From e57e1ee22c226e394521b42a2b1f5454ef5c2d84 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Thu, 24 Feb 2022 19:37:51 +0100 Subject: [PATCH 001/251] =?UTF-8?q?=E2=9C=A8=20Add=20mongoose=20test=20mod?= =?UTF-8?q?els?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/models/SNCF_schedules.js | 21 ++++++++++++++++++ src/test/models/SNCF_stops.js | 20 +++++++++++++++++ src/test/models/TBM_lines.model.js | 20 +++++++++++++++++ src/test/models/TBM_lines_routes.model.js | 24 +++++++++++++++++++++ src/test/models/TBM_schedules.model.js | 24 +++++++++++++++++++++ src/test/models/TBM_stops.model.js | 23 ++++++++++++++++++++ src/test/models/TBM_vehicles.model.js | 22 +++++++++++++++++++ src/test/models/addresses.model.js | 26 +++++++++++++++++++++++ src/test/models/intersections.model.js | 19 +++++++++++++++++ src/test/models/sections.model.js | 25 ++++++++++++++++++++++ 10 files changed, 224 insertions(+) create mode 100644 src/test/models/SNCF_schedules.js create mode 100644 src/test/models/SNCF_stops.js create mode 100644 src/test/models/TBM_lines.model.js create mode 100644 src/test/models/TBM_lines_routes.model.js create mode 100644 src/test/models/TBM_schedules.model.js create mode 100644 src/test/models/TBM_stops.model.js create mode 100644 src/test/models/TBM_vehicles.model.js create mode 100644 src/test/models/addresses.model.js create mode 100644 src/test/models/intersections.model.js create mode 100644 src/test/models/sections.model.js diff --git a/src/test/models/SNCF_schedules.js b/src/test/models/SNCF_schedules.js new file mode 100644 index 00000000..0b2ccd3b --- /dev/null +++ b/src/test/models/SNCF_schedules.js @@ -0,0 +1,21 @@ +// sncf_schedules-model.js - A mongoose model +// +// See http://mongoosejs.com/docs/models.html +// for more of what you can do here. +module.exports = function (Schema, model) { + const modelName = 'sncf_route_schedules'; + const schema = new Schema({ + _id: { type: String }, + realtime: { type: Date, required: true }, + trip: { type: Number, required: true }, //implicitly includes direction + stop_point: { type: String, required: true, ref: 'sncf_stops' }, + route: { type: String, required: true, ref: 'sncf_routes' }, + }, { + timestamps: true, + }); + + // This is necessary to avoid model compilation errors in watch mode + // see https://mongoosejs.com/docs/api/connection.html#connection_Connection-deleteModel + return model(modelName, schema); + +}; diff --git a/src/test/models/SNCF_stops.js b/src/test/models/SNCF_stops.js new file mode 100644 index 00000000..d8b12b77 --- /dev/null +++ b/src/test/models/SNCF_stops.js @@ -0,0 +1,20 @@ +// sncf_stops-model.js - A mongoose model +// +// See http://mongoosejs.com/docs/models.html +// for more of what you can do here. +module.exports = function (Schema, model) { + const modelName = 'sncf_stops'; + const schema = new Schema({ + _id: { type: Number }, + coords: { type: Array, required: true }, + name: { type: String, required: true }, + name_lowercase: { type: String, required: true }, + }, { + timestamps: true, + }); + + // This is necessary to avoid model compilation errors in watch mode + // see https://mongoosejs.com/docs/api/connection.html#connection_Connection-deleteModel + return model(modelName, schema); + +}; diff --git a/src/test/models/TBM_lines.model.js b/src/test/models/TBM_lines.model.js new file mode 100644 index 00000000..75d246c4 --- /dev/null +++ b/src/test/models/TBM_lines.model.js @@ -0,0 +1,20 @@ +// tbm_lines-model.js - A mongoose model +// +// See http://mongoosejs.com/docs/models.html +// for more of what you can do here. +module.exports = function (Schema, model) { + const modelName = 'tbm_lines'; + const schema = new Schema({ + _id: { type: Number }, + libelle: { type: String, required: true }, + vehicule: { type: String, required: true }, + active: { type: Number, required: true }, + }, { + timestamps: true + }); + + // This is necessary to avoid model compilation errors in watch mode + // see https://mongoosejs.com/docs/api/connection.html#connection_Connection-deleteModel + return model(modelName, schema); + +}; diff --git a/src/test/models/TBM_lines_routes.model.js b/src/test/models/TBM_lines_routes.model.js new file mode 100644 index 00000000..073d7297 --- /dev/null +++ b/src/test/models/TBM_lines_routes.model.js @@ -0,0 +1,24 @@ +// tbm_lines_routes-model.js - A mongoose model +// +// See http://mongoosejs.com/docs/models.html +// for more of what you can do here. +module.exports = function (Schema, model) { + const modelName = 'tbm_lines_routes'; + const schema = new Schema({ + _id: { type: Number }, + libelle: { type: String, required: true }, + sens: { type: String, required: true }, + vehicule: { type: String, required: true }, + rs_sv_ligne_a: { type: Number, required: true, ref: 'lines' }, + rg_sv_arret_p_nd: { type: Number, required: true, ref: 'stops' }, + rg_sv_arret_p_na: { type: Number, required: true, ref: 'stops' }, + }, { + timestamps: true, + toObject: { virtuals: true }, + }); + + // This is necessary to avoid model compilation errors in watch mode + // see https://mongoosejs.com/docs/api/connection.html#connection_Connection-deleteModel + return model(modelName, schema); + +}; diff --git a/src/test/models/TBM_schedules.model.js b/src/test/models/TBM_schedules.model.js new file mode 100644 index 00000000..dbee202e --- /dev/null +++ b/src/test/models/TBM_schedules.model.js @@ -0,0 +1,24 @@ +// tbm_schedules-model.js - A mongoose model +// +// See http://mongoosejs.com/docs/models.html +// for more of what you can do here. +module.exports = function (Schema, model) { + const modelName = 'tbm_schedules'; + const schema = new Schema({ + _id: { type: Number }, + hor_theo: { type: Date, required: true }, + hor_app: { type: Date, required: true }, + hor_estime: { type: Date, required: true }, + etat: { type: String, required: true }, + type: { type: String, required: true }, //donnée incertaine + rs_sv_arret_p: { type: Number, required: true, ref: 'stops' }, + rs_sv_cours_a: { type: Number, required: true, ref: 'vehicles' }, + }, { + timestamps: true, + }); + + // This is necessary to avoid model compilation errors in watch mode + // see https://mongoosejs.com/docs/api/connection.html#connection_Connection-deleteModel + return model(modelName, schema); + +}; diff --git a/src/test/models/TBM_stops.model.js b/src/test/models/TBM_stops.model.js new file mode 100644 index 00000000..2b0cddee --- /dev/null +++ b/src/test/models/TBM_stops.model.js @@ -0,0 +1,23 @@ +// tbm_stops-model.js - A mongoose model +// +// See http://mongoosejs.com/docs/models.html +// for more of what you can do here. +module.exports = function (Schema, model) { + const modelName = 'tbm_stops'; + const schema = new Schema({ + coords: { type: Array, required: true }, + _id: { type: Number }, + libelle: { type: String, required: true }, + libelle_lowercase: { type: String, required: true }, + vehicule: { type: String, required: true }, + type: { type: String, required: true }, + actif: { type: Number, required: true }, + }, { + timestamps: true + }); + + // This is necessary to avoid model compilation errors in watch mode + // see https://mongoosejs.com/docs/api/connection.html#connection_Connection-deleteModel + return model(modelName, schema); + +}; diff --git a/src/test/models/TBM_vehicles.model.js b/src/test/models/TBM_vehicles.model.js new file mode 100644 index 00000000..700ba523 --- /dev/null +++ b/src/test/models/TBM_vehicles.model.js @@ -0,0 +1,22 @@ +// tbm_vehicles-model.js - A mongoose model +// +// See http://mongoosejs.com/docs/models.html +// for more of what you can do here. +module.exports = function (Schema, model) { + const modelName = 'tbm_vehicles'; + const schema = new Schema({ + _id: { type: Number }, + etat: { type: String, required: true }, + rs_sv_ligne_a: { type: Number, ref: 'lines' }, + rg_sv_arret_p_nd: { type: Number, required: true, ref: 'stops' }, + rg_sv_arret_p_na: { type: Number, required: true, ref: 'stops' }, + rs_sv_chem_l: { type: Number, ref: 'lines_routes' }, + }, { + timestamps: true, + }); + + // This is necessary to avoid model compilation errors in watch mode + // see https://mongoosejs.com/docs/api/connection.html#connection_Connection-deleteModel + return model(modelName, schema); + +}; diff --git a/src/test/models/addresses.model.js b/src/test/models/addresses.model.js new file mode 100644 index 00000000..d539121f --- /dev/null +++ b/src/test/models/addresses.model.js @@ -0,0 +1,26 @@ +// addresses-model.js - A mongoose model +// +// See http://mongoosejs.com/docs/models.html +// for more of what you can do here. +module.exports = function (Schema, model) { + const modelName = 'addresses'; + const schema = new Schema({ + _id: { type: Number }, + coords: { type: Array, required: true }, + numero: { type: Number, required: true }, + rep: { type: String, required: false }, + type_voie: { type: String, required: true }, + nom_voie: { type: String, required: true }, + nom_voie_lowercase: { type: String, required: true }, + code_postal: { type: Number, required: true }, + fantoir: { type: String, required: true }, + commune: { type: String, required: true }, + }, { + timestamps: true, + }); + + // This is necessary to avoid model compilation errors in watch mode + // see https://mongoosejs.com/docs/api/connection.html#connection_Connection-deleteModel + return model(modelName, schema); + +}; diff --git a/src/test/models/intersections.model.js b/src/test/models/intersections.model.js new file mode 100644 index 00000000..ed1ece47 --- /dev/null +++ b/src/test/models/intersections.model.js @@ -0,0 +1,19 @@ +// intersections-model.js - A mongoose model +// +// See http://mongoosejs.com/docs/models.html +// for more of what you can do here. +module.exports = function (Schema, model) { + const modelName = 'intersections'; + const schema = new Schema({ + coords: { type: Array, required: true }, + _id: { type: Number }, + nature: { type: String, required: true }, + }, { + timestamps: true + }); + + // This is necessary to avoid model compilation errors in watch mode + // see https://mongoosejs.com/docs/api/connection.html#connection_Connection-deleteModel + return model(modelName, schema); + +}; diff --git a/src/test/models/sections.model.js b/src/test/models/sections.model.js new file mode 100644 index 00000000..beadfc61 --- /dev/null +++ b/src/test/models/sections.model.js @@ -0,0 +1,25 @@ +// sections-model.js - A mongoose model +// +// See http://mongoosejs.com/docs/models.html +// for more of what you can do here. +module.exports = function (Schema, model) { + const modelName = 'sections'; + const schema = new Schema({ + coords: { type: Array, required: true }, + distance: { type: Number, required: true }, + _id: { type: Number }, + domanial: { type: Number, required: true }, + groupe: { type: Number, required: true }, + nom_voie: { type: String, required: true }, + rg_fv_graph_dbl: { type: Boolean, required: true }, + rg_fv_graph_nd: { type: Number, required: true, ref: 'nodes' }, + rg_fv_graph_na: { type: Number, required: true, ref: 'nodes' }, + }, { + timestamps: true, + }); + + // This is necessary to avoid model compilation errors in watch mode + // see https://mongoosejs.com/docs/api/connection.html#connection_Connection-deleteModel + return model(modelName, schema); + +}; From f4df48381325cc3bce817f7a3c8c707e06da1178 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Thu, 24 Feb 2022 19:38:16 +0100 Subject: [PATCH 002/251] =?UTF-8?q?=E2=9C=A8=20Benchmark=20util?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/utils/benchmark.ts | 59 +++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 src/test/utils/benchmark.ts diff --git a/src/test/utils/benchmark.ts b/src/test/utils/benchmark.ts new file mode 100644 index 00000000..24702db6 --- /dev/null +++ b/src/test/utils/benchmark.ts @@ -0,0 +1,59 @@ +export async function benchmark(f: (...args: any[]) => returnType, args: any[] = [], times: number = 1) { + const starts: number[] = new Array(times); + const ends: number[] = new Array(times); + let lastReturn: Awaited; + for (let i = 0; i < times; i++) { + starts[i] = performance.now(); + lastReturn = await f(...args); + ends[i] = performance.now(); + }; + const durations = ends.map((e, i) => new Duration(e-starts[i])) + const totalDuration = new Duration(durations.reduce((acc, v) => acc+v.ms, 0)); + return { + fName: f.name, + args, + starts, + ends, + durations, + totalDuration, + averageDuration: new Duration(totalDuration.ms/times), + times, + lastReturn, + }; +}; + +export class Duration { + + private time: number; + + constructor(ms: number) { + + this.time = ms; + + } + + get ms() { + return this.time; + } + + set ms(ms: number) { + this.time = ms; + } + + get totalSeconds() { + return Math.floor(this.time / 1000); + } + + get rSeconds() { + return this.time % 1000; + } + + get totalMinuts() { + return Math.floor(this.time / 60000); + } + + get rMinuts() { + return this.time % 60000; + } + +} \ No newline at end of file From 49134435087fc649afbe9835d6087e958f39e889 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Thu, 24 Feb 2022 19:38:41 +0100 Subject: [PATCH 003/251] =?UTF-8?q?=E2=9C=A8=20Structures=20and=20utils?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/utils/Link.ts | 122 ++++++++++++++++++++++++++++++ src/test/utils/Queue.ts | 46 ++++++++++++ src/test/utils/Workers.ts | 152 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 320 insertions(+) create mode 100644 src/test/utils/Link.ts create mode 100644 src/test/utils/Queue.ts create mode 100644 src/test/utils/Workers.ts diff --git a/src/test/utils/Link.ts b/src/test/utils/Link.ts new file mode 100644 index 00000000..a52e948b --- /dev/null +++ b/src/test/utils/Link.ts @@ -0,0 +1,122 @@ +export type link = Link | symbol; + +/** + * @description Class of chained array + */ +export class Link { + + static emptyLink = Symbol('emptyLink') + + private _value: Type; + private _next: link; + + /** + * @description Construction of the first link + * @param val Any type of data to link + */ + constructor(val: Type, next: link = Link.emptyLink) { + this._value = val; + this._next = next; + } + + static isLink(l: link): boolean { + return l instanceof Link; + } + + /** + * @description Get the value of this link + */ + get value(): Type { + return this._value; + } + + set value(v: any) { + this._value = v; + } + + /** + * @description Get the next link of this chained array + */ + get next(): link { + return this._next; + } + + set next(v: link) { + if (!Link.isLink(v) && v != Link.emptyLink) throw new Error("Next value of the link can only be a Link or an empty Link.") + this._next = v; + } + + /** + * @description Get depth of the link {Number} + */ + get depth(): number { + if (!Link.isLink(this._next)) return 1; + return 1+(this._next as Link).depth; + } + + toArrayRec(): any[] { + if (!Link.isLink(this.next)) return [this.value]; + let next = (this.next as Link).toArrayRec(); + return [this.value, ...next]; + } + + toArray(): any[] { + return Array.from(this); + } + + toArrayRevertedRec(): any[] { + if (!this._next || !(this._next instanceof Link)) return [this.value]; + let next = this._next.toArray(); + return [...next, this.value]; + } + + toArrayReverted(): any[] { + return this.toArray().reverse(); + } + + *[Symbol.iterator]() { + let el = this as Link + while (Link.isLink(el)) { + yield el.value + el = el._next as Link + } + } + + /** + * @description Get the n(th) element of the link + * @param {Number} n Index of the element to access to + */ + get_rec(n: number): any { + if (n < 0) throw new Error("Invalid index"); + if (n == 0) return this.value; + if (this._next instanceof Link) return this._next.get(n-1); + else throw new Error("Index out of range"); + } + + /** + * @description Get the n(th) element of the link + * @param {Number} n Index of the element to access to + */ + get(n: number): any { + if (n < 0) throw new Error("Invalid index"); + let i = 0; + for (let el of this) { + if (n === i) return el; + i++; + } + throw new Error("Index out of range"); + } + + /** + * @description Create chained array from array + * @param {Array} array The array to convert into chained array + */ + static fromArray(a: Array = []): Link { + let m: Link = null; + for (let i = a.length-1; i >= 0; i--) {; + m = new this(a[i], m); + }; + return m; + } + +} \ No newline at end of file diff --git a/src/test/utils/Queue.ts b/src/test/utils/Queue.ts new file mode 100644 index 00000000..76b88571 --- /dev/null +++ b/src/test/utils/Queue.ts @@ -0,0 +1,46 @@ +import { link, Link } from "./Link"; + +export class Queue { + + private front: link; + private back: link; + private _size: number; + + constructor() { + + this.front = Link.emptyLink; + this.back = Link.emptyLink; + this._size = 0; + + } + + get size(): number { + return this._size; + } + + enqueue(val: Type): Queue { + if (this.size === 0) { + this.front = new Link(val); + this.back = this.front; + } else { + (this.back as Link).next = new Link(val); + this.back = (this.back as Link).next; + } + this._size++; + return this; + } + + dequeue(): Type { + if (!this.size) throw new Error("Queue is empty."); + const v = (this.front as Link).value; + this.front = (this.front as Link).next; + this._size--; + return v; + } + + toArray(): Type[] { + if (!this.size) return []; + return (this.front as Link).toArray(); + } + +} \ No newline at end of file diff --git a/src/test/utils/Workers.ts b/src/test/utils/Workers.ts new file mode 100644 index 00000000..fe2248db --- /dev/null +++ b/src/test/utils/Workers.ts @@ -0,0 +1,152 @@ +import { Worker, MessageChannel } from 'worker_threads' +import { Duration } from './benchmark'; +import { Queue } from './Queue'; +const nsPerMs = BigInt(1e6) + +interface poolWorker { + id: number; + status: 'IDLE' | 'BUSY'; + worker: Worker; + work: queued | null; +} + +export type resolveCb = (value: any) => void; +export type rejectCb = (reason?: any) => void; +type queued = [any, resolveCb, rejectCb]; + +export class WorkerPool { + + readonly script: string; + readonly size: number; + readonly pool: poolWorker[]; + readonly queue: Queue; + + constructor(script: string, size: number, initData?: any) { + + this.script = script; + this.size = size; + this.pool = new Array(this.size); + this.queue = new Queue(); + + for (let i = 0; i < this.size; i++) { + + this.pool[i] = { + id: i, + status: 'IDLE', + worker: new Worker(this.script), + work: null, + }; + + if (initData) { + const worker = this.pool[i]; + worker.status = 'BUSY'; + + console.log(`Initializing worker ${worker.id}`); + + worker.worker.postMessage({ init: true, ...initData }); + worker.worker.once('message', (v) => { + if (v === true) { + worker.status = 'IDLE'; + + console.log(`Initialized worker ${worker.id}`); + + this.runCallback(); + } + }); + worker.worker.once('error', console.error); + } + + } + } + + run(data: any, res: resolveCb, rej: rejectCb): void + run(data: any): Promise + run(data: any, res?: resolveCb, rej?: rejectCb) { + if (res && typeof res == 'function' && rej && typeof rej == 'function') { + + const work: queued = [data, res, rej]; + + const worker = this.getIdleWorker(); + + console.log(`Running worker ${worker.id} (${this.queue.size})`); + + worker.status = 'BUSY'; + worker.work = work; + + const startTime = process.hrtime.bigint(); + worker.worker.postMessage(data); + + const onceMessage = (result: any) => { + const delta = new Duration(Number((process.hrtime.bigint()-startTime)/nsPerMs)); + worker.status = 'IDLE'; + res(result); + console.log(`Finished worker ${worker.id} after ${delta.totalSeconds}s${delta.rSeconds} (${this.queue.size})`); + this.runCallback(); + worker.worker.removeListener('error', onceError); + }; + worker.worker.once('message', onceMessage); + + const onceError = (err: any) => { + worker.status = 'IDLE'; + rej(err); + console.log(`Finished worker ${worker.id} (${this.queue.size})`); + this.runCallback(); + worker.worker.removeListener('message', onceMessage); + }; + worker.worker.once('error', onceError); + + } else return new Promise((res, rej) => { + + const work: queued = [data, res, rej]; + + const worker = this.getIdleWorker(); + if (!worker) this.queue.enqueue(work), console.log(`Queued (${this.queue.size})`); + else { + + console.log(`Running worker ${worker.id} (${this.queue.size})`) + + worker.status = 'BUSY'; + worker.work = work; + + const startTime = process.hrtime.bigint(); + worker.worker.postMessage(data); + + const onceMessage = (result: any) => { + const delta = new Duration(Number((process.hrtime.bigint()-startTime)/nsPerMs)); + worker.status = 'IDLE'; + res(result); + console.log(`Finished worker ${worker.id} after ${delta.totalSeconds}s${delta.rSeconds} (${this.queue.size})`); + this.runCallback(); + worker.worker.removeListener('error', onceError); + }; + worker.worker.once('message', onceMessage); + + const onceError = (err: any) => { + worker.status = 'IDLE'; + rej(err); + console.log(`Finished worker ${worker.id} (${this.queue.size})`); + this.runCallback(); + worker.worker.removeListener('message', onceMessage); + }; + worker.worker.once('error', onceError); + + } + + }) + } + + protected runCallback(): void { + + if (!this.queue.size) return; + const nextQueued = this.queue.dequeue(); + this.run(...nextQueued); + + } + + protected getIdleWorker(): poolWorker | undefined { + + return this.pool.find(w => w.status === 'IDLE'); + + } + +} \ No newline at end of file From 512fb87ead2866c77d1a1e6fb1b3432984e66f27 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Thu, 24 Feb 2022 19:39:57 +0100 Subject: [PATCH 004/251] =?UTF-8?q?=E2=9C=A8=20Main=20test=20files?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/computePath.ts | 37 +++++++ src/test/test.ts | 206 +++++++++++++++++++++++++++++++++++++ src/test/utils/mongoose.ts | 13 +++ 3 files changed, 256 insertions(+) create mode 100644 src/test/computePath.ts create mode 100644 src/test/test.ts create mode 100644 src/test/utils/mongoose.ts diff --git a/src/test/computePath.ts b/src/test/computePath.ts new file mode 100644 index 00000000..2b198b03 --- /dev/null +++ b/src/test/computePath.ts @@ -0,0 +1,37 @@ +import { path, Dijkstra, tracePath } from '../FootPaths'; +import { WeightedGraph } from '../utils/Graph'; +import { stop, id } from './test'; + +let footGraph: WeightedGraph | undefined; +let stops: stop[] | undefined; + +export function computePath(i: number) { + + const sourcePaths: Map = new Map(); + const [dist, prev] = Dijkstra(footGraph, `stop-${stops[i]._id}`); + + for (let j = 0; j < stops.length; j++) { + + // const targetStop: stop = stops[j]; //Better assigning those 2 vars or getting stops[j] 3 times + casting to string 2 times ? + // const targetNode = `stop-${targetStop._id}`; + + sourcePaths.set(stops[j]._id, [tracePath(prev, `stop-${stops[j]._id}`), dist.get(`stop-${stops[j]._id}`)]); + + } + + return sourcePaths; +} + +import { parentPort } from 'worker_threads'; + +parentPort.on('message', (data) => { + + if (data.init === true) { + footGraph = new WeightedGraph(data.adj, data.weights); + stops = data.stops; + parentPort.postMessage(true); + } else { + parentPort.postMessage(computePath(data)); + } + +}) \ No newline at end of file diff --git a/src/test/test.ts b/src/test/test.ts new file mode 100644 index 00000000..0149094f --- /dev/null +++ b/src/test/test.ts @@ -0,0 +1,206 @@ +import { Schema, model, Model } from 'mongoose'; +import db from './utils/mongoose'; +import { benchmark } from './utils/benchmark'; +import { WorkerPool } from './utils/Workers'; + +import { WeightedGraph } from '../utils/Graph'; +import { path } from '../FootPaths'; + +import Point from '../utils/Point'; +import Segment from '../utils/Segment'; + +export type id = number; + +export interface section { + _id: id; + createdAt: Date; + updatedAt: Date; + coords: Array<[number, number]>; + distance: number; + domanial: number; + groupe: number; + nom_voie: string; + rg_fv_graph_dbl: boolean; + rg_fv_graph_na: id; + rg_fv_graph_nd: id; +} + +export interface stop { + _id: id; + createdAt: Date; + updatedAt: Date; + coords: [number, number]; + actif: 0 | 1; + libelle: string; + libelle_lowercase: string; + type: string; + vehicule: "BUS" | "TRAM" | "BATEAU"; +} + +function cartographicDistance(x1: number, y1: number, x2: number, y2: number): number { + + return Math.sqrt((x2-x1)**2+(y2-y1)**2); + +} + +async function run() { + + //Grab required data + await db(); + + const sectionsModel: Model
= require('./models/sections.model')(Schema, model); + const stopsModel: Model = require('./models/TBM_Stops.model')(Schema, model); + + async function queryData() { + + //Important : sections are oriented. + //ERROR : there can be 2 sections (or more) linking the same nd to the same na. They need to be both differentiated (by their _id, for example). + const sections: Array
= await sectionsModel.find({}).lean().exec(); + //Map section, from s1 to s2 (oriented). + const sectionsMap: Map = new Map(); + for (const s of sections) { + sectionsMap.set(`${s.rg_fv_graph_nd}-${s.rg_fv_graph_na}`, s); + if (s.rg_fv_graph_dbl) sectionsMap.set(`${s.rg_fv_graph_na}-${s.rg_fv_graph_nd}`, s); + } + + const stops: Array = await stopsModel.find({ coords: { '$not': { '$elemMatch': { '$eq': NaN } } } }).lean().exec(); + + return { + sections, + sectionsMap, + stops + } + + } + const b1 = await benchmark(queryData, [], 10); + const { sections, sectionsMap, stops } = b1.lastReturn; + + function makeGraph() { + + const footGraph: WeightedGraph = new WeightedGraph(); + + for (const s of sections) { + + //Oriented + s.rg_fv_graph_dbl ? footGraph.add_edge(s.rg_fv_graph_nd, s.rg_fv_graph_na, s.distance) : footGraph.add_arc(s.rg_fv_graph_nd, s.rg_fv_graph_na, s.distance); + + } + + return footGraph; + } + const b2 = await benchmark(makeGraph, [], 10); + const footGraph = b2.lastReturn; + + const arcs = footGraph.arcs; + + //Compute approached stops + function ComputeApproachedStops() { + + //Pre-generate segments to fasten the process (and not redundant computing) + //A segment describes a portion of a section (oriented) + const segments: Map = new Map(); + for (const a of arcs) { + + const section: section = sectionsMap.get(`${a[0]}-${a[1]}`); + for (let i = 0; i < section.coords.length-1; i++) { + + segments.set(section, { + n: i, + seg: new Segment( + new Point(...section.coords[i]), + new Point(...section.coords[i+1]) + ) + }); + + } + } + + const approachedStops: Array<[Point, section, number]> = new Array(stops.length); + for (let i = 0; i < stops.length; i++) { + + let closestPoint: [number, Point, section, number] = [Infinity, null, null, null]; + + for (const [ section, { n, seg } ] of segments) { + + const stopPoint: Point = new Point(...stops[i].coords); + const localClosestPoint: Point = seg.closestPointFromPoint(stopPoint); + const distance: number = Point.distance(stopPoint, localClosestPoint); + if (distance < closestPoint[0]) { + closestPoint[0] = distance; + closestPoint[1] = localClosestPoint; + closestPoint[2] = section; + closestPoint[3] = n; + } + } + + approachedStops[i] = [closestPoint[1], closestPoint[2], closestPoint[3]]; + + } + return approachedStops; + } + const b3 = await benchmark(ComputeApproachedStops, [], 1); + const approachedStops = b3.lastReturn; + + function updateGraph() { + //Pushes new approached stops into graph, just like a proxy on a section + for (let i = 0; i < approachedStops.length; i++) { + + const [closestPoint, section, n] = approachedStops[i] + + //Compute distance from section start to approachedStop + const toApproadchedStop: number = section.coords.reduce((acc, v, i, arr) => { + if (i < n && i < arr.length - 1) return acc+cartographicDistance(...v, ...arr[i+1]); + return acc; + }, 0) + Point.distance(closestPoint, new Point(...section.coords[n])); + + //Compute distance form approachedStop to section end + const fromApproachedStop: number = section.coords.reduce((acc, v, i, arr) => { + if (i > n && i < arr.length - 1) return acc+cartographicDistance(...v, ...arr[i+1]); + return acc; + }, 0) + Point.distance(closestPoint, new Point(...section.coords[n])); + + //Remove arc from p1 to p2 + footGraph.remove_arc(section.rg_fv_graph_nd, section.rg_fv_graph_na); + + //Insert new node approachedStop + //Create arc from p1 to approachedStop to p2 + //Ensure unique node id for approachedStop + footGraph.add_arc(section.rg_fv_graph_nd, `stop-${stops[i]._id}`, toApproadchedStop); + footGraph.add_arc(`stop-${stops[i]._id}`, section.rg_fv_graph_na, fromApproachedStop); + + } + } + const b4 = await benchmark(updateGraph, []); + function computePaths() { + + return new Promise((res, rej) => { + + const workerPool = new WorkerPool(__dirname+'/computePath.js', 8, { adj: footGraph.adj, weights: footGraph.weights, stops }); + + //paths> + const paths: Map> = new Map(); + + for (let i = 0; i < stops.length; i ++) { + + workerPool.run>(i).then(sourcePaths => { + + paths.set(stops[i]._id, sourcePaths); + if (paths.size === stops.length) res(paths); + + }).catch(rej); + + } + }) + + } + const b5 = await benchmark(computePaths, []); + const paths = b5.lastReturn; + + return { b1, b2, b3, b4, b5 }; +} + +run() + .then(console.log) + .catch(console.error) + +setTimeout(() => {}, 1000000); \ No newline at end of file diff --git a/src/test/utils/mongoose.ts b/src/test/utils/mongoose.ts new file mode 100644 index 00000000..fffb9724 --- /dev/null +++ b/src/test/utils/mongoose.ts @@ -0,0 +1,13 @@ +import { connect } from 'mongoose'; + +export default async function() { + + const client = await connect( + `mongodb://0.0.0.0:27017/bibm`, + //{ useNewUrlParser: true } + ) + + console.info('Database connected.') + + return client +}; From e8504bc90444b23c41f60a839ae8e70202ddc9ba Mon Sep 17 00:00:00 2001 From: Catatomik Date: Thu, 24 Feb 2022 19:40:22 +0100 Subject: [PATCH 005/251] =?UTF-8?q?=E2=9E=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index f10b849d..00508959 100644 --- a/package.json +++ b/package.json @@ -10,5 +10,8 @@ "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", - "license": "ISC" + "license": "ISC", + "dependencies": { + "mongoose": "^6.2.1" + } } From e17c42f4c17744a91dc6ef21fa9fff0db8f6a1f9 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Wed, 18 Jan 2023 18:31:30 +0100 Subject: [PATCH 006/251] =?UTF-8?q?=F0=9F=9A=A7=20Remove=20unused=20import?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/utils/Workers.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/utils/Workers.ts b/src/test/utils/Workers.ts index fe2248db..cd125440 100644 --- a/src/test/utils/Workers.ts +++ b/src/test/utils/Workers.ts @@ -1,4 +1,4 @@ -import { Worker, MessageChannel } from 'worker_threads' +import { Worker } from 'worker_threads' import { Duration } from './benchmark'; import { Queue } from './Queue'; const nsPerMs = BigInt(1e6) From 2ab23800bf47c2611ec32e85815151a4bd0815f6 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Wed, 18 Jan 2023 18:31:51 +0100 Subject: [PATCH 007/251] =?UTF-8?q?=F0=9F=9A=A7=20Clarifications?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/utils/Link.ts | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/test/utils/Link.ts b/src/test/utils/Link.ts index a52e948b..aca0c110 100644 --- a/src/test/utils/Link.ts +++ b/src/test/utils/Link.ts @@ -1,30 +1,30 @@ -export type link = Link | symbol; +export type LinkOrEmpty = Link | symbol; /** * @description Class of chained array */ export class Link { - static emptyLink = Symbol('emptyLink') + static emptyLink = Symbol('emptyLink'); private _value: Type; - private _next: link; + private _next: LinkOrEmpty; /** - * @description Construction of the first link - * @param val Any type of data to link + * @description Construction of the first LinkOrEmpty + * @param val Any type of data to LinkOrEmpty */ - constructor(val: Type, next: link = Link.emptyLink) { + constructor(val: Type, next: LinkOrEmpty = Link.emptyLink) { this._value = val; this._next = next; } - static isLink(l: link): boolean { + static isLink(l: LinkOrEmpty): boolean { return l instanceof Link; } /** - * @description Get the value of this link + * @description Get the value of this LinkOrEmpty */ get value(): Type { return this._value; @@ -35,19 +35,19 @@ export class Link { } /** - * @description Get the next link of this chained array + * @description Get the next LinkOrEmpty of this chained array */ - get next(): link { + get next(): LinkOrEmpty { return this._next; } - set next(v: link) { - if (!Link.isLink(v) && v != Link.emptyLink) throw new Error("Next value of the link can only be a Link or an empty Link.") + set next(v: LinkOrEmpty) { + if (!Link.isLink(v) && v != Link.emptyLink) throw new Error("Next value of the LinkOrEmpty can only be a Link or an empty Link.") this._next = v; } /** - * @description Get depth of the link {Number} + * @description Get depth of the LinkOrEmpty {Number} */ get depth(): number { if (!Link.isLink(this._next)) return 1; @@ -83,7 +83,7 @@ export class Link { } /** - * @description Get the n(th) element of the link + * @description Get the n(th) element of the LinkOrEmpty * @param {Number} n Index of the element to access to */ get_rec(n: number): any { @@ -94,7 +94,7 @@ export class Link { } /** - * @description Get the n(th) element of the link + * @description Get the n(th) element of the LinkOrEmpty * @param {Number} n Index of the element to access to */ get(n: number): any { From c7c79eb3b1654effde56648ae5c2501e27a7f68e Mon Sep 17 00:00:00 2001 From: Catatomik Date: Wed, 18 Jan 2023 18:34:12 +0100 Subject: [PATCH 008/251] =?UTF-8?q?=F0=9F=9A=A7=20Use=20new=20LinkOrEmpty?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/utils/Queue.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/utils/Queue.ts b/src/test/utils/Queue.ts index 76b88571..71766632 100644 --- a/src/test/utils/Queue.ts +++ b/src/test/utils/Queue.ts @@ -1,9 +1,9 @@ -import { link, Link } from "./Link"; +import { LinkOrEmpty, Link } from "./Link"; export class Queue { - private front: link; - private back: link; + private front: LinkOrEmpty; + private back: LinkOrEmpty; private _size: number; constructor() { From 98f66c243d60b0959c853e76267da8cd4a83873a Mon Sep 17 00:00:00 2001 From: Catatomik Date: Wed, 18 Jan 2023 18:43:41 +0100 Subject: [PATCH 009/251] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20mongoose?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6f4b2d76..7eef7b5c 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,6 @@ "author": "", "license": "ISC", "dependencies": { - "mongoose": "^6.2.1" + "mongoose": "^6.8.4" } } From 781939386407184fd5e4dba68935b0fa69b2eda4 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Wed, 18 Jan 2023 18:47:31 +0100 Subject: [PATCH 010/251] =?UTF-8?q?=F0=9F=8E=A8=20Format?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/models/SNCF_schedules.js | 6 +++--- src/test/models/addresses.model.js | 14 +++++++------- src/test/models/intersections.model.js | 4 ++-- src/test/models/sections.model.js | 14 +++++++------- 4 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/test/models/SNCF_schedules.js b/src/test/models/SNCF_schedules.js index 0b2ccd3b..1b455159 100644 --- a/src/test/models/SNCF_schedules.js +++ b/src/test/models/SNCF_schedules.js @@ -8,8 +8,8 @@ module.exports = function (Schema, model) { _id: { type: String }, realtime: { type: Date, required: true }, trip: { type: Number, required: true }, //implicitly includes direction - stop_point: { type: String, required: true, ref: 'sncf_stops' }, - route: { type: String, required: true, ref: 'sncf_routes' }, + stop_point: { type: String, required: true, ref: 'sncf_stops' }, + route: { type: String, required: true, ref: 'sncf_routes' }, }, { timestamps: true, }); @@ -17,5 +17,5 @@ module.exports = function (Schema, model) { // This is necessary to avoid model compilation errors in watch mode // see https://mongoosejs.com/docs/api/connection.html#connection_Connection-deleteModel return model(modelName, schema); - + }; diff --git a/src/test/models/addresses.model.js b/src/test/models/addresses.model.js index d539121f..1f77f6b9 100644 --- a/src/test/models/addresses.model.js +++ b/src/test/models/addresses.model.js @@ -9,12 +9,12 @@ module.exports = function (Schema, model) { coords: { type: Array, required: true }, numero: { type: Number, required: true }, rep: { type: String, required: false }, - type_voie: { type: String, required: true }, - nom_voie: { type: String, required: true }, - nom_voie_lowercase: { type: String, required: true }, - code_postal: { type: Number, required: true }, - fantoir: { type: String, required: true }, - commune: { type: String, required: true }, + type_voie: { type: String, required: true }, + nom_voie: { type: String, required: true }, + nom_voie_lowercase: { type: String, required: true }, + code_postal: { type: Number, required: true }, + fantoir: { type: String, required: true }, + commune: { type: String, required: true }, }, { timestamps: true, }); @@ -22,5 +22,5 @@ module.exports = function (Schema, model) { // This is necessary to avoid model compilation errors in watch mode // see https://mongoosejs.com/docs/api/connection.html#connection_Connection-deleteModel return model(modelName, schema); - + }; diff --git a/src/test/models/intersections.model.js b/src/test/models/intersections.model.js index ed1ece47..62ad0ab5 100644 --- a/src/test/models/intersections.model.js +++ b/src/test/models/intersections.model.js @@ -5,7 +5,7 @@ module.exports = function (Schema, model) { const modelName = 'intersections'; const schema = new Schema({ - coords: { type: Array, required: true }, + coords: { type: Array, required: true }, _id: { type: Number }, nature: { type: String, required: true }, }, { @@ -15,5 +15,5 @@ module.exports = function (Schema, model) { // This is necessary to avoid model compilation errors in watch mode // see https://mongoosejs.com/docs/api/connection.html#connection_Connection-deleteModel return model(modelName, schema); - + }; diff --git a/src/test/models/sections.model.js b/src/test/models/sections.model.js index beadfc61..a026ca56 100644 --- a/src/test/models/sections.model.js +++ b/src/test/models/sections.model.js @@ -5,15 +5,15 @@ module.exports = function (Schema, model) { const modelName = 'sections'; const schema = new Schema({ - coords: { type: Array, required: true }, - distance: { type: Number, required: true }, + coords: { type: Array, required: true }, + distance: { type: Number, required: true }, _id: { type: Number }, domanial: { type: Number, required: true }, groupe: { type: Number, required: true }, - nom_voie: { type: String, required: true }, - rg_fv_graph_dbl: { type: Boolean, required: true }, - rg_fv_graph_nd: { type: Number, required: true, ref: 'nodes' }, - rg_fv_graph_na: { type: Number, required: true, ref: 'nodes' }, + nom_voie: { type: String, required: true }, + rg_fv_graph_dbl: { type: Boolean, required: true }, + rg_fv_graph_nd: { type: Number, required: true, ref: 'nodes' }, + rg_fv_graph_na: { type: Number, required: true, ref: 'nodes' }, }, { timestamps: true, }); @@ -21,5 +21,5 @@ module.exports = function (Schema, model) { // This is necessary to avoid model compilation errors in watch mode // see https://mongoosejs.com/docs/api/connection.html#connection_Connection-deleteModel return model(modelName, schema); - + }; From b6e8e94acced698ee5621bc1cfe267b557cc7755 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Wed, 18 Jan 2023 19:47:16 +0100 Subject: [PATCH 011/251] =?UTF-8?q?=F0=9F=9A=A7=F0=9F=90=9B=20Use=20ts=20m?= =?UTF-8?q?odels?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/computePath.ts | 5 +- src/test/models/SNCF_schedules.js | 21 ----- src/test/models/SNCF_schedules.model.ts | 25 +++++ src/test/models/SNCF_stops.js | 20 ---- src/test/models/SNCF_stops.model.ts | 26 ++++++ src/test/models/TBM_lines.model.js | 20 ---- src/test/models/TBM_lines.model.ts | 24 +++++ src/test/models/TBM_lines_routes.model.js | 24 ----- src/test/models/TBM_lines_routes.model.ts | 28 ++++++ src/test/models/TBM_schedules.model.js | 24 ----- src/test/models/TBM_schedules.model.ts | 32 +++++++ src/test/models/TBM_stops.model.js | 23 ----- src/test/models/TBM_stops.model.ts | 33 +++++++ src/test/models/TBM_vehicles.model.js | 22 ----- src/test/models/TBM_vehicles.model.ts | 26 ++++++ src/test/models/addresses.model.js | 26 ------ src/test/models/addresses.model.ts | 32 +++++++ src/test/models/intersections.model.js | 19 ---- src/test/models/intersections.model.ts | 23 +++++ src/test/models/sections.model.js | 25 ----- src/test/models/sections.model.ts | 30 ++++++ src/test/test.ts | 107 +++++++++------------- 22 files changed, 324 insertions(+), 291 deletions(-) delete mode 100644 src/test/models/SNCF_schedules.js create mode 100644 src/test/models/SNCF_schedules.model.ts delete mode 100644 src/test/models/SNCF_stops.js create mode 100644 src/test/models/SNCF_stops.model.ts delete mode 100644 src/test/models/TBM_lines.model.js create mode 100644 src/test/models/TBM_lines.model.ts delete mode 100644 src/test/models/TBM_lines_routes.model.js create mode 100644 src/test/models/TBM_lines_routes.model.ts delete mode 100644 src/test/models/TBM_schedules.model.js create mode 100644 src/test/models/TBM_schedules.model.ts delete mode 100644 src/test/models/TBM_stops.model.js create mode 100644 src/test/models/TBM_stops.model.ts delete mode 100644 src/test/models/TBM_vehicles.model.js create mode 100644 src/test/models/TBM_vehicles.model.ts delete mode 100644 src/test/models/addresses.model.js create mode 100644 src/test/models/addresses.model.ts delete mode 100644 src/test/models/intersections.model.js create mode 100644 src/test/models/intersections.model.ts delete mode 100644 src/test/models/sections.model.js create mode 100644 src/test/models/sections.model.ts diff --git a/src/test/computePath.ts b/src/test/computePath.ts index 2b198b03..29f4bc9c 100644 --- a/src/test/computePath.ts +++ b/src/test/computePath.ts @@ -1,9 +1,9 @@ import { path, Dijkstra, tracePath } from '../FootPaths'; import { WeightedGraph } from '../utils/Graph'; -import { stop, id } from './test'; +import { id } from './test'; let footGraph: WeightedGraph | undefined; -let stops: stop[] | undefined; +let stops: dbSNCF_Stops[] | undefined; export function computePath(i: number) { @@ -23,6 +23,7 @@ export function computePath(i: number) { } import { parentPort } from 'worker_threads'; +import { dbSNCF_Stops } from './models/SNCF_stops.model'; parentPort.on('message', (data) => { diff --git a/src/test/models/SNCF_schedules.js b/src/test/models/SNCF_schedules.js deleted file mode 100644 index 1b455159..00000000 --- a/src/test/models/SNCF_schedules.js +++ /dev/null @@ -1,21 +0,0 @@ -// sncf_schedules-model.js - A mongoose model -// -// See http://mongoosejs.com/docs/models.html -// for more of what you can do here. -module.exports = function (Schema, model) { - const modelName = 'sncf_route_schedules'; - const schema = new Schema({ - _id: { type: String }, - realtime: { type: Date, required: true }, - trip: { type: Number, required: true }, //implicitly includes direction - stop_point: { type: String, required: true, ref: 'sncf_stops' }, - route: { type: String, required: true, ref: 'sncf_routes' }, - }, { - timestamps: true, - }); - - // This is necessary to avoid model compilation errors in watch mode - // see https://mongoosejs.com/docs/api/connection.html#connection_Connection-deleteModel - return model(modelName, schema); - -}; diff --git a/src/test/models/SNCF_schedules.model.ts b/src/test/models/SNCF_schedules.model.ts new file mode 100644 index 00000000..586b660b --- /dev/null +++ b/src/test/models/SNCF_schedules.model.ts @@ -0,0 +1,25 @@ +// sncf_schedules-model.js - A mongoose model +// +// See http://mongoosejs.com/docs/models.html + +import { InferSchemaType, Schema, model } from "mongoose"; + +const dbSNCF_Schedules = new Schema( + { + _id: { type: String, required: true }, + realtime: { type: Date, required: true }, + trip: { type: Number, required: true }, //implicitly includes direction + stop_point: { type: Number, required: true, ref: "sncf_stops" }, + route: { type: String, required: true, ref: "sncf_routes" }, + }, + { + timestamps: true, + }, +); + +export type dbSNCF_Schedules = InferSchemaType; + +export default function (m: typeof model) { + const modelName = "sncf_route_schedules"; + return m(modelName, dbSNCF_Schedules); +} diff --git a/src/test/models/SNCF_stops.js b/src/test/models/SNCF_stops.js deleted file mode 100644 index d8b12b77..00000000 --- a/src/test/models/SNCF_stops.js +++ /dev/null @@ -1,20 +0,0 @@ -// sncf_stops-model.js - A mongoose model -// -// See http://mongoosejs.com/docs/models.html -// for more of what you can do here. -module.exports = function (Schema, model) { - const modelName = 'sncf_stops'; - const schema = new Schema({ - _id: { type: Number }, - coords: { type: Array, required: true }, - name: { type: String, required: true }, - name_lowercase: { type: String, required: true }, - }, { - timestamps: true, - }); - - // This is necessary to avoid model compilation errors in watch mode - // see https://mongoosejs.com/docs/api/connection.html#connection_Connection-deleteModel - return model(modelName, schema); - -}; diff --git a/src/test/models/SNCF_stops.model.ts b/src/test/models/SNCF_stops.model.ts new file mode 100644 index 00000000..384d01a7 --- /dev/null +++ b/src/test/models/SNCF_stops.model.ts @@ -0,0 +1,26 @@ +// sncf_stops-model.js - A mongoose model +// +// See http://mongoosejs.com/docs/models.html + +import { InferSchemaType, Schema, model } from "mongoose"; + +const dbSNCF_Stops = new Schema( + { + _id: { type: Number, required: true }, + coords: { type: [Number], required: true }, + name: { type: String, required: true }, + name_lowercase: { type: String, required: true }, + }, + { + timestamps: true, + }, +); + +export type dbSNCF_Stops = Omit, "coords"> & { + coords: [number, number]; +}; + +export default function (m: typeof model) { + const modelName = "sncf_stops"; + return m(modelName, dbSNCF_Stops); +} diff --git a/src/test/models/TBM_lines.model.js b/src/test/models/TBM_lines.model.js deleted file mode 100644 index 75d246c4..00000000 --- a/src/test/models/TBM_lines.model.js +++ /dev/null @@ -1,20 +0,0 @@ -// tbm_lines-model.js - A mongoose model -// -// See http://mongoosejs.com/docs/models.html -// for more of what you can do here. -module.exports = function (Schema, model) { - const modelName = 'tbm_lines'; - const schema = new Schema({ - _id: { type: Number }, - libelle: { type: String, required: true }, - vehicule: { type: String, required: true }, - active: { type: Number, required: true }, - }, { - timestamps: true - }); - - // This is necessary to avoid model compilation errors in watch mode - // see https://mongoosejs.com/docs/api/connection.html#connection_Connection-deleteModel - return model(modelName, schema); - -}; diff --git a/src/test/models/TBM_lines.model.ts b/src/test/models/TBM_lines.model.ts new file mode 100644 index 00000000..a6bd4d63 --- /dev/null +++ b/src/test/models/TBM_lines.model.ts @@ -0,0 +1,24 @@ +// tbm_lines-model.js - A mongoose model +// +// See http://mongoosejs.com/docs/models.html + +import { InferSchemaType, Schema, model } from "mongoose"; + +const dbTBM_Lines = new Schema( + { + _id: { type: Number, required: true }, + libelle: { type: String, required: true }, + vehicule: { type: String, enum: ["BUS", "TRAM", "BATEAU"], required: true }, + active: { type: Number, enum: [0, 1] as const, required: true }, + }, + { + timestamps: true, + }, +); + +export type dbTBM_Lines = InferSchemaType; + +export default function (m: typeof model) { + const modelName = "tbm_lines"; + return m(modelName, dbTBM_Lines); +} diff --git a/src/test/models/TBM_lines_routes.model.js b/src/test/models/TBM_lines_routes.model.js deleted file mode 100644 index 073d7297..00000000 --- a/src/test/models/TBM_lines_routes.model.js +++ /dev/null @@ -1,24 +0,0 @@ -// tbm_lines_routes-model.js - A mongoose model -// -// See http://mongoosejs.com/docs/models.html -// for more of what you can do here. -module.exports = function (Schema, model) { - const modelName = 'tbm_lines_routes'; - const schema = new Schema({ - _id: { type: Number }, - libelle: { type: String, required: true }, - sens: { type: String, required: true }, - vehicule: { type: String, required: true }, - rs_sv_ligne_a: { type: Number, required: true, ref: 'lines' }, - rg_sv_arret_p_nd: { type: Number, required: true, ref: 'stops' }, - rg_sv_arret_p_na: { type: Number, required: true, ref: 'stops' }, - }, { - timestamps: true, - toObject: { virtuals: true }, - }); - - // This is necessary to avoid model compilation errors in watch mode - // see https://mongoosejs.com/docs/api/connection.html#connection_Connection-deleteModel - return model(modelName, schema); - -}; diff --git a/src/test/models/TBM_lines_routes.model.ts b/src/test/models/TBM_lines_routes.model.ts new file mode 100644 index 00000000..7b7ca669 --- /dev/null +++ b/src/test/models/TBM_lines_routes.model.ts @@ -0,0 +1,28 @@ +// tbm_lines_routes-model.js - A mongoose model +// +// See http://mongoosejs.com/docs/models.html + +import { InferSchemaType, Schema, model } from "mongoose"; + +const dbTBM_Lines_routes = new Schema( + { + _id: { type: Number, required: true }, + libelle: { type: String, required: true }, + sens: { type: String, required: true }, + vehicule: { type: String, required: true }, + rs_sv_ligne_a: { type: Number, required: true, ref: "lines" }, + rg_sv_arret_p_nd: { type: Number, required: true, ref: "stops" }, + rg_sv_arret_p_na: { type: Number, required: true, ref: "stops" }, + }, + { + timestamps: true, + toObject: { virtuals: true }, + }, +); + +export type dbTBM_Lines_routes = InferSchemaType; + +export default function (m: typeof model) { + const modelName = "tbm_lines_routes"; + return m(modelName, dbTBM_Lines_routes); +} diff --git a/src/test/models/TBM_schedules.model.js b/src/test/models/TBM_schedules.model.js deleted file mode 100644 index dbee202e..00000000 --- a/src/test/models/TBM_schedules.model.js +++ /dev/null @@ -1,24 +0,0 @@ -// tbm_schedules-model.js - A mongoose model -// -// See http://mongoosejs.com/docs/models.html -// for more of what you can do here. -module.exports = function (Schema, model) { - const modelName = 'tbm_schedules'; - const schema = new Schema({ - _id: { type: Number }, - hor_theo: { type: Date, required: true }, - hor_app: { type: Date, required: true }, - hor_estime: { type: Date, required: true }, - etat: { type: String, required: true }, - type: { type: String, required: true }, //donnée incertaine - rs_sv_arret_p: { type: Number, required: true, ref: 'stops' }, - rs_sv_cours_a: { type: Number, required: true, ref: 'vehicles' }, - }, { - timestamps: true, - }); - - // This is necessary to avoid model compilation errors in watch mode - // see https://mongoosejs.com/docs/api/connection.html#connection_Connection-deleteModel - return model(modelName, schema); - -}; diff --git a/src/test/models/TBM_schedules.model.ts b/src/test/models/TBM_schedules.model.ts new file mode 100644 index 00000000..83de452a --- /dev/null +++ b/src/test/models/TBM_schedules.model.ts @@ -0,0 +1,32 @@ +// tbm_schedules-model.js - A mongoose model +// +// See http://mongoosejs.com/docs/models.html + +import { InferSchemaType, Schema, model } from "mongoose"; + +const dbTBM_Schedules = new Schema( + { + _id: { type: Number, required: true }, + hor_theo: { type: Date, required: true }, + hor_app: { type: Date, required: true }, + hor_estime: { type: Date, required: true }, + etat: { + type: String, + enum: ["NON_REALISE", "REALISE", "DEVIE"], + required: true, + }, + type: { type: String, enum: ["REGULIER"], required: true }, //donnée incertaine + rs_sv_arret_p: { type: Number, required: true, ref: "stops" }, + rs_sv_cours_a: { type: Number, required: true, ref: "vehicles" }, + }, + { + timestamps: true, + }, +); + +export type dbTBM_Schedules = InferSchemaType; + +export default function (m: typeof model) { + const modelName = "tbm_schedules"; + return m(modelName, dbTBM_Schedules); +} diff --git a/src/test/models/TBM_stops.model.js b/src/test/models/TBM_stops.model.js deleted file mode 100644 index 2b0cddee..00000000 --- a/src/test/models/TBM_stops.model.js +++ /dev/null @@ -1,23 +0,0 @@ -// tbm_stops-model.js - A mongoose model -// -// See http://mongoosejs.com/docs/models.html -// for more of what you can do here. -module.exports = function (Schema, model) { - const modelName = 'tbm_stops'; - const schema = new Schema({ - coords: { type: Array, required: true }, - _id: { type: Number }, - libelle: { type: String, required: true }, - libelle_lowercase: { type: String, required: true }, - vehicule: { type: String, required: true }, - type: { type: String, required: true }, - actif: { type: Number, required: true }, - }, { - timestamps: true - }); - - // This is necessary to avoid model compilation errors in watch mode - // see https://mongoosejs.com/docs/api/connection.html#connection_Connection-deleteModel - return model(modelName, schema); - -}; diff --git a/src/test/models/TBM_stops.model.ts b/src/test/models/TBM_stops.model.ts new file mode 100644 index 00000000..6ea79f85 --- /dev/null +++ b/src/test/models/TBM_stops.model.ts @@ -0,0 +1,33 @@ +// tbm_stops-model.js - A mongoose model +// +// See http://mongoosejs.com/docs/models.html + +import { InferSchemaType, Schema, model } from "mongoose"; + +const dbTBM_Stops = new Schema( + { + coords: { type: [Number], required: true }, + _id: { type: Number, required: true }, + libelle: { type: String, required: true }, + libelle_lowercase: { type: String, required: true }, + vehicule: { type: String, enum: ["BUS", "TRAM", "BATEAU"], required: true }, + type: { + type: String, + enum: ["CLASSIQUE", "DELESTAGE", "AUTRE", "FICTIF"], + required: true, + }, + actif: { type: Number, enum: [0, 1] as const, required: true }, + }, + { + timestamps: true, + }, +); + +export type dbTBM_Stops = Omit, "coords"> & { + coords: [number, number]; +}; + +export default function (m: typeof model) { + const modelName = "tbm_stops"; + return m(modelName, dbTBM_Stops); +} diff --git a/src/test/models/TBM_vehicles.model.js b/src/test/models/TBM_vehicles.model.js deleted file mode 100644 index 700ba523..00000000 --- a/src/test/models/TBM_vehicles.model.js +++ /dev/null @@ -1,22 +0,0 @@ -// tbm_vehicles-model.js - A mongoose model -// -// See http://mongoosejs.com/docs/models.html -// for more of what you can do here. -module.exports = function (Schema, model) { - const modelName = 'tbm_vehicles'; - const schema = new Schema({ - _id: { type: Number }, - etat: { type: String, required: true }, - rs_sv_ligne_a: { type: Number, ref: 'lines' }, - rg_sv_arret_p_nd: { type: Number, required: true, ref: 'stops' }, - rg_sv_arret_p_na: { type: Number, required: true, ref: 'stops' }, - rs_sv_chem_l: { type: Number, ref: 'lines_routes' }, - }, { - timestamps: true, - }); - - // This is necessary to avoid model compilation errors in watch mode - // see https://mongoosejs.com/docs/api/connection.html#connection_Connection-deleteModel - return model(modelName, schema); - -}; diff --git a/src/test/models/TBM_vehicles.model.ts b/src/test/models/TBM_vehicles.model.ts new file mode 100644 index 00000000..dd1d3f87 --- /dev/null +++ b/src/test/models/TBM_vehicles.model.ts @@ -0,0 +1,26 @@ +// tbm_vehicles-model.js - A mongoose model +// +// See http://mongoosejs.com/docs/models.html + +import { InferSchemaType, Schema, model } from "mongoose"; + +const dbTBM_Vehicles = new Schema( + { + _id: { type: Number, required: true }, + etat: { type: String, required: true }, + rs_sv_ligne_a: { type: Number, ref: "lines" }, + rg_sv_arret_p_nd: { type: Number, required: true, ref: "stops" }, + rg_sv_arret_p_na: { type: Number, required: true, ref: "stops" }, + rs_sv_chem_l: { type: Number, ref: "lines_routes" }, + }, + { + timestamps: true, + }, +); + +export type dbTBM_Vehicles = InferSchemaType; + +export default function (m: typeof model) { + const modelName = "tbm_vehicles"; + return m(modelName, dbTBM_Vehicles); +} diff --git a/src/test/models/addresses.model.js b/src/test/models/addresses.model.js deleted file mode 100644 index 1f77f6b9..00000000 --- a/src/test/models/addresses.model.js +++ /dev/null @@ -1,26 +0,0 @@ -// addresses-model.js - A mongoose model -// -// See http://mongoosejs.com/docs/models.html -// for more of what you can do here. -module.exports = function (Schema, model) { - const modelName = 'addresses'; - const schema = new Schema({ - _id: { type: Number }, - coords: { type: Array, required: true }, - numero: { type: Number, required: true }, - rep: { type: String, required: false }, - type_voie: { type: String, required: true }, - nom_voie: { type: String, required: true }, - nom_voie_lowercase: { type: String, required: true }, - code_postal: { type: Number, required: true }, - fantoir: { type: String, required: true }, - commune: { type: String, required: true }, - }, { - timestamps: true, - }); - - // This is necessary to avoid model compilation errors in watch mode - // see https://mongoosejs.com/docs/api/connection.html#connection_Connection-deleteModel - return model(modelName, schema); - -}; diff --git a/src/test/models/addresses.model.ts b/src/test/models/addresses.model.ts new file mode 100644 index 00000000..278494c5 --- /dev/null +++ b/src/test/models/addresses.model.ts @@ -0,0 +1,32 @@ +// addresses-model.js - A mongoose model +// +// See http://mongoosejs.com/docs/models.html + +import { InferSchemaType, Schema, model } from "mongoose"; + +const dbAddresses = new Schema( + { + _id: { type: Number, required: true }, + coords: { type: [Number], required: true }, + numero: { type: Number, required: true }, + rep: { type: String, required: false }, + type_voie: { type: String, required: true }, + nom_voie: { type: String, required: true }, + nom_voie_lowercase: { type: String, required: true }, + code_postal: { type: Number, required: true }, + fantoir: { type: String, required: true }, + commune: { type: String, required: true }, + }, + { + timestamps: true, + }, +); + +export type dbAddresses = Omit, "coords"> & { + coords: [number, number]; +}; + +export default function (m: typeof model) { + const modelName = "addresses"; + return m(modelName, dbAddresses); +} diff --git a/src/test/models/intersections.model.js b/src/test/models/intersections.model.js deleted file mode 100644 index 62ad0ab5..00000000 --- a/src/test/models/intersections.model.js +++ /dev/null @@ -1,19 +0,0 @@ -// intersections-model.js - A mongoose model -// -// See http://mongoosejs.com/docs/models.html -// for more of what you can do here. -module.exports = function (Schema, model) { - const modelName = 'intersections'; - const schema = new Schema({ - coords: { type: Array, required: true }, - _id: { type: Number }, - nature: { type: String, required: true }, - }, { - timestamps: true - }); - - // This is necessary to avoid model compilation errors in watch mode - // see https://mongoosejs.com/docs/api/connection.html#connection_Connection-deleteModel - return model(modelName, schema); - -}; diff --git a/src/test/models/intersections.model.ts b/src/test/models/intersections.model.ts new file mode 100644 index 00000000..6a64b40a --- /dev/null +++ b/src/test/models/intersections.model.ts @@ -0,0 +1,23 @@ +// intersections-model.js - A mongoose model +// +// See http://mongoosejs.com/docs/models.html + +import { InferSchemaType, Schema, model } from "mongoose"; + +const dbIntersections = new Schema( + { + coords: { type: [Number], required: true }, + _id: { type: Number, required: true }, + nature: { type: String, required: true }, + }, + { + timestamps: true, + }, +); + +export type dbIntersections = InferSchemaType; + +export default function (m: typeof model) { + const modelName = "intersections"; + return m(modelName, dbIntersections); +} diff --git a/src/test/models/sections.model.js b/src/test/models/sections.model.js deleted file mode 100644 index a026ca56..00000000 --- a/src/test/models/sections.model.js +++ /dev/null @@ -1,25 +0,0 @@ -// sections-model.js - A mongoose model -// -// See http://mongoosejs.com/docs/models.html -// for more of what you can do here. -module.exports = function (Schema, model) { - const modelName = 'sections'; - const schema = new Schema({ - coords: { type: Array, required: true }, - distance: { type: Number, required: true }, - _id: { type: Number }, - domanial: { type: Number, required: true }, - groupe: { type: Number, required: true }, - nom_voie: { type: String, required: true }, - rg_fv_graph_dbl: { type: Boolean, required: true }, - rg_fv_graph_nd: { type: Number, required: true, ref: 'nodes' }, - rg_fv_graph_na: { type: Number, required: true, ref: 'nodes' }, - }, { - timestamps: true, - }); - - // This is necessary to avoid model compilation errors in watch mode - // see https://mongoosejs.com/docs/api/connection.html#connection_Connection-deleteModel - return model(modelName, schema); - -}; diff --git a/src/test/models/sections.model.ts b/src/test/models/sections.model.ts new file mode 100644 index 00000000..ea939b49 --- /dev/null +++ b/src/test/models/sections.model.ts @@ -0,0 +1,30 @@ +// sections-model.js - A mongoose model +// +// See http://mongoosejs.com/docs/models.html +import { InferSchemaType, Schema, model } from "mongoose"; + +const dbSections = new Schema( + { + coords: { type: [[Number]], required: true }, + distance: { type: Number, required: true }, + _id: { type: Number, required: true }, + domanial: { type: Number, required: true }, + groupe: { type: Number, required: true }, + nom_voie: { type: String, required: true }, + rg_fv_graph_dbl: { type: Boolean, required: true }, + rg_fv_graph_nd: { type: Number, required: true, ref: "nodes" }, + rg_fv_graph_na: { type: Number, required: true, ref: "nodes" }, + }, + { + timestamps: true, + }, +); + +export type dbSections = Omit, "coords"> & { + coords: [number, number][] +}; + +export default function (m: typeof model) { + const modelName = "sections"; + return m(modelName, dbSections); +} diff --git a/src/test/test.ts b/src/test/test.ts index 0149094f..bc83fc80 100644 --- a/src/test/test.ts +++ b/src/test/test.ts @@ -11,59 +11,36 @@ import Segment from '../utils/Segment'; export type id = number; -export interface section { - _id: id; - createdAt: Date; - updatedAt: Date; - coords: Array<[number, number]>; - distance: number; - domanial: number; - groupe: number; - nom_voie: string; - rg_fv_graph_dbl: boolean; - rg_fv_graph_na: id; - rg_fv_graph_nd: id; -} - -export interface stop { - _id: id; - createdAt: Date; - updatedAt: Date; - coords: [number, number]; - actif: 0 | 1; - libelle: string; - libelle_lowercase: string; - type: string; - vehicule: "BUS" | "TRAM" | "BATEAU"; -} - function cartographicDistance(x1: number, y1: number, x2: number, y2: number): number { - return Math.sqrt((x2-x1)**2+(y2-y1)**2); + return Math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2); } +import sectionsModelInit, { dbSections } from "./models/sections.model" +import stopsModelInit, { dbTBM_Stops } from "./models/TBM_stops.model" + async function run() { //Grab required data await db(); - const sectionsModel: Model
= require('./models/sections.model')(Schema, model); - const stopsModel: Model = require('./models/TBM_Stops.model')(Schema, model); + const sectionsModel = sectionsModelInit(model); + const stopsModel = stopsModelInit(model); async function queryData() { //Important : sections are oriented. //ERROR : there can be 2 sections (or more) linking the same nd to the same na. They need to be both differentiated (by their _id, for example). - const sections: Array
= await sectionsModel.find({}).lean().exec(); + const sections = await sectionsModel.find({}).lean().exec() as Array; //Map section, from s1 to s2 (oriented). - const sectionsMap: Map = new Map(); + const sectionsMap: Map = new Map(); for (const s of sections) { sectionsMap.set(`${s.rg_fv_graph_nd}-${s.rg_fv_graph_na}`, s); if (s.rg_fv_graph_dbl) sectionsMap.set(`${s.rg_fv_graph_na}-${s.rg_fv_graph_nd}`, s); } - const stops: Array = await stopsModel.find({ coords: { '$not': { '$elemMatch': { '$eq': NaN } } } }).lean().exec(); + const stops = await stopsModel.find({ coords: { '$not': { '$elemMatch': { '$eq': NaN } } } }).lean().exec() as Array; return { sections, @@ -85,7 +62,7 @@ async function run() { s.rg_fv_graph_dbl ? footGraph.add_edge(s.rg_fv_graph_nd, s.rg_fv_graph_na, s.distance) : footGraph.add_arc(s.rg_fv_graph_nd, s.rg_fv_graph_na, s.distance); } - + return footGraph; } const b2 = await benchmark(makeGraph, [], 10); @@ -98,40 +75,40 @@ async function run() { //Pre-generate segments to fasten the process (and not redundant computing) //A segment describes a portion of a section (oriented) - const segments: Map = new Map(); + const segments: Map = new Map(); for (const a of arcs) { - const section: section = sectionsMap.get(`${a[0]}-${a[1]}`); - for (let i = 0; i < section.coords.length-1; i++) { + const section: dbSections = sectionsMap.get(`${a[0]}-${a[1]}`); + for (let i = 0; i < section.coords.length - 1; i++) { segments.set(section, { n: i, seg: new Segment( new Point(...section.coords[i]), - new Point(...section.coords[i+1]) + new Point(...section.coords[i + 1]) ) }); } } - const approachedStops: Array<[Point, section, number]> = new Array(stops.length); + const approachedStops: Array<[Point, dbSections, number]> = new Array(stops.length); for (let i = 0; i < stops.length; i++) { - - let closestPoint: [number, Point, section, number] = [Infinity, null, null, null]; - - for (const [ section, { n, seg } ] of segments) { - - const stopPoint: Point = new Point(...stops[i].coords); - const localClosestPoint: Point = seg.closestPointFromPoint(stopPoint); - const distance: number = Point.distance(stopPoint, localClosestPoint); - if (distance < closestPoint[0]) { - closestPoint[0] = distance; - closestPoint[1] = localClosestPoint; - closestPoint[2] = section; - closestPoint[3] = n; - } + + let closestPoint: [number, Point, dbSections, number] = [Infinity, null, null, null]; + + for (const [section, { n, seg }] of segments) { + + const stopPoint: Point = new Point(...stops[i].coords); + const localClosestPoint: Point = seg.closestPointFromPoint(stopPoint); + const distance: number = Point.distance(stopPoint, localClosestPoint); + if (distance < closestPoint[0]) { + closestPoint[0] = distance; + closestPoint[1] = localClosestPoint; + closestPoint[2] = section; + closestPoint[3] = n; } + } approachedStops[i] = [closestPoint[1], closestPoint[2], closestPoint[3]]; @@ -149,13 +126,13 @@ async function run() { //Compute distance from section start to approachedStop const toApproadchedStop: number = section.coords.reduce((acc, v, i, arr) => { - if (i < n && i < arr.length - 1) return acc+cartographicDistance(...v, ...arr[i+1]); + if (i < n && i < arr.length - 1) return acc + cartographicDistance(...v, ...arr[i + 1]); return acc; }, 0) + Point.distance(closestPoint, new Point(...section.coords[n])); //Compute distance form approachedStop to section end const fromApproachedStop: number = section.coords.reduce((acc, v, i, arr) => { - if (i > n && i < arr.length - 1) return acc+cartographicDistance(...v, ...arr[i+1]); + if (i > n && i < arr.length - 1) return acc + cartographicDistance(...v, ...arr[i + 1]); return acc; }, 0) + Point.distance(closestPoint, new Point(...section.coords[n])); @@ -175,22 +152,22 @@ async function run() { return new Promise((res, rej) => { - const workerPool = new WorkerPool(__dirname+'/computePath.js', 8, { adj: footGraph.adj, weights: footGraph.weights, stops }); + const workerPool = new WorkerPool(__dirname + '/computePath.js', 8, { adj: footGraph.adj, weights: footGraph.weights, stops }); - //paths> - const paths: Map> = new Map(); + //paths> + const paths: Map> = new Map(); - for (let i = 0; i < stops.length; i ++) { + for (let i = 0; i < stops.length; i++) { - workerPool.run>(i).then(sourcePaths => { + workerPool.run>(i).then(sourcePaths => { - paths.set(stops[i]._id, sourcePaths); - if (paths.size === stops.length) res(paths); + paths.set(stops[i]._id, sourcePaths); + if (paths.size === stops.length) res(paths); - }).catch(rej); + }).catch(rej); - } - }) + } + }) } const b5 = await benchmark(computePaths, []); @@ -203,4 +180,4 @@ run() .then(console.log) .catch(console.error) -setTimeout(() => {}, 1000000); \ No newline at end of file +setTimeout(() => { }, 1000000); \ No newline at end of file From b9018ddce5fe06682a9154e6d8fc36958081bc17 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Wed, 18 Jan 2023 21:50:55 +0100 Subject: [PATCH 012/251] =?UTF-8?q?=F0=9F=9A=A7=20Move=20to=20strict=20mod?= =?UTF-8?q?e?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/computePath.ts | 11 +++++++---- src/test/test.ts | 10 +++++++--- src/test/utils/Link.ts | 20 +++++++++++--------- src/test/utils/benchmark.ts | 8 ++++---- 4 files changed, 29 insertions(+), 20 deletions(-) diff --git a/src/test/computePath.ts b/src/test/computePath.ts index 29f4bc9c..4664b8fb 100644 --- a/src/test/computePath.ts +++ b/src/test/computePath.ts @@ -8,6 +8,9 @@ let stops: dbSNCF_Stops[] | undefined; export function computePath(i: number) { const sourcePaths: Map = new Map(); + + if (!footGraph || !stops) return sourcePaths; + const [dist, prev] = Dijkstra(footGraph, `stop-${stops[i]._id}`); for (let j = 0; j < stops.length; j++) { @@ -15,7 +18,7 @@ export function computePath(i: number) { // const targetStop: stop = stops[j]; //Better assigning those 2 vars or getting stops[j] 3 times + casting to string 2 times ? // const targetNode = `stop-${targetStop._id}`; - sourcePaths.set(stops[j]._id, [tracePath(prev, `stop-${stops[j]._id}`), dist.get(`stop-${stops[j]._id}`)]); + sourcePaths.set(stops[j]._id, [tracePath(prev, `stop-${stops[j]._id}`), dist.get(`stop-${stops[j]._id}`) || Infinity]); // ` || Infinity` Added for ts mental health } @@ -25,14 +28,14 @@ export function computePath(i: number) { import { parentPort } from 'worker_threads'; import { dbSNCF_Stops } from './models/SNCF_stops.model'; -parentPort.on('message', (data) => { +if (parentPort) parentPort.on('message', (data) => { if (data.init === true) { footGraph = new WeightedGraph(data.adj, data.weights); stops = data.stops; - parentPort.postMessage(true); + if (parentPort) parentPort.postMessage(true); } else { - parentPort.postMessage(computePath(data)); + if (parentPort) parentPort.postMessage(computePath(data)); } }) \ No newline at end of file diff --git a/src/test/test.ts b/src/test/test.ts index bc83fc80..b00184dc 100644 --- a/src/test/test.ts +++ b/src/test/test.ts @@ -50,6 +50,7 @@ async function run() { } const b1 = await benchmark(queryData, [], 10); + if (!b1.lastReturn) return console.log(`b1 return null`) const { sections, sectionsMap, stops } = b1.lastReturn; function makeGraph() { @@ -66,6 +67,7 @@ async function run() { return footGraph; } const b2 = await benchmark(makeGraph, [], 10); + if (!b2.lastReturn) return console.log(`b2 return null`) const footGraph = b2.lastReturn; const arcs = footGraph.arcs; @@ -78,7 +80,8 @@ async function run() { const segments: Map = new Map(); for (const a of arcs) { - const section: dbSections = sectionsMap.get(`${a[0]}-${a[1]}`); + const section = sectionsMap.get(`${a[0]}-${a[1]}`); + if (!section) continue // Added for ts mental health for (let i = 0; i < section.coords.length - 1; i++) { segments.set(section, { @@ -95,7 +98,7 @@ async function run() { const approachedStops: Array<[Point, dbSections, number]> = new Array(stops.length); for (let i = 0; i < stops.length; i++) { - let closestPoint: [number, Point, dbSections, number] = [Infinity, null, null, null]; + let closestPoint: [number, Point | null, dbSections | null, number | null] = [Infinity, null, null, null]; for (const [section, { n, seg }] of segments) { @@ -110,12 +113,13 @@ async function run() { } } - approachedStops[i] = [closestPoint[1], closestPoint[2], closestPoint[3]]; + if (closestPoint[1] !== null && closestPoint[2] !== null && closestPoint[3] !== null) approachedStops[i] = [closestPoint[1], closestPoint[2], closestPoint[3]]; } return approachedStops; } const b3 = await benchmark(ComputeApproachedStops, [], 1); + if (!b3.lastReturn) return console.log(`b3 return null`) const approachedStops = b3.lastReturn; function updateGraph() { diff --git a/src/test/utils/Link.ts b/src/test/utils/Link.ts index aca0c110..cf037700 100644 --- a/src/test/utils/Link.ts +++ b/src/test/utils/Link.ts @@ -1,11 +1,13 @@ -export type LinkOrEmpty = Link | symbol; +const emptyLink = Symbol('emptyLink') + +export type LinkOrEmpty = Link | typeof emptyLink; /** * @description Class of chained array */ export class Link { - static emptyLink = Symbol('emptyLink'); + static emptyLink: typeof emptyLink = emptyLink; private _value: Type; private _next: LinkOrEmpty; @@ -37,7 +39,7 @@ export class Link { /** * @description Get the next LinkOrEmpty of this chained array */ - get next(): LinkOrEmpty { + get next(): LinkOrEmpty { return this._next; } @@ -51,7 +53,7 @@ export class Link { */ get depth(): number { if (!Link.isLink(this._next)) return 1; - return 1+(this._next as Link).depth; + return 1 + (this._next as Link).depth; } toArrayRec(): any[] { @@ -89,7 +91,7 @@ export class Link { get_rec(n: number): any { if (n < 0) throw new Error("Invalid index"); if (n == 0) return this.value; - if (this._next instanceof Link) return this._next.get(n-1); + if (this._next instanceof Link) return this._next.get(n - 1); else throw new Error("Index out of range"); } @@ -109,11 +111,11 @@ export class Link { /** * @description Create chained array from array - * @param {Array} array The array to convert into chained array + * @param {Array} a The array to convert into chained array */ - static fromArray(a: Array = []): Link { - let m: Link = null; - for (let i = a.length-1; i >= 0; i--) {; + static fromArray(a: Array = []): LinkOrEmpty { + let m: LinkOrEmpty = Link.emptyLink; + for (let i = a.length - 1; i >= 0; i--) { m = new this(a[i], m); }; return m; diff --git a/src/test/utils/benchmark.ts b/src/test/utils/benchmark.ts index 24702db6..bccb3a24 100644 --- a/src/test/utils/benchmark.ts +++ b/src/test/utils/benchmark.ts @@ -1,14 +1,14 @@ export async function benchmark(f: (...args: any[]) => returnType, args: any[] = [], times: number = 1) { const starts: number[] = new Array(times); const ends: number[] = new Array(times); - let lastReturn: Awaited; + let lastReturn: Awaited | null = null; for (let i = 0; i < times; i++) { starts[i] = performance.now(); lastReturn = await f(...args); ends[i] = performance.now(); }; - const durations = ends.map((e, i) => new Duration(e-starts[i])) - const totalDuration = new Duration(durations.reduce((acc, v) => acc+v.ms, 0)); + const durations = ends.map((e, i) => new Duration(e - starts[i])) + const totalDuration = new Duration(durations.reduce((acc, v) => acc + v.ms, 0)); return { fName: f.name, args, @@ -16,7 +16,7 @@ export async function benchmark(f: (...args: any[]) => returnType, a ends, durations, totalDuration, - averageDuration: new Duration(totalDuration.ms/times), + averageDuration: new Duration(totalDuration.ms / times), times, lastReturn, }; From b758bdf42455d06d91d2c29d73bd1edc0a94fb6d Mon Sep 17 00:00:00 2001 From: Catatomik Date: Wed, 18 Jan 2023 21:51:00 +0100 Subject: [PATCH 013/251] =?UTF-8?q?=E2=9A=A1=F0=9F=9A=A7=20Move=20to=20str?= =?UTF-8?q?ict=20mode?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/utils/Workers.ts | 155 ++++++++++++++++++-------------------- 1 file changed, 72 insertions(+), 83 deletions(-) diff --git a/src/test/utils/Workers.ts b/src/test/utils/Workers.ts index cd125440..64035506 100644 --- a/src/test/utils/Workers.ts +++ b/src/test/utils/Workers.ts @@ -1,18 +1,23 @@ import { Worker } from 'worker_threads' +import { Deferred, rejectCb, resolveCb } from './Asyncs'; import { Duration } from './benchmark'; import { Queue } from './Queue'; const nsPerMs = BigInt(1e6) +enum Status { + Idle, + Busy, +} + interface poolWorker { id: number; - status: 'IDLE' | 'BUSY'; + status: Status; worker: Worker; work: queued | null; } -export type resolveCb = (value: any) => void; -export type rejectCb = (reason?: any) => void; -type queued = [any, resolveCb, rejectCb]; + +type queued = [any, resolveCb, rejectCb]; export class WorkerPool { @@ -32,21 +37,21 @@ export class WorkerPool { this.pool[i] = { id: i, - status: 'IDLE', + status: Status.Idle, worker: new Worker(this.script), work: null, }; if (initData) { const worker = this.pool[i]; - worker.status = 'BUSY'; + worker.status = Status.Busy; console.log(`Initializing worker ${worker.id}`); worker.worker.postMessage({ init: true, ...initData }); worker.worker.once('message', (v) => { if (v === true) { - worker.status = 'IDLE'; + worker.status = Status.Idle; console.log(`Initialized worker ${worker.id}`); @@ -59,93 +64,77 @@ export class WorkerPool { } } - run(data: any, res: resolveCb, rej: rejectCb): void + run(data: any, res: resolveCb, rej: rejectCb): void run(data: any): Promise - run(data: any, res?: resolveCb, rej?: rejectCb) { - if (res && typeof res == 'function' && rej && typeof rej == 'function') { - - const work: queued = [data, res, rej]; - - const worker = this.getIdleWorker(); - - console.log(`Running worker ${worker.id} (${this.queue.size})`); - - worker.status = 'BUSY'; - worker.work = work; - - const startTime = process.hrtime.bigint(); - worker.worker.postMessage(data); + async run(data: any, res?: resolveCb, rej?: rejectCb) { + + let def: Deferred | null = null; + let resolve: resolveCb; + let reject: rejectCb; + + if (!res || !rej) { + def = new Deferred(); + resolve = def.resolve; + reject = def.reject; + } else { + resolve = res; + reject = rej; + } - const onceMessage = (result: any) => { - const delta = new Duration(Number((process.hrtime.bigint()-startTime)/nsPerMs)); - worker.status = 'IDLE'; - res(result); - console.log(`Finished worker ${worker.id} after ${delta.totalSeconds}s${delta.rSeconds} (${this.queue.size})`); - this.runCallback(); - worker.worker.removeListener('error', onceError); - }; - worker.worker.once('message', onceMessage); - - const onceError = (err: any) => { - worker.status = 'IDLE'; - rej(err); - console.log(`Finished worker ${worker.id} (${this.queue.size})`); - this.runCallback(); - worker.worker.removeListener('message', onceMessage); - }; - worker.worker.once('error', onceError); - - } else return new Promise((res, rej) => { - - const work: queued = [data, res, rej]; - - const worker = this.getIdleWorker(); - if (!worker) this.queue.enqueue(work), console.log(`Queued (${this.queue.size})`); - else { - - console.log(`Running worker ${worker.id} (${this.queue.size})`) - - worker.status = 'BUSY'; - worker.work = work; - - const startTime = process.hrtime.bigint(); - worker.worker.postMessage(data); - - const onceMessage = (result: any) => { - const delta = new Duration(Number((process.hrtime.bigint()-startTime)/nsPerMs)); - worker.status = 'IDLE'; - res(result); - console.log(`Finished worker ${worker.id} after ${delta.totalSeconds}s${delta.rSeconds} (${this.queue.size})`); - this.runCallback(); - worker.worker.removeListener('error', onceError); - }; - worker.worker.once('message', onceMessage); - - const onceError = (err: any) => { - worker.status = 'IDLE'; - rej(err); - console.log(`Finished worker ${worker.id} (${this.queue.size})`); - this.runCallback(); - worker.worker.removeListener('message', onceMessage); - }; - worker.worker.once('error', onceError); + const job: queued = [data, resolve, reject]; - } + const worker = this.getIdleWorker(); + if (!worker) { + this.queue.enqueue(job) + console.log(`Delayed, queued (${this.queue.size})`); + return reject("Delayed"); + } - }) + console.log(`Running worker ${worker.id} (${this.queue.size})`); + + worker.status = Status.Busy; + worker.work = job; + + const startTime = process.hrtime.bigint(); + worker.worker.postMessage(data); + + const onceMessage = (result: any) => { + const delta = new Duration(Number((process.hrtime.bigint() - startTime) / nsPerMs)); + worker.status = Status.Idle; + resolve(result); + console.log(`Finished worker ${worker.id} after ${delta.totalSeconds}s${delta.rSeconds} (${this.queue.size})`); + this.runCallback(); + worker.worker.removeListener('message', onceMessage); + worker.worker.removeListener('error', onceError); + }; + const onceError = (err: any) => { + worker.status = Status.Idle; + reject(err); + console.log(`Finished worker ${worker.id} (${this.queue.size})`); + this.runCallback(); + worker.worker.removeListener('error', onceError); + worker.worker.removeListener('message', onceMessage); + }; + + worker.worker.once('message', onceMessage); + worker.worker.once('error', onceError); + + if (!res || !rej) return def!.promise } - protected runCallback(): void { - - if (!this.queue.size) return; - const nextQueued = this.queue.dequeue(); - this.run(...nextQueued); + protected runCallback(job?: queued) { + + if (!job) { + if (!this.queue.size) return; + job = this.queue.dequeue(); + } + return this.run(...job); } protected getIdleWorker(): poolWorker | undefined { - return this.pool.find(w => w.status === 'IDLE'); + return this.pool.find(w => w.status === Status.Idle); } From 0bb4bd8d21af7a2c8bc371d2b4f7a1cc342ea18f Mon Sep 17 00:00:00 2001 From: Catatomik Date: Wed, 18 Jan 2023 21:51:08 +0100 Subject: [PATCH 014/251] =?UTF-8?q?=E2=9C=A8=20Deferred=20class?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/utils/Asyncs.ts | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 src/test/utils/Asyncs.ts diff --git a/src/test/utils/Asyncs.ts b/src/test/utils/Asyncs.ts new file mode 100644 index 00000000..7550885b --- /dev/null +++ b/src/test/utils/Asyncs.ts @@ -0,0 +1,18 @@ +export type resolveCb = (value: T) => void; +export type rejectCb = (reason?: any) => void; + +export class Deferred { + + public promise: Promise; + public resolve!: resolveCb; + public reject!: rejectCb; + + constructor() { + + this.promise = new Promise((resolve, reject) => { + this.reject = reject; + this.resolve = resolve; + }) + + } +} \ No newline at end of file From b1d4b05228e45a3d8e35d7f08e9ca2d92f938191 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Wed, 18 Jan 2023 22:04:05 +0100 Subject: [PATCH 015/251] =?UTF-8?q?=F0=9F=9A=A7=20add=20package-lock?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/package-lock.json b/package-lock.json index 2e8ee225..bbed8226 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,9 @@ "name": "raptor", "version": "0.1.1", "license": "ISC", + "dependencies": { + "mongoose": "^6.8.4" + }, "devDependencies": { "typescript": "^4.9.4" } From 08f7af9bb698a0c33ca886361a3d3b090ee0c1f4 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Thu, 19 Jan 2023 10:21:22 +0100 Subject: [PATCH 016/251] =?UTF-8?q?=F0=9F=9A=A7=20Typo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/test.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/test/test.ts b/src/test/test.ts index b00184dc..2b7f47de 100644 --- a/src/test/test.ts +++ b/src/test/test.ts @@ -34,24 +34,24 @@ async function run() { //ERROR : there can be 2 sections (or more) linking the same nd to the same na. They need to be both differentiated (by their _id, for example). const sections = await sectionsModel.find({}).lean().exec() as Array; //Map section, from s1 to s2 (oriented). - const sectionsMap: Map = new Map(); + const mapppedSections: Map = new Map(); for (const s of sections) { - sectionsMap.set(`${s.rg_fv_graph_nd}-${s.rg_fv_graph_na}`, s); - if (s.rg_fv_graph_dbl) sectionsMap.set(`${s.rg_fv_graph_na}-${s.rg_fv_graph_nd}`, s); + mapppedSections.set(`${s.rg_fv_graph_nd}-${s.rg_fv_graph_na}`, s); + if (s.rg_fv_graph_dbl) mapppedSections.set(`${s.rg_fv_graph_na}-${s.rg_fv_graph_nd}`, s); } const stops = await stopsModel.find({ coords: { '$not': { '$elemMatch': { '$eq': NaN } } } }).lean().exec() as Array; return { sections, - sectionsMap, + mapppedSections, stops } } const b1 = await benchmark(queryData, [], 10); if (!b1.lastReturn) return console.log(`b1 return null`) - const { sections, sectionsMap, stops } = b1.lastReturn; + const { sections, mapppedSections, stops } = b1.lastReturn; function makeGraph() { @@ -80,7 +80,7 @@ async function run() { const segments: Map = new Map(); for (const a of arcs) { - const section = sectionsMap.get(`${a[0]}-${a[1]}`); + const section = mapppedSections.get(`${a[0]}-${a[1]}`); if (!section) continue // Added for ts mental health for (let i = 0; i < section.coords.length - 1; i++) { From 40ca51af603e3a471c7d9ccb929e310e86f0bf6b Mon Sep 17 00:00:00 2001 From: Catatomik Date: Thu, 19 Jan 2023 12:25:49 +0100 Subject: [PATCH 017/251] =?UTF-8?q?=F0=9F=90=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/computePath.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/computePath.ts b/src/test/computePath.ts index 4664b8fb..3f056b63 100644 --- a/src/test/computePath.ts +++ b/src/test/computePath.ts @@ -11,7 +11,7 @@ export function computePath(i: number) { if (!footGraph || !stops) return sourcePaths; - const [dist, prev] = Dijkstra(footGraph, `stop-${stops[i]._id}`); + const [dist, prev] = Dijkstra(footGraph, [`stop-${stops[i]._id}`]); for (let j = 0; j < stops.length; j++) { From 6a2b9f6f6de7aa8f087389cb65e5f1ec05a3fd38 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Thu, 19 Jan 2023 12:36:57 +0100 Subject: [PATCH 018/251] =?UTF-8?q?=F0=9F=9A=A7=20Remove=20unused=20import?= =?UTF-8?q?s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/test.ts b/src/test/test.ts index 2b7f47de..061f8eec 100644 --- a/src/test/test.ts +++ b/src/test/test.ts @@ -1,4 +1,4 @@ -import { Schema, model, Model } from 'mongoose'; +import { model } from 'mongoose'; import db from './utils/mongoose'; import { benchmark } from './utils/benchmark'; import { WorkerPool } from './utils/Workers'; From 79abc5fee0fb64f1db2d4401402b879c0d5c6d52 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Thu, 19 Jan 2023 17:59:48 +0100 Subject: [PATCH 019/251] =?UTF-8?q?=E2=9C=A8=20Unique=20filter?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/utils/{Asyncs.ts => ultils.ts} | 7 +++++++ 1 file changed, 7 insertions(+) rename src/test/utils/{Asyncs.ts => ultils.ts} (70%) diff --git a/src/test/utils/Asyncs.ts b/src/test/utils/ultils.ts similarity index 70% rename from src/test/utils/Asyncs.ts rename to src/test/utils/ultils.ts index 7550885b..d950812c 100644 --- a/src/test/utils/Asyncs.ts +++ b/src/test/utils/ultils.ts @@ -15,4 +15,11 @@ export class Deferred { }) } +} + +/** + * @description Checks unicity of a value in an array + */ +export function unique(v: T, i: number, arr: T[]): boolean { + return arr.indexOf(v) === i; } \ No newline at end of file From 80479419867afa788c0e678423135cb720a75e60 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Thu, 19 Jan 2023 18:00:11 +0100 Subject: [PATCH 020/251] =?UTF-8?q?=F0=9F=90=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/utils/Workers.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/utils/Workers.ts b/src/test/utils/Workers.ts index 64035506..19936bc8 100644 --- a/src/test/utils/Workers.ts +++ b/src/test/utils/Workers.ts @@ -1,5 +1,5 @@ import { Worker } from 'worker_threads' -import { Deferred, rejectCb, resolveCb } from './Asyncs'; +import { Deferred, rejectCb, resolveCb } from './ultils'; import { Duration } from './benchmark'; import { Queue } from './Queue'; const nsPerMs = BigInt(1e6) @@ -87,7 +87,7 @@ export class WorkerPool { if (!worker) { this.queue.enqueue(job) console.log(`Delayed, queued (${this.queue.size})`); - return reject("Delayed"); + return def?.promise; } console.log(`Running worker ${worker.id} (${this.queue.size})`); From 55ab47332ca1e060de46dd4cd8fa0ccd85c2d0c8 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Thu, 19 Jan 2023 18:00:25 +0100 Subject: [PATCH 021/251] =?UTF-8?q?=E2=9C=A8=20Stringify=20Duration?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/utils/benchmark.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/test/utils/benchmark.ts b/src/test/utils/benchmark.ts index bccb3a24..b309be1b 100644 --- a/src/test/utils/benchmark.ts +++ b/src/test/utils/benchmark.ts @@ -56,4 +56,8 @@ export class Duration { return this.time % 60000; } + toString() { + return `${this.totalMinuts}:${this.totalSeconds}:${this.rSeconds}` + } + } \ No newline at end of file From 9659274965e410b6f208265c1a5ad9f5278b2a1d Mon Sep 17 00:00:00 2001 From: Catatomik Date: Thu, 19 Jan 2023 18:01:08 +0100 Subject: [PATCH 022/251] =?UTF-8?q?=F0=9F=90=9B=F0=9F=92=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/test.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/test/test.ts b/src/test/test.ts index 061f8eec..b8699ca1 100644 --- a/src/test/test.ts +++ b/src/test/test.ts @@ -40,7 +40,7 @@ async function run() { if (s.rg_fv_graph_dbl) mapppedSections.set(`${s.rg_fv_graph_na}-${s.rg_fv_graph_nd}`, s); } - const stops = await stopsModel.find({ coords: { '$not': { '$elemMatch': { '$eq': NaN } } } }).lean().exec() as Array; + const stops = await stopsModel.find({ coords: { '$not': { '$elemMatch': { '$eq': Infinity } } } }).lean().exec() as Array; return { sections, @@ -50,6 +50,7 @@ async function run() { } const b1 = await benchmark(queryData, [], 10); + console.log("b1 ended") if (!b1.lastReturn) return console.log(`b1 return null`) const { sections, mapppedSections, stops } = b1.lastReturn; @@ -67,6 +68,7 @@ async function run() { return footGraph; } const b2 = await benchmark(makeGraph, [], 10); + console.log("b2 ended") if (!b2.lastReturn) return console.log(`b2 return null`) const footGraph = b2.lastReturn; @@ -95,6 +97,7 @@ async function run() { } } + /**@description [distance to closest point, closest point, section containing this point, indice of segment composing the section] */ const approachedStops: Array<[Point, dbSections, number]> = new Array(stops.length); for (let i = 0; i < stops.length; i++) { @@ -118,7 +121,8 @@ async function run() { } return approachedStops; } - const b3 = await benchmark(ComputeApproachedStops, [], 1); + const b3 = await benchmark(ComputeApproachedStops, [], 2); + console.log("b3 ended") if (!b3.lastReturn) return console.log(`b3 return null`) const approachedStops = b3.lastReturn; @@ -126,6 +130,7 @@ async function run() { //Pushes new approached stops into graph, just like a proxy on a section for (let i = 0; i < approachedStops.length; i++) { + if (!approachedStops[i]) continue; // couldn't find an approched stop (coords = Infinity) const [closestPoint, section, n] = approachedStops[i] //Compute distance from section start to approachedStop @@ -152,6 +157,7 @@ async function run() { } } const b4 = await benchmark(updateGraph, []); + console.log("b4 ended") function computePaths() { return new Promise((res, rej) => { @@ -175,6 +181,7 @@ async function run() { } const b5 = await benchmark(computePaths, []); + console.log("b5 ended") const paths = b5.lastReturn; return { b1, b2, b3, b4, b5 }; From c9fa26a0d0483385c619dbba7abb3018c5e31386 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Thu, 19 Jan 2023 19:30:43 +0100 Subject: [PATCH 023/251] =?UTF-8?q?=F0=9F=9A=A7=20Better=20types?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/computePath.ts | 47 +++++++++++++++++++++++---------------- src/test/test.ts | 8 +++---- src/test/utils/Workers.ts | 19 ++++++++-------- 3 files changed, 41 insertions(+), 33 deletions(-) diff --git a/src/test/computePath.ts b/src/test/computePath.ts index 3f056b63..9154b245 100644 --- a/src/test/computePath.ts +++ b/src/test/computePath.ts @@ -2,16 +2,40 @@ import { path, Dijkstra, tracePath } from '../FootPaths'; import { WeightedGraph } from '../utils/Graph'; import { id } from './test'; +import { parentPort } from 'worker_threads'; +import { dbSNCF_Stops } from './models/SNCF_stops.model'; +import { dbTBM_Stops } from './models/TBM_stops.model'; + +export interface initData { + adj: Required>[0]; + weights: Required>[1]; + stops: Array +} +export function initialCallback(data: initData) { + footGraph = new WeightedGraph(data.adj, data.weights); + stops = data.stops; + if (parentPort) parentPort.postMessage(true); +} + +if (parentPort) parentPort.on('message', (data: initData | Parameters) => { + if (data instanceof Array) { + if (parentPort) parentPort.postMessage(computePath(...data)); + } else { + initialCallback(data) + } + +}) + let footGraph: WeightedGraph | undefined; -let stops: dbSNCF_Stops[] | undefined; +let stops: initData["stops"] | undefined; -export function computePath(i: number) { +export function computePath(stopId: string) { const sourcePaths: Map = new Map(); if (!footGraph || !stops) return sourcePaths; - const [dist, prev] = Dijkstra(footGraph, [`stop-${stops[i]._id}`]); + const [dist, prev] = Dijkstra(footGraph, [stopId]); for (let j = 0; j < stops.length; j++) { @@ -23,19 +47,4 @@ export function computePath(i: number) { } return sourcePaths; -} - -import { parentPort } from 'worker_threads'; -import { dbSNCF_Stops } from './models/SNCF_stops.model'; - -if (parentPort) parentPort.on('message', (data) => { - - if (data.init === true) { - footGraph = new WeightedGraph(data.adj, data.weights); - stops = data.stops; - if (parentPort) parentPort.postMessage(true); - } else { - if (parentPort) parentPort.postMessage(computePath(data)); - } - -}) \ No newline at end of file +} \ No newline at end of file diff --git a/src/test/test.ts b/src/test/test.ts index b8699ca1..f291440a 100644 --- a/src/test/test.ts +++ b/src/test/test.ts @@ -4,7 +4,6 @@ import { benchmark } from './utils/benchmark'; import { WorkerPool } from './utils/Workers'; import { WeightedGraph } from '../utils/Graph'; -import { path } from '../FootPaths'; import Point from '../utils/Point'; import Segment from '../utils/Segment'; @@ -19,6 +18,7 @@ function cartographicDistance(x1: number, y1: number, x2: number, y2: number): n import sectionsModelInit, { dbSections } from "./models/sections.model" import stopsModelInit, { dbTBM_Stops } from "./models/TBM_stops.model" +import { computePath, initialCallback } from './computePath'; async function run() { @@ -162,14 +162,14 @@ async function run() { return new Promise((res, rej) => { - const workerPool = new WorkerPool(__dirname + '/computePath.js', 8, { adj: footGraph.adj, weights: footGraph.weights, stops }); + const workerPool = new WorkerPool(__dirname + '/computePath.js', 8, { adj: footGraph.adj, weights: footGraph.weights, stops }); //paths> - const paths: Map> = new Map(); + const paths: Map> = new Map(); for (let i = 0; i < stops.length; i++) { - workerPool.run>(i).then(sourcePaths => { + workerPool.run([`stop-${stops[i]._id}`]).then(sourcePaths => { paths.set(stops[i]._id, sourcePaths); if (paths.size === stops.length) res(paths); diff --git a/src/test/utils/Workers.ts b/src/test/utils/Workers.ts index 19936bc8..8439ecf6 100644 --- a/src/test/utils/Workers.ts +++ b/src/test/utils/Workers.ts @@ -16,17 +16,16 @@ interface poolWorker { work: queued | null; } - type queued = [any, resolveCb, rejectCb]; -export class WorkerPool { +export class WorkerPool any> { readonly script: string; readonly size: number; readonly pool: poolWorker[]; readonly queue: Queue; - constructor(script: string, size: number, initData?: any) { + constructor(script: string, size: number, initData?: Parameters[0]) { this.script = script; this.size = size; @@ -48,7 +47,7 @@ export class WorkerPool { console.log(`Initializing worker ${worker.id}`); - worker.worker.postMessage({ init: true, ...initData }); + worker.worker.postMessage({ ...initData }); worker.worker.once('message', (v) => { if (v === true) { worker.status = Status.Idle; @@ -64,16 +63,16 @@ export class WorkerPool { } } - run(data: any, res: resolveCb, rej: rejectCb): void - run(data: any): Promise - async run(data: any, res?: resolveCb, rej?: rejectCb) { + run any>(data: Parameters, res: resolveCb>, rej: rejectCb): void + run any>(data: Parameters): Promise> + async run any>(data: Parameters, res?: resolveCb>, rej?: rejectCb) { - let def: Deferred | null = null; - let resolve: resolveCb; + let def: Deferred> | null = null; + let resolve: resolveCb>; let reject: rejectCb; if (!res || !rej) { - def = new Deferred(); + def = new Deferred>(); resolve = def.resolve; reject = def.reject; } else { From ef06afa71b39a570d356960f9165ae61b4a99318 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Thu, 19 Jan 2023 23:01:15 +0100 Subject: [PATCH 024/251] =?UTF-8?q?=F0=9F=92=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/utils/ultils.ts | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/test/utils/ultils.ts b/src/test/utils/ultils.ts index d950812c..7550885b 100644 --- a/src/test/utils/ultils.ts +++ b/src/test/utils/ultils.ts @@ -15,11 +15,4 @@ export class Deferred { }) } -} - -/** - * @description Checks unicity of a value in an array - */ -export function unique(v: T, i: number, arr: T[]): boolean { - return arr.indexOf(v) === i; } \ No newline at end of file From cbb31f92be52ae7e905099dddd99c2310149caa7 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Thu, 19 Jan 2023 23:08:52 +0100 Subject: [PATCH 025/251] =?UTF-8?q?=E2=9A=A1=20Filter=20unique=20stops=20c?= =?UTF-8?q?oords?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/test.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/test/test.ts b/src/test/test.ts index f291440a..62901170 100644 --- a/src/test/test.ts +++ b/src/test/test.ts @@ -40,7 +40,8 @@ async function run() { if (s.rg_fv_graph_dbl) mapppedSections.set(`${s.rg_fv_graph_na}-${s.rg_fv_graph_nd}`, s); } - const stops = await stopsModel.find({ coords: { '$not': { '$elemMatch': { '$eq': Infinity } } } }).lean().exec() as Array; + const stops = (await stopsModel.find({ coords: { '$not': { '$elemMatch': { '$eq': Infinity } } } }).lean().exec() as Array) + .filter((s, _, arr) => !arr.find(ss => s.coords[0] === ss.coords[0] && s.coords[1] === ss.coords[1] && s._id !== ss._id)); return { sections, From bb4d7822d29a061923e97d4bc61af13f5efa324f Mon Sep 17 00:00:00 2001 From: Catatomik Date: Fri, 20 Jan 2023 14:34:21 +0100 Subject: [PATCH 026/251] =?UTF-8?q?=E2=9A=A1=20Memory?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/computePath.ts | 15 ++++++++------- src/test/test.ts | 15 +++++++++------ 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/src/test/computePath.ts b/src/test/computePath.ts index 9154b245..ca3982ef 100644 --- a/src/test/computePath.ts +++ b/src/test/computePath.ts @@ -1,19 +1,19 @@ -import { path, Dijkstra, tracePath } from '../FootPaths'; +import { path, Dijkstra, tracePath, DijkstraOptions } from '../FootPaths'; import { WeightedGraph } from '../utils/Graph'; -import { id } from './test'; +import { id, Section, Stop } from './test'; import { parentPort } from 'worker_threads'; -import { dbSNCF_Stops } from './models/SNCF_stops.model'; -import { dbTBM_Stops } from './models/TBM_stops.model'; export interface initData { adj: Required>[0]; weights: Required>[1]; - stops: Array + stops: Array
+ options?: DijkstraOptions; } export function initialCallback(data: initData) { footGraph = new WeightedGraph(data.adj, data.weights); stops = data.stops; + options = data.options; if (parentPort) parentPort.postMessage(true); } @@ -28,6 +28,7 @@ if (parentPort) parentPort.on('message', (data: initData | Parameters; +export type Stop = Pick; + async function run() { //Grab required data @@ -32,15 +35,15 @@ async function run() { //Important : sections are oriented. //ERROR : there can be 2 sections (or more) linking the same nd to the same na. They need to be both differentiated (by their _id, for example). - const sections = await sectionsModel.find({}).lean().exec() as Array; + const sections = await sectionsModel.find({}).select({ _id: 1, coords: 1, distance: 1, rg_fv_graph_dbl: 1, rg_fv_graph_nd: 1, rg_fv_graph_na: 1 }).lean().exec() as unknown as Section[]; //Map section, from s1 to s2 (oriented). - const mapppedSections: Map = new Map(); + const mapppedSections: Map = new Map(); for (const s of sections) { mapppedSections.set(`${s.rg_fv_graph_nd}-${s.rg_fv_graph_na}`, s); if (s.rg_fv_graph_dbl) mapppedSections.set(`${s.rg_fv_graph_na}-${s.rg_fv_graph_nd}`, s); } - const stops = (await stopsModel.find({ coords: { '$not': { '$elemMatch': { '$eq': Infinity } } } }).lean().exec() as Array) + const stops = (await stopsModel.find({ coords: { '$not': { '$elemMatch': { '$eq': Infinity } } } }).select({ _id: 1, coords: 1 }).lean().exec() as unknown as Stop[]) .filter((s, _, arr) => !arr.find(ss => s.coords[0] === ss.coords[0] && s.coords[1] === ss.coords[1] && s._id !== ss._id)); return { @@ -80,7 +83,7 @@ async function run() { //Pre-generate segments to fasten the process (and not redundant computing) //A segment describes a portion of a section (oriented) - const segments: Map = new Map(); + const segments: Map = new Map(); for (const a of arcs) { const section = mapppedSections.get(`${a[0]}-${a[1]}`); @@ -99,10 +102,10 @@ async function run() { } /**@description [distance to closest point, closest point, section containing this point, indice of segment composing the section] */ - const approachedStops: Array<[Point, dbSections, number]> = new Array(stops.length); + const approachedStops: Array<[Point, Section, number]> = new Array(stops.length); for (let i = 0; i < stops.length; i++) { - let closestPoint: [number, Point | null, dbSections | null, number | null] = [Infinity, null, null, null]; + let closestPoint: [number, Point | null, Section | null, number | null] = [Infinity, null, null, null]; for (const [section, { n, seg }] of segments) { From 6492bfbdc4b31dd9f165159924735efce40b4a5a Mon Sep 17 00:00:00 2001 From: Catatomik Date: Fri, 20 Jan 2023 16:51:49 +0100 Subject: [PATCH 027/251] =?UTF-8?q?=F0=9F=90=9B=20Correct=20types?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/utils/Workers.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/utils/Workers.ts b/src/test/utils/Workers.ts index 8439ecf6..69907c3a 100644 --- a/src/test/utils/Workers.ts +++ b/src/test/utils/Workers.ts @@ -64,11 +64,11 @@ export class WorkerPool any> { } run any>(data: Parameters, res: resolveCb>, rej: rejectCb): void - run any>(data: Parameters): Promise> - async run any>(data: Parameters, res?: resolveCb>, rej?: rejectCb) { + run any>(data: Parameters): Promise>> + async run any>(data: Parameters, res?: resolveCb>>, rej?: rejectCb) { let def: Deferred> | null = null; - let resolve: resolveCb>; + let resolve: resolveCb>>; let reject: rejectCb; if (!res || !rej) { From da80555698424aee36d529b90baa7aebb89f5535 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Fri, 20 Jan 2023 16:57:29 +0100 Subject: [PATCH 028/251] =?UTF-8?q?=F0=9F=9A=A7=E2=9C=A8=20Log=20option=20?= =?UTF-8?q?&=20correct=20types?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/utils/benchmark.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/test/utils/benchmark.ts b/src/test/utils/benchmark.ts index b309be1b..a8b60c62 100644 --- a/src/test/utils/benchmark.ts +++ b/src/test/utils/benchmark.ts @@ -1,7 +1,7 @@ -export async function benchmark(f: (...args: any[]) => returnType, args: any[] = [], times: number = 1) { +export async function benchmark any>(f: F, args: Parameters, times: number = 1, logStats = true) { const starts: number[] = new Array(times); const ends: number[] = new Array(times); - let lastReturn: Awaited | null = null; + let lastReturn: Awaited> | null = null; for (let i = 0; i < times; i++) { starts[i] = performance.now(); lastReturn = await f(...args); @@ -9,6 +9,8 @@ export async function benchmark(f: (...args: any[]) => returnType, a }; const durations = ends.map((e, i) => new Duration(e - starts[i])) const totalDuration = new Duration(durations.reduce((acc, v) => acc + v.ms, 0)); + const averageDuration = new Duration(totalDuration.ms / times); + if (logStats) console.log(`Benchmark of ${f.name || "anonymous"} : ${averageDuration}`); return { fName: f.name, args, @@ -16,7 +18,7 @@ export async function benchmark(f: (...args: any[]) => returnType, a ends, durations, totalDuration, - averageDuration: new Duration(totalDuration.ms / times), + averageDuration, times, lastReturn, }; From 24d00c4bdea9731fd4e25444e79b2b2e6fde946b Mon Sep 17 00:00:00 2001 From: Catatomik Date: Fri, 3 Feb 2023 21:48:11 +0100 Subject: [PATCH 029/251] =?UTF-8?q?=F0=9F=9A=A7=20Add=20benchmarking?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/computePath.ts | 41 +++++++++++++++++++++++++++++++++-------- src/test/test.ts | 2 +- 2 files changed, 34 insertions(+), 9 deletions(-) diff --git a/src/test/computePath.ts b/src/test/computePath.ts index ca3982ef..23e75067 100644 --- a/src/test/computePath.ts +++ b/src/test/computePath.ts @@ -1,8 +1,9 @@ import { path, Dijkstra, tracePath, DijkstraOptions } from '../FootPaths'; -import { WeightedGraph } from '../utils/Graph'; +import { node, WeightedGraph } from '../utils/Graph'; import { id, Section, Stop } from './test'; import { parentPort } from 'worker_threads'; +import { benchmark } from './utils/benchmark'; export interface initData { adj: Required>[0]; @@ -17,9 +18,9 @@ export function initialCallback(data: initData) { if (parentPort) parentPort.postMessage(true); } -if (parentPort) parentPort.on('message', (data: initData | Parameters) => { +if (parentPort) parentPort.on('message', async (data: initData | Parameters) => { if (data instanceof Array) { - if (parentPort) parentPort.postMessage(computePath(...data)); + if (parentPort) parentPort.postMessage(await computePath(...data)); } else { initialCallback(data) } @@ -30,22 +31,46 @@ let footGraph: WeightedGraph | undefined; let stops: initData["stops"] | undefined; let options: initData["options"] | undefined; -export function computePath(stopId: string) { +export async function computePath(stopId: string) { const sourcePaths: Map = new Map(); if (!footGraph || !stops) return sourcePaths; - const [dist, prev] = options ? Dijkstra(footGraph, [stopId], options) : Dijkstra(footGraph, [stopId]); + const [dist, prev] = options ? await Dijkstra(footGraph, [stopId], options) : await Dijkstra(footGraph, [stopId]); for (let j = 0; j < stops.length; j++) { - // const targetStop: stop = stops[j]; //Better assigning those 2 vars or getting stops[j] 3 times + casting to string 2 times ? - // const targetNode = `stop-${targetStop._id}`; + const targetNode = `stop-${stops[j]._id}`; - if (dist.get(`stop-${stops[j]._id}`) !== undefined && dist.get(`stop-${stops[j]._id}`)! < Infinity) sourcePaths.set(stops[j]._id, [tracePath(prev, `stop-${stops[j]._id}`), dist.get(`stop-${stops[j]._id}`)!]); + if (dist.get(targetNode) !== undefined && dist.get(targetNode)! < Infinity) + sourcePaths.set(stops[j]._id, [tracePath(prev, targetNode), dist.get(targetNode)!]); } + return sourcePaths; +} + +export async function computePathBench(stopId: string) { + + const sourcePaths: Map = new Map(); + + if (!footGraph || !stops) return sourcePaths; + + const [dist, prev] = options + ? (await benchmark(Dijkstra as (G: WeightedGraph, [s]: [node], O: DijkstraOptions) => Promise<[Map, Map]>, [footGraph, [stopId], options])).lastReturn! + : (await benchmark(Dijkstra as (G: WeightedGraph, [s]: [node]) => Promise<[Map, Map]>, [footGraph, [stopId]])).lastReturn!; + + await benchmark((s: NonNullable) => { + for (let j = 0; j < s.length; j++) { + + const targetNode = `stop-${s[j]._id}`; + + if (dist.get(targetNode) !== undefined && dist.get(targetNode)! < Infinity) + sourcePaths.set(s[j]._id, [tracePath(prev, targetNode), dist.get(targetNode)!]); + + } + }, [stops], 1, true) + return sourcePaths; } \ No newline at end of file diff --git a/src/test/test.ts b/src/test/test.ts index f55b7af1..be08b3ed 100644 --- a/src/test/test.ts +++ b/src/test/test.ts @@ -169,7 +169,7 @@ async function run() { const workerPool = new WorkerPool(__dirname + '/computePath.js', 8, { adj: footGraph.adj, weights: footGraph.weights, stops }); //paths> - const paths: Map> = new Map(); + const paths: Map>> = new Map(); for (let i = 0; i < stops.length; i++) { From 8212fe1de4a3af21c5ddc41c46b791468069155b Mon Sep 17 00:00:00 2001 From: Catatomik Date: Fri, 3 Feb 2023 22:32:00 +0100 Subject: [PATCH 030/251] =?UTF-8?q?=E2=9C=A8=E2=9A=A1=20Use=20a=20Fibonacc?= =?UTF-8?q?i=20Heap=20for=20Dijkstra?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 8 ++++++++ package.json | 5 ++++- src/FootPaths.ts | 35 ++++++++++++++--------------------- 3 files changed, 26 insertions(+), 22 deletions(-) diff --git a/package-lock.json b/package-lock.json index eb21bd87..c41ffb28 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,9 @@ "name": "raptor", "version": "0.1.1", "license": "ISC", + "dependencies": { + "@tyriar/fibonacci-heap": "^2.0.9" + }, "devDependencies": { "ts-node": "^10.9.1", "typescript": "^4.9.4" @@ -81,6 +84,11 @@ "dev": true, "peer": true }, + "node_modules/@tyriar/fibonacci-heap": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@tyriar/fibonacci-heap/-/fibonacci-heap-2.0.9.tgz", + "integrity": "sha512-bYuSNomfn4hu2tPiDN+JZtnzCpSpbJ/PNeulmocDy3xN2X5OkJL65zo6rPZp65cPPhLF9vfT/dgE+RtFRCSxOA==" + }, "node_modules/acorn": { "version": "8.8.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", diff --git a/package.json b/package.json index 008e237b..00453975 100644 --- a/package.json +++ b/package.json @@ -12,5 +12,8 @@ "devDependencies": { "ts-node": "^10.9.1", "typescript": "^4.9.4" + }, + "dependencies": { + "@tyriar/fibonacci-heap": "^2.0.9" } -} \ No newline at end of file +} diff --git a/src/FootPaths.ts b/src/FootPaths.ts index 90afaa09..505b267e 100644 --- a/src/FootPaths.ts +++ b/src/FootPaths.ts @@ -1,4 +1,5 @@ import { node, nodeOrNullNode, nullNode, WeightedGraph } from './utils/Graph'; +import { FibonacciHeap } from '@tyriar/fibonacci-heap'; export type path = node[]; @@ -42,43 +43,35 @@ export function Dijkstra(G: WeightedGraph, [s, t]: [node, node] | [node], O?: Di const dist: Map = new Map(); const prev: Map = new Map(); - const Q: Set = new Set(); + const Q = new FibonacciHeap(); + dist.set(s, 0); for (const e of G.nodesIterator) { - dist.set(e, Infinity); prev.set(e, nullNode); - Q.add(e); + if (e != s) dist.set(e, Infinity); + Q.insert(dist.get(e)!, e); } - dist.set(s, 0); - - while (Q.size) { - let min: [nodeOrNullNode, number] = [nullNode, Infinity]; - for (const e of Q) { - /**@description Distance to e */ - const d: number = dist.get(e) ?? Infinity; - if (d <= min[1]) min[0] = e, min[1] = d; - } + while (!Q.isEmpty()) { - if (min[0] === nullNode) break; // Added for ts mental health + const min = Q.extractMinimum()!; // Can't be null otherwise Q is empty - Q.delete(min[0]); + if (t !== undefined && min.value === t) break; - if (t !== undefined && min[0] === t) break; + for (const v of G.neighborsIterator(min.value!) ?? []) { - for (const v of G.neighborsIterator(min[0]) ?? []) { + /**@description New alternative distance found from min, from a + (a,b) instead of b */ + const alt = min.key + G.weight(min.value!, v); - if (!Q.has(v)) continue; + if (O && alt > O.maxCumulWeight) continue; - /**@description New alternative distance found from min, from a + (a,b) instead of b */ - const alt = (dist.get(min[0]) ?? Infinity) + G.weight(min[0], v); - if (O && alt > O.maxCumulWeight) continue if (alt < (dist.get(v) ?? Infinity)) { dist.set(v, alt); - prev.set(v, min[0]); + prev.set(v, min.value!); + Q.decreaseKey(min, alt); } From d364f075a93cee91cc05e74a5ff516d047fe8f99 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Sun, 19 Feb 2023 17:36:26 +0100 Subject: [PATCH 031/251] =?UTF-8?q?=E2=9E=95=F0=9F=94=A7=20Move=20to=20typ?= =?UTF-8?q?egoose?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 188 ++++++++++- package.json | 4 +- src/test/models/SNCF_schedules.model.ts | 55 ++-- src/test/models/SNCF_stops.model.ts | 50 +-- src/test/models/TBMScheduledRoutes.model.ts | 47 +++ src/test/models/TBM_lines.model.ts | 49 +-- src/test/models/TBM_lines_routes.model.ts | 66 ++-- src/test/models/TBM_schedules.model.ts | 94 ++++-- src/test/models/TBM_stops.model.ts | 85 +++-- src/test/models/TBM_trips.model.ts | 44 +++ src/test/models/TBM_vehicles.model.ts | 26 -- src/test/models/addresses.model.ts | 74 +++-- src/test/models/index.ts | 18 + src/test/models/intersections.model.ts | 40 ++- src/test/models/sections.model.ts | 72 ++-- src/test/test.ts | 346 ++++++++++---------- tsconfig.json | 2 + 17 files changed, 835 insertions(+), 425 deletions(-) create mode 100644 src/test/models/TBMScheduledRoutes.model.ts create mode 100644 src/test/models/TBM_trips.model.ts delete mode 100644 src/test/models/TBM_vehicles.model.ts create mode 100644 src/test/models/index.ts diff --git a/package-lock.json b/package-lock.json index 4ab12d4f..2f7f7c69 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,9 +9,9 @@ "version": "0.1.1", "license": "ISC", "dependencies": { + "@typegoose/typegoose": "^10.1.1", "@tyriar/fibonacci-heap": "^2.0.9", - "mongodb": "^5.0.1", - "mongoose": "^6.8.4" + "mongodb": "^5.0.1" }, "devDependencies": { "prettier": "^2.8.4", @@ -24,6 +24,7 @@ "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz", "integrity": "sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==", "optional": true, + "peer": true, "dependencies": { "tslib": "^1.11.1" } @@ -32,13 +33,15 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "optional": true + "optional": true, + "peer": true }, "node_modules/@aws-crypto/sha256-browser": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz", "integrity": "sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==", "optional": true, + "peer": true, "dependencies": { "@aws-crypto/ie11-detection": "^3.0.0", "@aws-crypto/sha256-js": "^3.0.0", @@ -54,13 +57,15 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "optional": true + "optional": true, + "peer": true }, "node_modules/@aws-crypto/sha256-js": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz", "integrity": "sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==", "optional": true, + "peer": true, "dependencies": { "@aws-crypto/util": "^3.0.0", "@aws-sdk/types": "^3.222.0", @@ -71,13 +76,15 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "optional": true + "optional": true, + "peer": true }, "node_modules/@aws-crypto/supports-web-crypto": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz", "integrity": "sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==", "optional": true, + "peer": true, "dependencies": { "tslib": "^1.11.1" } @@ -86,13 +93,15 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "optional": true + "optional": true, + "peer": true }, "node_modules/@aws-crypto/util": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz", "integrity": "sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/types": "^3.222.0", "@aws-sdk/util-utf8-browser": "^3.0.0", @@ -103,13 +112,15 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "optional": true + "optional": true, + "peer": true }, "node_modules/@aws-sdk/abort-controller": { "version": "3.272.0", "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.272.0.tgz", "integrity": "sha512-s2TV3phapcTwZNr4qLxbfuQuE9ZMP4RoJdkvRRCkKdm6jslsWLJf2Zlcxti/23hOlINUMYv2iXE2pftIgWGdpg==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/types": "3.272.0", "tslib": "^2.3.1" @@ -123,6 +134,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.272.0.tgz", "integrity": "sha512-uMjRWcNvX7SoGaVn0mXWD43+Z1awPahQwGW3riDLfXHZdOgw2oFDhD3Jg5jQ8OzQLUfDvArhE3WyZwlS4muMuQ==", "optional": true, + "peer": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", @@ -169,6 +181,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.272.0.tgz", "integrity": "sha512-xn9a0IGONwQIARmngThoRhF1lLGjHAD67sUaShgIMaIMc6ipVYN6alWG1VuUpoUQ6iiwMEt0CHdfCyLyUV/fTA==", "optional": true, + "peer": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", @@ -212,6 +225,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.272.0.tgz", "integrity": "sha512-ECcXu3xoa1yggnGKMTh29eWNHiF/wC6r5Uqbla22eOOosyh0+Z6lkJ3JUSLOUKCkBXA4Cs/tJL9UDFBrKbSlvA==", "optional": true, + "peer": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", @@ -255,6 +269,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.272.0.tgz", "integrity": "sha512-kigxCxURp3WupufGaL/LABMb7UQfzAQkKcj9royizL3ItJ0vw5kW/JFrPje5IW1mfLgdPF7PI9ShOjE0fCLTqA==", "optional": true, + "peer": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", @@ -302,6 +317,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.272.0.tgz", "integrity": "sha512-Dr4CffRVNsOp3LRNdpvcH6XuSgXOSLblWliCy/5I86cNl567KVMxujVx6uPrdTXYs2h1rt3MNl6jQGnAiJeTbw==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/signature-v4": "3.272.0", "@aws-sdk/types": "3.272.0", @@ -318,6 +334,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.272.0.tgz", "integrity": "sha512-rVx0rtQjbiYCM0nah2rB/2ut2YJYPpRr1AbW/Hd4r/PI+yiusrmXAwuT4HIW2yr34zsQMPi1jZ3WHN9Rn9mzlg==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/client-cognito-identity": "3.272.0", "@aws-sdk/property-provider": "3.272.0", @@ -333,6 +350,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.272.0.tgz", "integrity": "sha512-QI65NbLnKLYHyTYhXaaUrq6eVsCCrMUb05WDA7+TJkWkjXesovpjc8vUKgFiLSxmgKmb2uOhHNcDyObKMrYQFw==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/property-provider": "3.272.0", "@aws-sdk/types": "3.272.0", @@ -347,6 +365,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.272.0.tgz", "integrity": "sha512-wwAfVY1jTFQEfxVfdYD5r5ieYGl+0g4nhekVxNMqE8E1JeRDd18OqiwAflzpgBIqxfqvCUkf+vl5JYyacMkNAQ==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/node-config-provider": "3.272.0", "@aws-sdk/property-provider": "3.272.0", @@ -363,6 +382,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.272.0.tgz", "integrity": "sha512-iE3CDzK5NcupHYjfYjBdY1JCy8NLEoRUsboEjG0i0gy3S3jVpDeVHX1dLVcL/slBFj6GiM7SoNV/UfKnJf3Gaw==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/credential-provider-env": "3.272.0", "@aws-sdk/credential-provider-imds": "3.272.0", @@ -383,6 +403,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.272.0.tgz", "integrity": "sha512-FI8uvwM1IxiRSvbkdKv8DZG5vxU3ezaseTaB1fHWTxEUFb0pWIoHX9oeOKer9Fj31SOZTCNAaYFURbSRuZlm/w==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/credential-provider-env": "3.272.0", "@aws-sdk/credential-provider-imds": "3.272.0", @@ -404,6 +425,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.272.0.tgz", "integrity": "sha512-hiCAjWWm2PeBFp5cjkxqyam/XADjiS+e7GzwC34TbZn3LisS0uoweLojj9tD11NnnUhyhbLteUvu5+rotOLwrg==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/property-provider": "3.272.0", "@aws-sdk/shared-ini-file-loader": "3.272.0", @@ -419,6 +441,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.272.0.tgz", "integrity": "sha512-hwYaulyiU/7chKKFecxCeo0ls6Dxs7h+5EtoYcJJGvfpvCncyOZF35t00OAsCd3Wo7HkhhgfpGdb6dmvCNQAZQ==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/client-sso": "3.272.0", "@aws-sdk/property-provider": "3.272.0", @@ -436,6 +459,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.272.0.tgz", "integrity": "sha512-ImrHMkcgneGa/HadHAQXPwOrX26sAKuB8qlMxZF/ZCM2B55u8deY+ZVkVuraeKb7YsahMGehPFOfRAF6mvFI5Q==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/property-provider": "3.272.0", "@aws-sdk/types": "3.272.0", @@ -450,6 +474,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.272.0.tgz", "integrity": "sha512-ucd6Xq6aBMf+nM4uz5zkjL11mwaE5BV1Q4hkulaGu2v1dRA8n6zhLJk/sb4hOJ7leelqMJMErlbQ2T3MkYvlJQ==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/client-cognito-identity": "3.272.0", "@aws-sdk/client-sso": "3.272.0", @@ -476,6 +501,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.272.0.tgz", "integrity": "sha512-1Qhm9e0RbS1Xf4CZqUbQyUMkDLd7GrsRXWIvm9b86/vgeV8/WnjO3CMue9D51nYgcyQORhYXv6uVjAYCWbUExA==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/protocol-http": "3.272.0", "@aws-sdk/querystring-builder": "3.272.0", @@ -489,6 +515,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.272.0.tgz", "integrity": "sha512-40dwND+iAm3VtPHPZu7/+CIdVJFk2s0cWZt1lOiMPMSXycSYJ45wMk7Lly3uoqRx0uWfFK5iT2OCv+fJi5jTng==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/types": "3.272.0", "@aws-sdk/util-buffer-from": "3.208.0", @@ -504,6 +531,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.272.0.tgz", "integrity": "sha512-ysW6wbjl1Y78txHUQ/Tldj2Rg1BI7rpMO9B9xAF6yAX3mQ7t6SUPQG/ewOGvH2208NBIl3qP5e/hDf0Q6r/1iw==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/types": "3.272.0", "tslib": "^2.3.1" @@ -514,6 +542,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.201.0.tgz", "integrity": "sha512-UPez5qLh3dNgt0DYnPD/q0mVJY84rA17QE26hVNOW3fAji8W2wrwrxdacWOxyXvlxWsVRcKmr+lay1MDqpAMfg==", "optional": true, + "peer": true, "dependencies": { "tslib": "^2.3.1" }, @@ -526,6 +555,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.272.0.tgz", "integrity": "sha512-sAbDZSTNmLX+UTGwlUHJBWy0QGQkiClpHwVFXACon+aG0ySLNeRKEVYs6NCPYldw4cj6hveLUn50cX44ukHErw==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/protocol-http": "3.272.0", "@aws-sdk/types": "3.272.0", @@ -540,6 +570,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.272.0.tgz", "integrity": "sha512-Dk3JVjj7SxxoUKv3xGiOeBksvPtFhTDrVW75XJ98Ymv8gJH5L1sq4hIeJAHRKogGiRFq2J73mnZSlM9FVXEylg==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/middleware-serde": "3.272.0", "@aws-sdk/protocol-http": "3.272.0", @@ -559,6 +590,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.272.0.tgz", "integrity": "sha512-Q8K7bMMFZnioUXpxn57HIt4p+I63XaNAawMLIZ5B4F2piyukbQeM9q2XVKMGwqLvijHR8CyP5nHrtKqVuINogQ==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/protocol-http": "3.272.0", "@aws-sdk/types": "3.272.0", @@ -573,6 +605,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.272.0.tgz", "integrity": "sha512-u2SQ0hWrFwxbxxYMG5uMEgf01pQY5jauK/LYWgGIvuCmFgiyRQQP3oN7kkmsxnS9MWmNmhbyQguX2NY02s5e9w==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/types": "3.272.0", "tslib": "^2.3.1" @@ -586,6 +619,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.272.0.tgz", "integrity": "sha512-Gp/eKWeUWVNiiBdmUM2qLkBv+VLSJKoWAO+aKmyxxwjjmWhE0FrfA1NQ1a3g+NGMhRbAfQdaYswRAKsul70ISg==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/protocol-http": "3.272.0", "@aws-sdk/types": "3.272.0", @@ -600,6 +634,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.272.0.tgz", "integrity": "sha512-pCGvHM7C76VbO/dFerH+Vwf7tGv7j+e+eGrvhQ35mRghCtfIou/WMfTZlD1TNee93crrAQQVZKjtW3dMB3WCzg==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/protocol-http": "3.272.0", "@aws-sdk/service-error-classification": "3.272.0", @@ -618,6 +653,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.272.0.tgz", "integrity": "sha512-VvYPg7LrDIjUOWueSzo2wBzcNG7dw+cmzV6zAKaLxf0RC5jeAP4hE0OzDiiZfDrjNghEzgq/V+0NO+LewqYL9Q==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/middleware-signing": "3.272.0", "@aws-sdk/property-provider": "3.272.0", @@ -635,6 +671,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.272.0.tgz", "integrity": "sha512-kW1uOxgPSwtXPB5rm3QLdWomu42lkYpQL94tM1BjyFOWmBLO2lQhk5a7Dw6HkTozT9a+vxtscLChRa6KZe61Hw==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/types": "3.272.0", "tslib": "^2.3.1" @@ -648,6 +685,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.272.0.tgz", "integrity": "sha512-4LChFK4VAR91X+dupqM8fQqYhFGE0G4Bf9rQlVTgGSbi2KUOmpqXzH0/WKE228nKuEhmH8+Qd2VPSAE2JcyAUA==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/property-provider": "3.272.0", "@aws-sdk/protocol-http": "3.272.0", @@ -665,6 +703,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.272.0.tgz", "integrity": "sha512-jhwhknnPBGhfXAGV5GXUWfEhDFoP/DN8MPCO2yC5OAxyp6oVJ8lTPLkZYMTW5VL0c0eG44dXpF4Ib01V+PlDrQ==", "optional": true, + "peer": true, "dependencies": { "tslib": "^2.3.1" }, @@ -677,6 +716,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.272.0.tgz", "integrity": "sha512-Qy7/0fsDJxY5l0bEk7WKDfqb4Os/sCAgFR2zEvrhDtbkhYPf72ysvg/nRUTncmCbo8tOok4SJii2myk8KMfjjw==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/protocol-http": "3.272.0", "@aws-sdk/types": "3.272.0", @@ -691,6 +731,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.272.0.tgz", "integrity": "sha512-YYCIBh9g1EQo7hm2l22HX5Yr9RoPQ2RCvhzKvF1n1e8t1QH4iObQrYUtqHG4khcm64Cft8C5MwZmgzHbya5Z6Q==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/property-provider": "3.272.0", "@aws-sdk/shared-ini-file-loader": "3.272.0", @@ -706,6 +747,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.272.0.tgz", "integrity": "sha512-VrW9PjhhngeyYp4yGYPe5S0vgZH6NwU3Po9xAgayUeE37Inr7LS1YteFMHdpgsUUeNXnh7d06CXqHo1XjtqOKA==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/abort-controller": "3.272.0", "@aws-sdk/protocol-http": "3.272.0", @@ -722,6 +764,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.272.0.tgz", "integrity": "sha512-V1pZTaH5eqpAt8O8CzbItHhOtzIfFuWymvwZFkAtwKuaHpnl7jjrTouV482zoq8AD/fF+VVSshwBKYA7bhidIw==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/types": "3.272.0", "tslib": "^2.3.1" @@ -735,6 +778,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.272.0.tgz", "integrity": "sha512-4JQ54v5Yn08jspNDeHo45CaSn1CvTJqS1Ywgr79eU6jBExtguOWv6LNtwVSBD9X37v88iqaxt8iu1Z3pZZAJeg==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/types": "3.272.0", "tslib": "^2.3.1" @@ -748,6 +792,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.272.0.tgz", "integrity": "sha512-ndo++7GkdCj5tBXE6rGcITpSpZS4PfyV38wntGYAlj9liL1omk3bLZRY6uzqqkJpVHqbg2fD7O2qHNItzZgqhw==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/types": "3.272.0", "@aws-sdk/util-uri-escape": "3.201.0", @@ -762,6 +807,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.272.0.tgz", "integrity": "sha512-5oS4/9n6N1LZW9tI3qq/0GnCuWoOXRgcHVB+AJLRBvDbEe+GI+C/xK1tKLsfpDNgsQJHc4IPQoIt4megyZ/1+A==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/types": "3.272.0", "tslib": "^2.3.1" @@ -775,6 +821,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.272.0.tgz", "integrity": "sha512-REoltM1LK9byyIufLqx9znhSolPcHQgVHIA2S0zu5sdt5qER4OubkLAXuo4MBbisUTmh8VOOvIyUb5ijZCXq1w==", "optional": true, + "peer": true, "engines": { "node": ">=14.0.0" } @@ -784,6 +831,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.272.0.tgz", "integrity": "sha512-lzFPohp5sy2XvwFjZIzLVCRpC0i5cwBiaXmFzXYQZJm6FSCszHO4ax+m9yrtlyVFF/2YPWl+/bzNthy4aJtseA==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/types": "3.272.0", "tslib": "^2.3.1" @@ -797,6 +845,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.272.0.tgz", "integrity": "sha512-pWxnHG1NqJWMwlhJ6NHNiUikOL00DHROmxah6krJPMPq4I3am2KY2Rs/8ouWhnEXKaHAv4EQhSALJ+7Mq5S4/A==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/is-array-buffer": "3.201.0", "@aws-sdk/types": "3.272.0", @@ -815,6 +864,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.272.0.tgz", "integrity": "sha512-pvdleJ3kaRvyRw2pIZnqL85ZlWBOZrPKmR9I69GCvlyrfdjRBhbSjIEZ+sdhZudw0vdHxq25AGoLUXhofVLf5Q==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/middleware-stack": "3.272.0", "@aws-sdk/types": "3.272.0", @@ -829,6 +879,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.272.0.tgz", "integrity": "sha512-0GISJ4IKN2rXvbSddB775VjBGSKhYIGQnAdMqbvxi9LB6pSvVxcH9aIL28G0spiuL+dy3yGQZ8RlJPAyP9JW9A==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/client-sso-oidc": "3.272.0", "@aws-sdk/property-provider": "3.272.0", @@ -845,6 +896,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.272.0.tgz", "integrity": "sha512-MmmL6vxMGP5Bsi+4wRx4mxYlU/LX6M0noOXrDh/x5FfG7/4ZOar/nDxqDadhJtNM88cuWVHZWY59P54JzkGWmA==", "optional": true, + "peer": true, "dependencies": { "tslib": "^2.3.1" }, @@ -857,6 +909,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.272.0.tgz", "integrity": "sha512-vX/Tx02PlnQ/Kgtf5TnrNDHPNbY+amLZjW0Z1d9vzAvSZhQ4i9Y18yxoRDIaDTCNVRDjdhV8iuctW+05PB5JtQ==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/querystring-parser": "3.272.0", "@aws-sdk/types": "3.272.0", @@ -868,6 +921,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64/-/util-base64-3.208.0.tgz", "integrity": "sha512-PQniZph5A6N7uuEOQi+1hnMz/FSOK/8kMFyFO+4DgA1dZ5pcKcn5wiFwHkcTb/BsgVqQa3Jx0VHNnvhlS8JyTg==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/util-buffer-from": "3.208.0", "tslib": "^2.3.1" @@ -881,6 +935,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.188.0.tgz", "integrity": "sha512-8VpnwFWXhnZ/iRSl9mTf+VKOX9wDE8QtN4bj9pBfxwf90H1X7E8T6NkiZD3k+HubYf2J94e7DbeHs7fuCPW5Qg==", "optional": true, + "peer": true, "dependencies": { "tslib": "^2.3.1" } @@ -890,6 +945,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.208.0.tgz", "integrity": "sha512-3zj50e5g7t/MQf53SsuuSf0hEELzMtD8RX8C76f12OSRo2Bca4FLLYHe0TZbxcfQHom8/hOaeZEyTyMogMglqg==", "optional": true, + "peer": true, "dependencies": { "tslib": "^2.3.1" }, @@ -902,6 +958,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.208.0.tgz", "integrity": "sha512-7L0XUixNEFcLUGPeBF35enCvB9Xl+K6SQsmbrPk1P3mlV9mguWSDQqbOBwY1Ir0OVbD6H/ZOQU7hI/9RtRI0Zw==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/is-array-buffer": "3.201.0", "tslib": "^2.3.1" @@ -915,6 +972,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/util-config-provider/-/util-config-provider-3.208.0.tgz", "integrity": "sha512-DSRqwrERUsT34ug+anlMBIFooBEGwM8GejC7q00Y/9IPrQy50KnG5PW2NiTjuLKNi7pdEOlwTSEocJE15eDZIg==", "optional": true, + "peer": true, "dependencies": { "tslib": "^2.3.1" }, @@ -927,6 +985,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.272.0.tgz", "integrity": "sha512-W8ZVJSZRuUBg8l0JEZzUc+9fKlthVp/cdE+pFeF8ArhZelOLCiaeCrMaZAeJusaFzIpa6cmOYQAjtSMVyrwRtg==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/property-provider": "3.272.0", "@aws-sdk/types": "3.272.0", @@ -942,6 +1001,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.272.0.tgz", "integrity": "sha512-U0NTcbMw6KFk7uz/avBmfxQSTREEiX6JDMH68oN/3ux4AICd2I4jHyxnloSWGuiER1FxZf1dEJ8ZTwy8Ibl21Q==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/config-resolver": "3.272.0", "@aws-sdk/credential-provider-imds": "3.272.0", @@ -959,6 +1019,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.272.0.tgz", "integrity": "sha512-c4MPUaJt2G6gGpoiwIOqDfUa98c1J63RpYvf/spQEKOtC/tF5Gfqlxuq8FnAl5lHnrqj1B9ZXLLxFhHtDR0IiQ==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/types": "3.272.0", "tslib": "^2.3.1" @@ -972,6 +1033,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.201.0.tgz", "integrity": "sha512-7t1vR1pVxKx0motd3X9rI3m/xNp78p3sHtP5yo4NP4ARpxyJ0fokBomY8ScaH2D/B+U5o9ARxldJUdMqyBlJcA==", "optional": true, + "peer": true, "dependencies": { "tslib": "^2.3.1" }, @@ -984,6 +1046,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.208.0.tgz", "integrity": "sha512-iua1A2+P7JJEDHVgvXrRJSvsnzG7stYSGQnBVphIUlemwl6nN5D+QrgbjECtrbxRz8asYFHSzhdhECqN+tFiBg==", "optional": true, + "peer": true, "dependencies": { "tslib": "^2.3.1" }, @@ -996,6 +1059,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.272.0.tgz", "integrity": "sha512-Abw8m30arbwxqmeMMha5J11ESpHUNmCeSqSzE8/C4B8jZQtHY4kq7f+upzcNIQ11lsd+uzBEzNG3+dDRi0XOJQ==", "optional": true, + "peer": true, "dependencies": { "tslib": "^2.3.1" }, @@ -1008,6 +1072,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/util-retry/-/util-retry-3.272.0.tgz", "integrity": "sha512-Ngha5414LR4gRHURVKC9ZYXsEJhMkm+SJ+44wlzOhavglfdcKKPUsibz5cKY1jpUV7oKECwaxHWpBB8r6h+hOg==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/service-error-classification": "3.272.0", "tslib": "^2.3.1" @@ -1021,6 +1086,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.201.0.tgz", "integrity": "sha512-TeTWbGx4LU2c5rx0obHeDFeO9HvwYwQtMh1yniBz00pQb6Qt6YVOETVQikRZ+XRQwEyCg/dA375UplIpiy54mA==", "optional": true, + "peer": true, "dependencies": { "tslib": "^2.3.1" }, @@ -1033,6 +1099,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.272.0.tgz", "integrity": "sha512-Lp5QX5bH6uuwBlIdr7w7OAcAI50ttyskb++yUr9i+SPvj6RI2dsfIBaK4mDg1qUdM5LeUdvIyqwj3XHjFKAAvA==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/types": "3.272.0", "bowser": "^2.11.0", @@ -1044,6 +1111,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.272.0.tgz", "integrity": "sha512-ljK+R3l+Q1LIHrcR+Knhk0rmcSkfFadZ8V+crEGpABf/QUQRg7NkZMsoe814tfBO5F7tMxo8wwwSdaVNNHtoRA==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/node-config-provider": "3.272.0", "@aws-sdk/types": "3.272.0", @@ -1066,6 +1134,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8/-/util-utf8-3.254.0.tgz", "integrity": "sha512-14Kso/eIt5/qfIBmhEL9L1IfyUqswjSTqO2mY7KOzUZ9SZbwn3rpxmtkhmATkRjD7XIlLKaxBkI7tU9Zjzj8Kw==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/util-buffer-from": "3.208.0", "tslib": "^2.3.1" @@ -1079,6 +1148,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz", "integrity": "sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==", "optional": true, + "peer": true, "dependencies": { "tslib": "^2.3.1" } @@ -1136,6 +1206,24 @@ "dev": true, "license": "MIT" }, + "node_modules/@typegoose/typegoose": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/@typegoose/typegoose/-/typegoose-10.1.1.tgz", + "integrity": "sha512-QzRzgFnsQ3/UTToUEVJ5ln4t/QzlznEat7bcn9tNt4U6QCytPVvTJnRe5SwrJllxakgz0yrnbKkTw9YeoiYXuQ==", + "dependencies": { + "lodash": "^4.17.20", + "loglevel": "^1.8.1", + "reflect-metadata": "^0.1.13", + "semver": "^7.3.8", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.17.0" + }, + "peerDependencies": { + "mongoose": "~6.9.0" + } + }, "node_modules/@types/node": { "version": "18.11.18", "license": "MIT" @@ -1199,13 +1287,15 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "peer": true }, "node_modules/bowser": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==", - "optional": true + "optional": true, + "peer": true }, "node_modules/bson": { "version": "5.0.1", @@ -1233,6 +1323,7 @@ "url": "https://feross.org/support" } ], + "peer": true, "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -1247,6 +1338,7 @@ "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "peer": true, "dependencies": { "ms": "2.1.2" }, @@ -1262,7 +1354,8 @@ "node_modules/debug/node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "peer": true }, "node_modules/diff": { "version": "4.0.2", @@ -1277,6 +1370,7 @@ "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.0.11.tgz", "integrity": "sha512-4aUg3aNRR/WjQAcpceODG1C3x3lFANXRo8+1biqfieHmg9pyMt7qB4lQV/Ta6sJCTbA5vfD8fnA8S54JATiFUA==", "optional": true, + "peer": true, "dependencies": { "strnum": "^1.0.5" }, @@ -1305,7 +1399,8 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "peer": true }, "node_modules/ip": { "version": "2.0.0", @@ -1316,10 +1411,39 @@ "version": "2.5.1", "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.5.1.tgz", "integrity": "sha512-7jFxRVm+jD+rkq3kY0iZDJfsO2/t4BBPeEb2qKn2lR/9KhuksYk5hxzfRYWMPV8P/x2d0kHD306YyWLzjjH+uA==", + "peer": true, "engines": { "node": ">=12.0.0" } }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/loglevel": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.1.tgz", + "integrity": "sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg==", + "engines": { + "node": ">= 0.6.0" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/loglevel" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/make-error": { "version": "1.3.6", "dev": true, @@ -1376,6 +1500,7 @@ "version": "6.9.2", "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.9.2.tgz", "integrity": "sha512-Yb9rWJhYm+7Yf839QuKx2dXcclbA0GAMxtdDiaedHsOQU+y28cD/8gKYp1wTwwyAjKesqaGfLG4ez7D9lKpwBw==", + "peer": true, "dependencies": { "bson": "^4.7.0", "kareem": "2.5.1", @@ -1397,6 +1522,7 @@ "version": "4.7.2", "resolved": "https://registry.npmjs.org/bson/-/bson-4.7.2.tgz", "integrity": "sha512-Ry9wCtIZ5kGqkJoi6aD8KjxFZEx78guTQDnpXWiNthsxzrxAK/i8E6pCHAIZTbaEFWcOCvbecMukfK7XUvyLpQ==", + "peer": true, "dependencies": { "buffer": "^5.6.0" }, @@ -1408,6 +1534,7 @@ "version": "4.13.0", "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.13.0.tgz", "integrity": "sha512-+taZ/bV8d1pYuHL4U+gSwkhmDrwkWbH1l4aah4YpmpscMwgFBkufIKxgP/G7m87/NUuQzc2Z75ZTI7ZOyqZLbw==", + "peer": true, "dependencies": { "bson": "^4.7.0", "mongodb-connection-string-url": "^2.5.4", @@ -1425,6 +1552,7 @@ "version": "0.9.0", "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz", "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==", + "peer": true, "engines": { "node": ">=4.0.0" } @@ -1433,6 +1561,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/mquery/-/mquery-4.0.3.tgz", "integrity": "sha512-J5heI+P08I6VJ2Ky3+33IpCdAvlYGTSUjwTPxkAr8i8EoduPMBX2OY/wa3IKZIQl7MU4SbFk8ndgSKyB/cl1zA==", + "peer": true, "dependencies": { "debug": "4.x" }, @@ -1443,7 +1572,8 @@ "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "peer": true }, "node_modules/prettier": { "version": "2.8.4", @@ -1468,6 +1598,11 @@ "node": ">=6" } }, + "node_modules/reflect-metadata": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" + }, "node_modules/saslprep": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", @@ -1480,10 +1615,25 @@ "node": ">=6" } }, + "node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/sift": { "version": "16.0.1", "resolved": "https://registry.npmjs.org/sift/-/sift-16.0.1.tgz", - "integrity": "sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ==" + "integrity": "sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ==", + "peer": true }, "node_modules/smart-buffer": { "version": "4.2.0", @@ -1520,7 +1670,8 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", - "optional": true + "optional": true, + "peer": true }, "node_modules/tr46": { "version": "3.0.0", @@ -1579,8 +1730,7 @@ "node_modules/tslib": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "optional": true + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" }, "node_modules/typescript": { "version": "4.9.5", @@ -1600,6 +1750,7 @@ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "optional": true, + "peer": true, "bin": { "uuid": "dist/bin/uuid" } @@ -1629,6 +1780,11 @@ "node": ">=12" } }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "node_modules/yn": { "version": "3.1.1", "dev": true, diff --git a/package.json b/package.json index 817f70bd..056dd222 100644 --- a/package.json +++ b/package.json @@ -11,9 +11,9 @@ "author": "", "license": "ISC", "dependencies": { + "@typegoose/typegoose": "^10.1.1", "@tyriar/fibonacci-heap": "^2.0.9", - "mongodb": "^5.0.1", - "mongoose": "^6.8.4" + "mongodb": "^5.0.1" }, "devDependencies": { "prettier": "^2.8.4", diff --git a/src/test/models/SNCF_schedules.model.ts b/src/test/models/SNCF_schedules.model.ts index 586b660b..6e081353 100644 --- a/src/test/models/SNCF_schedules.model.ts +++ b/src/test/models/SNCF_schedules.model.ts @@ -2,24 +2,39 @@ // // See http://mongoosejs.com/docs/models.html -import { InferSchemaType, Schema, model } from "mongoose"; - -const dbSNCF_Schedules = new Schema( - { - _id: { type: String, required: true }, - realtime: { type: Date, required: true }, - trip: { type: Number, required: true }, //implicitly includes direction - stop_point: { type: Number, required: true, ref: "sncf_stops" }, - route: { type: String, required: true, ref: "sncf_routes" }, - }, - { - timestamps: true, - }, -); - -export type dbSNCF_Schedules = InferSchemaType; - -export default function (m: typeof model) { - const modelName = "sncf_route_schedules"; - return m(modelName, dbSNCF_Schedules); +import { SNCFEndpoints } from "."; +import { TimeStamps } from "@typegoose/typegoose/lib/defaultClasses"; +import { addModelToTypegoose, buildSchema, prop, Ref } from "@typegoose/typegoose"; +import { modelOptions } from "@typegoose/typegoose/lib/modelOptions"; +import { getName } from "@typegoose/typegoose/lib/internal/utils"; +import { dbSNCF_Stops } from "./SNCF_stops.model"; +import { Mongoose } from "mongoose"; + +@modelOptions({ options: { customName: SNCFEndpoints.Schedules } }) +export class dbSNCF_Schedules extends TimeStamps { + @prop({ required: true }) + public _id!: string; + + @prop({ required: true }) + public realtime!: Date; + + @prop({ required: true }) + public trip!: number; //iImplicitly includes direction + + @prop({ required: true, ref: () => dbSNCF_Stops, type: () => Number }) + public stop_point!: Ref; + + @prop({ required: true }) + public route!: string; // Should be a ref } + +export default function init(db: Mongoose) { + const dbSNCF_SchedulesSchema = buildSchema(dbSNCF_Schedules, { existingMongoose: db }); + const dbSNCF_SchedulesModelRaw = db.model(getName(dbSNCF_Schedules), dbSNCF_SchedulesSchema); + + return addModelToTypegoose(dbSNCF_SchedulesModelRaw, dbSNCF_Schedules, { + existingMongoose: db, + }); +} + +export type dbSNCF_SchedulesModel = ReturnType; diff --git a/src/test/models/SNCF_stops.model.ts b/src/test/models/SNCF_stops.model.ts index 384d01a7..2f144f6d 100644 --- a/src/test/models/SNCF_stops.model.ts +++ b/src/test/models/SNCF_stops.model.ts @@ -2,25 +2,33 @@ // // See http://mongoosejs.com/docs/models.html -import { InferSchemaType, Schema, model } from "mongoose"; - -const dbSNCF_Stops = new Schema( - { - _id: { type: Number, required: true }, - coords: { type: [Number], required: true }, - name: { type: String, required: true }, - name_lowercase: { type: String, required: true }, - }, - { - timestamps: true, - }, -); - -export type dbSNCF_Stops = Omit, "coords"> & { - coords: [number, number]; -}; - -export default function (m: typeof model) { - const modelName = "sncf_stops"; - return m(modelName, dbSNCF_Stops); +import { TimeStamps } from "@typegoose/typegoose/lib/defaultClasses"; +import { addModelToTypegoose, buildSchema, prop } from "@typegoose/typegoose"; +import { modelOptions } from "@typegoose/typegoose/lib/modelOptions"; +import { getName } from "@typegoose/typegoose/lib/internal/utils"; +import { SNCFEndpoints } from "."; +import { Mongoose } from "mongoose"; + +@modelOptions({ options: { customName: SNCFEndpoints.Stops } }) +export class dbSNCF_Stops extends TimeStamps { + @prop({ required: true }) + public _id!: number; + + @prop({ type: () => [Number, Number], required: true }) + public coords!: [number, number]; + + @prop({ required: true }) + public name!: string; + + @prop({ required: true }) + public name_lowercase!: string; } + +export default function init(db: Mongoose) { + const dbSNCF_StopsSchema = buildSchema(dbSNCF_Stops, { existingMongoose: db }); + const dbSNCF_StopsModelRaw = db.model(getName(dbSNCF_Stops), dbSNCF_StopsSchema); + + return addModelToTypegoose(dbSNCF_StopsModelRaw, dbSNCF_Stops, { existingMongoose: db }); +} + +export type dbSNCF_StopsModel = ReturnType; diff --git a/src/test/models/TBMScheduledRoutes.model.ts b/src/test/models/TBMScheduledRoutes.model.ts new file mode 100644 index 00000000..5baa1303 --- /dev/null +++ b/src/test/models/TBMScheduledRoutes.model.ts @@ -0,0 +1,47 @@ +// TBMScheduledRoutes-model.js - A mongoose model +// +// See http://mongoosejs.com/docs/models.html + +import { TimeStamps } from "@typegoose/typegoose/lib/defaultClasses"; +import { addModelToTypegoose, buildSchema, prop, Ref } from "@typegoose/typegoose"; +import { modelOptions } from "@typegoose/typegoose/lib/modelOptions"; +import { getName } from "@typegoose/typegoose/lib/internal/utils"; +import { dbTBM_Schedules } from "./TBM_schedules.model"; +import { dbTBM_Stops } from "./TBM_stops.model"; +import { TBMEndpoints } from "."; +import { Mongoose } from "mongoose"; + +@modelOptions({ schemaOptions: { _id: false } }) +export class TripOfScheduledRoute { + @prop({ required: true }) + public tripId!: number; + + @prop({ required: true, ref: () => dbTBM_Schedules }) + public schedules!: Ref[]; +} + +@modelOptions({ options: { customName: TBMEndpoints.ScheduledRoutes } }) +export class dbTBM_ScheduledRoutes extends TimeStamps { + @prop({ required: true }) + // routeId + public _id!: number; + + @prop({ required: true, type: () => TripOfScheduledRoute }) + public trips!: TripOfScheduledRoute[]; + + @prop({ required: true, ref: () => dbTBM_Stops, type: () => Number }) + public stops!: Ref[]; +} + +export default function init(db: Mongoose) { + const dbTBM_ScheduledRoutesSchema = buildSchema(dbTBM_ScheduledRoutes, { + existingMongoose: db, + }); + const dbTBM_ScheduledRoutesModelRaw = db.model(getName(dbTBM_ScheduledRoutes), dbTBM_ScheduledRoutesSchema); + + return addModelToTypegoose(dbTBM_ScheduledRoutesModelRaw, dbTBM_ScheduledRoutes, { + existingMongoose: db, + }); +} + +export type dbTBM_ScheduledRoutesModel = ReturnType; diff --git a/src/test/models/TBM_lines.model.ts b/src/test/models/TBM_lines.model.ts index a6bd4d63..bd226627 100644 --- a/src/test/models/TBM_lines.model.ts +++ b/src/test/models/TBM_lines.model.ts @@ -2,23 +2,34 @@ // // See http://mongoosejs.com/docs/models.html -import { InferSchemaType, Schema, model } from "mongoose"; - -const dbTBM_Lines = new Schema( - { - _id: { type: Number, required: true }, - libelle: { type: String, required: true }, - vehicule: { type: String, enum: ["BUS", "TRAM", "BATEAU"], required: true }, - active: { type: Number, enum: [0, 1] as const, required: true }, - }, - { - timestamps: true, - }, -); - -export type dbTBM_Lines = InferSchemaType; - -export default function (m: typeof model) { - const modelName = "tbm_lines"; - return m(modelName, dbTBM_Lines); +import { TBMEndpoints } from "."; +import { TimeStamps } from "@typegoose/typegoose/lib/defaultClasses"; +import { addModelToTypegoose, buildSchema, prop } from "@typegoose/typegoose"; +import { modelOptions } from "@typegoose/typegoose/lib/modelOptions"; +import { getName } from "@typegoose/typegoose/lib/internal/utils"; +import { Active, VehicleType } from "./TBM_stops.model"; +import { Mongoose } from "mongoose"; + +@modelOptions({ options: { customName: TBMEndpoints.Lines } }) +export class dbTBM_Lines extends TimeStamps { + @prop({ required: true }) + public _id!: number; + + @prop({ required: true }) + public libelle!: string; + + @prop({ required: true, enum: VehicleType }) + public vehicule!: VehicleType; + + @prop({ required: true, enum: [0, 1] as const }) + public active!: Active; } + +export default function init(db: Mongoose) { + const dbTBM_LinesSchema = buildSchema(dbTBM_Lines, { existingMongoose: db }); + const dbTBM_LinesModelRaw = db.model(getName(dbTBM_Lines), dbTBM_LinesSchema); + + return addModelToTypegoose(dbTBM_LinesModelRaw, dbTBM_Lines, { existingMongoose: db }); +} + +export type dbTBM_LinesModel = ReturnType; diff --git a/src/test/models/TBM_lines_routes.model.ts b/src/test/models/TBM_lines_routes.model.ts index 7b7ca669..252bbc9c 100644 --- a/src/test/models/TBM_lines_routes.model.ts +++ b/src/test/models/TBM_lines_routes.model.ts @@ -2,27 +2,47 @@ // // See http://mongoosejs.com/docs/models.html -import { InferSchemaType, Schema, model } from "mongoose"; - -const dbTBM_Lines_routes = new Schema( - { - _id: { type: Number, required: true }, - libelle: { type: String, required: true }, - sens: { type: String, required: true }, - vehicule: { type: String, required: true }, - rs_sv_ligne_a: { type: Number, required: true, ref: "lines" }, - rg_sv_arret_p_nd: { type: Number, required: true, ref: "stops" }, - rg_sv_arret_p_na: { type: Number, required: true, ref: "stops" }, - }, - { - timestamps: true, - toObject: { virtuals: true }, - }, -); - -export type dbTBM_Lines_routes = InferSchemaType; - -export default function (m: typeof model) { - const modelName = "tbm_lines_routes"; - return m(modelName, dbTBM_Lines_routes); +import { TBMEndpoints } from "."; +import { TimeStamps } from "@typegoose/typegoose/lib/defaultClasses"; +import { addModelToTypegoose, buildSchema, prop, Ref } from "@typegoose/typegoose"; +import { modelOptions } from "@typegoose/typegoose/lib/modelOptions"; +import { getName } from "@typegoose/typegoose/lib/internal/utils"; +import { dbTBM_Lines } from "./TBM_lines.model"; +import { dbTBM_Stops } from "./TBM_stops.model"; +import { Mongoose } from "mongoose"; + +@modelOptions({ options: { customName: TBMEndpoints.Lines_routes } }) +export class dbTBM_Lines_routes extends TimeStamps { + @prop({ required: true }) + public _id!: number; + + @prop({ required: true }) + public libelle!: string; + + @prop({ required: true }) + public sens!: string; + + @prop({ required: true }) + public vehicule!: string; + + @prop({ required: true, ref: () => dbTBM_Lines, type: () => Number }) + public rs_sv_ligne_a!: Ref; + + @prop({ required: true, ref: () => dbTBM_Stops, type: () => Number }) + public rg_sv_arret_p_nd!: Ref; + + @prop({ required: true, ref: () => dbTBM_Stops, type: () => Number }) + public rg_sv_arret_p_na!: Ref; } + +// for more of what you can do here. +export default function init(db: Mongoose) { + const dbTBM_Lines_routesSchema = buildSchema(dbTBM_Lines_routes, { existingMongoose: db }); + const dbTBM_Lines_routesModelRaw = db.model(getName(dbTBM_Lines_routes), dbTBM_Lines_routesSchema); + + return addModelToTypegoose(dbTBM_Lines_routesModelRaw, dbTBM_Lines_routes, { + existingMongoose: db, + }); +} + +export type dbTBM_Lines_routesModel = ReturnType; diff --git a/src/test/models/TBM_schedules.model.ts b/src/test/models/TBM_schedules.model.ts index 83de452a..a24338b4 100644 --- a/src/test/models/TBM_schedules.model.ts +++ b/src/test/models/TBM_schedules.model.ts @@ -2,31 +2,71 @@ // // See http://mongoosejs.com/docs/models.html -import { InferSchemaType, Schema, model } from "mongoose"; - -const dbTBM_Schedules = new Schema( - { - _id: { type: Number, required: true }, - hor_theo: { type: Date, required: true }, - hor_app: { type: Date, required: true }, - hor_estime: { type: Date, required: true }, - etat: { - type: String, - enum: ["NON_REALISE", "REALISE", "DEVIE"], - required: true, - }, - type: { type: String, enum: ["REGULIER"], required: true }, //donnée incertaine - rs_sv_arret_p: { type: Number, required: true, ref: "stops" }, - rs_sv_cours_a: { type: Number, required: true, ref: "vehicles" }, - }, - { - timestamps: true, - }, -); - -export type dbTBM_Schedules = InferSchemaType; - -export default function (m: typeof model) { - const modelName = "tbm_schedules"; - return m(modelName, dbTBM_Schedules); +export enum RtScheduleState { + Non_realise = "NON_REALISE", + Realise = "REALISE", + Devie = "DEVIE", } + +export enum RtScheduleType { + Regulier = "REGULIER", + Deviation = "DEVIATION", +} + +import { TBMEndpoints } from "."; +import { TimeStamps } from "@typegoose/typegoose/lib/defaultClasses"; +import { addModelToTypegoose, buildSchema, getDiscriminatorModelForClass, index, prop, Ref } from "@typegoose/typegoose"; +import { modelOptions } from "@typegoose/typegoose/lib/modelOptions"; +import { getName } from "@typegoose/typegoose/lib/internal/utils"; +import { dbTBM_Stops } from "./TBM_stops.model"; +import { dbTBM_Trips } from "./TBM_trips.model"; +import { Mongoose } from "mongoose"; + +@index({ gid: 1, realtime: 1 }, { unique: true }) +@index({ rs_sv_cours_a: 1 }) +@modelOptions({ options: { customName: TBMEndpoints.Schedules } }) +export class dbTBM_Schedules extends TimeStamps { + @prop({ required: true, index: true }) + public gid!: number; + + @prop({ required: true }) + public hor_theo!: Date; + + @prop({ required: true }) + public realtime!: boolean; + + @prop({ required: true, ref: () => dbTBM_Stops, type: () => Number }) + public rs_sv_arret_p!: Ref; + + @prop({ required: true, ref: () => dbTBM_Trips, type: () => Number }) + public rs_sv_cours_a!: Ref; +} + +@modelOptions({ options: { customName: TBMEndpoints.Schedules_rt } }) +export class dbTBM_Schedules_rt extends dbTBM_Schedules { + @prop({ required: true }) + public hor_app!: Date; + + @prop({ required: true }) + public hor_estime!: Date; + + @prop({ required: true, enum: RtScheduleState }) + public etat!: RtScheduleState; + + @prop({ required: true, enum: RtScheduleType }) + public type!: RtScheduleType; +} + +export default function init(db: Mongoose) { + const dbTBM_SchedulesSchema = buildSchema(dbTBM_Schedules, { existingMongoose: db }); + const dbTBM_SchedulesModelRaw = db.model(getName(dbTBM_Schedules), dbTBM_SchedulesSchema); + + const dbTBM_SchedulesModel = addModelToTypegoose(dbTBM_SchedulesModelRaw, dbTBM_Schedules, { + existingMongoose: db, + }); + + return [dbTBM_SchedulesModel, getDiscriminatorModelForClass(dbTBM_SchedulesModel, dbTBM_Schedules_rt)] as const; +} + +export type dbTBM_SchedulesModel = ReturnType[0]; +export type dbTBM_Schedules_rtModel = ReturnType[1]; diff --git a/src/test/models/TBM_stops.model.ts b/src/test/models/TBM_stops.model.ts index 6ea79f85..ed41b8d4 100644 --- a/src/test/models/TBM_stops.model.ts +++ b/src/test/models/TBM_stops.model.ts @@ -2,32 +2,61 @@ // // See http://mongoosejs.com/docs/models.html -import { InferSchemaType, Schema, model } from "mongoose"; - -const dbTBM_Stops = new Schema( - { - coords: { type: [Number], required: true }, - _id: { type: Number, required: true }, - libelle: { type: String, required: true }, - libelle_lowercase: { type: String, required: true }, - vehicule: { type: String, enum: ["BUS", "TRAM", "BATEAU"], required: true }, - type: { - type: String, - enum: ["CLASSIQUE", "DELESTAGE", "AUTRE", "FICTIF"], - required: true, - }, - actif: { type: Number, enum: [0, 1] as const, required: true }, - }, - { - timestamps: true, - }, -); - -export type dbTBM_Stops = Omit, "coords"> & { - coords: [number, number]; -}; - -export default function (m: typeof model) { - const modelName = "tbm_stops"; - return m(modelName, dbTBM_Stops); +import { TBMEndpoints } from "."; +import { TimeStamps } from "@typegoose/typegoose/lib/defaultClasses"; +import { addModelToTypegoose, buildSchema, prop } from "@typegoose/typegoose"; +import { modelOptions } from "@typegoose/typegoose/lib/modelOptions"; +import { getName } from "@typegoose/typegoose/lib/internal/utils"; +import { Mongoose } from "mongoose"; + +export enum VehicleType { + Bus = "BUS", + Tram = "TRAM", + Bateau = "BATEAU", +} + +export enum StopType { + Classique = "CLASSIQUE", + Delestage = "DELESTAGE", + Autre = "AUTRE", + Fictif = "FICTIF", } + +export type Active = 0 | 1; + +@modelOptions({ options: { customName: TBMEndpoints.Stops } }) +export class dbTBM_Stops extends TimeStamps { + @prop({ required: true }) + public _id!: number; + + @prop({ type: () => [Number, Number], required: true }) + public coords!: [number, number]; + + @prop({ required: true }) + public libelle!: string; + + @prop({ required: true }) + public libelle_lowercase!: string; + + @prop({ required: true, enum: VehicleType }) + public vehicule!: VehicleType; + + @prop({ required: true, enum: StopType }) + public type!: StopType; + + @prop({ required: true, enum: [0, 1] as const }) + public actif!: Active; +} + +// export type dbTBM_Stops = Omit, "coords"> & { +// coords: [number, number]; +// }; + +export default function init(db: Mongoose) { + const dbTBM_StopsSchema = buildSchema(dbTBM_Stops, { existingMongoose: db }); + const dbTBM_StopsModelRaw = db.model(getName(dbTBM_Stops), dbTBM_StopsSchema); + + return addModelToTypegoose(dbTBM_StopsModelRaw, dbTBM_Stops, { existingMongoose: db }); +} + +export type dbTBM_StopsModel = ReturnType; diff --git a/src/test/models/TBM_trips.model.ts b/src/test/models/TBM_trips.model.ts new file mode 100644 index 00000000..a96601d2 --- /dev/null +++ b/src/test/models/TBM_trips.model.ts @@ -0,0 +1,44 @@ +// tbm_vehicles-model.js - A mongoose model +// +// See http://mongoosejs.com/docs/models.html + +import { TBMEndpoints } from "."; +import { TimeStamps } from "@typegoose/typegoose/lib/defaultClasses"; +import { addModelToTypegoose, buildSchema, index, prop, Ref } from "@typegoose/typegoose"; +import { modelOptions } from "@typegoose/typegoose/lib/modelOptions"; +import { getName } from "@typegoose/typegoose/lib/internal/utils"; +import { dbTBM_Lines } from "./TBM_lines.model"; +import { dbTBM_Stops } from "./TBM_stops.model"; +import { dbTBM_Lines_routes } from "./TBM_lines_routes.model"; +import { Mongoose } from "mongoose"; + +@index({ rs_sv_chem_l: 1 }) +@modelOptions({ options: { customName: TBMEndpoints.Trips } }) +export class dbTBM_Trips extends TimeStamps { + @prop({ required: true }) + public _id!: number; + + @prop({ required: true }) + public etat!: string; + + @prop({ required: true, ref: () => dbTBM_Lines, type: () => Number }) + public rs_sv_ligne_a!: Ref; + + @prop({ required: true, ref: () => dbTBM_Stops, type: () => Number }) + public rg_sv_arret_p_nd!: Ref; + + @prop({ required: true, ref: () => dbTBM_Stops, type: () => Number }) + public rg_sv_arret_p_na!: Ref; + + @prop({ required: true, ref: () => dbTBM_Lines_routes, type: () => Number }) + public rs_sv_chem_l!: Ref; +} + +export default function init(db: Mongoose) { + const dbTBM_TripsSchema = buildSchema(dbTBM_Trips, { existingMongoose: db }); + const dbTBM_TripsModelRaw = db.model(getName(dbTBM_Trips), dbTBM_TripsSchema); + + return addModelToTypegoose(dbTBM_TripsModelRaw, dbTBM_Trips, { existingMongoose: db }); +} + +export type dbTBM_TripsModel = ReturnType; diff --git a/src/test/models/TBM_vehicles.model.ts b/src/test/models/TBM_vehicles.model.ts deleted file mode 100644 index dd1d3f87..00000000 --- a/src/test/models/TBM_vehicles.model.ts +++ /dev/null @@ -1,26 +0,0 @@ -// tbm_vehicles-model.js - A mongoose model -// -// See http://mongoosejs.com/docs/models.html - -import { InferSchemaType, Schema, model } from "mongoose"; - -const dbTBM_Vehicles = new Schema( - { - _id: { type: Number, required: true }, - etat: { type: String, required: true }, - rs_sv_ligne_a: { type: Number, ref: "lines" }, - rg_sv_arret_p_nd: { type: Number, required: true, ref: "stops" }, - rg_sv_arret_p_na: { type: Number, required: true, ref: "stops" }, - rs_sv_chem_l: { type: Number, ref: "lines_routes" }, - }, - { - timestamps: true, - }, -); - -export type dbTBM_Vehicles = InferSchemaType; - -export default function (m: typeof model) { - const modelName = "tbm_vehicles"; - return m(modelName, dbTBM_Vehicles); -} diff --git a/src/test/models/addresses.model.ts b/src/test/models/addresses.model.ts index 278494c5..acd2780e 100644 --- a/src/test/models/addresses.model.ts +++ b/src/test/models/addresses.model.ts @@ -2,31 +2,51 @@ // // See http://mongoosejs.com/docs/models.html -import { InferSchemaType, Schema, model } from "mongoose"; - -const dbAddresses = new Schema( - { - _id: { type: Number, required: true }, - coords: { type: [Number], required: true }, - numero: { type: Number, required: true }, - rep: { type: String, required: false }, - type_voie: { type: String, required: true }, - nom_voie: { type: String, required: true }, - nom_voie_lowercase: { type: String, required: true }, - code_postal: { type: Number, required: true }, - fantoir: { type: String, required: true }, - commune: { type: String, required: true }, - }, - { - timestamps: true, - }, -); - -export type dbAddresses = Omit, "coords"> & { - coords: [number, number]; -}; - -export default function (m: typeof model) { - const modelName = "addresses"; - return m(modelName, dbAddresses); +import { TBMEndpoints } from "."; +import { TimeStamps } from "@typegoose/typegoose/lib/defaultClasses"; +import { addModelToTypegoose, buildSchema, prop } from "@typegoose/typegoose"; +import { modelOptions } from "@typegoose/typegoose/lib/modelOptions"; +import { getName } from "@typegoose/typegoose/lib/internal/utils"; +import { Mongoose } from "mongoose"; + +@modelOptions({ options: { customName: TBMEndpoints.Addresses } }) +export class dbAddresses extends TimeStamps { + @prop({ required: true }) + public _id!: number; + + @prop({ type: () => [Number, Number], required: true }) + public coords!: [number, number]; + + @prop({ required: true }) + public numero!: number; + + @prop() + public rep?: string; + + @prop({ required: true }) + public type_voie!: string; + + @prop({ required: true }) + public nom_voie!: string; + + @prop({ required: true }) + public nom_voie_lowercase!: string; + + @prop({ required: true }) + public code_postal!: number; + + @prop({ required: true }) + public fantoir!: string; + + @prop({ required: true }) + public commune!: string; } + +export default function init(db: Mongoose) { + const dbAddressesSchema = buildSchema(dbAddresses, { existingMongoose: db }); + const dbAddressesModelRaw = db.model(getName(dbAddresses), dbAddressesSchema); + + return addModelToTypegoose(dbAddressesModelRaw, dbAddresses, { existingMongoose: db }); +} + +export type dbAddressesModel = ReturnType; diff --git a/src/test/models/index.ts b/src/test/models/index.ts new file mode 100644 index 00000000..ef18fc7f --- /dev/null +++ b/src/test/models/index.ts @@ -0,0 +1,18 @@ +export enum TBMEndpoints { + Addresses = "Addresses", + Intersections = "Intersections", + Sections = "Sections", + Stops = "TBM_Stops", + Lines = "TBM_Lines", + // 2 different endpoints in 1 collection + Schedules = "TBM_Schedules", + Schedules_rt = "TBM_Schedules_rt", + Trips = "TBM_Trips", + Lines_routes = "TBM_Lines_routes", + ScheduledRoutes = "TBM_Scheduled_routes", +} + +export enum SNCFEndpoints { + Schedules = "SNCF_Schedules", + Stops = "SNCF_Stops", +} diff --git a/src/test/models/intersections.model.ts b/src/test/models/intersections.model.ts index 6a64b40a..266acaba 100644 --- a/src/test/models/intersections.model.ts +++ b/src/test/models/intersections.model.ts @@ -2,22 +2,32 @@ // // See http://mongoosejs.com/docs/models.html -import { InferSchemaType, Schema, model } from "mongoose"; +import { TBMEndpoints } from "."; +import { TimeStamps } from "@typegoose/typegoose/lib/defaultClasses"; +import { addModelToTypegoose, buildSchema, prop } from "@typegoose/typegoose"; +import { modelOptions } from "@typegoose/typegoose/lib/modelOptions"; +import { getName } from "@typegoose/typegoose/lib/internal/utils"; +import { Mongoose } from "mongoose"; -const dbIntersections = new Schema( - { - coords: { type: [Number], required: true }, - _id: { type: Number, required: true }, - nature: { type: String, required: true }, - }, - { - timestamps: true, - }, -); +@modelOptions({ options: { customName: TBMEndpoints.Intersections } }) +export class dbIntersections extends TimeStamps { + @prop({ required: true }) + public _id!: number; -export type dbIntersections = InferSchemaType; + @prop({ type: () => [Number, Number], required: true }) + public coords!: [number, number]; -export default function (m: typeof model) { - const modelName = "intersections"; - return m(modelName, dbIntersections); + @prop({ required: true }) + public nature!: string; } + +export default function init(db: Mongoose) { + const dbIntersectionsSchema = buildSchema(dbIntersections, { existingMongoose: db }); + const dbIntersectionsModelRaw = db.model(getName(dbIntersections), dbIntersectionsSchema); + + return addModelToTypegoose(dbIntersectionsModelRaw, dbIntersections, { + existingMongoose: db, + }); +} + +export type dbIntersectionsModel = ReturnType; diff --git a/src/test/models/sections.model.ts b/src/test/models/sections.model.ts index ea939b49..b36fa9b4 100644 --- a/src/test/models/sections.model.ts +++ b/src/test/models/sections.model.ts @@ -1,30 +1,50 @@ // sections-model.js - A mongoose model // // See http://mongoosejs.com/docs/models.html -import { InferSchemaType, Schema, model } from "mongoose"; - -const dbSections = new Schema( - { - coords: { type: [[Number]], required: true }, - distance: { type: Number, required: true }, - _id: { type: Number, required: true }, - domanial: { type: Number, required: true }, - groupe: { type: Number, required: true }, - nom_voie: { type: String, required: true }, - rg_fv_graph_dbl: { type: Boolean, required: true }, - rg_fv_graph_nd: { type: Number, required: true, ref: "nodes" }, - rg_fv_graph_na: { type: Number, required: true, ref: "nodes" }, - }, - { - timestamps: true, - }, -); - -export type dbSections = Omit, "coords"> & { - coords: [number, number][] -}; - -export default function (m: typeof model) { - const modelName = "sections"; - return m(modelName, dbSections); + +import { TBMEndpoints } from "."; +import { TimeStamps } from "@typegoose/typegoose/lib/defaultClasses"; +import { addModelToTypegoose, buildSchema, prop, Ref } from "@typegoose/typegoose"; +import { modelOptions } from "@typegoose/typegoose/lib/modelOptions"; +import { getName } from "@typegoose/typegoose/lib/internal/utils"; +import { dbIntersections } from "./intersections.model"; +import { Mongoose } from "mongoose"; + +@modelOptions({ options: { customName: TBMEndpoints.Sections } }) +export class dbSections extends TimeStamps { + @prop({ required: true }) + public _id!: number; + + @prop({ type: () => [[Number, Number]], required: true }) + public coords!: [number, number][]; + + @prop({ required: true }) + public distance!: number; + + @prop({ required: true }) + public domanial!: number; + + @prop({ required: true }) + public groupe!: number; + + @prop({ required: true }) + public nom_voie!: string; + + @prop({ required: true }) + public rg_fv_graph_dbl!: boolean; + + @prop({ required: true, ref: () => dbIntersections, type: () => Number }) + public rg_fv_graph_nd!: Ref; + + @prop({ required: true, ref: () => dbIntersections, type: () => Number }) + public rg_fv_graph_na!: Ref; } + +export default function init(db: Mongoose) { + const dbSectionsSchema = buildSchema(dbSections, { existingMongoose: db }); + const dbSectionsModelRaw = db.model(getName(dbSections), dbSectionsSchema); + + return addModelToTypegoose(dbSectionsModelRaw, dbSections, { existingMongoose: db }); +} + +export type dbSectionsModel = ReturnType; diff --git a/src/test/test.ts b/src/test/test.ts index 7a46396e..ae1cc5f9 100644 --- a/src/test/test.ts +++ b/src/test/test.ts @@ -1,198 +1,194 @@ -import { model } from 'mongoose'; -import db from './utils/mongoose'; -import { benchmark } from './utils/benchmark'; -import { WorkerPool } from './utils/Workers'; +import { HydratedDocument, model } from "mongoose"; +import initDB from "./utils/mongoose"; +import { benchmark } from "./utils/benchmark"; +import { WorkerPool } from "./utils/Workers"; -import { WeightedGraph } from '../utils/Graph'; +import { WeightedGraph } from "../utils/Graph"; -import Point from '../utils/Point'; -import Segment from '../utils/Segment'; +import Point from "../utils/Point"; +import Segment from "../utils/Segment"; export type id = number; function cartographicDistance(x1: number, y1: number, x2: number, y2: number): number { - - return Math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2); - + return Math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2); } -import sectionsModelInit, { dbSections } from "./models/sections.model" -import stopsModelInit, { dbTBM_Stops } from "./models/TBM_stops.model" -import { computePath, initialCallback } from './computePath'; - -export type Section = Pick; -export type Stop = Pick; - -async function run() { - - //Grab required data - await db(); - - const sectionsModel = sectionsModelInit(model); - const stopsModel = stopsModelInit(model); - - async function queryData() { - - //Important : sections are oriented. - //ERROR : there can be 2 sections (or more) linking the same nd to the same na. They need to be both differentiated (by their _id, for example). - const sections = await sectionsModel.find({}).select({ _id: 1, coords: 1, distance: 1, rg_fv_graph_dbl: 1, rg_fv_graph_nd: 1, rg_fv_graph_na: 1 }).lean().exec() as unknown as Section[]; - //Map section, from s1 to s2 (oriented). - const mapppedSections: Map = new Map(); - for (const s of sections) { - mapppedSections.set(`${s.rg_fv_graph_nd}-${s.rg_fv_graph_na}`, s); - if (s.rg_fv_graph_dbl) mapppedSections.set(`${s.rg_fv_graph_na}-${s.rg_fv_graph_nd}`, s); - } +import sectionsModelInit, { dbSections } from "./models/sections.model"; +import stopsModelInit, { dbTBM_Stops } from "./models/TBM_stops.model"; +import { computePath, initialCallback } from "./computePath"; +import { DocumentType } from "@typegoose/typegoose"; - const stops = (await stopsModel.find({ coords: { '$not': { '$elemMatch': { '$eq': Infinity } } } }).select({ _id: 1, coords: 1 }).lean().exec() as unknown as Stop[]) - .filter((s, _, arr) => !arr.find(ss => s.coords[0] === ss.coords[0] && s.coords[1] === ss.coords[1] && s._id !== ss._id)); +const sectionProjection = { _id: 1, coords: 1, distance: 1, rg_fv_graph_dbl: 1, rg_fv_graph_nd: 1, rg_fv_graph_na: 1 }; +export type Section = Pick; - return { - sections, - mapppedSections, - stops - } +const stopProjection = { _id: 1, coords: 1 }; +export type Stop = Pick; +async function run() { + //Grab required data + const db = await initDB(); + + const sectionsModel = sectionsModelInit(db); + const stopsModel = stopsModelInit(db); + + async function queryData() { + //Important : sections are oriented. + //ERROR : there can be 2 sections (or more) linking the same nd to the same na. They need to be both differentiated (by their _id, for example). + const sections = (await sectionsModel + .find>>({}, sectionProjection) + .lean() + // Coords field type lost... + .exec()) as unknown as Section[]; + //Map section, from s1 to s2 (oriented). + const mapppedSections: Map = new Map(); + for (const s of sections) { + mapppedSections.set(`${s.rg_fv_graph_nd}-${s.rg_fv_graph_na}`, s); + if (s.rg_fv_graph_dbl) mapppedSections.set(`${s.rg_fv_graph_na}-${s.rg_fv_graph_nd}`, s); } - const b1 = await benchmark(queryData, [], 10); - console.log("b1 ended") - if (!b1.lastReturn) return console.log(`b1 return null`) - const { sections, mapppedSections, stops } = b1.lastReturn; - - function makeGraph() { - - const footGraph: WeightedGraph = new WeightedGraph(); - - for (const s of sections) { - - //Oriented - s.rg_fv_graph_dbl ? footGraph.add_edge(s.rg_fv_graph_nd, s.rg_fv_graph_na, s.distance) : footGraph.add_arc(s.rg_fv_graph_nd, s.rg_fv_graph_na, s.distance); - - } - return footGraph; + const stops = ( + (await stopsModel + .find>>({ coords: { $not: { $elemMatch: { $eq: Infinity } } } }, stopProjection) + .lean() + // Coords field type lost... + .exec()) as unknown as Stop[] + ).filter((s, _, arr) => !arr.find((ss) => s.coords[0] === ss.coords[0] && s.coords[1] === ss.coords[1] && s._id !== ss._id)); + + return { + sections, + mapppedSections, + stops, + }; + } + const b1 = await benchmark(queryData, [], 10); + console.log("b1 ended"); + if (!b1.lastReturn) return console.log(`b1 return null`); + const { sections, mapppedSections, stops } = b1.lastReturn; + + function makeGraph() { + const footGraph: WeightedGraph = new WeightedGraph(); + + for (const s of sections) { + //Oriented + s.rg_fv_graph_dbl + ? footGraph.add_edge(s.rg_fv_graph_nd as number, s.rg_fv_graph_na as number, s.distance) + : footGraph.add_arc(s.rg_fv_graph_nd as number, s.rg_fv_graph_na as number, s.distance); } - const b2 = await benchmark(makeGraph, [], 10); - console.log("b2 ended") - if (!b2.lastReturn) return console.log(`b2 return null`) - const footGraph = b2.lastReturn; - - const arcs = footGraph.arcs; - - //Compute approached stops - function ComputeApproachedStops() { - - //Pre-generate segments to fasten the process (and not redundant computing) - //A segment describes a portion of a section (oriented) - const segments: Map = new Map(); - for (const a of arcs) { - - const section = mapppedSections.get(`${a[0]}-${a[1]}`); - if (!section) continue // Added for ts mental health - for (let i = 0; i < section.coords.length - 1; i++) { - - segments.set(section, { - n: i, - seg: new Segment( - new Point(...section.coords[i]), - new Point(...section.coords[i + 1]) - ) - }); - - } - } - - /**@description [distance to closest point, closest point, section containing this point, indice of segment composing the section] */ - const approachedStops: Array<[Point, Section, number]> = new Array(stops.length); - for (let i = 0; i < stops.length; i++) { - - let closestPoint: [number, Point | null, Section | null, number | null] = [Infinity, null, null, null]; - - for (const [section, { n, seg }] of segments) { - - const stopPoint: Point = new Point(...stops[i].coords); - const localClosestPoint: Point = seg.closestPointFromPoint(stopPoint); - const distance: number = Point.distance(stopPoint, localClosestPoint); - if (distance < closestPoint[0]) { - closestPoint[0] = distance; - closestPoint[1] = localClosestPoint; - closestPoint[2] = section; - closestPoint[3] = n; - } - } - if (closestPoint[1] !== null && closestPoint[2] !== null && closestPoint[3] !== null) approachedStops[i] = [closestPoint[1], closestPoint[2], closestPoint[3]]; - - } - return approachedStops; + return footGraph; + } + const b2 = await benchmark(makeGraph, [], 10); + console.log("b2 ended"); + if (!b2.lastReturn) return console.log(`b2 return null`); + const footGraph = b2.lastReturn; + + const arcs = footGraph.arcs; + + //Compute approached stops + function ComputeApproachedStops() { + //Pre-generate segments to fasten the process (and not redundant computing) + //A segment describes a portion of a section (oriented) + const segments: Map = new Map(); + for (const a of arcs) { + const section = mapppedSections.get(`${a[0]}-${a[1]}`); + if (!section) continue; // Added for ts mental health + for (let i = 0; i < section.coords.length - 1; i++) { + segments.set(section, { + n: i, + seg: new Segment(new Point(...section.coords[i]), new Point(...section.coords[i + 1])), + }); + } } - const b3 = await benchmark(ComputeApproachedStops, [], 1); - console.log("b3 ended") - if (!b3.lastReturn) return console.log(`b3 return null`) - const approachedStops = b3.lastReturn; - - function updateGraph() { - //Pushes new approached stops into graph, just like a proxy on a section - for (let i = 0; i < approachedStops.length; i++) { - - if (!approachedStops[i]) continue; // couldn't find an approched stop (coords = Infinity) - const [closestPoint, section, n] = approachedStops[i] - - //Compute distance from section start to approachedStop - const toApproadchedStop: number = section.coords.reduce((acc, v, i, arr) => { - if (i < n && i < arr.length - 1) return acc + cartographicDistance(...v, ...arr[i + 1]); - return acc; - }, 0) + Point.distance(closestPoint, new Point(...section.coords[n])); - - //Compute distance form approachedStop to section end - const fromApproachedStop: number = section.coords.reduce((acc, v, i, arr) => { - if (i > n && i < arr.length - 1) return acc + cartographicDistance(...v, ...arr[i + 1]); - return acc; - }, 0) + Point.distance(closestPoint, new Point(...section.coords[n])); - - //Remove arc from p1 to p2 - footGraph.remove_arc(section.rg_fv_graph_nd, section.rg_fv_graph_na); - - //Insert new node approachedStop - //Create arc from p1 to approachedStop to p2 - //Ensure unique node id for approachedStop - footGraph.add_arc(section.rg_fv_graph_nd, `stop-${stops[i]._id}`, toApproadchedStop); - footGraph.add_arc(`stop-${stops[i]._id}`, section.rg_fv_graph_na, fromApproachedStop); + /**@description [distance to closest point, closest point, section containing this point, indice of segment composing the section] */ + const approachedStops: Array<[Point, Section, number]> = new Array(stops.length); + for (let i = 0; i < stops.length; i++) { + let closestPoint: [number, Point | null, Section | null, number | null] = [Infinity, null, null, null]; + + for (const [section, { n, seg }] of segments) { + const stopPoint: Point = new Point(...stops[i].coords); + const localClosestPoint: Point = seg.closestPointFromPoint(stopPoint); + const distance: number = Point.distance(stopPoint, localClosestPoint); + if (distance < closestPoint[0]) { + closestPoint[0] = distance; + closestPoint[1] = localClosestPoint; + closestPoint[2] = section; + closestPoint[3] = n; } - } - const b4 = await benchmark(updateGraph, []); - console.log("b4 ended") - function computePaths() { - - return new Promise((res, rej) => { - - const workerPool = new WorkerPool(__dirname + '/computePath.js', 8, { adj: footGraph.adj, weights: footGraph.weights, stops }); - - //paths> - const paths: Map>>> = new Map(); - - for (let i = 0; i < stops.length; i++) { - - workerPool.run>([`stop-${stops[i]._id}`, false]).then(sourcePaths => { - - paths.set(stops[i]._id, sourcePaths); - if (paths.size === stops.length) res(paths); - - }).catch(rej); - - } - }) + } + if (closestPoint[1] !== null && closestPoint[2] !== null && closestPoint[3] !== null) + approachedStops[i] = [closestPoint[1], closestPoint[2], closestPoint[3]]; } - const b5 = await benchmark(computePaths, []); - console.log("b5 ended") - const paths = b5.lastReturn; - - return { b1, b2, b3, b4, b5 }; + return approachedStops; + } + const b3 = await benchmark(ComputeApproachedStops, [], 1); + console.log("b3 ended"); + if (!b3.lastReturn) return console.log(`b3 return null`); + const approachedStops = b3.lastReturn; + + function updateGraph() { + //Pushes new approached stops into graph, just like a proxy on a section + for (let i = 0; i < approachedStops.length; i++) { + if (!approachedStops[i]) continue; // couldn't find an approched stop (coords = Infinity) + const [closestPoint, section, n] = approachedStops[i]; + + //Compute distance from section start to approachedStop + const toApproadchedStop: number = + section.coords.reduce((acc, v, i, arr) => { + if (i < n && i < arr.length - 1) return acc + cartographicDistance(...v, ...arr[i + 1]); + return acc; + }, 0) + Point.distance(closestPoint, new Point(...section.coords[n])); + + //Compute distance form approachedStop to section end + const fromApproachedStop: number = + section.coords.reduce((acc, v, i, arr) => { + if (i > n && i < arr.length - 1) return acc + cartographicDistance(...v, ...arr[i + 1]); + return acc; + }, 0) + Point.distance(closestPoint, new Point(...section.coords[n])); + + //Remove arc from p1 to p2 + footGraph.remove_arc(section.rg_fv_graph_nd as number, section.rg_fv_graph_na as number); + + //Insert new node approachedStop + //Create arc from p1 to approachedStop to p2 + //Ensure unique node id for approachedStop + footGraph.add_arc(section.rg_fv_graph_nd as number, `stop-${stops[i]._id}`, toApproadchedStop); + footGraph.add_arc(`stop-${stops[i]._id}`, section.rg_fv_graph_na as number, fromApproachedStop); + } + } + const b4 = await benchmark(updateGraph, []); + console.log("b4 ended"); + function computePaths() { + return new Promise((res, rej) => { + const workerPool = new WorkerPool(__dirname + "/computePath.js", 8, { + adj: footGraph.adj, + weights: footGraph.weights, + stops, + }); + + //paths> + const paths: Map>>> = new Map(); + + for (let i = 0; i < stops.length; i++) { + workerPool + .run>([`stop-${stops[i]._id}`, false]) + .then((sourcePaths) => { + paths.set(stops[i]._id, sourcePaths); + if (paths.size === stops.length) res(paths); + }) + .catch(rej); + } + }); + } + const b5 = await benchmark(computePaths, []); + console.log("b5 ended"); + const paths = b5.lastReturn; + + return { b1, b2, b3, b4, b5 }; } -run() - .then(console.log) - .catch(console.error) +run().then(console.log).catch(console.error); -setTimeout(() => { }, 1000000); \ No newline at end of file +setTimeout(() => {}, 1000000); diff --git a/tsconfig.json b/tsconfig.json index 201d24b3..1290d0f1 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -3,6 +3,8 @@ "outDir": "./built", "moduleResolution": "Node", "module": "CommonJS", + "experimentalDecorators": true, + "emitDecoratorMetadata": true, "allowJs": true, "sourceMap": true, "target": "es6", From 5565ed3f267f5bdd47c8dc3a8ea18a488af6d8ac Mon Sep 17 00:00:00 2001 From: Catatomik Date: Sun, 19 Feb 2023 17:36:33 +0100 Subject: [PATCH 032/251] =?UTF-8?q?=F0=9F=8E=A8=20Prettier?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/computePath.ts | 109 +++++++++-------- src/test/utils/Link.ts | 226 ++++++++++++++++++------------------ src/test/utils/Queue.ts | 80 ++++++------- src/test/utils/Workers.ts | 224 +++++++++++++++++------------------ src/test/utils/benchmark.ts | 104 ++++++++--------- src/test/utils/mongoose.ts | 19 ++- src/test/utils/ultils.ts | 7 +- 7 files changed, 379 insertions(+), 390 deletions(-) diff --git a/src/test/computePath.ts b/src/test/computePath.ts index 1aac62ba..5aa9e0ea 100644 --- a/src/test/computePath.ts +++ b/src/test/computePath.ts @@ -1,76 +1,89 @@ -import { path, Dijkstra, tracePath, DijkstraOptions } from '../FootPaths'; -import { node, WeightedGraph } from '../utils/Graph'; -import { id, Section, Stop } from './test'; +import { path, Dijkstra, tracePath, DijkstraOptions } from "../FootPaths"; +import { node, WeightedGraph } from "../utils/Graph"; +import { id, Section, Stop } from "./test"; -import { parentPort } from 'worker_threads'; -import { benchmark } from './utils/benchmark'; +import { parentPort } from "worker_threads"; +import { benchmark } from "./utils/benchmark"; export interface initData { - adj: Required>[0]; - weights: Required>[1]; - stops: Array
- options?: DijkstraOptions; + adj: Required>[0]; + weights: Required>[1]; + stops: Array
; + options?: DijkstraOptions; } export function initialCallback(data: initData) { - footGraph = new WeightedGraph(data.adj, data.weights); - stops = data.stops; - options = data.options; - if (parentPort) parentPort.postMessage(true); + footGraph = new WeightedGraph(data.adj, data.weights); + stops = data.stops; + options = data.options; + if (parentPort) parentPort.postMessage(true); } -if (parentPort) parentPort.on('message', async (data: initData | Parameters) => { +if (parentPort) + parentPort.on("message", async (data: initData | Parameters) => { if (data instanceof Array) { - if (parentPort) parentPort.postMessage(await computePath(...data)); + if (parentPort) parentPort.postMessage(await computePath(...data)); } else { - initialCallback(data) + initialCallback(data); } - -}) + }); let footGraph: WeightedGraph | undefined; let stops: initData["stops"] | undefined; let options: initData["options"] | undefined; export async function computePath(stopId: string, returnPaths: Paths) { + const sourcePaths: Map = new Map(); - const sourcePaths: Map = new Map(); - - if (!footGraph || !stops) return sourcePaths; - - const [dist, prev] = options ? await Dijkstra(footGraph, [stopId], options) : await Dijkstra(footGraph, [stopId]); + if (!footGraph || !stops) return sourcePaths; - for (let j = 0; j < stops.length; j++) { + const [dist, prev] = options ? await Dijkstra(footGraph, [stopId], options) : await Dijkstra(footGraph, [stopId]); - const targetNode = `stop-${stops[j]._id}`; + for (let j = 0; j < stops.length; j++) { + const targetNode = `stop-${stops[j]._id}`; - if (dist.get(targetNode) !== undefined && dist.get(targetNode)! < Infinity) - sourcePaths.set(stops[j]._id, (returnPaths ? [tracePath(prev, targetNode), dist.get(targetNode)!] : dist.get(targetNode)!) as Paths extends true ? [path, number] : number); - - } + if (dist.get(targetNode) !== undefined && dist.get(targetNode)! < Infinity) + sourcePaths.set( + stops[j]._id, + (returnPaths ? [tracePath(prev, targetNode), dist.get(targetNode)!] : dist.get(targetNode)!) as Paths extends true ? [path, number] : number, + ); + } - return sourcePaths; + return sourcePaths; } export async function computePathBench(stopId: string, returnPaths: boolean) { + const sourcePaths: Map = new Map(); - const sourcePaths: Map = new Map(); + if (!footGraph || !stops) return sourcePaths; - if (!footGraph || !stops) return sourcePaths; + const [dist, prev] = options + ? ( + await benchmark(Dijkstra as (G: WeightedGraph, [s]: [node], O: DijkstraOptions) => [Map, Map], [ + footGraph, + [stopId], + options, + ]) + ).lastReturn! + : (await benchmark(Dijkstra as (G: WeightedGraph, [s]: [node]) => [Map, Map], [footGraph, [stopId]])).lastReturn!; - const [dist, prev] = options - ? (await benchmark(Dijkstra as (G: WeightedGraph, [s]: [node], O: DijkstraOptions) => [Map, Map], [footGraph, [stopId], options])).lastReturn! - : (await benchmark(Dijkstra as (G: WeightedGraph, [s]: [node]) => [Map, Map], [footGraph, [stopId]])).lastReturn!; + await benchmark( + (s: NonNullable) => { + for (let j = 0; j < s.length; j++) { + const targetNode = `stop-${s[j]._id}`; - await benchmark((s: NonNullable) => { - for (let j = 0; j < s.length; j++) { - - const targetNode = `stop-${s[j]._id}`; - - if (dist.get(targetNode) !== undefined && dist.get(targetNode)! < Infinity) - sourcePaths.set(s[j]._id, (returnPaths ? [tracePath(prev, targetNode), dist.get(targetNode)!] : dist.get(targetNode)!) as Paths extends true ? [path, number] : number); - - } - }, [stops], 1, true) - - return sourcePaths; -} \ No newline at end of file + if (dist.get(targetNode) !== undefined && dist.get(targetNode)! < Infinity) + sourcePaths.set( + s[j]._id, + (returnPaths ? [tracePath(prev, targetNode), dist.get(targetNode)!] : dist.get(targetNode)!) as Paths extends true + ? [path, number] + : number, + ); + } + }, + [stops], + 1, + true, + ); + + return sourcePaths; +} diff --git a/src/test/utils/Link.ts b/src/test/utils/Link.ts index cf037700..0c7b1162 100644 --- a/src/test/utils/Link.ts +++ b/src/test/utils/Link.ts @@ -1,4 +1,4 @@ -const emptyLink = Symbol('emptyLink') +const emptyLink = Symbol("emptyLink"); export type LinkOrEmpty = Link | typeof emptyLink; @@ -6,119 +6,117 @@ export type LinkOrEmpty = Link | typeof emptyLink; * @description Class of chained array */ export class Link { - - static emptyLink: typeof emptyLink = emptyLink; - - private _value: Type; - private _next: LinkOrEmpty; - - /** - * @description Construction of the first LinkOrEmpty - * @param val Any type of data to LinkOrEmpty - */ - constructor(val: Type, next: LinkOrEmpty = Link.emptyLink) { - this._value = val; - this._next = next; - } - - static isLink(l: LinkOrEmpty): boolean { - return l instanceof Link; - } - - /** - * @description Get the value of this LinkOrEmpty - */ - get value(): Type { - return this._value; - } - - set value(v: any) { - this._value = v; - } - - /** - * @description Get the next LinkOrEmpty of this chained array - */ - get next(): LinkOrEmpty { - return this._next; - } - - set next(v: LinkOrEmpty) { - if (!Link.isLink(v) && v != Link.emptyLink) throw new Error("Next value of the LinkOrEmpty can only be a Link or an empty Link.") - this._next = v; - } - - /** - * @description Get depth of the LinkOrEmpty {Number} - */ - get depth(): number { - if (!Link.isLink(this._next)) return 1; - return 1 + (this._next as Link).depth; + static emptyLink: typeof emptyLink = emptyLink; + + private _value: Type; + private _next: LinkOrEmpty; + + /** + * @description Construction of the first LinkOrEmpty + * @param val Any type of data to LinkOrEmpty + */ + constructor(val: Type, next: LinkOrEmpty = Link.emptyLink) { + this._value = val; + this._next = next; + } + + static isLink(l: LinkOrEmpty): boolean { + return l instanceof Link; + } + + /** + * @description Get the value of this LinkOrEmpty + */ + get value(): Type { + return this._value; + } + + set value(v: any) { + this._value = v; + } + + /** + * @description Get the next LinkOrEmpty of this chained array + */ + get next(): LinkOrEmpty { + return this._next; + } + + set next(v: LinkOrEmpty) { + if (!Link.isLink(v) && v != Link.emptyLink) throw new Error("Next value of the LinkOrEmpty can only be a Link or an empty Link."); + this._next = v; + } + + /** + * @description Get depth of the LinkOrEmpty {Number} + */ + get depth(): number { + if (!Link.isLink(this._next)) return 1; + return 1 + (this._next as Link).depth; + } + + toArrayRec(): any[] { + if (!Link.isLink(this.next)) return [this.value]; + let next = (this.next as Link).toArrayRec(); + return [this.value, ...next]; + } + + toArray(): any[] { + return Array.from(this); + } + + toArrayRevertedRec(): any[] { + if (!this._next || !(this._next instanceof Link)) return [this.value]; + let next = this._next.toArray(); + return [...next, this.value]; + } + + toArrayReverted(): any[] { + return this.toArray().reverse(); + } + + *[Symbol.iterator]() { + let el = this as Link; + while (Link.isLink(el)) { + yield el.value; + el = el._next as Link; } - - toArrayRec(): any[] { - if (!Link.isLink(this.next)) return [this.value]; - let next = (this.next as Link).toArrayRec(); - return [this.value, ...next]; - } - - toArray(): any[] { - return Array.from(this); - } - - toArrayRevertedRec(): any[] { - if (!this._next || !(this._next instanceof Link)) return [this.value]; - let next = this._next.toArray(); - return [...next, this.value]; - } - - toArrayReverted(): any[] { - return this.toArray().reverse(); + } + + /** + * @description Get the n(th) element of the LinkOrEmpty + * @param {Number} n Index of the element to access to + */ + get_rec(n: number): any { + if (n < 0) throw new Error("Invalid index"); + if (n == 0) return this.value; + if (this._next instanceof Link) return this._next.get(n - 1); + else throw new Error("Index out of range"); + } + + /** + * @description Get the n(th) element of the LinkOrEmpty + * @param {Number} n Index of the element to access to + */ + get(n: number): any { + if (n < 0) throw new Error("Invalid index"); + let i = 0; + for (let el of this) { + if (n === i) return el; + i++; } - - *[Symbol.iterator]() { - let el = this as Link - while (Link.isLink(el)) { - yield el.value - el = el._next as Link - } + throw new Error("Index out of range"); + } + + /** + * @description Create chained array from array + * @param {Array} a The array to convert into chained array + */ + static fromArray(a: Array = []): LinkOrEmpty { + let m: LinkOrEmpty = Link.emptyLink; + for (let i = a.length - 1; i >= 0; i--) { + m = new this(a[i], m); } - - /** - * @description Get the n(th) element of the LinkOrEmpty - * @param {Number} n Index of the element to access to - */ - get_rec(n: number): any { - if (n < 0) throw new Error("Invalid index"); - if (n == 0) return this.value; - if (this._next instanceof Link) return this._next.get(n - 1); - else throw new Error("Index out of range"); - } - - /** - * @description Get the n(th) element of the LinkOrEmpty - * @param {Number} n Index of the element to access to - */ - get(n: number): any { - if (n < 0) throw new Error("Invalid index"); - let i = 0; - for (let el of this) { - if (n === i) return el; - i++; - } - throw new Error("Index out of range"); - } - - /** - * @description Create chained array from array - * @param {Array} a The array to convert into chained array - */ - static fromArray(a: Array = []): LinkOrEmpty { - let m: LinkOrEmpty = Link.emptyLink; - for (let i = a.length - 1; i >= 0; i--) { - m = new this(a[i], m); - }; - return m; - } - -} \ No newline at end of file + return m; + } +} diff --git a/src/test/utils/Queue.ts b/src/test/utils/Queue.ts index 71766632..d8f5af8f 100644 --- a/src/test/utils/Queue.ts +++ b/src/test/utils/Queue.ts @@ -1,46 +1,42 @@ import { LinkOrEmpty, Link } from "./Link"; export class Queue { - - private front: LinkOrEmpty; - private back: LinkOrEmpty; - private _size: number; - - constructor() { - - this.front = Link.emptyLink; - this.back = Link.emptyLink; - this._size = 0; - + private front: LinkOrEmpty; + private back: LinkOrEmpty; + private _size: number; + + constructor() { + this.front = Link.emptyLink; + this.back = Link.emptyLink; + this._size = 0; + } + + get size(): number { + return this._size; + } + + enqueue(val: Type): Queue { + if (this.size === 0) { + this.front = new Link(val); + this.back = this.front; + } else { + (this.back as Link).next = new Link(val); + this.back = (this.back as Link).next; } - - get size(): number { - return this._size; - } - - enqueue(val: Type): Queue { - if (this.size === 0) { - this.front = new Link(val); - this.back = this.front; - } else { - (this.back as Link).next = new Link(val); - this.back = (this.back as Link).next; - } - this._size++; - return this; - } - - dequeue(): Type { - if (!this.size) throw new Error("Queue is empty."); - const v = (this.front as Link).value; - this.front = (this.front as Link).next; - this._size--; - return v; - } - - toArray(): Type[] { - if (!this.size) return []; - return (this.front as Link).toArray(); - } - -} \ No newline at end of file + this._size++; + return this; + } + + dequeue(): Type { + if (!this.size) throw new Error("Queue is empty."); + const v = (this.front as Link).value; + this.front = (this.front as Link).next; + this._size--; + return v; + } + + toArray(): Type[] { + if (!this.size) return []; + return (this.front as Link).toArray(); + } +} diff --git a/src/test/utils/Workers.ts b/src/test/utils/Workers.ts index 4e56f05f..d35363f2 100644 --- a/src/test/utils/Workers.ts +++ b/src/test/utils/Workers.ts @@ -1,140 +1,130 @@ -import { Worker } from 'worker_threads' -import { Deferred, rejectCb, resolveCb } from './ultils'; -import { Duration } from './benchmark'; -import { Queue } from './Queue'; -const nsPerMs = BigInt(1e6) +import { Worker } from "worker_threads"; +import { Deferred, rejectCb, resolveCb } from "./ultils"; +import { Duration } from "./benchmark"; +import { Queue } from "./Queue"; +const nsPerMs = BigInt(1e6); enum Status { - Idle, - Busy, + Idle, + Busy, } interface poolWorker { - id: number; - status: Status; - worker: Worker; - work: queued | null; + id: number; + status: Status; + worker: Worker; + work: queued | null; } type queued = [any, resolveCb, rejectCb]; export class WorkerPool any> { - - readonly script: string; - readonly size: number; - readonly pool: poolWorker[]; - readonly queue: Queue; - - constructor(script: string, size: number, initData?: Parameters[0]) { - - this.script = script; - this.size = size; - this.pool = new Array(this.size); - this.queue = new Queue(); - - for (let i = 0; i < this.size; i++) { - - this.pool[i] = { - id: i, - status: Status.Idle, - worker: new Worker(this.script), - work: null, - }; - - if (initData) { - const worker = this.pool[i]; - worker.status = Status.Busy; - - console.log(`Initializing worker ${worker.id}`); - - worker.worker.postMessage({ ...initData }); - worker.worker.once('message', (v) => { - if (v === true) { - worker.status = Status.Idle; - - console.log(`Initialized worker ${worker.id}`); - - this.runCallback(); - } - }); - worker.worker.once('error', console.error); - } - - } - } - - run any>(data: Parameters, res: resolveCb>, rej: rejectCb): void - run any>(data: Parameters): Promise>> - async run any>(data: Parameters, res?: resolveCb>>, rej?: rejectCb) { - - let def: Deferred> | null = null; - let resolve: resolveCb>>; - let reject: rejectCb; - - if (!res || !rej) { - def = new Deferred>(); - resolve = def.resolve; - reject = def.reject; - } else { - resolve = res; - reject = rej; - } - - const job: queued = [data, resolve, reject]; - - const worker = this.getIdleWorker(); - if (!worker) { - this.queue.enqueue(job) - console.log(`Delayed, queued (${this.queue.size})`); - return def?.promise; - } - - console.log(`Running worker ${worker.id} (${this.queue.size})`); - + readonly script: string; + readonly size: number; + readonly pool: poolWorker[]; + readonly queue: Queue; + + constructor(script: string, size: number, initData?: Parameters[0]) { + this.script = script; + this.size = size; + this.pool = new Array(this.size); + this.queue = new Queue(); + + for (let i = 0; i < this.size; i++) { + this.pool[i] = { + id: i, + status: Status.Idle, + worker: new Worker(this.script), + work: null, + }; + + if (initData) { + const worker = this.pool[i]; worker.status = Status.Busy; - worker.work = job; - const startTime = process.hrtime.bigint(); - worker.worker.postMessage(data); + console.log(`Initializing worker ${worker.id}`); - const onceMessage = (result: any) => { - const delta = new Duration(Number((process.hrtime.bigint() - startTime) / nsPerMs)); - worker.status = Status.Idle; - resolve(result); - console.log(`Finished worker ${worker.id} after ${delta.totalSeconds}s${delta.rSeconds} (${this.queue.size})`); - this.runCallback(); - worker.worker.removeListener('message', onceMessage); - worker.worker.removeListener('error', onceError); - }; - const onceError = (err: any) => { + worker.worker.postMessage({ ...initData }); + worker.worker.once("message", (v) => { + if (v === true) { worker.status = Status.Idle; - reject(err); - console.log(`Errored worker ${worker.id} (${this.queue.size})`); - this.runCallback(); - worker.worker.removeListener('error', onceError); - worker.worker.removeListener('message', onceMessage); - }; - worker.worker.once('message', onceMessage); - worker.worker.once('error', onceError); + console.log(`Initialized worker ${worker.id}`); - if (!res || !rej) return def!.promise + this.runCallback(); + } + }); + worker.worker.once("error", console.error); + } } - - protected runCallback(job?: queued) { - - if (!job) { - if (!this.queue.size) return; - job = this.queue.dequeue(); - } - return this.run(...job); - + } + + run any>(data: Parameters, res: resolveCb>, rej: rejectCb): void; + run any>(data: Parameters): Promise>>; + async run any>(data: Parameters, res?: resolveCb>>, rej?: rejectCb) { + let def: Deferred> | null = null; + let resolve: resolveCb>>; + let reject: rejectCb; + + if (!res || !rej) { + def = new Deferred>(); + resolve = def.resolve; + reject = def.reject; + } else { + resolve = res; + reject = rej; } - protected getIdleWorker(): poolWorker | undefined { + const job: queued = [data, resolve, reject]; - return this.pool.find(w => w.status === Status.Idle); + const worker = this.getIdleWorker(); + if (!worker) { + this.queue.enqueue(job); + console.log(`Delayed, queued (${this.queue.size})`); + return def?.promise; + } + console.log(`Running worker ${worker.id} (${this.queue.size})`); + + worker.status = Status.Busy; + worker.work = job; + + const startTime = process.hrtime.bigint(); + worker.worker.postMessage(data); + + const onceMessage = (result: any) => { + const delta = new Duration(Number((process.hrtime.bigint() - startTime) / nsPerMs)); + worker.status = Status.Idle; + resolve(result); + console.log(`Finished worker ${worker.id} after ${delta.totalSeconds}s${delta.rSeconds} (${this.queue.size})`); + this.runCallback(); + worker.worker.removeListener("message", onceMessage); + worker.worker.removeListener("error", onceError); + }; + const onceError = (err: any) => { + worker.status = Status.Idle; + reject(err); + console.log(`Errored worker ${worker.id} (${this.queue.size})`); + this.runCallback(); + worker.worker.removeListener("error", onceError); + worker.worker.removeListener("message", onceMessage); + }; + + worker.worker.once("message", onceMessage); + worker.worker.once("error", onceError); + + if (!res || !rej) return def!.promise; + } + + protected runCallback(job?: queued) { + if (!job) { + if (!this.queue.size) return; + job = this.queue.dequeue(); } + return this.run(...job); + } -} \ No newline at end of file + protected getIdleWorker(): poolWorker | undefined { + return this.pool.find((w) => w.status === Status.Idle); + } +} diff --git a/src/test/utils/benchmark.ts b/src/test/utils/benchmark.ts index a8b60c62..2c3c2b02 100644 --- a/src/test/utils/benchmark.ts +++ b/src/test/utils/benchmark.ts @@ -1,65 +1,61 @@ export async function benchmark any>(f: F, args: Parameters, times: number = 1, logStats = true) { - const starts: number[] = new Array(times); - const ends: number[] = new Array(times); - let lastReturn: Awaited> | null = null; - for (let i = 0; i < times; i++) { - starts[i] = performance.now(); - lastReturn = await f(...args); - ends[i] = performance.now(); - }; - const durations = ends.map((e, i) => new Duration(e - starts[i])) - const totalDuration = new Duration(durations.reduce((acc, v) => acc + v.ms, 0)); - const averageDuration = new Duration(totalDuration.ms / times); - if (logStats) console.log(`Benchmark of ${f.name || "anonymous"} : ${averageDuration}`); - return { - fName: f.name, - args, - starts, - ends, - durations, - totalDuration, - averageDuration, - times, - lastReturn, - }; -}; + const starts: number[] = new Array(times); + const ends: number[] = new Array(times); + let lastReturn: Awaited> | null = null; + for (let i = 0; i < times; i++) { + starts[i] = performance.now(); + lastReturn = await f(...args); + ends[i] = performance.now(); + } + const durations = ends.map((e, i) => new Duration(e - starts[i])); + const totalDuration = new Duration(durations.reduce((acc, v) => acc + v.ms, 0)); + const averageDuration = new Duration(totalDuration.ms / times); + if (logStats) console.log(`Benchmark of ${f.name || "anonymous"} : ${averageDuration}`); + return { + fName: f.name, + args, + starts, + ends, + durations, + totalDuration, + averageDuration, + times, + lastReturn, + }; +} export class Duration { + private time: number; - private time: number; + constructor(ms: number) { + this.time = ms; + } - constructor(ms: number) { + get ms() { + return this.time; + } - this.time = ms; + set ms(ms: number) { + this.time = ms; + } - } + get totalSeconds() { + return Math.floor(this.time / 1000); + } - get ms() { - return this.time; - } + get rSeconds() { + return this.time % 1000; + } - set ms(ms: number) { - this.time = ms; - } + get totalMinuts() { + return Math.floor(this.time / 60000); + } - get totalSeconds() { - return Math.floor(this.time / 1000); - } + get rMinuts() { + return this.time % 60000; + } - get rSeconds() { - return this.time % 1000; - } - - get totalMinuts() { - return Math.floor(this.time / 60000); - } - - get rMinuts() { - return this.time % 60000; - } - - toString() { - return `${this.totalMinuts}:${this.totalSeconds}:${this.rSeconds}` - } - -} \ No newline at end of file + toString() { + return `${this.totalMinuts}:${this.totalSeconds}:${this.rSeconds}`; + } +} diff --git a/src/test/utils/mongoose.ts b/src/test/utils/mongoose.ts index fffb9724..5d3344a1 100644 --- a/src/test/utils/mongoose.ts +++ b/src/test/utils/mongoose.ts @@ -1,13 +1,12 @@ -import { connect } from 'mongoose'; +import { connect } from "mongoose"; -export default async function() { +export default async function () { + const client = await connect( + `mongodb://0.0.0.0:27017/bibm`, + //{ useNewUrlParser: true } + ); - const client = await connect( - `mongodb://0.0.0.0:27017/bibm`, - //{ useNewUrlParser: true } - ) + console.info("Database connected."); - console.info('Database connected.') - - return client -}; + return client; +} diff --git a/src/test/utils/ultils.ts b/src/test/utils/ultils.ts index 7550885b..c3a83651 100644 --- a/src/test/utils/ultils.ts +++ b/src/test/utils/ultils.ts @@ -2,17 +2,14 @@ export type resolveCb = (value: T) => void; export type rejectCb = (reason?: any) => void; export class Deferred { - public promise: Promise; public resolve!: resolveCb; public reject!: rejectCb; constructor() { - this.promise = new Promise((resolve, reject) => { this.reject = reject; this.resolve = resolve; - }) - + }); } -} \ No newline at end of file +} From 2f6c88678a925a4baefdb99a4b05963d951046d2 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Sun, 19 Feb 2023 17:51:43 +0100 Subject: [PATCH 033/251] =?UTF-8?q?=F0=9F=9A=A7=20Remove=20unused=20import?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/test.ts b/src/test/test.ts index ae1cc5f9..a6f3ce6f 100644 --- a/src/test/test.ts +++ b/src/test/test.ts @@ -1,4 +1,4 @@ -import { HydratedDocument, model } from "mongoose"; +import { HydratedDocument } from "mongoose"; import initDB from "./utils/mongoose"; import { benchmark } from "./utils/benchmark"; import { WorkerPool } from "./utils/Workers"; From d10a7ca362e61ecba97d01c18ac39727c6de4e36 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Sun, 19 Feb 2023 17:54:00 +0100 Subject: [PATCH 034/251] =?UTF-8?q?=E2=AC=86=EF=B8=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2f7f7c69..885bec30 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "0.1.1", "license": "ISC", "dependencies": { - "@typegoose/typegoose": "^10.1.1", + "@typegoose/typegoose": "^10.2.0-beta.3", "@tyriar/fibonacci-heap": "^2.0.9", "mongodb": "^5.0.1" }, @@ -1207,9 +1207,9 @@ "license": "MIT" }, "node_modules/@typegoose/typegoose": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/@typegoose/typegoose/-/typegoose-10.1.1.tgz", - "integrity": "sha512-QzRzgFnsQ3/UTToUEVJ5ln4t/QzlznEat7bcn9tNt4U6QCytPVvTJnRe5SwrJllxakgz0yrnbKkTw9YeoiYXuQ==", + "version": "10.2.0-beta.3", + "resolved": "https://registry.npmjs.org/@typegoose/typegoose/-/typegoose-10.2.0-beta.3.tgz", + "integrity": "sha512-BmWO+bto0LonMcC51odJ5fwNU/6TKbzmuURhTYXxyXSx58/O5MGzaHbmDDTuM1jg6pLrbKfJHPc6DFAic/49mw==", "dependencies": { "lodash": "^4.17.20", "loglevel": "^1.8.1", diff --git a/package.json b/package.json index 056dd222..f1645448 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "author": "", "license": "ISC", "dependencies": { - "@typegoose/typegoose": "^10.1.1", + "@typegoose/typegoose": "^10.2.0-beta.3", "@tyriar/fibonacci-heap": "^2.0.9", "mongodb": "^5.0.1" }, From d3ba5158f066c35bc7cd4fb8ecbbe61a873a8ebc Mon Sep 17 00:00:00 2001 From: Catatomik Date: Sun, 19 Feb 2023 17:55:41 +0100 Subject: [PATCH 035/251] =?UTF-8?q?=F0=9F=90=9B=E2=9E=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 6 ++++++ package.json | 1 + src/test/test.ts | 3 +++ 3 files changed, 10 insertions(+) diff --git a/package-lock.json b/package-lock.json index 885bec30..865e75c9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "version": "0.1.1", "license": "ISC", "dependencies": { + "@abraham/reflection": "^0.12.0", "@typegoose/typegoose": "^10.2.0-beta.3", "@tyriar/fibonacci-heap": "^2.0.9", "mongodb": "^5.0.1" @@ -19,6 +20,11 @@ "typescript": "^4.9.5" } }, + "node_modules/@abraham/reflection": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@abraham/reflection/-/reflection-0.12.0.tgz", + "integrity": "sha512-OoLlgBE5u18mc61pJNamEh2OtFpHjtvDi1pV4ojnnH77juCvQw/Z3YlHF8TJiorU7/V6UuGApFzsi+bieug7fg==" + }, "node_modules/@aws-crypto/ie11-detection": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz", diff --git a/package.json b/package.json index f1645448..995abac1 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "author": "", "license": "ISC", "dependencies": { + "@abraham/reflection": "^0.12.0", "@typegoose/typegoose": "^10.2.0-beta.3", "@tyriar/fibonacci-heap": "^2.0.9", "mongodb": "^5.0.1" diff --git a/src/test/test.ts b/src/test/test.ts index a6f3ce6f..0620560a 100644 --- a/src/test/test.ts +++ b/src/test/test.ts @@ -14,6 +14,9 @@ function cartographicDistance(x1: number, y1: number, x2: number, y2: number): n return Math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2); } +// Needed to solve "Reflect.getMetadata is not a function" error of typegoose +import "@abraham/reflection"; + import sectionsModelInit, { dbSections } from "./models/sections.model"; import stopsModelInit, { dbTBM_Stops } from "./models/TBM_stops.model"; import { computePath, initialCallback } from "./computePath"; From 20f9477ef125c12dc95a218d5a76eba2c13439e4 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Sun, 19 Feb 2023 17:57:00 +0100 Subject: [PATCH 036/251] =?UTF-8?q?=F0=9F=90=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tsconfig.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tsconfig.json b/tsconfig.json index 1290d0f1..c2c86900 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -8,7 +8,8 @@ "allowJs": true, "sourceMap": true, "target": "es6", - "strict": true + "strict": true, + "skipLibCheck": true, }, "include": [ "./src/**/*" From abfdc9e5b39b2b90867dd20ef46fda7474f5b79b Mon Sep 17 00:00:00 2001 From: Catatomik Date: Wed, 22 Feb 2023 19:56:05 +0100 Subject: [PATCH 037/251] =?UTF-8?q?=E2=9E=95=20proj4js?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 29 ++++++++++++++++++++++++++++- package.json | 4 +++- tsconfig.json | 1 + 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 865e75c9..dfdc4359 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,9 +12,11 @@ "@abraham/reflection": "^0.12.0", "@typegoose/typegoose": "^10.2.0-beta.3", "@tyriar/fibonacci-heap": "^2.0.9", - "mongodb": "^5.0.1" + "mongodb": "^5.0.1", + "proj4": "^2.8.1" }, "devDependencies": { + "@types/proj4": "^2.5.2", "prettier": "^2.8.4", "ts-node": "^10.9.1", "typescript": "^4.9.5" @@ -1234,6 +1236,12 @@ "version": "18.11.18", "license": "MIT" }, + "node_modules/@types/proj4": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/@types/proj4/-/proj4-2.5.2.tgz", + "integrity": "sha512-/Nmfn9p08yaYw6xo5f2b0L+2oHk2kZeOkp5v+4VCeNfq+ETlLQbmHmC97/pjDIEZy8jxwz7pdPpwNzDHM5cuJw==", + "dev": true + }, "node_modules/@types/webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.0.tgz", @@ -1461,6 +1469,11 @@ "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", "optional": true }, + "node_modules/mgrs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mgrs/-/mgrs-1.0.0.tgz", + "integrity": "sha512-awNbTOqCxK1DBGjalK3xqWIstBZgN6fxsMSiXLs9/spqWkF2pAhb2rrYCFSsr1/tT7PhcDGjZndG8SWYn0byYA==" + }, "node_modules/mongodb": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-5.0.1.tgz", @@ -1596,6 +1609,15 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, + "node_modules/proj4": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/proj4/-/proj4-2.8.1.tgz", + "integrity": "sha512-KK/bgM6oIwxdpeCaJ/JK3V1D8LMQCKKKzndab4/pYQNd+NVKTcddUNtds053Q110GxTALXVjx98L9f5q8xPVXQ==", + "dependencies": { + "mgrs": "1.0.0", + "wkt-parser": "^1.3.1" + } + }, "node_modules/punycode": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", @@ -1786,6 +1808,11 @@ "node": ">=12" } }, + "node_modules/wkt-parser": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/wkt-parser/-/wkt-parser-1.3.2.tgz", + "integrity": "sha512-A26BOOo7sHAagyxG7iuRhnKMO7Q3mEOiOT4oGUmohtN/Li5wameeU4S6f8vWw6NADTVKljBs8bzA8JPQgSEMVQ==" + }, "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", diff --git a/package.json b/package.json index 995abac1..667d0969 100644 --- a/package.json +++ b/package.json @@ -14,9 +14,11 @@ "@abraham/reflection": "^0.12.0", "@typegoose/typegoose": "^10.2.0-beta.3", "@tyriar/fibonacci-heap": "^2.0.9", - "mongodb": "^5.0.1" + "mongodb": "^5.0.1", + "proj4": "^2.8.1" }, "devDependencies": { + "@types/proj4": "^2.5.2", "prettier": "^2.8.4", "ts-node": "^10.9.1", "typescript": "^4.9.5" diff --git a/tsconfig.json b/tsconfig.json index c2c86900..ade8fe47 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -5,6 +5,7 @@ "module": "CommonJS", "experimentalDecorators": true, "emitDecoratorMetadata": true, + "esModuleInterop": true, "allowJs": true, "sourceMap": true, "target": "es6", From d599812b43ea16eb6567a0b797ffa411306cc157 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Wed, 22 Feb 2023 19:58:21 +0100 Subject: [PATCH 038/251] =?UTF-8?q?=E2=9C=A8=20euclidianDistance?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/utils/ultils.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/test/utils/ultils.ts b/src/test/utils/ultils.ts index c3a83651..e8491c3f 100644 --- a/src/test/utils/ultils.ts +++ b/src/test/utils/ultils.ts @@ -13,3 +13,7 @@ export class Deferred { }); } } + +export function euclidianDistance(x1: number, y1: number, x2: number, y2: number): number { + return Math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2); +} From 311c8bdbb2c97ae1efe9361908cbdf063a06a59b Mon Sep 17 00:00:00 2001 From: Catatomik Date: Wed, 22 Feb 2023 19:59:01 +0100 Subject: [PATCH 039/251] =?UTF-8?q?=E2=9C=A8=20approachedStopName,=20secti?= =?UTF-8?q?onId?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/utils/ultils.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/test/utils/ultils.ts b/src/test/utils/ultils.ts index e8491c3f..2611f37e 100644 --- a/src/test/utils/ultils.ts +++ b/src/test/utils/ultils.ts @@ -1,3 +1,5 @@ +import { node } from "../../utils/Graph"; + export type resolveCb = (value: T) => void; export type rejectCb = (reason?: any) => void; @@ -17,3 +19,12 @@ export class Deferred { export function euclidianDistance(x1: number, y1: number, x2: number, y2: number): number { return Math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2); } + +/** Ensure unique node id for approachedStop (as(approached stop)={stop id}) */ +export function approachedStopName(_id: number) { + return `as=${_id}` as const; +} + +export function sectionId({ rg_fv_graph_nd, rg_fv_graph_na }: S) { + return `${rg_fv_graph_nd}-${rg_fv_graph_na}` as const; +} From 2c4e5d9083683f93f5cd53aa6b35eec5962e6247 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Wed, 22 Feb 2023 19:59:54 +0100 Subject: [PATCH 040/251] =?UTF-8?q?=E2=9C=A8=20KeyOfMap,=20unique?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/utils/ultils.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/test/utils/ultils.ts b/src/test/utils/ultils.ts index 2611f37e..eb4a96d1 100644 --- a/src/test/utils/ultils.ts +++ b/src/test/utils/ultils.ts @@ -28,3 +28,12 @@ export function approachedStopName(_id: number) { export function sectionId({ rg_fv_graph_nd, rg_fv_graph_na }: S) { return `${rg_fv_graph_nd}-${rg_fv_graph_na}` as const; } + +export type KeyOfMap> = M extends Map ? K : never; + +/** + * @description Checks unicity of a value in an array + */ +export function unique(v: T, i: number, arr: T[]): boolean { + return arr.indexOf(v) === i; +} From 8ebe106a8503328a1c8e5f3ed3544a132d517fa4 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Wed, 22 Feb 2023 20:00:55 +0100 Subject: [PATCH 041/251] =?UTF-8?q?=E2=9C=A8=20toWGS=20from=20proj4=20+=20?= =?UTF-8?q?computeGEOJSON?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/utils/ultils.ts | 49 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/src/test/utils/ultils.ts b/src/test/utils/ultils.ts index eb4a96d1..0ae69e28 100644 --- a/src/test/utils/ultils.ts +++ b/src/test/utils/ultils.ts @@ -1,3 +1,4 @@ +import proj4, { TemplateCoordinates } from "proj4"; import { node } from "../../utils/Graph"; export type resolveCb = (value: T) => void; @@ -37,3 +38,51 @@ export type KeyOfMap> = M extends Map(v: T, i: number, arr: T[]): boolean { return arr.indexOf(v) === i; } + +export const toWGS = proj4( + "+proj=lcc +lat_0=46.5 +lon_0=3 +lat_1=49 +lat_2=44 +x_0=700000 +y_0=6600000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs +type=crs", + "+proj=longlat +datum=WGS84 +no_defs +type=crs", +).forward; + +export type cb = (arg: T) => R; +export function computeGEOJSON( + points: P[], + lines: L[], + pointCoords: cb, + lineCoords: cb, + pointProps: cb = () => ({}), + lineProps: cb = () => ({}), +) { + return { + type: "FeatureCollection" as const, + features: [ + ...points.map( + (point) => + ({ + type: "Feature", + properties: { + ...pointProps(point), + }, + geometry: { + type: "Point", + coordinates: pointCoords(point), + }, + } as const), + ), + ...lines.map( + (line) => + ({ + type: "Feature", + properties: { + ...lineProps(line), + }, + geometry: { + type: "LineString", + coordinates: lineCoords(line), + }, + } as const), + ), + ] as const, + }; +} +export type GEOJSON = ReturnType; From 92d935cc7ac30e928ecd69778ff88ffbc63d93ab Mon Sep 17 00:00:00 2001 From: Catatomik Date: Thu, 23 Feb 2023 01:08:45 +0100 Subject: [PATCH 042/251] =?UTF-8?q?=F0=9F=9A=A7=20cat=5Fdig=20field=20adde?= =?UTF-8?q?d=20to=20sections?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/models/sections.model.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/test/models/sections.model.ts b/src/test/models/sections.model.ts index b36fa9b4..723fd891 100644 --- a/src/test/models/sections.model.ts +++ b/src/test/models/sections.model.ts @@ -27,6 +27,9 @@ export class dbSections extends TimeStamps { @prop({ required: true }) public groupe!: number; + @prop({ required: true }) + public cat_dig!: number; + @prop({ required: true }) public nom_voie!: string; From cb64eaa3c0b2ceb56d4f484dadea513183983c79 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Thu, 23 Feb 2023 01:11:09 +0100 Subject: [PATCH 043/251] =?UTF-8?q?=E2=9A=A1=20Use=20utils?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/computePath.ts | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/src/test/computePath.ts b/src/test/computePath.ts index 5aa9e0ea..9f6082c7 100644 --- a/src/test/computePath.ts +++ b/src/test/computePath.ts @@ -1,14 +1,15 @@ import { path, Dijkstra, tracePath, DijkstraOptions } from "../FootPaths"; import { node, WeightedGraph } from "../utils/Graph"; -import { id, Section, Stop } from "./test"; +import type { id } from "./test"; import { parentPort } from "worker_threads"; import { benchmark } from "./utils/benchmark"; +import { approachedStopName } from "./utils/ultils"; export interface initData { adj: Required>[0]; weights: Required>[1]; - stops: Array
; + stops: id[]; options?: DijkstraOptions; } export function initialCallback(data: initData) { @@ -31,19 +32,19 @@ let footGraph: WeightedGraph | undefined; let stops: initData["stops"] | undefined; let options: initData["options"] | undefined; -export async function computePath(stopId: string, returnPaths: Paths) { - const sourcePaths: Map = new Map(); +export async function computePath(stopId: node, returnPaths: Paths) { + const sourcePaths: Map = new Map(); if (!footGraph || !stops) return sourcePaths; const [dist, prev] = options ? await Dijkstra(footGraph, [stopId], options) : await Dijkstra(footGraph, [stopId]); - for (let j = 0; j < stops.length; j++) { - const targetNode = `stop-${stops[j]._id}`; + for (const stopId of stops) { + const targetNode = approachedStopName(stopId); if (dist.get(targetNode) !== undefined && dist.get(targetNode)! < Infinity) sourcePaths.set( - stops[j]._id, + stopId, (returnPaths ? [tracePath(prev, targetNode), dist.get(targetNode)!] : dist.get(targetNode)!) as Paths extends true ? [path, number] : number, ); } @@ -51,8 +52,8 @@ export async function computePath(stopId: string, returnP return sourcePaths; } -export async function computePathBench(stopId: string, returnPaths: boolean) { - const sourcePaths: Map = new Map(); +export async function computePathBench(stopId: node, returnPaths: boolean) { + const sourcePaths: Map = new Map(); if (!footGraph || !stops) return sourcePaths; @@ -68,12 +69,12 @@ export async function computePathBench(stopId: string, re await benchmark( (s: NonNullable) => { - for (let j = 0; j < s.length; j++) { - const targetNode = `stop-${s[j]._id}`; + for (const stopId of s) { + const targetNode = approachedStopName(stopId); if (dist.get(targetNode) !== undefined && dist.get(targetNode)! < Infinity) sourcePaths.set( - s[j]._id, + stopId, (returnPaths ? [tracePath(prev, targetNode), dist.get(targetNode)!] : dist.get(targetNode)!) as Paths extends true ? [path, number] : number, From 5e405af5478bd01d91829360dd8872023bf5c1d6 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Thu, 23 Feb 2023 01:14:50 +0100 Subject: [PATCH 044/251] =?UTF-8?q?=E2=9C=A8=E2=9A=A1=20Data=20displaying?= =?UTF-8?q?=20w/GEOJSON=20+=20new=20data=20structures=20(maps)=20+=20use?= =?UTF-8?q?=20utils?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/test.ts | 416 +++++++++++++++++++++++++++++++++++++---------- 1 file changed, 326 insertions(+), 90 deletions(-) diff --git a/src/test/test.ts b/src/test/test.ts index 0620560a..1b6269e6 100644 --- a/src/test/test.ts +++ b/src/test/test.ts @@ -3,17 +3,13 @@ import initDB from "./utils/mongoose"; import { benchmark } from "./utils/benchmark"; import { WorkerPool } from "./utils/Workers"; -import { WeightedGraph } from "../utils/Graph"; +import { node, WeightedGraph } from "../utils/Graph"; import Point from "../utils/Point"; import Segment from "../utils/Segment"; export type id = number; -function cartographicDistance(x1: number, y1: number, x2: number, y2: number): number { - return Math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2); -} - // Needed to solve "Reflect.getMetadata is not a function" error of typegoose import "@abraham/reflection"; @@ -21,177 +17,417 @@ import sectionsModelInit, { dbSections } from "./models/sections.model"; import stopsModelInit, { dbTBM_Stops } from "./models/TBM_stops.model"; import { computePath, initialCallback } from "./computePath"; import { DocumentType } from "@typegoose/typegoose"; +import { approachedStopName, euclidianDistance, computeGEOJSON, Deferred, GEOJSON, KeyOfMap, sectionId, toWGS, unique } from "./utils/ultils"; +import { writeFile } from "fs/promises"; +import { TemplateCoordinates } from "proj4"; -const sectionProjection = { _id: 1, coords: 1, distance: 1, rg_fv_graph_dbl: 1, rg_fv_graph_nd: 1, rg_fv_graph_na: 1 }; -export type Section = Pick; +const sectionProjection = { coords: 1, distance: 1, rg_fv_graph_nd: 1, rg_fv_graph_na: 1, nom_voie: 1 }; +export type dbSection = Pick; +type SectionOverwritten = { rg_fv_graph_nd: node; rg_fv_graph_na: node }; +export type Section = Omit & SectionOverwritten; -const stopProjection = { _id: 1, coords: 1 }; +const stopProjection = { _id: 1, coords: 1, libelle: 1 }; export type Stop = Pick; async function run() { + /** Data displaying. + * Uses {@link proj4} with crs {@link https://epsg.io/2154}. + */ + const GEOJSONs: GEOJSON[] = []; + //Grab required data const db = await initDB(); const sectionsModel = sectionsModelInit(db); const stopsModel = stopsModelInit(db); + const limitTop = new Point(44.813926, -0.581271).fromWGSToLambert93(); + const limitBot = new Point(44.793123, -0.632578).fromWGSToLambert93(); + async function queryData() { - //Important : sections are oriented. - //ERROR : there can be 2 sections (or more) linking the same nd to the same na. They need to be both differentiated (by their _id, for example). - const sections = (await sectionsModel - .find>>({}, sectionProjection) - .lean() - // Coords field type lost... - .exec()) as unknown as Section[]; - //Map section, from s1 to s2 (oriented). - const mapppedSections: Map = new Map(); - for (const s of sections) { - mapppedSections.set(`${s.rg_fv_graph_nd}-${s.rg_fv_graph_na}`, s); - if (s.rg_fv_graph_dbl) mapppedSections.set(`${s.rg_fv_graph_na}-${s.rg_fv_graph_nd}`, s); - } + //Important : sections are oriented => 2 entries per section + const sections = new Map( + ( + (await sectionsModel + .find>>( + //Restrict domain + { + $and: [ + { "coords.0.0": { $lte: limitTop.x } }, + { "coords.0.0": { $gte: limitBot.x } }, + { "coords.0.1": { $lte: limitTop.y } }, + { "coords.0.1": { $gte: limitBot.y } }, + ], + cat_dig: { + $in: [2, 3, 4, 5, 7, 9], + }, + }, + sectionProjection, + ) + .lean() + // Coords field type lost... + .exec()) as unknown as Section[] + ).map((s) => [sectionId(s as { rg_fv_graph_nd: number; rg_fv_graph_na: number }), s] as const), + ); + + //Restricted domain + const validIntersections = new Map( + Array.from(sections.values()) + .flatMap((s) => [s.rg_fv_graph_nd as number, s.rg_fv_graph_na as number]) + .filter(unique) + .map((intersectionId) => { + return [ + intersectionId, + { + _id: intersectionId, + coords: (Array.from(sections.values()).find((s) => s.rg_fv_graph_nd === intersectionId)?.coords[0] ?? + Array.from(sections.values()) + .find((s) => s.rg_fv_graph_na === intersectionId) + ?.coords.at(-1))!, + }, + ] as const; + }), + ); - const stops = ( - (await stopsModel - .find>>({ coords: { $not: { $elemMatch: { $eq: Infinity } } } }, stopProjection) - .lean() - // Coords field type lost... - .exec()) as unknown as Stop[] - ).filter((s, _, arr) => !arr.find((ss) => s.coords[0] === ss.coords[0] && s.coords[1] === ss.coords[1] && s._id !== ss._id)); + const stops = new Map( + ( + (await stopsModel + .find>>( + { + $and: [ + { coords: { $not: { $elemMatch: { $eq: Infinity } } } }, + //Restrict domain + { "coords.0": { $lte: limitTop.x } }, + { "coords.0": { $gte: limitBot.x } }, + { "coords.1": { $lte: limitTop.y } }, + { "coords.1": { $gte: limitBot.y } }, + ], + }, + stopProjection, + ) + .lean() + // Coords field type lost... + .exec()) as unknown as Stop[] + ) + .filter((s, _, arr) => !arr.find((ss) => s.coords[0] === ss.coords[0] && s.coords[1] === ss.coords[1] && s._id !== ss._id)) + .map((s) => [s._id, s]), + ); return { sections, - mapppedSections, + validIntersections, stops, }; } const b1 = await benchmark(queryData, [], 10); console.log("b1 ended"); - if (!b1.lastReturn) return console.log(`b1 return null`); - const { sections, mapppedSections, stops } = b1.lastReturn; + if (!b1.lastReturn) throw `b1 return null`; + const { validIntersections, sections, stops } = b1.lastReturn; + + /** Little helper to get a section easier */ + function getSection(nd: node, na: node) { + return sections.get(sectionId({ rg_fv_graph_nd: nd, rg_fv_graph_na: na })) ?? sections.get(sectionId({ rg_fv_graph_nd: na, rg_fv_graph_na: nd })); + } function makeGraph() { const footGraph: WeightedGraph = new WeightedGraph(); - for (const s of sections) { - //Oriented - s.rg_fv_graph_dbl - ? footGraph.add_edge(s.rg_fv_graph_nd as number, s.rg_fv_graph_na as number, s.distance) - : footGraph.add_arc(s.rg_fv_graph_nd as number, s.rg_fv_graph_na as number, s.distance); + for (const s of sections.values()) { + //Oriented but don't care (foot graph) + footGraph.add_edge(s.rg_fv_graph_nd as number, s.rg_fv_graph_na as number, s.distance); } return footGraph; } const b2 = await benchmark(makeGraph, [], 10); console.log("b2 ended"); - if (!b2.lastReturn) return console.log(`b2 return null`); + if (!b2.lastReturn) throw `b2 return null`; const footGraph = b2.lastReturn; - const arcs = footGraph.arcs; + GEOJSONs.push( + computeGEOJSON( + // footGraph.nodes, + [], + footGraph.arcs, + () => [], + // (node) => + // toWGS(typeof node === "number" ? validIntersections.get(node)?.coords ?? [0, 0] : stops.get(parseInt(node.split("-")[0]))?.coords ?? [0, 0]), + (arc) => + sections.get(sectionId({ rg_fv_graph_nd: arc[0], rg_fv_graph_na: arc[1] }))?.coords.map((coords) => toWGS(coords)) ?? [ + [0, 0], + [0, 0], + ], + (node) => ({ + id: node, + "marker-color": "#5a5a5a", + "marker-size": "small", + }), + (arc) => ({ + nom: Array.from(sections.values()).find((s) => s.rg_fv_graph_nd === arc[0] && s.rg_fv_graph_na === arc[1])?.nom_voie || "Unknown", + }), + ), + ); //Compute approached stops - function ComputeApproachedStops() { + function computeApproachedStops() { //Pre-generate segments to fasten the process (and not redundant computing) //A segment describes a portion of a section (oriented) - const segments: Map = new Map(); - for (const a of arcs) { - const section = mapppedSections.get(`${a[0]}-${a[1]}`); + const segments: Map, { n: number; seg: Segment }> = new Map(); + for (const arc of footGraph.arcs) { + const sId = sectionId({ rg_fv_graph_nd: arc[0], rg_fv_graph_na: arc[1] }); + const section = sections.get(sId); if (!section) continue; // Added for ts mental health for (let i = 0; i < section.coords.length - 1; i++) { - segments.set(section, { + segments.set(sId, { n: i, seg: new Segment(new Point(...section.coords[i]), new Point(...section.coords[i + 1])), }); } } - /**@description [distance to closest point, closest point, section containing this point, indice of segment composing the section] */ - const approachedStops: Array<[Point, Section, number]> = new Array(stops.length); - for (let i = 0; i < stops.length; i++) { - let closestPoint: [number, Point | null, Section | null, number | null] = [Infinity, null, null, null]; + /**@description [closest point, section containing this point, indice of segment composing the section] */ + const approachedStops: Map, [Point, KeyOfMap, number]> = new Map(); + for (const [stopId, stop] of stops) { + /**@description [distance to closest point, closest point, section containing this point, indice of segment composing the section (i;i+1 in Section coords)] */ + let closestPoint: [number, Point | null, KeyOfMap | null, number | null] = [Infinity, null, null, null]; - for (const [section, { n, seg }] of segments) { - const stopPoint: Point = new Point(...stops[i].coords); + for (const [sectionKey, { n, seg }] of segments) { + const stopPoint: Point = new Point(...stop.coords); const localClosestPoint: Point = seg.closestPointFromPoint(stopPoint); const distance: number = Point.distance(stopPoint, localClosestPoint); if (distance < closestPoint[0]) { closestPoint[0] = distance; closestPoint[1] = localClosestPoint; - closestPoint[2] = section; + closestPoint[2] = sectionKey; closestPoint[3] = n; } } - if (closestPoint[1] !== null && closestPoint[2] !== null && closestPoint[3] !== null) - approachedStops[i] = [closestPoint[1], closestPoint[2], closestPoint[3]]; + if (closestPoint[1] !== null && closestPoint[2] !== null && closestPoint[3] !== null) { + approachedStops.set(approachedStopName(stopId), [closestPoint[1], closestPoint[2], closestPoint[3]]); + // else : couldn't find an approched stop (coords = Infinity) + } } return approachedStops; } - const b3 = await benchmark(ComputeApproachedStops, [], 1); + const b3 = await benchmark(computeApproachedStops, [], 1); console.log("b3 ended"); - if (!b3.lastReturn) return console.log(`b3 return null`); + if (!b3.lastReturn) throw `b3 return null`; const approachedStops = b3.lastReturn; - function updateGraph() { + /** Update {@link footGraph} & {@link sections} */ + function refreshWithApproachedStops() { //Pushes new approached stops into graph, just like a proxy on a section - for (let i = 0; i < approachedStops.length; i++) { - if (!approachedStops[i]) continue; // couldn't find an approched stop (coords = Infinity) - const [closestPoint, section, n] = approachedStops[i]; - + for (const [stopId, [closestPoint, sectionKey, n]] of approachedStops) { + const section = sections.get(sectionKey); + if (!section) continue; // Added to ts mental health //Compute distance from section start to approachedStop const toApproadchedStop: number = section.coords.reduce((acc, v, i, arr) => { - if (i < n && i < arr.length - 1) return acc + cartographicDistance(...v, ...arr[i + 1]); + if (i < n && i < arr.length - 1) return acc + euclidianDistance(...v, ...arr[i + 1]); return acc; }, 0) + Point.distance(closestPoint, new Point(...section.coords[n])); //Compute distance form approachedStop to section end const fromApproachedStop: number = section.coords.reduce((acc, v, i, arr) => { - if (i > n && i < arr.length - 1) return acc + cartographicDistance(...v, ...arr[i + 1]); + if (i > n && i < arr.length - 1) return acc + euclidianDistance(...v, ...arr[i + 1]); return acc; }, 0) + Point.distance(closestPoint, new Point(...section.coords[n])); - //Remove arc from p1 to p2 - footGraph.remove_arc(section.rg_fv_graph_nd as number, section.rg_fv_graph_na as number); + //Remove edge from p1 to p2 + footGraph.remove_edge(section.rg_fv_graph_nd as number, section.rg_fv_graph_na as number); + sections.delete(sectionId(section)); + const insertedNode = stopId; //Insert new node approachedStop - //Create arc from p1 to approachedStop to p2 - //Ensure unique node id for approachedStop - footGraph.add_arc(section.rg_fv_graph_nd as number, `stop-${stops[i]._id}`, toApproadchedStop); - footGraph.add_arc(`stop-${stops[i]._id}`, section.rg_fv_graph_na as number, fromApproachedStop); + //Create edges from p1 to approachedStop, then from approachedStop to p2 + const subsectionToApproachedStop: Section = { + coords: [...section.coords.slice(0, n + 1), [closestPoint.x, closestPoint.y]], + distance: toApproadchedStop, + nom_voie: section.nom_voie, + rg_fv_graph_nd: section.rg_fv_graph_nd, + rg_fv_graph_na: insertedNode, + }; + footGraph.add_edge(section.rg_fv_graph_nd as number, insertedNode, toApproadchedStop); + sections.set(sectionId({ rg_fv_graph_nd: section.rg_fv_graph_nd, rg_fv_graph_na: insertedNode }), subsectionToApproachedStop); + + const subsectionFromApproachedStop: Section = { + coords: [[closestPoint.x, closestPoint.y], ...section.coords.slice(n + 1)], + distance: fromApproachedStop, + nom_voie: section.nom_voie, + rg_fv_graph_nd: insertedNode, + rg_fv_graph_na: section.rg_fv_graph_na, + }; + footGraph.add_edge(insertedNode, section.rg_fv_graph_na as number, fromApproachedStop); + sections.set(sectionId({ rg_fv_graph_nd: insertedNode, rg_fv_graph_na: section.rg_fv_graph_na }), subsectionFromApproachedStop); } } - const b4 = await benchmark(updateGraph, []); + const b4 = await benchmark(refreshWithApproachedStops, []); console.log("b4 ended"); - function computePaths() { - return new Promise((res, rej) => { - const workerPool = new WorkerPool(__dirname + "/computePath.js", 8, { - adj: footGraph.adj, - weights: footGraph.weights, - stops, - }); - - //paths> - const paths: Map>>> = new Map(); - - for (let i = 0; i < stops.length; i++) { - workerPool - .run>([`stop-${stops[i]._id}`, false]) - .then((sourcePaths) => { - paths.set(stops[i]._id, sourcePaths); - if (paths.size === stops.length) res(paths); - }) - .catch(rej); - } + + GEOJSONs.push( + computeGEOJSON( + footGraph.nodes, + footGraph.arcs, + // () => [], + (node) => { + let coords: [number, number] = [0, 0]; + if (typeof node === "number") coords = validIntersections.get(node)?.coords ?? [0, 0]; + else { + const approachedStopPoint = approachedStops.get(node as ReturnType)?.[0]; + if (approachedStopPoint) coords = [approachedStopPoint.x, approachedStopPoint.y]; + } + return toWGS(coords); + }, + (arc) => + getSection(arc[0], arc[1])?.coords.map((coords) => toWGS(coords)) ?? [ + [0, 0], + [0, 0], + ], + (node) => ({ + id: node, + name: stops.get(typeof node === "string" ? parseInt(node.split("=")[1]) : node)?.libelle ?? "Unknown", + "marker-color": typeof node === "string" ? "#ff0000" : "#5a5a5a", + "marker-size": typeof node === "string" ? "medium" : "small", + }), + (arc) => ({ + name: getSection(arc[0], arc[1])?.nom_voie || "Unknown", + distance: getSection(arc[0], arc[1])?.distance || "Unknown", + sectionId: sectionId({ rg_fv_graph_nd: arc[0], rg_fv_graph_na: arc[1] }), + stroke: typeof arc[0] === "string" || typeof arc[1] === "string" ? "#e60000" : "#5a5a5a", + }), + ), + ); + + async function computePaths() { + const getFullPaths = true; + + //paths> + const paths: Map>>> = new Map(); + + const def = new Deferred(); + + const workerPool = new WorkerPool(__dirname + "/computePath.js", 8, { + adj: footGraph.adj, + weights: footGraph.weights, + stops: Array.from(stops.keys()), }); + + let rejected = false; + + for (const stopId of stops.keys()) { + workerPool + .run>([approachedStopName(stopId), getFullPaths]) + .then((sourcePaths) => { + paths.set(stopId, sourcePaths); + if (paths.size === approachedStops.size) def.resolve(paths); + }) + .catch((r) => { + if (rejected) return; + rejected = true; + def.reject(r); + }); + } + + return def.promise; } const b5 = await benchmark(computePaths, []); console.log("b5 ended"); + if (!b5.lastReturn) throw `b5 return null`; const paths = b5.lastReturn; + // From "Les Harmonies" + GEOJSONs.push( + computeGEOJSON( + footGraph.nodes, + Array.from(paths.get(128738)!).filter(([_, [path]]) => path.length), + (node) => { + let coords: [number, number] = [0, 0]; + if (typeof node === "number") coords = validIntersections.get(node)?.coords ?? [0, 0]; + else { + const approachedStopPoint = approachedStops.get(node as ReturnType)?.[0]; + if (approachedStopPoint) coords = [approachedStopPoint.x, approachedStopPoint.y]; + } + return toWGS(coords); + }, + ([_, [path]]) => + path.reduce( + (acc, v, i) => + i < path.length - 1 + ? [ + ...acc, + ...(( + sections.get(sectionId({ rg_fv_graph_nd: v, rg_fv_graph_na: path[i + 1] }))?.coords ?? + sections + .get(sectionId({ rg_fv_graph_nd: path[i + 1], rg_fv_graph_na: v })) + ?.coords // Make a copy & reverse to get coords in the right order, tricky + .slice() + .reverse() + )?.map((coords) => toWGS(coords)) ?? [ + [0, 0], + [0, 0], + ]), + ] + : acc, + [], + ), + (node) => ({ + id: node, + name: stops.get(typeof node === "string" ? parseInt(node.split("=")[1]) : node)?.libelle ?? "Unknown", + "marker-color": typeof node === "string" ? "#ff0000" : "#5a5a5a", + "marker-size": typeof node === "string" ? "medium" : "small", + }), + ([dest, [path, distance]]) => ({ + path: `${path[0]}-${dest}`, + distance, + stroke: "#8080ff", + }), + ), + ); + + //From "Les Harmonies" to "Peixotto" + const specificPath = paths.get(128738)!.get(126798)!; + GEOJSONs.push( + computeGEOJSON( + footGraph.nodes, + specificPath[0].reduce<[node, node][]>((acc, node, i, path) => (i < path.length - 1 ? [...acc, [node, path[i + 1]]] : acc), []), + (node) => { + let coords: [number, number] = [0, 0]; + if (typeof node === "number") coords = validIntersections.get(node)?.coords ?? [0, 0]; + else { + const approachedStopPoint = approachedStops.get(node as ReturnType)?.[0]; + if (approachedStopPoint) coords = [approachedStopPoint.x, approachedStopPoint.y]; + } + return toWGS(coords); + }, + (path) => + path.reduce( + (acc, v, i) => + i === 0 + ? getSection(v, path[i + 1])?.coords.map((coords) => toWGS(coords)) ?? [ + [0, 0], + [0, 0], + ] + : acc, + [], + ), + (node) => ({ + id: node, + name: stops.get(typeof node === "string" ? parseInt(node.split("=")[1]) : node)?.libelle ?? "Unknown", + "marker-color": typeof node === "string" ? "#ff0000" : "#5a5a5a", + "marker-size": typeof node === "string" ? "medium" : "small", + }), + (path) => ({ + path: `${path[0]}-${path[path.length - 1]}`, + totalDistance: specificPath[1], + stroke: "#8080ff", + }), + ), + ); + for (let i = 0; i < GEOJSONs.length; i++) await writeFile(__dirname + `/../../out-${i}.geojson`, JSON.stringify(GEOJSONs[i])); + return { b1, b2, b3, b4, b5 }; } run().then(console.log).catch(console.error); - -setTimeout(() => {}, 1000000); From ee010fdd3562f4d6b3cc8915c4e6dbe2cc717c54 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Thu, 23 Feb 2023 01:17:31 +0100 Subject: [PATCH 045/251] =?UTF-8?q?=F0=9F=99=88=20GEOJSON=20files?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 440bd8e6..5461655d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ /built /node_modules -/.vscode \ No newline at end of file +/.vscode +*.geojson \ No newline at end of file From 42d00fd5fb7895a401e51dfc2b414312ff79e7c3 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Fri, 24 Feb 2023 21:18:18 +0100 Subject: [PATCH 046/251] =?UTF-8?q?=E2=9C=A8=20FootGraph=20model?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/models/FootGraph.model.ts | 61 ++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 src/test/models/FootGraph.model.ts diff --git a/src/test/models/FootGraph.model.ts b/src/test/models/FootGraph.model.ts new file mode 100644 index 00000000..8aff573d --- /dev/null +++ b/src/test/models/FootGraph.model.ts @@ -0,0 +1,61 @@ +// tbm_schedules-model.js - A mongoose model +// +// See http://mongoosejs.com/docs/models.html + +import { addModelToTypegoose, buildSchema, getDiscriminatorModelForClass, index, prop, Ref } from "@typegoose/typegoose"; +import { modelOptions } from "@typegoose/typegoose/lib/modelOptions"; +import { getName } from "@typegoose/typegoose/lib/internal/utils"; +import { Mongoose } from "mongoose"; +import { approachedStopName, dbIntersectionId, dbSectionId } from "../utils/ultils"; + +@modelOptions({ options: { customName: "FootGraph" } }) +export class dbFootGraph { + @prop({ required: true }) + public _id!: ReturnType | ReturnType | ReturnType; +} + +@modelOptions({ options: { customName: "FootGraphNode" } }) +export class dbFootGraphNodes extends dbFootGraph { + @prop({ required: true }) + public _id!: ReturnType | ReturnType; + + @prop({ required: true, type: () => [Number] }) + public coords!: [number, number]; + + @prop() + public stopId?: number; +} + +@modelOptions({ options: { customName: "FootGraphEdge" } }) +export class dbFootGraphEdges extends dbFootGraph { + @prop({ required: true }) + public _id!: ReturnType; + + @prop({ required: true }) + public distance!: number; + + @prop({ required: true, type: () => [[Number, Number]] }) + public coords!: [number, number][]; + + @prop({ required: true, ref: () => dbFootGraphNodes, type: () => [String, String] }) + public ends!: [Ref, Ref]; +} + +export default function init(db: Mongoose) { + const dbFootGraphSchema = buildSchema(dbFootGraph, { existingMongoose: db }); + const dbFootGraphModelRaw = db.model(getName(dbFootGraph), dbFootGraphSchema); + + const dbFootGraphModel = addModelToTypegoose(dbFootGraphModelRaw, dbFootGraph, { + existingMongoose: db, + }); + + return [ + dbFootGraphModel, + getDiscriminatorModelForClass(dbFootGraphModel, dbFootGraphNodes), + getDiscriminatorModelForClass(dbFootGraphModel, dbFootGraphEdges), + ] as const; +} + +export type dbFootGraphModel = ReturnType[0]; +export type dbFootGraphNodesModel = ReturnType[1]; +export type dbFootGraphEdgesModel = ReturnType[2]; From 40524aaa46edd0d971cb725c190d8c4d1003791b Mon Sep 17 00:00:00 2001 From: Catatomik Date: Fri, 24 Feb 2023 21:18:31 +0100 Subject: [PATCH 047/251] =?UTF-8?q?=E2=9C=A8=20FootPaths=20model?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/models/FootPaths.model.ts | 35 ++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 src/test/models/FootPaths.model.ts diff --git a/src/test/models/FootPaths.model.ts b/src/test/models/FootPaths.model.ts new file mode 100644 index 00000000..5c3e8bfb --- /dev/null +++ b/src/test/models/FootPaths.model.ts @@ -0,0 +1,35 @@ +// addresses-model.js - A mongoose model +// +// See http://mongoosejs.com/docs/models.html + +import { TimeStamps } from "@typegoose/typegoose/lib/defaultClasses"; +import { addModelToTypegoose, buildSchema, prop, Ref } from "@typegoose/typegoose"; +import { modelOptions } from "@typegoose/typegoose/lib/modelOptions"; +import { getName } from "@typegoose/typegoose/lib/internal/utils"; +import { Mongoose } from "mongoose"; +import { dbTBM_Stops } from "./TBM_stops.model"; +import { dbFootGraphNodes } from "./FootGraph.model"; + +@modelOptions({ options: { customName: "footPaths" } }) +export class dbFootPaths extends TimeStamps { + @prop({ required: true, index: true, ref: () => dbTBM_Stops, type: () => Number }) + public from!: Ref; + + @prop({ required: true, index: true, ref: () => dbTBM_Stops, type: () => Number }) + public to!: Ref; + + @prop({ required: true }) + public distance!: number; + + @prop({ ref: () => dbFootGraphNodes, type: () => String }) + public path?: Ref[]; // Ref[] to intersections | stops +} + +export default function init(db: Mongoose) { + const dbFootPathsSchema = buildSchema(dbFootPaths, { existingMongoose: db }); + const dbFootPathsModelRaw = db.model(getName(dbFootPaths), dbFootPathsSchema); + + return addModelToTypegoose(dbFootPathsModelRaw, dbFootPaths, { existingMongoose: db }); +} + +export type dbFootPathsModel = ReturnType; From 50d484523b57871c7620d998fe09afb3a27bb7bc Mon Sep 17 00:00:00 2001 From: Catatomik Date: Fri, 24 Feb 2023 21:19:33 +0100 Subject: [PATCH 048/251] =?UTF-8?q?=E2=9C=A8=20unpackRefType,=20dbIntersec?= =?UTF-8?q?tionId,=20dbSectionId=20&=20moved=20KeyOfMap?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/utils/ultils.ts | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/test/utils/ultils.ts b/src/test/utils/ultils.ts index 0ae69e28..f4eafe1a 100644 --- a/src/test/utils/ultils.ts +++ b/src/test/utils/ultils.ts @@ -1,3 +1,5 @@ +import { Ref } from "@typegoose/typegoose"; +import { RefType } from "@typegoose/typegoose/lib/types"; import proj4, { TemplateCoordinates } from "proj4"; import { node } from "../../utils/Graph"; @@ -21,17 +23,31 @@ export function euclidianDistance(x1: number, y1: number, x2: number, y2: number return Math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2); } +export type unpackRefType = T extends Ref + ? D extends { + _id?: RefType; + } + ? D["_id"] + : never + : never; + /** Ensure unique node id for approachedStop (as(approached stop)={stop id}) */ export function approachedStopName(_id: number) { return `as=${_id}` as const; } +export function dbIntersectionId(_id: number) { + return `i=${_id}` as const; +} + +export function dbSectionId(_id: number) { + return `s=${_id}` as const; +} + export function sectionId({ rg_fv_graph_nd, rg_fv_graph_na }: S) { return `${rg_fv_graph_nd}-${rg_fv_graph_na}` as const; } -export type KeyOfMap> = M extends Map ? K : never; - /** * @description Checks unicity of a value in an array */ From f49ff5732c6756a2af0a33ba5e880966f7245ae6 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Fri, 24 Feb 2023 21:22:20 +0100 Subject: [PATCH 049/251] =?UTF-8?q?=F0=9F=9A=A7=20Type=20computePath?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/computePath.ts | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/src/test/computePath.ts b/src/test/computePath.ts index 9f6082c7..b1d04d41 100644 --- a/src/test/computePath.ts +++ b/src/test/computePath.ts @@ -1,14 +1,14 @@ import { path, Dijkstra, tracePath, DijkstraOptions } from "../FootPaths"; -import { node, WeightedGraph } from "../utils/Graph"; -import type { id } from "./test"; +import { node, unpackGraphNode, WeightedGraph } from "../utils/Graph"; +import type { footGraphNodes, id } from "./test"; import { parentPort } from "worker_threads"; import { benchmark } from "./utils/benchmark"; import { approachedStopName } from "./utils/ultils"; export interface initData { - adj: Required>[0]; - weights: Required>[1]; + adj: Required>>[0]; + weights: Required>>[1]; stops: id[]; options?: DijkstraOptions; } @@ -20,7 +20,7 @@ export function initialCallback(data: initData) { } if (parentPort) - parentPort.on("message", async (data: initData | Parameters) => { + parentPort.on("message", async (data: initData | Parameters) => { if (data instanceof Array) { if (parentPort) parentPort.postMessage(await computePath(...data)); } else { @@ -28,12 +28,12 @@ if (parentPort) } }); -let footGraph: WeightedGraph | undefined; +let footGraph: WeightedGraph | undefined; let stops: initData["stops"] | undefined; let options: initData["options"] | undefined; -export async function computePath(stopId: node, returnPaths: Paths) { - const sourcePaths: Map = new Map(); +export async function computePath(stopId: ReturnType, returnPaths: Paths) { + const sourcePaths: Map>, number] : number> = new Map(); if (!footGraph || !stops) return sourcePaths; @@ -45,15 +45,17 @@ export async function computePath(stopId: node, returnPat if (dist.get(targetNode) !== undefined && dist.get(targetNode)! < Infinity) sourcePaths.set( stopId, - (returnPaths ? [tracePath(prev, targetNode), dist.get(targetNode)!] : dist.get(targetNode)!) as Paths extends true ? [path, number] : number, + (returnPaths ? [tracePath(prev, targetNode), dist.get(targetNode)!] : dist.get(targetNode)!) as Paths extends true + ? [ReturnType>>, number] + : number, ); } return sourcePaths; } -export async function computePathBench(stopId: node, returnPaths: boolean) { - const sourcePaths: Map = new Map(); +export async function computePathBench(stopId: ReturnType, returnPaths: boolean) { + const sourcePaths: Map>, number] : number> = new Map(); if (!footGraph || !stops) return sourcePaths; @@ -76,7 +78,7 @@ export async function computePathBench(stopId: node, retu sourcePaths.set( stopId, (returnPaths ? [tracePath(prev, targetNode), dist.get(targetNode)!] : dist.get(targetNode)!) as Paths extends true - ? [path, number] + ? [ReturnType>>, number] : number, ); } From 490e2af74a492c205cfb42f975a618dada68e7f0 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Fri, 24 Feb 2023 21:23:29 +0100 Subject: [PATCH 050/251] =?UTF-8?q?=E2=9C=A8=F0=9F=9A=A7=20Typed=20compute?= =?UTF-8?q?Path=20&=20updateDb?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/test.ts | 77 ++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 72 insertions(+), 5 deletions(-) diff --git a/src/test/test.ts b/src/test/test.ts index 1b6269e6..739822c4 100644 --- a/src/test/test.ts +++ b/src/test/test.ts @@ -9,6 +9,7 @@ import Point from "../utils/Point"; import Segment from "../utils/Segment"; export type id = number; +export type footGraphNodes = number | ReturnType; // Needed to solve "Reflect.getMetadata is not a function" error of typegoose import "@abraham/reflection"; @@ -17,13 +18,33 @@ import sectionsModelInit, { dbSections } from "./models/sections.model"; import stopsModelInit, { dbTBM_Stops } from "./models/TBM_stops.model"; import { computePath, initialCallback } from "./computePath"; import { DocumentType } from "@typegoose/typegoose"; -import { approachedStopName, euclidianDistance, computeGEOJSON, Deferred, GEOJSON, KeyOfMap, sectionId, toWGS, unique } from "./utils/ultils"; +import { + approachedStopName, + euclidianDistance, + computeGEOJSON, + Deferred, + GEOJSON, + sectionId, + toWGS, + unique, + dbIntersectionId, + dbSectionId, + unpackRefType, +} from "./utils/ultils"; import { writeFile } from "fs/promises"; import { TemplateCoordinates } from "proj4"; +import FootGraphModelInit, { dbFootGraphEdges, dbFootGraphNodes } from "./models/FootGraph.model"; +import FootPathsModelInit, { dbFootPaths } from "./models/FootPaths.model"; +import { KeyOfMap } from "../utils"; const sectionProjection = { coords: 1, distance: 1, rg_fv_graph_nd: 1, rg_fv_graph_na: 1, nom_voie: 1 }; export type dbSection = Pick; -type SectionOverwritten = { rg_fv_graph_nd: node; rg_fv_graph_na: node }; +type SectionOverwritten = { + /** Will never be populated, so force to be RefType */ + rg_fv_graph_nd: unpackRefType | ReturnType; + /** Will never be populated, so force to be RefType */ + rg_fv_graph_na: unpackRefType | ReturnType; +}; export type Section = Omit & SectionOverwritten; const stopProjection = { _id: 1, coords: 1, libelle: 1 }; @@ -40,6 +61,8 @@ async function run() { const sectionsModel = sectionsModelInit(db); const stopsModel = stopsModelInit(db); + const [FootGraphModel, FootGraphNodesModel, FootGraphEdgesModel] = FootGraphModelInit(db); + const FootPathModel = FootPathsModelInit(db); const limitTop = new Point(44.813926, -0.581271).fromWGSToLambert93(); const limitBot = new Point(44.793123, -0.632578).fromWGSToLambert93(); @@ -130,7 +153,7 @@ async function run() { } function makeGraph() { - const footGraph: WeightedGraph = new WeightedGraph(); + const footGraph: WeightedGraph = new WeightedGraph(); for (const s of sections.values()) { //Oriented but don't care (foot graph) @@ -304,7 +327,7 @@ async function run() { const getFullPaths = true; //paths> - const paths: Map>>> = new Map(); + const paths: Map, Awaited>>> = new Map(); const def = new Deferred(); @@ -427,7 +450,51 @@ async function run() { ); for (let i = 0; i < GEOJSONs.length; i++) await writeFile(__dirname + `/../../out-${i}.geojson`, JSON.stringify(GEOJSONs[i])); - return { b1, b2, b3, b4, b5 }; + async function updateDb() { + //Empty db + await FootGraphModel.deleteMany({}); + + await FootGraphNodesModel.insertMany( + Array.from(validIntersections.values()) + .map(({ _id, coords }) => ({ + _id: dbIntersectionId(_id), + coords, + })) + .concat( + Array.from(approachedStops).map(([asId, [Point]]) => ({ + _id: asId, + coords: [Point.x, Point.y], + })), + ), + ); + + await FootGraphEdgesModel.insertMany( + Array.from(sections.values()).map((section, index) => ({ + _id: dbSectionId(index), + coords: section.coords, + distance: section.distance, + ends: [ + typeof section.rg_fv_graph_nd === "number" ? dbIntersectionId(section.rg_fv_graph_nd) : section.rg_fv_graph_nd, + typeof section.rg_fv_graph_na === "number" ? dbIntersectionId(section.rg_fv_graph_na) : section.rg_fv_graph_na, + ], + })), + ); + + await FootPathModel.deleteMany({}); + + await FootPathModel.insertMany( + Array.from(paths).map(([from, [[to, [path, distance]]]]) => ({ + from, + to, + path: path.map((node) => (typeof node === "number" ? dbIntersectionId(node) : node)), + distance, + })), + ); + } + const b6 = await benchmark(updateDb, []); + console.log("b6 ended"); + + return { b1, b2, b3, b4, b5, b6 }; } run().then(console.log).catch(console.error); From 34fb45a9e2b1fb63560f6ee2fabd456c701b7048 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Fri, 24 Feb 2023 21:26:46 +0100 Subject: [PATCH 051/251] =?UTF-8?q?=F0=9F=90=9B=20`=5Fid`=20type=20at=20ru?= =?UTF-8?q?ntime?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/models/FootGraph.model.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/models/FootGraph.model.ts b/src/test/models/FootGraph.model.ts index 8aff573d..e79da075 100644 --- a/src/test/models/FootGraph.model.ts +++ b/src/test/models/FootGraph.model.ts @@ -10,13 +10,13 @@ import { approachedStopName, dbIntersectionId, dbSectionId } from "../utils/ulti @modelOptions({ options: { customName: "FootGraph" } }) export class dbFootGraph { - @prop({ required: true }) + @prop({ required: true, type: () => String }) public _id!: ReturnType | ReturnType | ReturnType; } @modelOptions({ options: { customName: "FootGraphNode" } }) export class dbFootGraphNodes extends dbFootGraph { - @prop({ required: true }) + @prop({ required: true, type: () => String }) public _id!: ReturnType | ReturnType; @prop({ required: true, type: () => [Number] }) @@ -28,7 +28,7 @@ export class dbFootGraphNodes extends dbFootGraph { @modelOptions({ options: { customName: "FootGraphEdge" } }) export class dbFootGraphEdges extends dbFootGraph { - @prop({ required: true }) + @prop({ required: true, type: () => String }) public _id!: ReturnType; @prop({ required: true }) From 68206c7557f70c187c15b0f66d8fcdd8d793c7ca Mon Sep 17 00:00:00 2001 From: Catatomik Date: Fri, 24 Feb 2023 21:30:17 +0100 Subject: [PATCH 052/251] =?UTF-8?q?=F0=9F=9A=A7=20Remove=20useless=20casts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/test.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/test/test.ts b/src/test/test.ts index 739822c4..63db6a34 100644 --- a/src/test/test.ts +++ b/src/test/test.ts @@ -157,7 +157,7 @@ async function run() { for (const s of sections.values()) { //Oriented but don't care (foot graph) - footGraph.add_edge(s.rg_fv_graph_nd as number, s.rg_fv_graph_na as number, s.distance); + footGraph.add_edge(s.rg_fv_graph_nd, s.rg_fv_graph_na, s.distance); } return footGraph; @@ -259,7 +259,7 @@ async function run() { }, 0) + Point.distance(closestPoint, new Point(...section.coords[n])); //Remove edge from p1 to p2 - footGraph.remove_edge(section.rg_fv_graph_nd as number, section.rg_fv_graph_na as number); + footGraph.remove_edge(section.rg_fv_graph_nd, section.rg_fv_graph_na); sections.delete(sectionId(section)); const insertedNode = stopId; @@ -272,7 +272,7 @@ async function run() { rg_fv_graph_nd: section.rg_fv_graph_nd, rg_fv_graph_na: insertedNode, }; - footGraph.add_edge(section.rg_fv_graph_nd as number, insertedNode, toApproadchedStop); + footGraph.add_edge(section.rg_fv_graph_nd, insertedNode, toApproadchedStop); sections.set(sectionId({ rg_fv_graph_nd: section.rg_fv_graph_nd, rg_fv_graph_na: insertedNode }), subsectionToApproachedStop); const subsectionFromApproachedStop: Section = { @@ -282,7 +282,7 @@ async function run() { rg_fv_graph_nd: insertedNode, rg_fv_graph_na: section.rg_fv_graph_na, }; - footGraph.add_edge(insertedNode, section.rg_fv_graph_na as number, fromApproachedStop); + footGraph.add_edge(insertedNode, section.rg_fv_graph_na, fromApproachedStop); sections.set(sectionId({ rg_fv_graph_nd: insertedNode, rg_fv_graph_na: section.rg_fv_graph_na }), subsectionFromApproachedStop); } } From dd9e02d6a79b2f93314889b5c871f28b4df8735e Mon Sep 17 00:00:00 2001 From: Catatomik Date: Sat, 25 Feb 2023 15:26:59 +0100 Subject: [PATCH 053/251] =?UTF-8?q?=F0=9F=9A=A7=F0=9F=92=A9=20Correct=20ty?= =?UTF-8?q?pes=20&=20handle=20not=20querying=20fullPaths?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/computePath.ts | 52 +++++++++++++++++++++++------------------ src/test/test.ts | 4 ++-- 2 files changed, 31 insertions(+), 25 deletions(-) diff --git a/src/test/computePath.ts b/src/test/computePath.ts index b1d04d41..4c775b0f 100644 --- a/src/test/computePath.ts +++ b/src/test/computePath.ts @@ -1,5 +1,5 @@ import { path, Dijkstra, tracePath, DijkstraOptions } from "../FootPaths"; -import { node, unpackGraphNode, WeightedGraph } from "../utils/Graph"; +import { unpackGraphNode, WeightedGraph } from "../utils/Graph"; import type { footGraphNodes, id } from "./test"; import { parentPort } from "worker_threads"; @@ -20,7 +20,7 @@ export function initialCallback(data: initData) { } if (parentPort) - parentPort.on("message", async (data: initData | Parameters) => { + parentPort.on("message", async (data: initData | Parameters) => { if (data instanceof Array) { if (parentPort) parentPort.postMessage(await computePath(...data)); } else { @@ -33,41 +33,49 @@ let stops: initData["stops"] | undefined; let options: initData["options"] | undefined; export async function computePath(stopId: ReturnType, returnPaths: Paths) { - const sourcePaths: Map>, number] : number> = new Map(); + const sourcePaths: Map> : never[], number]> = new Map(); if (!footGraph || !stops) return sourcePaths; - const [dist, prev] = options ? await Dijkstra(footGraph, [stopId], options) : await Dijkstra(footGraph, [stopId]); + const [dist, prev] = options + ? await Dijkstra(footGraph, [stopId], options) + : await Dijkstra(footGraph, [stopId]); for (const stopId of stops) { const targetNode = approachedStopName(stopId); if (dist.get(targetNode) !== undefined && dist.get(targetNode)! < Infinity) - sourcePaths.set( - stopId, - (returnPaths ? [tracePath(prev, targetNode), dist.get(targetNode)!] : dist.get(targetNode)!) as Paths extends true - ? [ReturnType>>, number] - : number, - ); + sourcePaths.set(stopId, [ + (returnPaths ? tracePath(prev, targetNode) : []) as Paths extends true ? path> : [], + dist.get(targetNode)!, + ]); } return sourcePaths; } export async function computePathBench(stopId: ReturnType, returnPaths: boolean) { - const sourcePaths: Map>, number] : number> = new Map(); + const sourcePaths: Map> : [], number]> = new Map(); if (!footGraph || !stops) return sourcePaths; const [dist, prev] = options ? ( - await benchmark(Dijkstra as (G: WeightedGraph, [s]: [node], O: DijkstraOptions) => [Map, Map], [ - footGraph, - [stopId], - options, - ]) + await benchmark( + Dijkstra as ( + G: typeof footGraph, + [s]: [typeof stopId], + O: DijkstraOptions, + ) => [Map, Map], + [footGraph, [stopId], options], + ) ).lastReturn! - : (await benchmark(Dijkstra as (G: WeightedGraph, [s]: [node]) => [Map, Map], [footGraph, [stopId]])).lastReturn!; + : ( + await benchmark( + Dijkstra as (G: typeof footGraph, [s]: [typeof stopId]) => [Map, Map], + [footGraph, [stopId]], + ) + ).lastReturn!; await benchmark( (s: NonNullable) => { @@ -75,12 +83,10 @@ export async function computePathBench(stopId: ReturnType const targetNode = approachedStopName(stopId); if (dist.get(targetNode) !== undefined && dist.get(targetNode)! < Infinity) - sourcePaths.set( - stopId, - (returnPaths ? [tracePath(prev, targetNode), dist.get(targetNode)!] : dist.get(targetNode)!) as Paths extends true - ? [ReturnType>>, number] - : number, - ); + sourcePaths.set(stopId, [ + (returnPaths ? tracePath(prev, targetNode) : []) as Paths extends true ? path> : [], + dist.get(targetNode)!, + ]); } }, [stops], diff --git a/src/test/test.ts b/src/test/test.ts index 63db6a34..714d21d0 100644 --- a/src/test/test.ts +++ b/src/test/test.ts @@ -323,9 +323,9 @@ async function run() { ), ); - async function computePaths() { - const getFullPaths = true; + const getFullPaths = false; + async function computePaths() { //paths> const paths: Map, Awaited>>> = new Map(); From c9fbc8e699e8c54c22020ec8902256438c615839 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Sat, 25 Feb 2023 15:39:37 +0100 Subject: [PATCH 054/251] =?UTF-8?q?=F0=9F=92=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/utils/benchmark.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/test/utils/benchmark.ts b/src/test/utils/benchmark.ts index 2c3c2b02..70bcdf08 100644 --- a/src/test/utils/benchmark.ts +++ b/src/test/utils/benchmark.ts @@ -1,3 +1,10 @@ +/** + * Benchmark a function + * @param f The function to do the benchmark on, sync or async + * @param args The argument(s) to pass to the function {@link f} + * @param times Number of times to repeat the benchmark + * @param logStats Wheter to log to the bench to the console at its end, or not + */ export async function benchmark any>(f: F, args: Parameters, times: number = 1, logStats = true) { const starts: number[] = new Array(times); const ends: number[] = new Array(times); From e70fb49c15a84370203a6b96953f147e152bd717 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Sat, 25 Feb 2023 16:16:34 +0100 Subject: [PATCH 055/251] =?UTF-8?q?=F0=9F=90=9B=20Check=20model=20existenc?= =?UTF-8?q?e=20before=20compiling?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/models/FootGraph.model.ts | 15 ++++++++++++++- src/test/models/FootPaths.model.ts | 4 +++- src/test/models/SNCF_schedules.model.ts | 4 +++- src/test/models/SNCF_stops.model.ts | 4 +++- src/test/models/TBMScheduledRoutes.model.ts | 4 +++- src/test/models/TBM_lines.model.ts | 4 +++- src/test/models/TBM_lines_routes.model.ts | 4 +++- src/test/models/TBM_schedules.model.ts | 5 ++++- src/test/models/TBM_stops.model.ts | 4 +++- src/test/models/TBM_trips.model.ts | 4 +++- src/test/models/addresses.model.ts | 4 +++- src/test/models/intersections.model.ts | 4 +++- src/test/models/sections.model.ts | 4 +++- 13 files changed, 51 insertions(+), 13 deletions(-) diff --git a/src/test/models/FootGraph.model.ts b/src/test/models/FootGraph.model.ts index e79da075..df52f190 100644 --- a/src/test/models/FootGraph.model.ts +++ b/src/test/models/FootGraph.model.ts @@ -2,7 +2,16 @@ // // See http://mongoosejs.com/docs/models.html -import { addModelToTypegoose, buildSchema, getDiscriminatorModelForClass, index, prop, Ref } from "@typegoose/typegoose"; +import { + addModelToTypegoose, + buildSchema, + deleteModelWithClass, + getDiscriminatorModelForClass, + getModelForClass, + index, + prop, + Ref, +} from "@typegoose/typegoose"; import { modelOptions } from "@typegoose/typegoose/lib/modelOptions"; import { getName } from "@typegoose/typegoose/lib/internal/utils"; import { Mongoose } from "mongoose"; @@ -42,6 +51,10 @@ export class dbFootGraphEdges extends dbFootGraph { } export default function init(db: Mongoose) { + if (getModelForClass(dbFootGraph, { existingMongoose: db })) deleteModelWithClass(dbFootGraph); + if (getModelForClass(dbFootGraphNodes, { existingMongoose: db })) deleteModelWithClass(dbFootGraphNodes); + if (getModelForClass(dbFootGraphEdges, { existingMongoose: db })) deleteModelWithClass(dbFootGraphEdges); + const dbFootGraphSchema = buildSchema(dbFootGraph, { existingMongoose: db }); const dbFootGraphModelRaw = db.model(getName(dbFootGraph), dbFootGraphSchema); diff --git a/src/test/models/FootPaths.model.ts b/src/test/models/FootPaths.model.ts index 5c3e8bfb..556579a8 100644 --- a/src/test/models/FootPaths.model.ts +++ b/src/test/models/FootPaths.model.ts @@ -3,7 +3,7 @@ // See http://mongoosejs.com/docs/models.html import { TimeStamps } from "@typegoose/typegoose/lib/defaultClasses"; -import { addModelToTypegoose, buildSchema, prop, Ref } from "@typegoose/typegoose"; +import { addModelToTypegoose, buildSchema, deleteModelWithClass, getModelForClass, prop, Ref } from "@typegoose/typegoose"; import { modelOptions } from "@typegoose/typegoose/lib/modelOptions"; import { getName } from "@typegoose/typegoose/lib/internal/utils"; import { Mongoose } from "mongoose"; @@ -26,6 +26,8 @@ export class dbFootPaths extends TimeStamps { } export default function init(db: Mongoose) { + if (getModelForClass(dbFootPaths, { existingMongoose: db })) deleteModelWithClass(dbFootPaths); + const dbFootPathsSchema = buildSchema(dbFootPaths, { existingMongoose: db }); const dbFootPathsModelRaw = db.model(getName(dbFootPaths), dbFootPathsSchema); diff --git a/src/test/models/SNCF_schedules.model.ts b/src/test/models/SNCF_schedules.model.ts index 6e081353..610f1d90 100644 --- a/src/test/models/SNCF_schedules.model.ts +++ b/src/test/models/SNCF_schedules.model.ts @@ -4,7 +4,7 @@ import { SNCFEndpoints } from "."; import { TimeStamps } from "@typegoose/typegoose/lib/defaultClasses"; -import { addModelToTypegoose, buildSchema, prop, Ref } from "@typegoose/typegoose"; +import { addModelToTypegoose, buildSchema, deleteModelWithClass, getModelForClass, prop, Ref } from "@typegoose/typegoose"; import { modelOptions } from "@typegoose/typegoose/lib/modelOptions"; import { getName } from "@typegoose/typegoose/lib/internal/utils"; import { dbSNCF_Stops } from "./SNCF_stops.model"; @@ -29,6 +29,8 @@ export class dbSNCF_Schedules extends TimeStamps { } export default function init(db: Mongoose) { + if (getModelForClass(dbSNCF_Schedules, { existingMongoose: db })) deleteModelWithClass(dbSNCF_Schedules); + const dbSNCF_SchedulesSchema = buildSchema(dbSNCF_Schedules, { existingMongoose: db }); const dbSNCF_SchedulesModelRaw = db.model(getName(dbSNCF_Schedules), dbSNCF_SchedulesSchema); diff --git a/src/test/models/SNCF_stops.model.ts b/src/test/models/SNCF_stops.model.ts index 2f144f6d..96439774 100644 --- a/src/test/models/SNCF_stops.model.ts +++ b/src/test/models/SNCF_stops.model.ts @@ -3,7 +3,7 @@ // See http://mongoosejs.com/docs/models.html import { TimeStamps } from "@typegoose/typegoose/lib/defaultClasses"; -import { addModelToTypegoose, buildSchema, prop } from "@typegoose/typegoose"; +import { addModelToTypegoose, buildSchema, deleteModelWithClass, getModelForClass, prop } from "@typegoose/typegoose"; import { modelOptions } from "@typegoose/typegoose/lib/modelOptions"; import { getName } from "@typegoose/typegoose/lib/internal/utils"; import { SNCFEndpoints } from "."; @@ -25,6 +25,8 @@ export class dbSNCF_Stops extends TimeStamps { } export default function init(db: Mongoose) { + if (getModelForClass(dbSNCF_Stops, { existingMongoose: db })) deleteModelWithClass(dbSNCF_Stops); + const dbSNCF_StopsSchema = buildSchema(dbSNCF_Stops, { existingMongoose: db }); const dbSNCF_StopsModelRaw = db.model(getName(dbSNCF_Stops), dbSNCF_StopsSchema); diff --git a/src/test/models/TBMScheduledRoutes.model.ts b/src/test/models/TBMScheduledRoutes.model.ts index 5baa1303..b5509c0e 100644 --- a/src/test/models/TBMScheduledRoutes.model.ts +++ b/src/test/models/TBMScheduledRoutes.model.ts @@ -3,7 +3,7 @@ // See http://mongoosejs.com/docs/models.html import { TimeStamps } from "@typegoose/typegoose/lib/defaultClasses"; -import { addModelToTypegoose, buildSchema, prop, Ref } from "@typegoose/typegoose"; +import { addModelToTypegoose, buildSchema, deleteModelWithClass, getModelForClass, prop, Ref } from "@typegoose/typegoose"; import { modelOptions } from "@typegoose/typegoose/lib/modelOptions"; import { getName } from "@typegoose/typegoose/lib/internal/utils"; import { dbTBM_Schedules } from "./TBM_schedules.model"; @@ -34,6 +34,8 @@ export class dbTBM_ScheduledRoutes extends TimeStamps { } export default function init(db: Mongoose) { + if (getModelForClass(dbTBM_ScheduledRoutes, { existingMongoose: db })) deleteModelWithClass(dbTBM_ScheduledRoutes); + const dbTBM_ScheduledRoutesSchema = buildSchema(dbTBM_ScheduledRoutes, { existingMongoose: db, }); diff --git a/src/test/models/TBM_lines.model.ts b/src/test/models/TBM_lines.model.ts index bd226627..4b5338e9 100644 --- a/src/test/models/TBM_lines.model.ts +++ b/src/test/models/TBM_lines.model.ts @@ -4,7 +4,7 @@ import { TBMEndpoints } from "."; import { TimeStamps } from "@typegoose/typegoose/lib/defaultClasses"; -import { addModelToTypegoose, buildSchema, prop } from "@typegoose/typegoose"; +import { addModelToTypegoose, buildSchema, deleteModelWithClass, getModelForClass, prop } from "@typegoose/typegoose"; import { modelOptions } from "@typegoose/typegoose/lib/modelOptions"; import { getName } from "@typegoose/typegoose/lib/internal/utils"; import { Active, VehicleType } from "./TBM_stops.model"; @@ -26,6 +26,8 @@ export class dbTBM_Lines extends TimeStamps { } export default function init(db: Mongoose) { + if (getModelForClass(dbTBM_Lines, { existingMongoose: db })) deleteModelWithClass(dbTBM_Lines); + const dbTBM_LinesSchema = buildSchema(dbTBM_Lines, { existingMongoose: db }); const dbTBM_LinesModelRaw = db.model(getName(dbTBM_Lines), dbTBM_LinesSchema); diff --git a/src/test/models/TBM_lines_routes.model.ts b/src/test/models/TBM_lines_routes.model.ts index 252bbc9c..fcc9a11f 100644 --- a/src/test/models/TBM_lines_routes.model.ts +++ b/src/test/models/TBM_lines_routes.model.ts @@ -4,7 +4,7 @@ import { TBMEndpoints } from "."; import { TimeStamps } from "@typegoose/typegoose/lib/defaultClasses"; -import { addModelToTypegoose, buildSchema, prop, Ref } from "@typegoose/typegoose"; +import { addModelToTypegoose, buildSchema, deleteModelWithClass, getModelForClass, prop, Ref } from "@typegoose/typegoose"; import { modelOptions } from "@typegoose/typegoose/lib/modelOptions"; import { getName } from "@typegoose/typegoose/lib/internal/utils"; import { dbTBM_Lines } from "./TBM_lines.model"; @@ -37,6 +37,8 @@ export class dbTBM_Lines_routes extends TimeStamps { // for more of what you can do here. export default function init(db: Mongoose) { + if (getModelForClass(dbTBM_Lines_routes, { existingMongoose: db })) deleteModelWithClass(dbTBM_Lines_routes); + const dbTBM_Lines_routesSchema = buildSchema(dbTBM_Lines_routes, { existingMongoose: db }); const dbTBM_Lines_routesModelRaw = db.model(getName(dbTBM_Lines_routes), dbTBM_Lines_routesSchema); diff --git a/src/test/models/TBM_schedules.model.ts b/src/test/models/TBM_schedules.model.ts index a24338b4..0780872c 100644 --- a/src/test/models/TBM_schedules.model.ts +++ b/src/test/models/TBM_schedules.model.ts @@ -15,7 +15,7 @@ export enum RtScheduleType { import { TBMEndpoints } from "."; import { TimeStamps } from "@typegoose/typegoose/lib/defaultClasses"; -import { addModelToTypegoose, buildSchema, getDiscriminatorModelForClass, index, prop, Ref } from "@typegoose/typegoose"; +import { addModelToTypegoose, buildSchema, deleteModelWithClass, getDiscriminatorModelForClass, getModelForClass, index, prop, Ref } from "@typegoose/typegoose"; import { modelOptions } from "@typegoose/typegoose/lib/modelOptions"; import { getName } from "@typegoose/typegoose/lib/internal/utils"; import { dbTBM_Stops } from "./TBM_stops.model"; @@ -58,6 +58,9 @@ export class dbTBM_Schedules_rt extends dbTBM_Schedules { } export default function init(db: Mongoose) { + if (getModelForClass(dbTBM_Schedules, { existingMongoose: db })) deleteModelWithClass(dbTBM_Schedules); + if (getModelForClass(dbTBM_Schedules_rt, { existingMongoose: db })) deleteModelWithClass(dbTBM_Schedules_rt); + const dbTBM_SchedulesSchema = buildSchema(dbTBM_Schedules, { existingMongoose: db }); const dbTBM_SchedulesModelRaw = db.model(getName(dbTBM_Schedules), dbTBM_SchedulesSchema); diff --git a/src/test/models/TBM_stops.model.ts b/src/test/models/TBM_stops.model.ts index ed41b8d4..6664dac5 100644 --- a/src/test/models/TBM_stops.model.ts +++ b/src/test/models/TBM_stops.model.ts @@ -4,7 +4,7 @@ import { TBMEndpoints } from "."; import { TimeStamps } from "@typegoose/typegoose/lib/defaultClasses"; -import { addModelToTypegoose, buildSchema, prop } from "@typegoose/typegoose"; +import { addModelToTypegoose, buildSchema, deleteModelWithClass, getModelForClass, prop } from "@typegoose/typegoose"; import { modelOptions } from "@typegoose/typegoose/lib/modelOptions"; import { getName } from "@typegoose/typegoose/lib/internal/utils"; import { Mongoose } from "mongoose"; @@ -53,6 +53,8 @@ export class dbTBM_Stops extends TimeStamps { // }; export default function init(db: Mongoose) { + if (getModelForClass(dbTBM_Stops, { existingMongoose: db })) deleteModelWithClass(dbTBM_Stops); + const dbTBM_StopsSchema = buildSchema(dbTBM_Stops, { existingMongoose: db }); const dbTBM_StopsModelRaw = db.model(getName(dbTBM_Stops), dbTBM_StopsSchema); diff --git a/src/test/models/TBM_trips.model.ts b/src/test/models/TBM_trips.model.ts index a96601d2..a91de50e 100644 --- a/src/test/models/TBM_trips.model.ts +++ b/src/test/models/TBM_trips.model.ts @@ -4,7 +4,7 @@ import { TBMEndpoints } from "."; import { TimeStamps } from "@typegoose/typegoose/lib/defaultClasses"; -import { addModelToTypegoose, buildSchema, index, prop, Ref } from "@typegoose/typegoose"; +import { addModelToTypegoose, buildSchema, deleteModelWithClass, getModelForClass, index, prop, Ref } from "@typegoose/typegoose"; import { modelOptions } from "@typegoose/typegoose/lib/modelOptions"; import { getName } from "@typegoose/typegoose/lib/internal/utils"; import { dbTBM_Lines } from "./TBM_lines.model"; @@ -35,6 +35,8 @@ export class dbTBM_Trips extends TimeStamps { } export default function init(db: Mongoose) { + if (getModelForClass(dbTBM_Trips, { existingMongoose: db })) deleteModelWithClass(dbTBM_Trips); + const dbTBM_TripsSchema = buildSchema(dbTBM_Trips, { existingMongoose: db }); const dbTBM_TripsModelRaw = db.model(getName(dbTBM_Trips), dbTBM_TripsSchema); diff --git a/src/test/models/addresses.model.ts b/src/test/models/addresses.model.ts index acd2780e..affbbd30 100644 --- a/src/test/models/addresses.model.ts +++ b/src/test/models/addresses.model.ts @@ -4,7 +4,7 @@ import { TBMEndpoints } from "."; import { TimeStamps } from "@typegoose/typegoose/lib/defaultClasses"; -import { addModelToTypegoose, buildSchema, prop } from "@typegoose/typegoose"; +import { addModelToTypegoose, buildSchema, deleteModelWithClass, getModelForClass, prop } from "@typegoose/typegoose"; import { modelOptions } from "@typegoose/typegoose/lib/modelOptions"; import { getName } from "@typegoose/typegoose/lib/internal/utils"; import { Mongoose } from "mongoose"; @@ -43,6 +43,8 @@ export class dbAddresses extends TimeStamps { } export default function init(db: Mongoose) { + if (getModelForClass(dbAddresses, { existingMongoose: db })) deleteModelWithClass(dbAddresses); + const dbAddressesSchema = buildSchema(dbAddresses, { existingMongoose: db }); const dbAddressesModelRaw = db.model(getName(dbAddresses), dbAddressesSchema); diff --git a/src/test/models/intersections.model.ts b/src/test/models/intersections.model.ts index 266acaba..e8fac8e2 100644 --- a/src/test/models/intersections.model.ts +++ b/src/test/models/intersections.model.ts @@ -4,7 +4,7 @@ import { TBMEndpoints } from "."; import { TimeStamps } from "@typegoose/typegoose/lib/defaultClasses"; -import { addModelToTypegoose, buildSchema, prop } from "@typegoose/typegoose"; +import { addModelToTypegoose, buildSchema, deleteModelWithClass, getModelForClass, prop } from "@typegoose/typegoose"; import { modelOptions } from "@typegoose/typegoose/lib/modelOptions"; import { getName } from "@typegoose/typegoose/lib/internal/utils"; import { Mongoose } from "mongoose"; @@ -22,6 +22,8 @@ export class dbIntersections extends TimeStamps { } export default function init(db: Mongoose) { + if (getModelForClass(dbIntersections, { existingMongoose: db })) deleteModelWithClass(dbIntersections); + const dbIntersectionsSchema = buildSchema(dbIntersections, { existingMongoose: db }); const dbIntersectionsModelRaw = db.model(getName(dbIntersections), dbIntersectionsSchema); diff --git a/src/test/models/sections.model.ts b/src/test/models/sections.model.ts index 723fd891..5e5b1937 100644 --- a/src/test/models/sections.model.ts +++ b/src/test/models/sections.model.ts @@ -4,7 +4,7 @@ import { TBMEndpoints } from "."; import { TimeStamps } from "@typegoose/typegoose/lib/defaultClasses"; -import { addModelToTypegoose, buildSchema, prop, Ref } from "@typegoose/typegoose"; +import { addModelToTypegoose, buildSchema, deleteModelWithClass, getModelForClass, prop, Ref } from "@typegoose/typegoose"; import { modelOptions } from "@typegoose/typegoose/lib/modelOptions"; import { getName } from "@typegoose/typegoose/lib/internal/utils"; import { dbIntersections } from "./intersections.model"; @@ -44,6 +44,8 @@ export class dbSections extends TimeStamps { } export default function init(db: Mongoose) { + if (getModelForClass(dbSections, { existingMongoose: db })) deleteModelWithClass(dbSections); + const dbSectionsSchema = buildSchema(dbSections, { existingMongoose: db }); const dbSectionsModelRaw = db.model(getName(dbSections), dbSectionsSchema); From 620445de3acfef585a9142736e4cc36adff10a10 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Sat, 25 Feb 2023 16:39:36 +0100 Subject: [PATCH 056/251] =?UTF-8?q?=E2=9C=A8=20Benchmark=20main=20function?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/index.ts | 4 ++++ src/test/test.ts | 4 +--- 2 files changed, 5 insertions(+), 3 deletions(-) create mode 100644 src/test/index.ts diff --git a/src/test/index.ts b/src/test/index.ts new file mode 100644 index 00000000..86e53a44 --- /dev/null +++ b/src/test/index.ts @@ -0,0 +1,4 @@ +import { run } from "./test"; +import { benchmark } from "./utils/benchmark"; + +benchmark(run, [], 10).then(console.log).catch(console.error); \ No newline at end of file diff --git a/src/test/test.ts b/src/test/test.ts index 714d21d0..f671aebb 100644 --- a/src/test/test.ts +++ b/src/test/test.ts @@ -50,7 +50,7 @@ export type Section = Omit & SectionOverwri const stopProjection = { _id: 1, coords: 1, libelle: 1 }; export type Stop = Pick; -async function run() { +export async function run() { /** Data displaying. * Uses {@link proj4} with crs {@link https://epsg.io/2154}. */ @@ -496,5 +496,3 @@ async function run() { return { b1, b2, b3, b4, b5, b6 }; } - -run().then(console.log).catch(console.error); From 2b10ceb8d058c931c51588ca543bc6d5ad3b3f50 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Sat, 25 Feb 2023 16:41:21 +0100 Subject: [PATCH 057/251] =?UTF-8?q?=F0=9F=9A=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/test.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/test/test.ts b/src/test/test.ts index f671aebb..8c0d55be 100644 --- a/src/test/test.ts +++ b/src/test/test.ts @@ -494,5 +494,8 @@ export async function run() { const b6 = await benchmark(updateDb, []); console.log("b6 ended"); + //End procedure + await db.disconnect(); + return { b1, b2, b3, b4, b5, b6 }; } From 4e34b327e9adb7c01cfb63e8edd3ffad923dcb35 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Sat, 25 Feb 2023 16:41:41 +0100 Subject: [PATCH 058/251] =?UTF-8?q?=F0=9F=8E=A8=20Prettier?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/index.ts | 2 +- src/test/models/SNCF_schedules.model.ts | 2 +- src/test/models/SNCF_stops.model.ts | 2 +- src/test/models/TBMScheduledRoutes.model.ts | 2 +- src/test/models/TBM_lines.model.ts | 2 +- src/test/models/TBM_lines_routes.model.ts | 2 +- src/test/models/TBM_schedules.model.ts | 15 ++++++++++++--- src/test/models/TBM_trips.model.ts | 2 +- src/test/models/intersections.model.ts | 2 +- 9 files changed, 20 insertions(+), 11 deletions(-) diff --git a/src/test/index.ts b/src/test/index.ts index 86e53a44..f237da8b 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -1,4 +1,4 @@ import { run } from "./test"; import { benchmark } from "./utils/benchmark"; -benchmark(run, [], 10).then(console.log).catch(console.error); \ No newline at end of file +benchmark(run, [], 10).then(console.log).catch(console.error); diff --git a/src/test/models/SNCF_schedules.model.ts b/src/test/models/SNCF_schedules.model.ts index 610f1d90..d1d656e7 100644 --- a/src/test/models/SNCF_schedules.model.ts +++ b/src/test/models/SNCF_schedules.model.ts @@ -29,7 +29,7 @@ export class dbSNCF_Schedules extends TimeStamps { } export default function init(db: Mongoose) { - if (getModelForClass(dbSNCF_Schedules, { existingMongoose: db })) deleteModelWithClass(dbSNCF_Schedules); + if (getModelForClass(dbSNCF_Schedules, { existingMongoose: db })) deleteModelWithClass(dbSNCF_Schedules); const dbSNCF_SchedulesSchema = buildSchema(dbSNCF_Schedules, { existingMongoose: db }); const dbSNCF_SchedulesModelRaw = db.model(getName(dbSNCF_Schedules), dbSNCF_SchedulesSchema); diff --git a/src/test/models/SNCF_stops.model.ts b/src/test/models/SNCF_stops.model.ts index 96439774..f1e5a2dd 100644 --- a/src/test/models/SNCF_stops.model.ts +++ b/src/test/models/SNCF_stops.model.ts @@ -25,7 +25,7 @@ export class dbSNCF_Stops extends TimeStamps { } export default function init(db: Mongoose) { - if (getModelForClass(dbSNCF_Stops, { existingMongoose: db })) deleteModelWithClass(dbSNCF_Stops); + if (getModelForClass(dbSNCF_Stops, { existingMongoose: db })) deleteModelWithClass(dbSNCF_Stops); const dbSNCF_StopsSchema = buildSchema(dbSNCF_Stops, { existingMongoose: db }); const dbSNCF_StopsModelRaw = db.model(getName(dbSNCF_Stops), dbSNCF_StopsSchema); diff --git a/src/test/models/TBMScheduledRoutes.model.ts b/src/test/models/TBMScheduledRoutes.model.ts index b5509c0e..ca6ec1dd 100644 --- a/src/test/models/TBMScheduledRoutes.model.ts +++ b/src/test/models/TBMScheduledRoutes.model.ts @@ -34,7 +34,7 @@ export class dbTBM_ScheduledRoutes extends TimeStamps { } export default function init(db: Mongoose) { - if (getModelForClass(dbTBM_ScheduledRoutes, { existingMongoose: db })) deleteModelWithClass(dbTBM_ScheduledRoutes); + if (getModelForClass(dbTBM_ScheduledRoutes, { existingMongoose: db })) deleteModelWithClass(dbTBM_ScheduledRoutes); const dbTBM_ScheduledRoutesSchema = buildSchema(dbTBM_ScheduledRoutes, { existingMongoose: db, diff --git a/src/test/models/TBM_lines.model.ts b/src/test/models/TBM_lines.model.ts index 4b5338e9..df49c7e4 100644 --- a/src/test/models/TBM_lines.model.ts +++ b/src/test/models/TBM_lines.model.ts @@ -26,7 +26,7 @@ export class dbTBM_Lines extends TimeStamps { } export default function init(db: Mongoose) { - if (getModelForClass(dbTBM_Lines, { existingMongoose: db })) deleteModelWithClass(dbTBM_Lines); + if (getModelForClass(dbTBM_Lines, { existingMongoose: db })) deleteModelWithClass(dbTBM_Lines); const dbTBM_LinesSchema = buildSchema(dbTBM_Lines, { existingMongoose: db }); const dbTBM_LinesModelRaw = db.model(getName(dbTBM_Lines), dbTBM_LinesSchema); diff --git a/src/test/models/TBM_lines_routes.model.ts b/src/test/models/TBM_lines_routes.model.ts index fcc9a11f..cd5281cf 100644 --- a/src/test/models/TBM_lines_routes.model.ts +++ b/src/test/models/TBM_lines_routes.model.ts @@ -37,7 +37,7 @@ export class dbTBM_Lines_routes extends TimeStamps { // for more of what you can do here. export default function init(db: Mongoose) { - if (getModelForClass(dbTBM_Lines_routes, { existingMongoose: db })) deleteModelWithClass(dbTBM_Lines_routes); + if (getModelForClass(dbTBM_Lines_routes, { existingMongoose: db })) deleteModelWithClass(dbTBM_Lines_routes); const dbTBM_Lines_routesSchema = buildSchema(dbTBM_Lines_routes, { existingMongoose: db }); const dbTBM_Lines_routesModelRaw = db.model(getName(dbTBM_Lines_routes), dbTBM_Lines_routesSchema); diff --git a/src/test/models/TBM_schedules.model.ts b/src/test/models/TBM_schedules.model.ts index 0780872c..4162db6a 100644 --- a/src/test/models/TBM_schedules.model.ts +++ b/src/test/models/TBM_schedules.model.ts @@ -15,7 +15,16 @@ export enum RtScheduleType { import { TBMEndpoints } from "."; import { TimeStamps } from "@typegoose/typegoose/lib/defaultClasses"; -import { addModelToTypegoose, buildSchema, deleteModelWithClass, getDiscriminatorModelForClass, getModelForClass, index, prop, Ref } from "@typegoose/typegoose"; +import { + addModelToTypegoose, + buildSchema, + deleteModelWithClass, + getDiscriminatorModelForClass, + getModelForClass, + index, + prop, + Ref, +} from "@typegoose/typegoose"; import { modelOptions } from "@typegoose/typegoose/lib/modelOptions"; import { getName } from "@typegoose/typegoose/lib/internal/utils"; import { dbTBM_Stops } from "./TBM_stops.model"; @@ -58,8 +67,8 @@ export class dbTBM_Schedules_rt extends dbTBM_Schedules { } export default function init(db: Mongoose) { - if (getModelForClass(dbTBM_Schedules, { existingMongoose: db })) deleteModelWithClass(dbTBM_Schedules); - if (getModelForClass(dbTBM_Schedules_rt, { existingMongoose: db })) deleteModelWithClass(dbTBM_Schedules_rt); + if (getModelForClass(dbTBM_Schedules, { existingMongoose: db })) deleteModelWithClass(dbTBM_Schedules); + if (getModelForClass(dbTBM_Schedules_rt, { existingMongoose: db })) deleteModelWithClass(dbTBM_Schedules_rt); const dbTBM_SchedulesSchema = buildSchema(dbTBM_Schedules, { existingMongoose: db }); const dbTBM_SchedulesModelRaw = db.model(getName(dbTBM_Schedules), dbTBM_SchedulesSchema); diff --git a/src/test/models/TBM_trips.model.ts b/src/test/models/TBM_trips.model.ts index a91de50e..38fbea36 100644 --- a/src/test/models/TBM_trips.model.ts +++ b/src/test/models/TBM_trips.model.ts @@ -35,7 +35,7 @@ export class dbTBM_Trips extends TimeStamps { } export default function init(db: Mongoose) { - if (getModelForClass(dbTBM_Trips, { existingMongoose: db })) deleteModelWithClass(dbTBM_Trips); + if (getModelForClass(dbTBM_Trips, { existingMongoose: db })) deleteModelWithClass(dbTBM_Trips); const dbTBM_TripsSchema = buildSchema(dbTBM_Trips, { existingMongoose: db }); const dbTBM_TripsModelRaw = db.model(getName(dbTBM_Trips), dbTBM_TripsSchema); diff --git a/src/test/models/intersections.model.ts b/src/test/models/intersections.model.ts index e8fac8e2..7cdb876e 100644 --- a/src/test/models/intersections.model.ts +++ b/src/test/models/intersections.model.ts @@ -22,7 +22,7 @@ export class dbIntersections extends TimeStamps { } export default function init(db: Mongoose) { - if (getModelForClass(dbIntersections, { existingMongoose: db })) deleteModelWithClass(dbIntersections); + if (getModelForClass(dbIntersections, { existingMongoose: db })) deleteModelWithClass(dbIntersections); const dbIntersectionsSchema = buildSchema(dbIntersections, { existingMongoose: db }); const dbIntersectionsModelRaw = db.model(getName(dbIntersections), dbIntersectionsSchema); From b04aabbe645840d5e9563633e8bf5b02dea5f5eb Mon Sep 17 00:00:00 2001 From: Catatomik Date: Sat, 25 Feb 2023 19:08:09 +0100 Subject: [PATCH 059/251] =?UTF-8?q?=F0=9F=92=AC=20Better=20time=20formatti?= =?UTF-8?q?ng?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/utils/benchmark.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/test/utils/benchmark.ts b/src/test/utils/benchmark.ts index 70bcdf08..6ea4ccd0 100644 --- a/src/test/utils/benchmark.ts +++ b/src/test/utils/benchmark.ts @@ -34,6 +34,10 @@ export async function benchmark any>(f: F, args: P export class Duration { private time: number; + static getLeadingZeros(time: number, expectedNumbers: number) { + return `${"0".repeat(expectedNumbers - time.toString().length)}`; + } + constructor(ms: number) { this.time = ms; } @@ -63,6 +67,8 @@ export class Duration { } toString() { - return `${this.totalMinuts}:${this.totalSeconds}:${this.rSeconds}`; + return `${Duration.getLeadingZeros(this.totalMinuts, 2)}${this.totalMinuts}:${Duration.getLeadingZeros(this.totalSeconds, 2)}${ + this.totalSeconds + }:${Duration.getLeadingZeros(Math.floor(this.rSeconds), 3)}${this.rSeconds}`; } } From c33dd95b66fa07a1cfaa077e01f4534633aa7c3a Mon Sep 17 00:00:00 2001 From: Catatomik Date: Sat, 25 Feb 2023 20:23:17 +0100 Subject: [PATCH 060/251] =?UTF-8?q?=F0=9F=90=9B=20Negative=20repeat=20in?= =?UTF-8?q?=20leading=20zeros?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/utils/benchmark.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/test/utils/benchmark.ts b/src/test/utils/benchmark.ts index 6ea4ccd0..fdf1c387 100644 --- a/src/test/utils/benchmark.ts +++ b/src/test/utils/benchmark.ts @@ -35,7 +35,8 @@ export class Duration { private time: number; static getLeadingZeros(time: number, expectedNumbers: number) { - return `${"0".repeat(expectedNumbers - time.toString().length)}`; + const repeats = expectedNumbers - time.toString().length; + return "0".repeat(repeats < 0 ? 0 : repeats); } constructor(ms: number) { From 742c3deff5cffd5fddfd03d690359968f5e1c482 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Sat, 25 Feb 2023 20:23:25 +0100 Subject: [PATCH 061/251] =?UTF-8?q?=F0=9F=92=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/utils/Workers.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/utils/Workers.ts b/src/test/utils/Workers.ts index d35363f2..72111054 100644 --- a/src/test/utils/Workers.ts +++ b/src/test/utils/Workers.ts @@ -96,7 +96,7 @@ export class WorkerPool any> { const delta = new Duration(Number((process.hrtime.bigint() - startTime) / nsPerMs)); worker.status = Status.Idle; resolve(result); - console.log(`Finished worker ${worker.id} after ${delta.totalSeconds}s${delta.rSeconds} (${this.queue.size})`); + console.log(`Finished worker ${worker.id} after ${delta} (${this.queue.size})`); this.runCallback(); worker.worker.removeListener("message", onceMessage); worker.worker.removeListener("error", onceError); From 875d602eb3c96fc71b0869df4fdf90394b0492d2 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Sat, 25 Feb 2023 20:23:44 +0100 Subject: [PATCH 062/251] =?UTF-8?q?=F0=9F=9A=A7=20More=20compatible=20type?= =?UTF-8?q?s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/computePath.ts | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/src/test/computePath.ts b/src/test/computePath.ts index 4c775b0f..920ac8cb 100644 --- a/src/test/computePath.ts +++ b/src/test/computePath.ts @@ -33,7 +33,7 @@ let stops: initData["stops"] | undefined; let options: initData["options"] | undefined; export async function computePath(stopId: ReturnType, returnPaths: Paths) { - const sourcePaths: Map> : never[], number]> = new Map(); + const sourcePaths: Map>, number]> = new Map(); if (!footGraph || !stops) return sourcePaths; @@ -45,17 +45,14 @@ export async function computePath(stopId: ReturnType> : [], - dist.get(targetNode)!, - ]); + sourcePaths.set(stopId, [returnPaths ? tracePath(prev, targetNode) : [], dist.get(targetNode)!]); } return sourcePaths; } export async function computePathBench(stopId: ReturnType, returnPaths: boolean) { - const sourcePaths: Map> : [], number]> = new Map(); + const sourcePaths: Map>, number]> = new Map(); if (!footGraph || !stops) return sourcePaths; @@ -83,10 +80,7 @@ export async function computePathBench(stopId: ReturnType const targetNode = approachedStopName(stopId); if (dist.get(targetNode) !== undefined && dist.get(targetNode)! < Infinity) - sourcePaths.set(stopId, [ - (returnPaths ? tracePath(prev, targetNode) : []) as Paths extends true ? path> : [], - dist.get(targetNode)!, - ]); + sourcePaths.set(stopId, [returnPaths ? tracePath(prev, targetNode) : [], dist.get(targetNode)!]); } }, [stops], From 4c54a41d3b901034f1573c401e60e0ad78e6b2be Mon Sep 17 00:00:00 2001 From: Catatomik Date: Sat, 25 Feb 2023 20:23:53 +0100 Subject: [PATCH 063/251] =?UTF-8?q?=E2=9C=A8=20Test=20options?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/index.ts | 4 +- src/test/test.ts | 322 +++++++++++++++++++++++----------------------- 2 files changed, 167 insertions(+), 159 deletions(-) diff --git a/src/test/index.ts b/src/test/index.ts index f237da8b..d8554c8a 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -1,4 +1,6 @@ import { run } from "./test"; import { benchmark } from "./utils/benchmark"; -benchmark(run, [], 10).then(console.log).catch(console.error); +benchmark(run, [{ getFullPaths: false, computeGEOJSONs: false }], 5) + .then(console.log) + .catch(console.error); diff --git a/src/test/test.ts b/src/test/test.ts index 8c0d55be..9effd5ac 100644 --- a/src/test/test.ts +++ b/src/test/test.ts @@ -8,6 +8,10 @@ import { node, WeightedGraph } from "../utils/Graph"; import Point from "../utils/Point"; import Segment from "../utils/Segment"; +export interface testOptions { + getFullPaths: boolean; + computeGEOJSONs: boolean; +} export type id = number; export type footGraphNodes = number | ReturnType; @@ -50,7 +54,7 @@ export type Section = Omit & SectionOverwri const stopProjection = { _id: 1, coords: 1, libelle: 1 }; export type Stop = Pick; -export async function run() { +export async function run({ getFullPaths, computeGEOJSONs }: testOptions) { /** Data displaying. * Uses {@link proj4} with crs {@link https://epsg.io/2154}. */ @@ -73,14 +77,14 @@ export async function run() { ( (await sectionsModel .find>>( - //Restrict domain { - $and: [ - { "coords.0.0": { $lte: limitTop.x } }, - { "coords.0.0": { $gte: limitBot.x } }, - { "coords.0.1": { $lte: limitTop.y } }, - { "coords.0.1": { $gte: limitBot.y } }, - ], + //Restrict domain + // $and: [ + // { "coords.0.0": { $lte: limitTop.x } }, + // { "coords.0.0": { $gte: limitBot.x } }, + // { "coords.0.1": { $lte: limitTop.y } }, + // { "coords.0.1": { $gte: limitBot.y } }, + // ], cat_dig: { $in: [2, 3, 4, 5, 7, 9], }, @@ -120,10 +124,10 @@ export async function run() { $and: [ { coords: { $not: { $elemMatch: { $eq: Infinity } } } }, //Restrict domain - { "coords.0": { $lte: limitTop.x } }, - { "coords.0": { $gte: limitBot.x } }, - { "coords.1": { $lte: limitTop.y } }, - { "coords.1": { $gte: limitBot.y } }, + // { "coords.0": { $lte: limitTop.x } }, + // { "coords.0": { $gte: limitBot.x } }, + // { "coords.1": { $lte: limitTop.y } }, + // { "coords.1": { $gte: limitBot.y } }, ], }, stopProjection, @@ -142,7 +146,7 @@ export async function run() { stops, }; } - const b1 = await benchmark(queryData, [], 10); + const b1 = await benchmark(queryData, []); console.log("b1 ended"); if (!b1.lastReturn) throw `b1 return null`; const { validIntersections, sections, stops } = b1.lastReturn; @@ -162,34 +166,35 @@ export async function run() { return footGraph; } - const b2 = await benchmark(makeGraph, [], 10); + const b2 = await benchmark(makeGraph, []); console.log("b2 ended"); if (!b2.lastReturn) throw `b2 return null`; const footGraph = b2.lastReturn; - GEOJSONs.push( - computeGEOJSON( - // footGraph.nodes, - [], - footGraph.arcs, - () => [], - // (node) => - // toWGS(typeof node === "number" ? validIntersections.get(node)?.coords ?? [0, 0] : stops.get(parseInt(node.split("-")[0]))?.coords ?? [0, 0]), - (arc) => - sections.get(sectionId({ rg_fv_graph_nd: arc[0], rg_fv_graph_na: arc[1] }))?.coords.map((coords) => toWGS(coords)) ?? [ - [0, 0], - [0, 0], - ], - (node) => ({ - id: node, - "marker-color": "#5a5a5a", - "marker-size": "small", - }), - (arc) => ({ - nom: Array.from(sections.values()).find((s) => s.rg_fv_graph_nd === arc[0] && s.rg_fv_graph_na === arc[1])?.nom_voie || "Unknown", - }), - ), - ); + if (computeGEOJSONs) + GEOJSONs.push( + computeGEOJSON( + // footGraph.nodes, + [], + footGraph.arcs, + () => [], + // (node) => + // toWGS(typeof node === "number" ? validIntersections.get(node)?.coords ?? [0, 0] : stops.get(parseInt(node.split("-")[0]))?.coords ?? [0, 0]), + (arc) => + sections.get(sectionId({ rg_fv_graph_nd: arc[0], rg_fv_graph_na: arc[1] }))?.coords.map((coords) => toWGS(coords)) ?? [ + [0, 0], + [0, 0], + ], + (node) => ({ + id: node, + "marker-color": "#5a5a5a", + "marker-size": "small", + }), + (arc) => ({ + nom: Array.from(sections.values()).find((s) => s.rg_fv_graph_nd === arc[0] && s.rg_fv_graph_na === arc[1])?.nom_voie || "Unknown", + }), + ), + ); //Compute approached stops function computeApproachedStops() { @@ -233,7 +238,7 @@ export async function run() { } return approachedStops; } - const b3 = await benchmark(computeApproachedStops, [], 1); + const b3 = await benchmark(computeApproachedStops, []); console.log("b3 ended"); if (!b3.lastReturn) throw `b3 return null`; const approachedStops = b3.lastReturn; @@ -289,41 +294,40 @@ export async function run() { const b4 = await benchmark(refreshWithApproachedStops, []); console.log("b4 ended"); - GEOJSONs.push( - computeGEOJSON( - footGraph.nodes, - footGraph.arcs, - // () => [], - (node) => { - let coords: [number, number] = [0, 0]; - if (typeof node === "number") coords = validIntersections.get(node)?.coords ?? [0, 0]; - else { - const approachedStopPoint = approachedStops.get(node as ReturnType)?.[0]; - if (approachedStopPoint) coords = [approachedStopPoint.x, approachedStopPoint.y]; - } - return toWGS(coords); - }, - (arc) => - getSection(arc[0], arc[1])?.coords.map((coords) => toWGS(coords)) ?? [ - [0, 0], - [0, 0], - ], - (node) => ({ - id: node, - name: stops.get(typeof node === "string" ? parseInt(node.split("=")[1]) : node)?.libelle ?? "Unknown", - "marker-color": typeof node === "string" ? "#ff0000" : "#5a5a5a", - "marker-size": typeof node === "string" ? "medium" : "small", - }), - (arc) => ({ - name: getSection(arc[0], arc[1])?.nom_voie || "Unknown", - distance: getSection(arc[0], arc[1])?.distance || "Unknown", - sectionId: sectionId({ rg_fv_graph_nd: arc[0], rg_fv_graph_na: arc[1] }), - stroke: typeof arc[0] === "string" || typeof arc[1] === "string" ? "#e60000" : "#5a5a5a", - }), - ), - ); - - const getFullPaths = false; + if (computeGEOJSONs) + GEOJSONs.push( + computeGEOJSON( + footGraph.nodes, + footGraph.arcs, + // () => [], + (node) => { + let coords: [number, number] = [0, 0]; + if (typeof node === "number") coords = validIntersections.get(node)?.coords ?? [0, 0]; + else { + const approachedStopPoint = approachedStops.get(node as ReturnType)?.[0]; + if (approachedStopPoint) coords = [approachedStopPoint.x, approachedStopPoint.y]; + } + return toWGS(coords); + }, + (arc) => + getSection(arc[0], arc[1])?.coords.map((coords) => toWGS(coords)) ?? [ + [0, 0], + [0, 0], + ], + (node) => ({ + id: node, + name: stops.get(typeof node === "string" ? parseInt(node.split("=")[1]) : node)?.libelle ?? "Unknown", + "marker-color": typeof node === "string" ? "#ff0000" : "#5a5a5a", + "marker-size": typeof node === "string" ? "medium" : "small", + }), + (arc) => ({ + name: getSection(arc[0], arc[1])?.nom_voie || "Unknown", + distance: getSection(arc[0], arc[1])?.distance || "Unknown", + sectionId: sectionId({ rg_fv_graph_nd: arc[0], rg_fv_graph_na: arc[1] }), + stroke: typeof arc[0] === "string" || typeof arc[1] === "string" ? "#e60000" : "#5a5a5a", + }), + ), + ); async function computePaths() { //paths> @@ -361,94 +365,96 @@ export async function run() { const paths = b5.lastReturn; // From "Les Harmonies" - GEOJSONs.push( - computeGEOJSON( - footGraph.nodes, - Array.from(paths.get(128738)!).filter(([_, [path]]) => path.length), - (node) => { - let coords: [number, number] = [0, 0]; - if (typeof node === "number") coords = validIntersections.get(node)?.coords ?? [0, 0]; - else { - const approachedStopPoint = approachedStops.get(node as ReturnType)?.[0]; - if (approachedStopPoint) coords = [approachedStopPoint.x, approachedStopPoint.y]; - } - return toWGS(coords); - }, - ([_, [path]]) => - path.reduce( - (acc, v, i) => - i < path.length - 1 - ? [ - ...acc, - ...(( - sections.get(sectionId({ rg_fv_graph_nd: v, rg_fv_graph_na: path[i + 1] }))?.coords ?? - sections - .get(sectionId({ rg_fv_graph_nd: path[i + 1], rg_fv_graph_na: v })) - ?.coords // Make a copy & reverse to get coords in the right order, tricky - .slice() - .reverse() - )?.map((coords) => toWGS(coords)) ?? [ - [0, 0], - [0, 0], - ]), - ] - : acc, - [], - ), - (node) => ({ - id: node, - name: stops.get(typeof node === "string" ? parseInt(node.split("=")[1]) : node)?.libelle ?? "Unknown", - "marker-color": typeof node === "string" ? "#ff0000" : "#5a5a5a", - "marker-size": typeof node === "string" ? "medium" : "small", - }), - ([dest, [path, distance]]) => ({ - path: `${path[0]}-${dest}`, - distance, - stroke: "#8080ff", - }), - ), - ); + if (computeGEOJSONs) + GEOJSONs.push( + computeGEOJSON( + footGraph.nodes, + Array.from(paths.get(128738)!).filter(([_, [path]]) => path.length), + (node) => { + let coords: [number, number] = [0, 0]; + if (typeof node === "number") coords = validIntersections.get(node)?.coords ?? [0, 0]; + else { + const approachedStopPoint = approachedStops.get(node as ReturnType)?.[0]; + if (approachedStopPoint) coords = [approachedStopPoint.x, approachedStopPoint.y]; + } + return toWGS(coords); + }, + ([_, [path]]) => + path.reduce( + (acc, v, i) => + i < path.length - 1 + ? [ + ...acc, + ...(( + sections.get(sectionId({ rg_fv_graph_nd: v, rg_fv_graph_na: path[i + 1] }))?.coords ?? + sections + .get(sectionId({ rg_fv_graph_nd: path[i + 1], rg_fv_graph_na: v })) + ?.coords // Make a copy & reverse to get coords in the right order, tricky + .slice() + .reverse() + )?.map((coords) => toWGS(coords)) ?? [ + [0, 0], + [0, 0], + ]), + ] + : acc, + [], + ), + (node) => ({ + id: node, + name: stops.get(typeof node === "string" ? parseInt(node.split("=")[1]) : node)?.libelle ?? "Unknown", + "marker-color": typeof node === "string" ? "#ff0000" : "#5a5a5a", + "marker-size": typeof node === "string" ? "medium" : "small", + }), + ([dest, [path, distance]]) => ({ + path: `${path[0]}-${dest}`, + distance, + stroke: "#8080ff", + }), + ), + ); //From "Les Harmonies" to "Peixotto" const specificPath = paths.get(128738)!.get(126798)!; - GEOJSONs.push( - computeGEOJSON( - footGraph.nodes, - specificPath[0].reduce<[node, node][]>((acc, node, i, path) => (i < path.length - 1 ? [...acc, [node, path[i + 1]]] : acc), []), - (node) => { - let coords: [number, number] = [0, 0]; - if (typeof node === "number") coords = validIntersections.get(node)?.coords ?? [0, 0]; - else { - const approachedStopPoint = approachedStops.get(node as ReturnType)?.[0]; - if (approachedStopPoint) coords = [approachedStopPoint.x, approachedStopPoint.y]; - } - return toWGS(coords); - }, - (path) => - path.reduce( - (acc, v, i) => - i === 0 - ? getSection(v, path[i + 1])?.coords.map((coords) => toWGS(coords)) ?? [ - [0, 0], - [0, 0], - ] - : acc, - [], - ), - (node) => ({ - id: node, - name: stops.get(typeof node === "string" ? parseInt(node.split("=")[1]) : node)?.libelle ?? "Unknown", - "marker-color": typeof node === "string" ? "#ff0000" : "#5a5a5a", - "marker-size": typeof node === "string" ? "medium" : "small", - }), - (path) => ({ - path: `${path[0]}-${path[path.length - 1]}`, - totalDistance: specificPath[1], - stroke: "#8080ff", - }), - ), - ); - for (let i = 0; i < GEOJSONs.length; i++) await writeFile(__dirname + `/../../out-${i}.geojson`, JSON.stringify(GEOJSONs[i])); + if (computeGEOJSONs) + GEOJSONs.push( + computeGEOJSON( + footGraph.nodes, + specificPath[0].reduce<[node, node][]>((acc, node, i, path) => (i < path.length - 1 ? [...acc, [node, path[i + 1]]] : acc), []), + (node) => { + let coords: [number, number] = [0, 0]; + if (typeof node === "number") coords = validIntersections.get(node)?.coords ?? [0, 0]; + else { + const approachedStopPoint = approachedStops.get(node as ReturnType)?.[0]; + if (approachedStopPoint) coords = [approachedStopPoint.x, approachedStopPoint.y]; + } + return toWGS(coords); + }, + (path) => + path.reduce( + (acc, v, i) => + i === 0 + ? getSection(v, path[i + 1])?.coords.map((coords) => toWGS(coords)) ?? [ + [0, 0], + [0, 0], + ] + : acc, + [], + ), + (node) => ({ + id: node, + name: stops.get(typeof node === "string" ? parseInt(node.split("=")[1]) : node)?.libelle ?? "Unknown", + "marker-color": typeof node === "string" ? "#ff0000" : "#5a5a5a", + "marker-size": typeof node === "string" ? "medium" : "small", + }), + (path) => ({ + path: `${path[0]}-${path[path.length - 1]}`, + totalDistance: specificPath[1], + stroke: "#8080ff", + }), + ), + ); + if (computeGEOJSONs) for (let i = 0; i < GEOJSONs.length; i++) await writeFile(__dirname + `/../../out-${i}.geojson`, JSON.stringify(GEOJSONs[i])); async function updateDb() { //Empty db From 4934d67cb386abc103a111e8559e9376535d770b Mon Sep 17 00:00:00 2001 From: Catatomik Date: Sat, 25 Feb 2023 20:25:44 +0100 Subject: [PATCH 064/251] =?UTF-8?q?=F0=9F=9A=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/computePath.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/computePath.ts b/src/test/computePath.ts index 920ac8cb..3dcdf953 100644 --- a/src/test/computePath.ts +++ b/src/test/computePath.ts @@ -32,7 +32,7 @@ let footGraph: WeightedGraph | undefined; let stops: initData["stops"] | undefined; let options: initData["options"] | undefined; -export async function computePath(stopId: ReturnType, returnPaths: Paths) { +export async function computePath(stopId: ReturnType, returnPaths: boolean) { const sourcePaths: Map>, number]> = new Map(); if (!footGraph || !stops) return sourcePaths; @@ -51,7 +51,7 @@ export async function computePath(stopId: ReturnType(stopId: ReturnType, returnPaths: boolean) { +export async function computePathBench(stopId: ReturnType, returnPaths: boolean) { const sourcePaths: Map>, number]> = new Map(); if (!footGraph || !stops) return sourcePaths; From 6aa5fed7f3e5277ceeaf74c1bbb01e839d2868fb Mon Sep 17 00:00:00 2001 From: Catatomik Date: Sat, 25 Feb 2023 20:25:58 +0100 Subject: [PATCH 065/251] =?UTF-8?q?=F0=9F=92=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- out-0.geojson | 1 - out-1.geojson | 1 - out-2.geojson | 1 - out-3.geojson | 1 - 4 files changed, 4 deletions(-) delete mode 100644 out-0.geojson delete mode 100644 out-1.geojson delete mode 100644 out-2.geojson delete mode 100644 out-3.geojson diff --git a/out-0.geojson b/out-0.geojson deleted file mode 100644 index a3f0c584..00000000 --- a/out-0.geojson +++ /dev/null @@ -1 +0,0 @@ -{"type":"FeatureCollection","features":[{"type":"Feature","properties":{"nom":"Avenue Roul"},"geometry":{"type":"LineString","coordinates":[[-0.598503457195701,44.805929589372],[-0.599594343530901,44.80593786015047],[-0.5997331001835146,44.80595319683834],[-0.5998917179816667,44.805980606374426],[-0.5999951036373583,44.806025258018686]]}},{"type":"Feature","properties":{"nom":"Rue du Général André"},"geometry":{"type":"LineString","coordinates":[[-0.598503457195701,44.805929589372],[-0.5984066689433065,44.80404866973753]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de l'Université"},"geometry":{"type":"LineString","coordinates":[[-0.5999951036373583,44.806025258018686],[-0.5999857389047671,44.806035373400114],[-0.5999680339751972,44.806065931207954],[-0.5999579091474151,44.80609832099349],[-0.599956256747319,44.80612656908074]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Résidence Crespy I"},"geometry":{"type":"LineString","coordinates":[[-0.5889352992729378,44.80426162947189],[-0.5888401723316949,44.80448154821921]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Voie 1 Faculté des Sciences"},"geometry":{"type":"LineString","coordinates":[[-0.5923014576779416,44.80911464724327],[-0.5924032108814535,44.80912296419148],[-0.5925715802135042,44.809132149793314],[-0.5927401461516187,44.80914042811659],[-0.5929927901926941,44.80915361730581],[-0.5931613226284861,44.80916135557597],[-0.5932457489801798,44.80916373320644],[-0.5933724647536849,44.80916243269566],[-0.5934984178918323,44.80915295867147],[-0.5936231057803754,44.80913739890081],[-0.5937460119922557,44.80911558953809],[-0.5938653489143757,44.809085244934074],[-0.593980162198748,44.80904729607213],[-0.5940895733518388,44.80900186080643],[-0.5941920612032893,44.80894889713399],[-0.594286390818953,44.80888889450593],[-0.5944338093874455,44.80878127231715],[-0.5946693176037725,44.80860897970359],[-0.5948467939806595,44.808480138548774],[-0.5950249402806838,44.80835190649283],[-0.5950842838442604,44.80830922367916],[-0.5951085953449483,44.80828512401],[-0.595118792724725,44.80826399273431]]}},{"type":"Feature","properties":{"nom":"Voie 1 Faculté des Sciences"},"geometry":{"type":"LineString","coordinates":[[-0.5923014576779416,44.80911464724327],[-0.5923203593795362,44.80909306119912],[-0.5923314057953137,44.80906929102091],[-0.592334021490954,44.80904425570406],[-0.5923283073312876,44.809019573538976],[-0.5923143473697959,44.80899659310074],[-0.5922931097233672,44.80897663504195],[-0.5922658038850416,44.80896083222664],[-0.5922338863311691,44.80895021963794],[-0.5921994113864558,44.80894527288714],[-0.5921882974571633,44.80894562386988]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Voie 1 Faculté des Sciences"},"geometry":{"type":"LineString","coordinates":[[-0.595118792724725,44.80826399273431],[-0.5951235605337198,44.80822681828497],[-0.5951234192899467,44.80810890524155]]}},{"type":"Feature","properties":{"nom":"Place Henri Goulinat"},"geometry":{"type":"LineString","coordinates":[[-0.6312988395560757,44.806953711851584],[-0.6309171201956937,44.80701688540854]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Place Henri Goulinat"},"geometry":{"type":"LineString","coordinates":[[-0.6309171201956937,44.80701688540854],[-0.6308228069958516,44.80703232765483]]}},{"type":"Feature","properties":{"nom":"Avenue de Genève"},"geometry":{"type":"LineString","coordinates":[[-0.6192614171451878,44.802438103692516],[-0.6193901306760591,44.8013866079945]]}},{"type":"Feature","properties":{"nom":"Avenue Raymond Boivin"},"geometry":{"type":"LineString","coordinates":[[-0.6192614171451878,44.802438103692516],[-0.6182464372634308,44.80245301211074]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de Genève"},"geometry":{"type":"LineString","coordinates":[[-0.6193901306760591,44.8013866079945],[-0.6194581803946418,44.80085421141209]]}},{"type":"Feature","properties":{"nom":"Avenue de Genève"},"geometry":{"type":"LineString","coordinates":[[-0.6195375283914707,44.800241821394124],[-0.6195571001638541,44.800067877994806]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de Genève"},"geometry":{"type":"LineString","coordinates":[[-0.6195571001638541,44.800067877994806],[-0.6196697256676994,44.79906661944379]]}},{"type":"Feature","properties":{"nom":"Allée des Cyclades"},"geometry":{"type":"LineString","coordinates":[[-0.6195571001638541,44.800067877994806],[-0.619423815369965,44.80005896769497],[-0.6191154289825405,44.80004013518206],[-0.6190323834630272,44.80003539102069]]}},{"type":"Feature","properties":{"nom":"Place Henri Goulinat"},"geometry":{"type":"LineString","coordinates":[[-0.6317468675861465,44.80689859927188],[-0.6316195941969948,44.80690104150232],[-0.6312988395560757,44.806953711851584]]}},{"type":"Feature","properties":{"nom":"Avenue Roger Cohé"},"geometry":{"type":"LineString","coordinates":[[-0.6317468675861465,44.80689859927188],[-0.6313355096094503,44.80614980310704],[-0.6313232630557205,44.80610605296365]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Allée Jacques Brel"},"geometry":{"type":"LineString","coordinates":[[-0.6077811541581584,44.80684108265683],[-0.6077934054527061,44.80684880150884],[-0.6078034398176395,44.806857491505625],[-0.6078113891675294,44.806867238546964],[-0.6078169784182125,44.80687769102831],[-0.6078201963137756,44.80688866913973],[-0.6078208996819043,44.8068999071757],[-0.6078190716415861,44.80691113542341],[-0.607814810344942,44.80692190035544],[-0.6078081101632886,44.806932112066306],[-0.6077991955422586,44.80694131302301],[-0.607788319055796,44.80694949521394],[-0.6077757107766091,44.8069562910094],[-0.6077617383193701,44.80696150858398],[-0.6077467805511492,44.80696513591928],[-0.6077312050887919,44.80696698119019],[-0.607715901583938,44.806967106259115]]}},{"type":"Feature","properties":{"nom":"Allée Jacques Brel"},"geometry":{"type":"LineString","coordinates":[[-0.607715901583938,44.806967106259115],[-0.6076998428430483,44.80696527346084],[-0.6076848194250404,44.806961786331996],[-0.6076708313323107,44.80695664487297],[-0.6076581367674685,44.806949930977645],[-0.6076471258552513,44.80694181243824],[-0.6076381943417974,44.80693254695137],[-0.6076286563956004,44.806921679208564],[-0.6076263081823315,44.80690842143976],[-0.6076249290135118,44.80690053789966],[-0.6076254885736272,44.80688925980674],[-0.6076285964218933,44.8068782612202],[-0.6076341375206092,44.80686772595245],[-0.6076418817964175,44.80685802163282],[-0.6076518348755929,44.80684923816512],[-0.6076636403991216,44.806841747181615],[-0.6076769307508927,44.80683574050894],[-0.6076914533548683,44.806831226156575],[-0.6077067199378906,44.80682848986049],[-0.6077224779209154,44.80682753963061],[-0.6077382221511985,44.80682839149057],[-0.6077535737622443,44.806831057456606],[-0.6077681482628328,44.8068354596426],[-0.6077811541581584,44.80684108265683]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue des Orchidées"},"geometry":{"type":"LineString","coordinates":[[-0.6197644570798326,44.8049764093837],[-0.619434263251487,44.80508024381205]]}},{"type":"Feature","properties":{"nom":"Rue des Flamboyants"},"geometry":{"type":"LineString","coordinates":[[-0.6197644570798326,44.8049764093837],[-0.619980510101008,44.80504781568014],[-0.6201737519763828,44.80505418675388]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue des Orchidées"},"geometry":{"type":"LineString","coordinates":[[-0.619434263251487,44.80508024381205],[-0.6192984980148553,44.80512068753395]]}},{"type":"Feature","properties":{"nom":"Allée des Hibiscus"},"geometry":{"type":"LineString","coordinates":[[-0.619434263251487,44.80508024381205],[-0.6192339446481433,44.804759615665944]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue des Orchidées"},"geometry":{"type":"LineString","coordinates":[[-0.6192984980148553,44.80512068753395],[-0.6188697461705239,44.80524089870388]]}},{"type":"Feature","properties":{"nom":"Place du Muguet"},"geometry":{"type":"LineString","coordinates":[[-0.6192984980148553,44.80512068753395],[-0.6196479004013254,44.80571168586368]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de Gradignan"},"geometry":{"type":"LineString","coordinates":[[-0.6252738215622851,44.8018510579183],[-0.6254105407253198,44.80210965413609],[-0.625439882089743,44.80218186678796],[-0.6255429995479178,44.80249765613825]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue des Lacs"},"geometry":{"type":"LineString","coordinates":[[-0.6252738215622851,44.8018510579183],[-0.6268196929754306,44.80186600150498]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de Gradignan"},"geometry":{"type":"LineString","coordinates":[[-0.6255429995479178,44.80249765613825],[-0.6255939932486262,44.802731058936885],[-0.6256668640573011,44.80321572841437],[-0.6256676068307824,44.803400556478046]]}},{"type":"Feature","properties":{"nom":"Avenue Raymond Boivin"},"geometry":{"type":"LineString","coordinates":[[-0.6255429995479178,44.80249765613825],[-0.6237854723855056,44.80244520763538]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue des Fougères"},"geometry":{"type":"LineString","coordinates":[[-0.6256676068307824,44.803400556478046],[-0.6237420017448931,44.80334184354475]]}},{"type":"Feature","properties":{"nom":"Avenue de Gradignan"},"geometry":{"type":"LineString","coordinates":[[-0.6256676068307824,44.803400556478046],[-0.6256255858329896,44.804118601845786]]}},{"type":"Feature","properties":{"nom":"Avenue de Gradignan"},"geometry":{"type":"LineString","coordinates":[[-0.6254961069676005,44.80434026530025],[-0.6254913089998229,44.8043617661527],[-0.6254913737934205,44.80438345516219],[-0.6254981249364217,44.80440393855727],[-0.6255105870394615,44.804423349318945],[-0.625521936792281,44.8044350780614],[-0.6255354689330679,44.80444556811825],[-0.6255592725920494,44.80445854161158],[-0.6255814707323305,44.80446636389337]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de Gradignan"},"geometry":{"type":"LineString","coordinates":[[-0.6254961069676005,44.80434026530025],[-0.6255111828394053,44.804318929105925],[-0.6255265575605203,44.80430387726369],[-0.6255408110952814,44.80429388318724],[-0.6255568796378143,44.80428539862231],[-0.6255725350617136,44.804279270471646],[-0.6255900706352978,44.804274329765185],[-0.6256127082144118,44.80427048785866],[-0.6256309069148038,44.80426916582181]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de Gradignan"},"geometry":{"type":"LineString","coordinates":[[-0.6255814707323305,44.80446636389337],[-0.6255949032852566,44.80448789323362],[-0.6256155342448166,44.80460184989887]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue François Rabelais"},"geometry":{"type":"LineString","coordinates":[[-0.5924389591219411,44.796194159508005],[-0.5923109617560379,44.79619270781825]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Piste Cyclable Thouars"},"geometry":{"type":"LineString","coordinates":[[-0.5924389591219411,44.796194159508005],[-0.5925582154445792,44.795084814159736],[-0.5925434084053987,44.79490809036547],[-0.5925170135340905,44.794780917490456],[-0.592470576961654,44.79465086454193],[-0.5923499605559438,44.794414515873356],[-0.5920778183532163,44.793876133815616],[-0.5920473615655151,44.79385025139916],[-0.5919747227009714,44.793750392727745]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de Thouars"},"geometry":{"type":"LineString","coordinates":[[-0.5923109617560379,44.79619270781825],[-0.5922783509610803,44.796444976952124]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue du Colonel René Fonck"},"geometry":{"type":"LineString","coordinates":[[-0.629585442485553,44.809839194970834],[-0.6298388909331807,44.80976642717627],[-0.6299778274662602,44.809713978744675],[-0.6301179324754076,44.809637890875145],[-0.6301869250232973,44.809594070291]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Roger Marcade"},"geometry":{"type":"LineString","coordinates":[[-0.629585442485553,44.809839194970834],[-0.6293560511976012,44.809064046406846]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue du Colonel René Fonck"},"geometry":{"type":"LineString","coordinates":[[-0.6301869250232973,44.809594070291],[-0.6301881949740376,44.80953988936505],[-0.6300172199596933,44.80892484828186]]}},{"type":"Feature","properties":{"nom":"Avenue de la Mission Haut-Brion"},"geometry":{"type":"LineString","coordinates":[[-0.6058105533287731,44.80886602147036],[-0.6059454930276448,44.80937647603922],[-0.6060900218720519,44.80999364468744],[-0.6063400223491766,44.810836189241876]]}},{"type":"Feature","properties":{"nom":"Avenue de la Mission Haut-Brion"},"geometry":{"type":"LineString","coordinates":[[-0.6058105533287731,44.80886602147036],[-0.6057286659423373,44.80862305200351]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Cours de la Libération"},"geometry":{"type":"LineString","coordinates":[[-0.5912290658125761,44.81024498686175],[-0.5911816076208583,44.81038304934558],[-0.5911565152469914,44.810435278298364]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Cours de la Libération"},"geometry":{"type":"LineString","coordinates":[[-0.5911565152469914,44.810435278298364],[-0.5911347603798242,44.8104415501873],[-0.5911030828954811,44.81045714351977],[-0.5910771330750205,44.81047733036299],[-0.5910582441855303,44.810501167810585],[-0.5910470956051911,44.81052737327255],[-0.5910444930150597,44.810554660169785],[-0.5910504787063213,44.81058167593988],[-0.5910571820878934,44.810593805537806]]}},{"type":"Feature","properties":{"nom":"Cours de la Libération"},"geometry":{"type":"LineString","coordinates":[[-0.5912464814650292,44.810668722841385],[-0.591261564462835,44.810667075587695],[-0.5912972463689521,44.810656850784255],[-0.5913207195900397,44.8106456601919]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Cours de la Libération"},"geometry":{"type":"LineString","coordinates":[[-0.5913207195900397,44.8106456601919],[-0.5913289295122336,44.8106413473032],[-0.5913548793182154,44.81062116040356],[-0.5913738944233753,44.81059731891887],[-0.5913855063098329,44.810568396335654]]}},{"type":"Feature","properties":{"nom":"Cours Gambetta"},"geometry":{"type":"LineString","coordinates":[[-0.5909511668127475,44.812623544396445],[-0.5909411493675063,44.812604943427615],[-0.5909192519016513,44.81258050182881],[-0.590891021962493,44.81256004356215]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Allée du 7eme Art"},"geometry":{"type":"LineString","coordinates":[[-0.5909511668127475,44.812623544396445],[-0.5910638012599737,44.81257485773017],[-0.5912388657746035,44.8125004184211],[-0.5913181665871189,44.81245701767912],[-0.5917119486618941,44.812198391093595],[-0.5917754354442839,44.812134770482885],[-0.5918484956615023,44.812094809335896],[-0.592091543614231,44.81197615372202],[-0.5922883144237633,44.811854094556566],[-0.5924320910993154,44.811736591267085],[-0.5925403396734101,44.81162570483094],[-0.5926239454592466,44.811566132554546],[-0.5927334378641754,44.8114975451563],[-0.5928350152651911,44.81140146238646],[-0.592902132312796,44.81130475640597],[-0.5929916653465276,44.81112915117395],[-0.5930532642854286,44.81102919626336],[-0.5931454559922102,44.81095106570616],[-0.5932376196923449,44.810898879568605],[-0.5933332085698515,44.81086307015932],[-0.5935603093493157,44.81080743181822],[-0.5936800687216522,44.81076959737419],[-0.5938280368006075,44.81070519819918],[-0.5939750321222723,44.810623173474006],[-0.5941450725904092,44.810500784290554],[-0.5943043354637455,44.81037197922775]]}},{"type":"Feature","properties":{"nom":"Cours de la Libération"},"geometry":{"type":"LineString","coordinates":[[-0.590891021962493,44.81256004356215],[-0.5911431977987415,44.8116209964151],[-0.5911505427980376,44.81151545879639],[-0.5911646091488846,44.81141421307799],[-0.5912376563349585,44.811148597543365],[-0.5912955110226233,44.81083616858027],[-0.5913207195900397,44.8106456601919]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Cours Gambetta"},"geometry":{"type":"LineString","coordinates":[[-0.590891021962493,44.81256004356215],[-0.5908567345623567,44.81254392026931],[-0.5908188678605452,44.81253331486465],[-0.5908003747528613,44.81253101600426]]}},{"type":"Feature","properties":{"nom":"Avenue de Brivazac"},"geometry":{"type":"LineString","coordinates":[[-0.6167453060802395,44.80336708893274],[-0.6166797655074852,44.803447815757075],[-0.6166798438931331,44.80350150287981],[-0.6166915313790807,44.80356274816857],[-0.6172260327789955,44.80500699088302],[-0.61722735111803,44.80504009959485],[-0.617199029463869,44.805092888259615]]}},{"type":"Feature","properties":{"nom":"Avenue Marc Desbats"},"geometry":{"type":"LineString","coordinates":[[-0.6167453060802395,44.80336708893274],[-0.6171779755265052,44.80349701217258],[-0.6177762813257962,44.80365923002183]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue du Rond Point"},"geometry":{"type":"LineString","coordinates":[[-0.617199029463869,44.805092888259615],[-0.6161900184432482,44.80532874127065]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Chateaubriand"},"geometry":{"type":"LineString","coordinates":[[-0.6276472320417161,44.80639863800813],[-0.6276292716732798,44.80639292359291],[-0.6276144333966495,44.80638954856195],[-0.6275955226731811,44.80638762585235],[-0.627580310507428,44.80638763521816],[-0.6275641854810309,44.80639030507034],[-0.6275476549826021,44.806394431655576],[-0.6275307443033792,44.806401874677405],[-0.6275170694821108,44.80641102002122],[-0.6275035249587216,44.80642437225543]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Chateaubriand"},"geometry":{"type":"LineString","coordinates":[[-0.6275035249587216,44.80642437225543],[-0.6274975301480122,44.80643487320401],[-0.6274934084498641,44.806446035910135],[-0.6274918741446912,44.80645539389038],[-0.6274934651770765,44.80647099766352],[-0.6274972406471625,44.806481374391794],[-0.6275030802182302,44.80649118592944],[-0.627509315722027,44.806498447789295],[-0.62751662546439,44.806505155452946],[-0.6275241500267995,44.80651068779218],[-0.6275358685874478,44.80651717212261],[-0.6275479303243285,44.80652210000882],[-0.627563540838725,44.80652638192112],[-0.6275920194000862,44.80652960157727]]}},{"type":"Feature","properties":{"nom":"Rue Pierre Curie"},"geometry":{"type":"LineString","coordinates":[[-0.6294283912792256,44.80648281815557],[-0.6298909344003979,44.80713449809973]]}},{"type":"Feature","properties":{"nom":"Avenue Jean Jaurès"},"geometry":{"type":"LineString","coordinates":[[-0.6294283912792256,44.80648281815557],[-0.6295206167811596,44.806458345196894]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Rosa Bonheur"},"geometry":{"type":"LineString","coordinates":[[-0.6298909344003979,44.80713449809973],[-0.6307440648849332,44.806857015563125]]}},{"type":"Feature","properties":{"nom":"Rue Pierre Curie"},"geometry":{"type":"LineString","coordinates":[[-0.6298909344003979,44.80713449809973],[-0.6303581801530276,44.807816474705625]]}},{"type":"Feature","properties":{"nom":"Avenue des Arts"},"geometry":{"type":"LineString","coordinates":[[-0.6093915158581251,44.79630839606761],[-0.609407816146981,44.796312112613],[-0.6094157740806402,44.796313931943324],[-0.6094330193994758,44.79631455567107],[-0.6094402478803415,44.796316848567315],[-0.6094651222442096,44.79631605907007],[-0.6094812810763949,44.79631347428736],[-0.6094968335321709,44.79630928725581],[-0.6095114120679069,44.79630368980656],[-0.6095368093002356,44.79629306465444]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de Villemejan"},"geometry":{"type":"LineString","coordinates":[[-0.6093915158581251,44.79630839606761],[-0.6089633352782533,44.79677248997531],[-0.6086748268046032,44.79707693717378],[-0.6084836211205795,44.79728253800702],[-0.6084264316418591,44.797326961844696],[-0.6083631987544722,44.797375901382935],[-0.6077348722450214,44.798054701993905],[-0.6075668450194411,44.79821632599034]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de la Paillère"},"geometry":{"type":"LineString","coordinates":[[-0.6095368093002356,44.79629306465444],[-0.6095466807126192,44.796278968639925],[-0.6095582185245817,44.79626319823893],[-0.6095648681782163,44.79624614166186],[-0.6095662902799633,44.79622844026168],[-0.6095644165390834,44.79621669886626],[-0.6095572807265902,44.796199719513616],[-0.6095480015968218,44.796184880097506]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Auguste Renoir"},"geometry":{"type":"LineString","coordinates":[[-0.6050567334529893,44.796471117352944],[-0.6044920844667878,44.796098687245035],[-0.6044886120736285,44.79605528735255],[-0.6047473209493885,44.79584863480862],[-0.6047700509299112,44.79581557460453],[-0.6048339085700761,44.795610684071555]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Allée Eugène Delacroix"},"geometry":{"type":"LineString","coordinates":[[-0.6050567334529893,44.796471117352944],[-0.6052886303193759,44.796303058213795],[-0.6054086379978214,44.795921806801715]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de la Paillère"},"geometry":{"type":"LineString","coordinates":[[-0.6048339085700761,44.795610684071555],[-0.6039887601312252,44.7954786555727]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue du Clos du Haut-Carre"},"geometry":{"type":"LineString","coordinates":[[-0.5953333058379465,44.810684745640245],[-0.5953186101308662,44.810735205701064],[-0.5952979737254277,44.81081621119665],[-0.5952878598298705,44.81084274475754],[-0.5952745323810137,44.810868479065086],[-0.5952582383651411,44.81089331622957],[-0.5952388402650163,44.81091708043319],[-0.5952220354169286,44.81094184365469],[-0.5952107623447859,44.81096805351509],[-0.5952051137065719,44.81099516659442],[-0.5952051821639053,44.811022639472654],[-0.5952101706753147,44.81104986676603],[-0.5952544882123809,44.811267365576846],[-0.5952561817644154,44.81129451684607],[-0.595254869181587,44.81137085787207]]}},{"type":"Feature","properties":{"nom":"Rue du Haut Carre"},"geometry":{"type":"LineString","coordinates":[[-0.5953333058379465,44.810684745640245],[-0.5956192017505934,44.81079876111444],[-0.5957016899524444,44.81082479978316]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rond-point Crespy"},"geometry":{"type":"LineString","coordinates":[[-0.5861456236711587,44.80662154869525],[-0.5861717946848317,44.80663862858331],[-0.5861935059276961,44.80666095992945],[-0.5862076905591813,44.80668617698043],[-0.586213624511145,44.80671301440007],[-0.5862110459478397,44.806740111203695],[-0.5862094348735556,44.806745356618016]]}},{"type":"Feature","properties":{"nom":"Rue Peydavant"},"geometry":{"type":"LineString","coordinates":[[-0.5861456236711587,44.80662154869525],[-0.586211031012847,44.80655967750731],[-0.5864038006426242,44.80620662323543],[-0.5864346295520101,44.80611232650015],[-0.5864864687442536,44.80581270157772]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Maréchal Leclerc"},"geometry":{"type":"LineString","coordinates":[[-0.5862094348735556,44.806745356618016],[-0.5863008390895252,44.80675851632417],[-0.5866327237521493,44.80683138086207],[-0.5870359638241108,44.80697301231156],[-0.5875561706922359,44.8071642442764],[-0.5878866023049307,44.80723804824538]]}},{"type":"Feature","properties":{"nom":"Rond-point Crespy"},"geometry":{"type":"LineString","coordinates":[[-0.5862094348735556,44.806745356618016],[-0.586200048323218,44.80676612222467],[-0.5861811951663501,44.80678973251775],[-0.586155438948151,44.80680977701848],[-0.5861240457568794,44.80682526250225]]}},{"type":"Feature","properties":{"nom":"Rue du Parc Haut-Brion"},"geometry":{"type":"LineString","coordinates":[[-0.6112758976534942,44.812906173888436],[-0.6124513569495835,44.8124584335045],[-0.612483879645363,44.812452356036964],[-0.6125095873130819,44.81245667436025],[-0.6125343644315607,44.81246633712406],[-0.6125570029779188,44.812488319078504],[-0.6131783922998356,44.81317699595155]]}},{"type":"Feature","properties":{"nom":"Rue Paul Doumer"},"geometry":{"type":"LineString","coordinates":[[-0.6112758976534942,44.812906173888436],[-0.610887609474551,44.81260077766566]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Pasteur"},"geometry":{"type":"LineString","coordinates":[[-0.6324496511934334,44.80593829283401],[-0.6322783750644018,44.805949257790886],[-0.6319962683258628,44.80598862481973],[-0.6315741973873511,44.806051918242034],[-0.631467218957927,44.806079206126995],[-0.6313232630557205,44.80610605296365]]}},{"type":"Feature","properties":{"nom":"Rue André Pujol"},"geometry":{"type":"LineString","coordinates":[[-0.6324496511934334,44.80593829283401],[-0.6324844789986086,44.80605924437815],[-0.6325908846172884,44.80652085973066],[-0.6325879215274339,44.80659833652428],[-0.6325669597352549,44.80664521908078],[-0.6325405304841869,44.80668164633392],[-0.6324539626388954,44.80672359754805]]}},{"type":"Feature","properties":{"nom":"Rue André Pujol"},"geometry":{"type":"LineString","coordinates":[[-0.6324496511934334,44.80593829283401],[-0.632434424831285,44.80579104134143],[-0.6324194213976093,44.805679455993634],[-0.6323806819730596,44.805534576928295],[-0.6323132574139818,44.80535818369297]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Pasteur"},"geometry":{"type":"LineString","coordinates":[[-0.6313232630557205,44.80610605296365],[-0.6311754385788592,44.80612572631919]]}},{"type":"Feature","properties":{"nom":"Rue de l'Amiral Prouhet"},"geometry":{"type":"LineString","coordinates":[[-0.6288534679758239,44.80246991038936],[-0.6293327530723806,44.80245758969772]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue de l'Amiral Prouhet"},"geometry":{"type":"LineString","coordinates":[[-0.6288534679758239,44.80246991038936],[-0.6283159846498326,44.80246624911388]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Esplanade des Antilles"},"geometry":{"type":"LineString","coordinates":[[-0.6162816263743869,44.79540521177599],[-0.6168956162527585,44.795241569770326]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Esplanade des Antilles"},"geometry":{"type":"LineString","coordinates":[[-0.6168956162527585,44.795241569770326],[-0.6184503784224944,44.79483267624182]]}},{"type":"Feature","properties":{"nom":"Avenue Pierre Wiehn"},"geometry":{"type":"LineString","coordinates":[[-0.6311324422268266,44.79922387400509],[-0.631197549124675,44.79901009777785],[-0.6312081465817138,44.79895336681411],[-0.6312149688728318,44.79887486597169],[-0.6312129438674134,44.79882664559519],[-0.6312049291956946,44.79875564504234],[-0.6311809581239277,44.798672362038296],[-0.6311539946474614,44.79861187574718],[-0.6311424661557034,44.79858954266949],[-0.6311237850518203,44.79856212301061],[-0.6310558402779142,44.79847772165939],[-0.6309194649392065,44.79830722276473],[-0.6308977360020902,44.7982936832358],[-0.6308623117393518,44.79828166195963]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Pierre Wiehn"},"geometry":{"type":"LineString","coordinates":[[-0.6308623117393518,44.79828166195963],[-0.6307665484608452,44.797685210289806]]}},{"type":"Feature","properties":{"nom":"Avenue Pierre Wiehn"},"geometry":{"type":"LineString","coordinates":[[-0.6308623117393518,44.79828166195963],[-0.6308293046047101,44.7983019937443],[-0.6308179239110738,44.798328211198736],[-0.6308126080649018,44.79835630695447]]}},{"type":"Feature","properties":{"nom":"Avenue Pierre Wiehn"},"geometry":{"type":"LineString","coordinates":[[-0.6310068594694284,44.79942967178872],[-0.6310581243917399,44.799395875030235],[-0.6311324422268266,44.79922387400509]]}},{"type":"Feature","properties":{"nom":"Avenue Pierre Wiehn"},"geometry":{"type":"LineString","coordinates":[[-0.6310068594694284,44.79942967178872],[-0.6309711873600478,44.79967890203219]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Raymond Poincaré"},"geometry":{"type":"LineString","coordinates":[[-0.6309711873600478,44.79967890203219],[-0.6270247250366625,44.79947566576465]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue du Pin Vert"},"geometry":{"type":"LineString","coordinates":[[-0.6268000100219724,44.80943708538574],[-0.6268778992087118,44.80961305766512],[-0.6271167540555563,44.81045664227241]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Nancel Pénard"},"geometry":{"type":"LineString","coordinates":[[-0.6268000100219724,44.80943708538574],[-0.6283197798229173,44.80908035095809],[-0.6286497829100846,44.809017575311366]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue du Pin Vert"},"geometry":{"type":"LineString","coordinates":[[-0.6271167540555563,44.81045664227241],[-0.6274574680346562,44.81176640446349]]}},{"type":"Feature","properties":{"nom":"Avenue du Colonel René Fonck"},"geometry":{"type":"LineString","coordinates":[[-0.6271167540555563,44.81045664227241],[-0.6286928870004799,44.81012441088032],[-0.6295164631937994,44.809867159990326]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Colonel Robert Jacqui"},"geometry":{"type":"LineString","coordinates":[[-0.6274574680346562,44.81176640446349],[-0.6277362673801568,44.81171823690237],[-0.6292495941975884,44.81154772038825],[-0.6294347394499498,44.811517580596465],[-0.6295318646408904,44.81149241106393],[-0.6296135522985689,44.81145521238506],[-0.630105762234423,44.8111767311133]]}},{"type":"Feature","properties":{"nom":"Rue du Pin Vert"},"geometry":{"type":"LineString","coordinates":[[-0.6274574680346562,44.81176640446349],[-0.6278458495754775,44.813336609117634]]}},{"type":"Feature","properties":{"nom":"Esplanade Michel Montaigne"},"geometry":{"type":"LineString","coordinates":[[-0.6171929150616469,44.79703612275271],[-0.6178180737614022,44.79822614617144]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Léon Duguit"},"geometry":{"type":"LineString","coordinates":[[-0.6178180737614022,44.79822614617144],[-0.6155228591083164,44.798835583950826]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Bengaline"},"geometry":{"type":"LineString","coordinates":[[-0.6198157907617171,44.80774853275552],[-0.6203579837622806,44.80579151082335]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de Candau"},"geometry":{"type":"LineString","coordinates":[[-0.6198157907617171,44.80774853275552],[-0.6191155935746175,44.80774793270232]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue des Roses"},"geometry":{"type":"LineString","coordinates":[[-0.6203579837622806,44.80579151082335],[-0.6197821167735479,44.805715071577865],[-0.6196479004013254,44.80571168586368]]}},{"type":"Feature","properties":{"nom":"Avenue Roger Cohé"},"geometry":{"type":"LineString","coordinates":[[-0.6324014687974893,44.808087433957105],[-0.6326941613131767,44.808703809879916],[-0.6328764318135781,44.80911814029118]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Faust"},"geometry":{"type":"LineString","coordinates":[[-0.6324014687974893,44.808087433957105],[-0.6336468350273577,44.807851273265534]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Nancel Pénard"},"geometry":{"type":"LineString","coordinates":[[-0.6328764318135781,44.80911814029118],[-0.6337864428814863,44.80910835023672]]}},{"type":"Feature","properties":{"nom":"Avenue Roger Cohé"},"geometry":{"type":"LineString","coordinates":[[-0.6328764318135781,44.80911814029118],[-0.6328727374500808,44.80925428511151],[-0.6329473572416371,44.810243456326134],[-0.6329810111493155,44.810428044560325],[-0.633028961347352,44.8105402891574],[-0.633114214193189,44.81066611608326],[-0.6332377179105999,44.81086071646261],[-0.6334066349679124,44.81109917839348]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Roger Cohé"},"geometry":{"type":"LineString","coordinates":[[-0.6318478280770993,44.80695050696602],[-0.6317965963954754,44.80693070283317],[-0.6317468675861465,44.80689859927188]]}},{"type":"Feature","properties":{"nom":"Avenue Roger Cohé"},"geometry":{"type":"LineString","coordinates":[[-0.6318478280770993,44.80695050696602],[-0.6318344475459178,44.80697111302237],[-0.6318300204253717,44.806993234869886],[-0.6318324084723742,44.807027120272075],[-0.6318451084747093,44.80705797388971],[-0.6319203834717184,44.807210334545076],[-0.6321117556848382,44.80756041567953],[-0.6321402210686764,44.8075884236563]]}},{"type":"Feature","properties":{"nom":"Rue Etienne Marcel"},"geometry":{"type":"LineString","coordinates":[[-0.6318478280770993,44.80695050696602],[-0.6318708487837335,44.806920224357256],[-0.6319028551906827,44.80689397884912],[-0.6319438869450177,44.8068723997569],[-0.6319909504692127,44.806852159469905],[-0.6321219936157869,44.80681716620748]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Roger Cohé"},"geometry":{"type":"LineString","coordinates":[[-0.6321402210686764,44.8075884236563],[-0.6321842848015413,44.807655120050576],[-0.6322250455002194,44.80773165097806],[-0.6322953326742453,44.807865072908555]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Cours Lamartine"},"geometry":{"type":"LineString","coordinates":[[-0.6276631170427468,44.80521949652113],[-0.6277925832853277,44.805231852482606],[-0.6281727174855826,44.80523008675701],[-0.6288757892038233,44.80517225416577],[-0.6292569572675963,44.805162794691796]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Bossuet"},"geometry":{"type":"LineString","coordinates":[[-0.6276631170427468,44.80521949652113],[-0.6273931098724322,44.80459851259172]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Cours Lamartine"},"geometry":{"type":"LineString","coordinates":[[-0.6292569572675963,44.805162794691796],[-0.6294068853773797,44.80514440789779],[-0.6295324341583451,44.80511463755945],[-0.6299514419578577,44.8049585728237]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Cours Lamartine"},"geometry":{"type":"LineString","coordinates":[[-0.6242857966554964,44.80616683431997],[-0.624392730730364,44.806177029491856],[-0.6245481874042036,44.80616802192599],[-0.6255918904816619,44.80607557265362],[-0.6256963685750807,44.806042694812106],[-0.6264257207198175,44.80572872752301]]}},{"type":"Feature","properties":{"nom":"Avenue de Gradignan"},"geometry":{"type":"LineString","coordinates":[[-0.6242857966554964,44.80616683431997],[-0.6239720212718814,44.80653986900685],[-0.6236435928320284,44.806901298311644]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Cours Lamartine"},"geometry":{"type":"LineString","coordinates":[[-0.6264257207198175,44.80572872752301],[-0.6264452093200988,44.80572089964615],[-0.6275234082952711,44.805253499889325],[-0.6276631170427468,44.80521949652113]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Chateaubriand"},"geometry":{"type":"LineString","coordinates":[[-0.6264257207198175,44.80572872752301],[-0.6264898994294626,44.80581445866783],[-0.6265736345610354,44.80590495026556],[-0.6266235932582861,44.80595232858612],[-0.6266806804304974,44.80599557147015],[-0.6267695182097334,44.806053613885474],[-0.6269556598485034,44.80614553903033]]}},{"type":"Feature","properties":{"nom":"Place du Cardinal"},"geometry":{"type":"LineString","coordinates":[[-0.6271324783500616,44.803995137202875],[-0.6270380147878877,44.803983960819586],[-0.6269731200970811,44.80396743227417],[-0.626866419482022,44.80396229516245],[-0.6260456600254464,44.80406568709261]]}},{"type":"Feature","properties":{"nom":"Avenue du Cardinal"},"geometry":{"type":"LineString","coordinates":[[-0.6271324783500616,44.803995137202875],[-0.6270386649190198,44.803331257509726]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Place du Cardinal"},"geometry":{"type":"LineString","coordinates":[[-0.6260456600254464,44.80406568709261],[-0.6256255858329896,44.804118601845786]]}},{"type":"Feature","properties":{"nom":"Place du Cardinal"},"geometry":{"type":"LineString","coordinates":[[-0.6260456600254464,44.80406568709261],[-0.6258774818792617,44.804124254980074],[-0.625843488718329,44.80413950309265],[-0.625806609998064,44.80415991928146],[-0.6257720261608137,44.80418312606181],[-0.6257178324680197,44.80422772977319],[-0.6256920152543619,44.80424470067365],[-0.6256309069148038,44.80426916582181]]}},{"type":"Feature","properties":{"nom":"Place Chambrelent"},"geometry":{"type":"LineString","coordinates":[[-0.6160451960339756,44.80552540298936],[-0.616069999748557,44.80551938959388],[-0.6161007793486125,44.805507781210345],[-0.6161284344207812,44.80549275891181],[-0.6161524880191527,44.80547478828108],[-0.6161722106322893,44.80545434292842],[-0.616186999033138,44.8054318924515],[-0.616196513849846,44.80540807822479],[-0.616200536358187,44.8053834477037],[-0.6161989853973469,44.80535872413398],[-0.6161900184432482,44.80532874127065]]}},{"type":"Feature","properties":{"nom":"Avenue des Echoppes"},"geometry":{"type":"LineString","coordinates":[[-0.6160451960339756,44.80552540298936],[-0.6170217073769195,44.807881198466156]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Place Chambrelent"},"geometry":{"type":"LineString","coordinates":[[-0.6161900184432482,44.80532874127065],[-0.6161794303789566,44.80531124142981],[-0.6161618954250845,44.80528990871011],[-0.6161396857314758,44.80527070644408],[-0.6161136097680673,44.805254419674476],[-0.6160840576653555,44.80524121616066],[-0.6160519472549137,44.80523160721982],[-0.6160181738041459,44.80522574455226],[-0.6159833856512068,44.80522387779543],[-0.6159487193511826,44.80522597081409],[-0.615914663117892,44.80523173783854]]}},{"type":"Feature","properties":{"nom":"Allée Miguel de Cervantes"},"geometry":{"type":"LineString","coordinates":[[-0.61475110339749,44.79739329170675],[-0.6144349318392345,44.7968040173848],[-0.6144513877847124,44.79669719618234],[-0.6141607998750656,44.79618494001125]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Jean Babin"},"geometry":{"type":"LineString","coordinates":[[-0.6141607998750656,44.79618494001125],[-0.6134275723343956,44.79739310400014],[-0.6133825259541782,44.797451557915835],[-0.6132884361869587,44.797530937927014],[-0.61320351519842,44.79757291229289],[-0.6131122312654099,44.79760824243035],[-0.6129888077446444,44.79763342325468],[-0.6128294430135697,44.797650377098066]]}},{"type":"Feature","properties":{"nom":"Rue de la Ramée"},"geometry":{"type":"LineString","coordinates":[[-0.6292460675686923,44.79350349109471],[-0.6303640321588959,44.79343483472454]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Place du Théatre de Verdure"},"geometry":{"type":"LineString","coordinates":[[-0.6303640321588959,44.79343483472454],[-0.6302316808832789,44.792369582384545],[-0.6302505337432102,44.79224304303161],[-0.6302012372237766,44.79214525411156],[-0.630181560447226,44.792005531352444]]}},{"type":"Feature","properties":{"nom":"Rue de la Ramée"},"geometry":{"type":"LineString","coordinates":[[-0.6303640321588959,44.79343483472454],[-0.6304017045255174,44.79375586260076]]}},{"type":"Feature","properties":{"nom":"Rue de la Ramée"},"geometry":{"type":"LineString","coordinates":[[-0.6303640321588959,44.79343483472454],[-0.6308029509226473,44.79340748890225]]}},{"type":"Feature","properties":{"nom":"Rue de la Ramée"},"geometry":{"type":"LineString","coordinates":[[-0.6284124019636882,44.793554507407194],[-0.6292460675686923,44.79350349109471]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Allée des Glycines"},"geometry":{"type":"LineString","coordinates":[[-0.6284124019636882,44.793554507407194],[-0.6282294451853828,44.79213080313704]]}},{"type":"Feature","properties":{"nom":"Rue Léo Valentin"},"geometry":{"type":"LineString","coordinates":[[-0.6070114019224195,44.80985200795313],[-0.6067216609943213,44.810010552473784]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue du Colonel Rozanoff"},"geometry":{"type":"LineString","coordinates":[[-0.6070114019224195,44.80985200795313],[-0.6068910981952097,44.80969493507652],[-0.6067962175351043,44.80952147165574],[-0.6067367308739857,44.809327157783876]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Pey Berland"},"geometry":{"type":"LineString","coordinates":[[-0.6095170708821552,44.80091872951914],[-0.6095317575320273,44.80091484025157],[-0.6095570980646322,44.800905297959275],[-0.6095798648460617,44.80089304477661],[-0.6095995640297538,44.80087827654376],[-0.6096158449338255,44.800861454807595],[-0.6096279724225,44.80084296323347],[-0.60963791548459,44.800817874852086]]}},{"type":"Feature","properties":{"nom":"Rue Robert Escarpit"},"geometry":{"type":"LineString","coordinates":[[-0.6095170708821552,44.80091872951914],[-0.609645861768104,44.80123173384342],[-0.6098627747233983,44.801652743087374],[-0.6100256344382521,44.80197025086304],[-0.6102145576305503,44.80231800974073],[-0.6102746480075385,44.802519869898916],[-0.6102833204074737,44.80270885886091],[-0.6102606287240187,44.80287587226174],[-0.6101937762554739,44.803418672063685],[-0.6101889075141375,44.80350458555031]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Pey Berland"},"geometry":{"type":"LineString","coordinates":[[-0.60963791548459,44.800817874852086],[-0.6096391446131232,44.80080315232458],[-0.6096378667872699,44.80078274405728],[-0.6096320655610014,44.80076283968727],[-0.6096217634550005,44.80074379883161],[-0.6096073730735705,44.800726148890426],[-0.6095891807458483,44.800710421274296],[-0.6095588933797128,44.80069147420939]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue de Peybouquey"},"geometry":{"type":"LineString","coordinates":[[-0.6082347158446524,44.80920497076243],[-0.608323235867677,44.80983473148223]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Marc Sangnier"},"geometry":{"type":"LineString","coordinates":[[-0.6082347158446524,44.80920497076243],[-0.6079744244836235,44.8092536744586],[-0.6075898372026082,44.809273619724856]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue de Peybouquey"},"geometry":{"type":"LineString","coordinates":[[-0.608323235867677,44.80983473148223],[-0.6082974034579984,44.8099233740803]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue de Peybouquey"},"geometry":{"type":"LineString","coordinates":[[-0.6082974034579984,44.8099233740803],[-0.6082220039483905,44.80995405184058],[-0.6075713543030989,44.810276376273286],[-0.6073338044080702,44.81047218280503],[-0.6071209203217991,44.81072648102644],[-0.6070065521135677,44.81079775978465]]}},{"type":"Feature","properties":{"nom":"Rue du Professeur Esclangon"},"geometry":{"type":"LineString","coordinates":[[-0.6082974034579984,44.8099233740803],[-0.6083296572291402,44.80994334021627],[-0.6083542670853637,44.809970575280886],[-0.6085033352425838,44.81021510544721],[-0.6085478765069215,44.810251437121984],[-0.6086281463910928,44.810274293978075],[-0.6087086123223199,44.81027804701107],[-0.6096690928376816,44.810170730948805],[-0.609762277969697,44.810129038191626],[-0.6098173368340993,44.810094861093866],[-0.609868930302305,44.810035660831055],[-0.6098806053932724,44.80997556539293],[-0.6096602097524809,44.80926099606958]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Esplanade des Antilles"},"geometry":{"type":"LineString","coordinates":[[-0.6168116988168031,44.79508163835017],[-0.6168956162527585,44.795241569770326]]}},{"type":"Feature","properties":{"nom":"Esplanade des Antilles"},"geometry":{"type":"LineString","coordinates":[[-0.6168116988168031,44.79508163835017],[-0.6183588167645683,44.79466389064747]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Esplanade des Antilles"},"geometry":{"type":"LineString","coordinates":[[-0.6183588167645683,44.79466389064747],[-0.6195693809825837,44.79434475553062]]}},{"type":"Feature","properties":{"nom":"Esplanade des Antilles"},"geometry":{"type":"LineString","coordinates":[[-0.6183588167645683,44.79466389064747],[-0.6184503784224944,44.79483267624182]]}},{"type":"Feature","properties":{"nom":"Esplanade des Antilles"},"geometry":{"type":"LineString","coordinates":[[-0.6162000239246755,44.79524135064804],[-0.6162816263743869,44.79540521177599]]}},{"type":"Feature","properties":{"nom":"Esplanade des Antilles"},"geometry":{"type":"LineString","coordinates":[[-0.6162000239246755,44.79524135064804],[-0.6168116988168031,44.79508163835017]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Camille Jullian"},"geometry":{"type":"LineString","coordinates":[[-0.6162000239246755,44.79524135064804],[-0.6156559924187647,44.79421016985492]]}},{"type":"Feature","properties":{"nom":"Avenue Marc Desbats"},"geometry":{"type":"LineString","coordinates":[[-0.6198124150619269,44.80396081435652],[-0.620246204442297,44.803864581263305],[-0.6203792673335272,44.80384160840961],[-0.620543049862054,44.803824233598675],[-0.6206963139697018,44.80382070591095],[-0.6208521062902216,44.80383124063021],[-0.621023654175631,44.80385892988657],[-0.6217801419272814,44.8040674385863],[-0.622785430389558,44.80418577153616],[-0.6234301620012386,44.80417829556763]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue du Jasmin"},"geometry":{"type":"LineString","coordinates":[[-0.6198124150619269,44.80396081435652],[-0.6197940289716289,44.804594956016665]]}},{"type":"Feature","properties":{"nom":"Avenue Marc Desbats"},"geometry":{"type":"LineString","coordinates":[[-0.6234301620012386,44.80417829556763],[-0.624980290765997,44.804237624535524],[-0.6251384912586874,44.80424626573726],[-0.6252798683845749,44.80426933817362],[-0.6254961069676005,44.80434026530025]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Pierre Corneille"},"geometry":{"type":"LineString","coordinates":[[-0.6234301620012386,44.80417829556763],[-0.6237420017448931,44.80334184354475]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue du Maréchal Juin"},"geometry":{"type":"LineString","coordinates":[[-0.6278541662325295,44.793963642612205],[-0.6278533162913976,44.79391394341432]]}},{"type":"Feature","properties":{"nom":"Avenue du Maréchal Juin"},"geometry":{"type":"LineString","coordinates":[[-0.6278541662325295,44.793963642612205],[-0.6278565756756521,44.794040137058424]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue du Maréchal Lyautey"},"geometry":{"type":"LineString","coordinates":[[-0.6309071398690205,44.7941820380093],[-0.6310078893751916,44.79423899723361],[-0.6310697521341039,44.79424900309802],[-0.6312603473250071,44.79427615808597],[-0.6313290519388837,44.79427828818823],[-0.6313657294546688,44.7942580191304],[-0.6314170497640901,44.79416692679618]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rond-point de la Médaille Militaire"},"geometry":{"type":"LineString","coordinates":[[-0.6309071398690205,44.7941820380093],[-0.6310172467659032,44.794148524309634],[-0.6310433213428046,44.794138683327134],[-0.6310669363967286,44.79412594809952],[-0.6310904512217805,44.79410961270501]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue du Maréchal Lyautey"},"geometry":{"type":"LineString","coordinates":[[-0.6314170497640901,44.79416692679618],[-0.6317063869638696,44.794168947249176],[-0.6320306161316701,44.79417859070338],[-0.6324882849617394,44.79416964742149]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue du Général André"},"geometry":{"type":"LineString","coordinates":[[-0.5984066689433065,44.80404866973753],[-0.5983820722771941,44.80357759664346],[-0.5979900250654584,44.80311454502185]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Jules Guesde"},"geometry":{"type":"LineString","coordinates":[[-0.5984066689433065,44.80404866973753],[-0.5997391280946534,44.803545193767775],[-0.5997742485059586,44.80353822685002],[-0.5998136485780937,44.80353697982322],[-0.5998485137892398,44.8035401101894],[-0.5998836905566615,44.80354620340311]]}},{"type":"Feature","properties":{"nom":"Rue du Général Chanzy"},"geometry":{"type":"LineString","coordinates":[[-0.5859945919392777,44.80275327348517],[-0.5860531752910388,44.802720462658044],[-0.5860922950989269,44.80269688063008],[-0.5861217296874395,44.80264787986385],[-0.5862241014385443,44.80232760458696]]}},{"type":"Feature","properties":{"nom":"Rue Peydavant"},"geometry":{"type":"LineString","coordinates":[[-0.5859945919392777,44.80275327348517],[-0.5857791225853631,44.80255170517815],[-0.5857474342805559,44.80251622112827],[-0.5857175619396152,44.80247941867424],[-0.585631840212864,44.8023319549606],[-0.5853664302049465,44.80193801712926]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue de Tremeuge"},"geometry":{"type":"LineString","coordinates":[[-0.5862241014385443,44.80232760458696],[-0.5857400198724079,44.802234706479176]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue du Général Sarrail"},"geometry":{"type":"LineString","coordinates":[[-0.5892437059848279,44.799063900248946],[-0.5883960860467061,44.79893904008061]]}},{"type":"Feature","properties":{"nom":"Rue du Maréchal Foch"},"geometry":{"type":"LineString","coordinates":[[-0.5892437059848279,44.799063900248946],[-0.5895145995675709,44.798263440100435]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue du Général Sarrail"},"geometry":{"type":"LineString","coordinates":[[-0.5883960860467061,44.79893904008061],[-0.5880565579603034,44.798887055557884],[-0.587860065877693,44.79886460859568]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Allée Serpentine"},"geometry":{"type":"LineString","coordinates":[[-0.6275361969122202,44.79722248075931],[-0.6273012065458757,44.79771850090848],[-0.6270944091415902,44.798047326511444],[-0.6269131893382579,44.79829606218226],[-0.6267074536947084,44.79849098854267],[-0.6263481581518827,44.798742879546126],[-0.625708373280292,44.799153971622026],[-0.6254359480854346,44.79930255649085],[-0.6252628069394983,44.79941635645798]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Raymond Poincaré"},"geometry":{"type":"LineString","coordinates":[[-0.6252628069394983,44.79941635645798],[-0.6243497290246917,44.79999677088432]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Parking Eglise Notre Dame"},"geometry":{"type":"LineString","coordinates":[[-0.5911660667008316,44.8129569095402],[-0.5912914430355238,44.81289538911248],[-0.5913689948605365,44.81288077969289],[-0.5921025824436333,44.81289446071338]]}},{"type":"Feature","properties":{"nom":"Rue Camille Pelletan"},"geometry":{"type":"LineString","coordinates":[[-0.5911660667008316,44.8129569095402],[-0.591061768215042,44.81287534498284],[-0.5909861552343875,44.81283170009456],[-0.5908991722573637,44.81276805557285]]}},{"type":"Feature","properties":{"nom":"Rue Camille Pelletan"},"geometry":{"type":"LineString","coordinates":[[-0.5911660667008316,44.8129569095402],[-0.5912935129941872,44.81307891065408],[-0.5914545851507416,44.813240927366664],[-0.5916959773634577,44.813485535309894],[-0.5917562264759109,44.813560833208086],[-0.5918219889374632,44.813653522968245],[-0.591936730460309,44.81381123670087],[-0.5919798225307895,44.81388536468162]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Parking Eglise Notre Dame"},"geometry":{"type":"LineString","coordinates":[[-0.5921025824436333,44.81289446071338],[-0.5921067490056824,44.81264047826045]]}},{"type":"Feature","properties":{"nom":"Parking Eglise Notre Dame"},"geometry":{"type":"LineString","coordinates":[[-0.5921025824436333,44.81289446071338],[-0.5920974094795683,44.81304091711586]]}},{"type":"Feature","properties":{"nom":"Impasse des Acacias"},"geometry":{"type":"LineString","coordinates":[[-0.581117210519938,44.79888183393539],[-0.5811369777359245,44.79890472277522],[-0.5811497561818502,44.798933236572225],[-0.5811524997704511,44.79896314733159],[-0.5811476582560566,44.79898500943584]]}},{"type":"Feature","properties":{"nom":"Impasse Primevères"},"geometry":{"type":"LineString","coordinates":[[-0.581117210519938,44.79888183393539],[-0.5811542306378672,44.7988545445758],[-0.5813370818998064,44.79869411663818],[-0.5813616910905933,44.798674784880426],[-0.5813901576516096,44.79865848449798],[-0.5814225430180948,44.79864620445074],[-0.5815242089175237,44.79861678908058],[-0.5815915360821149,44.79860079621852],[-0.5816715327550772,44.79859323230218]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Impasse des Acacias"},"geometry":{"type":"LineString","coordinates":[[-0.5811476582560566,44.79898500943584],[-0.5811458600226866,44.79899272299039],[-0.5811303789384671,44.7990205051733],[-0.5811081752372063,44.799045976754684],[-0.5810804613885764,44.79906828881808],[-0.581047582708136,44.79908688999771],[-0.5810113237821022,44.799101994341925],[-0.5808605655680199,44.79915583565918],[-0.5808249881772474,44.7991717292149],[-0.5808042810274717,44.79918463227966]]}},{"type":"Feature","properties":{"nom":"Passage du Muguet"},"geometry":{"type":"LineString","coordinates":[[-0.5811476582560566,44.79898500943584],[-0.5812039803335847,44.798997558877595],[-0.5812381930856463,44.79902080355666],[-0.5812579836811633,44.79905017751328],[-0.581399142937162,44.799271566811626]]}},{"type":"Feature","properties":{"nom":"Rue Robespierre"},"geometry":{"type":"LineString","coordinates":[[-0.5814737141394966,44.8081419763692],[-0.580958284944962,44.80802947790924]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue René Vache"},"geometry":{"type":"LineString","coordinates":[[-0.580958284944962,44.80802947790924],[-0.5828735045100534,44.80483162648224]]}},{"type":"Feature","properties":{"nom":"Rue Robespierre"},"geometry":{"type":"LineString","coordinates":[[-0.580958284944962,44.80802947790924],[-0.5803759554584518,44.80790331877033],[-0.5802005205473478,44.80789028403128],[-0.5800638644317188,44.807898548845024],[-0.5798826958981265,44.80791136727445]]}},{"type":"Feature","properties":{"nom":"Rue Ronsard"},"geometry":{"type":"LineString","coordinates":[[-0.6004554726115798,44.79519916794754],[-0.6001321486882959,44.79540452289199],[-0.5997934074083904,44.79563856069324],[-0.5996686147130225,44.79577556272885],[-0.5991991647159907,44.79643090777138],[-0.598876699509152,44.79680828903164],[-0.5986010282207422,44.79711248291793]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Ronsard"},"geometry":{"type":"LineString","coordinates":[[-0.6004554726115798,44.79519916794754],[-0.6025536281227533,44.79596940673287]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue François Rabelais"},"geometry":{"type":"LineString","coordinates":[[-0.5986010282207422,44.79711248291793],[-0.5983648820431158,44.79700807279177],[-0.5980172370582716,44.796870616446455],[-0.5978580732608683,44.79681376542394]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Résidence Parc de Suzon"},"geometry":{"type":"LineString","coordinates":[[-0.5826588270171792,44.81231056002393],[-0.5836514704914351,44.81236324867341]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Résidence Parc de Suzon"},"geometry":{"type":"LineString","coordinates":[[-0.5836514704914351,44.81236324867341],[-0.5836397916982583,44.81212859390735]]}},{"type":"Feature","properties":{"nom":"Résidence Parc de Suzon"},"geometry":{"type":"LineString","coordinates":[[-0.5836514704914351,44.81236324867341],[-0.5841520718199863,44.81235053970521]]}},{"type":"Feature","properties":{"nom":"Résidence Verlaine 1"},"geometry":{"type":"LineString","coordinates":[[-0.5850304000323213,44.80045316333416],[-0.5859920373070406,44.80070218999017]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Résidence Verlaine 1"},"geometry":{"type":"LineString","coordinates":[[-0.5859920373070406,44.80070218999017],[-0.58600702822517,44.8007377500221]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de Saige"},"geometry":{"type":"LineString","coordinates":[[-0.630737406271222,44.797443454373465],[-0.6306944067410274,44.79700575772121]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Allée du Lartigon"},"geometry":{"type":"LineString","coordinates":[[-0.6306944067410274,44.79700575772121],[-0.6275361969122202,44.79722248075931]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de Saige"},"geometry":{"type":"LineString","coordinates":[[-0.6306944067410274,44.79700575772121],[-0.630562884029604,44.795967954910736]]}},{"type":"Feature","properties":{"nom":"Avenue de la Mission Haut Brion"},"geometry":{"type":"LineString","coordinates":[[-0.6056351334495721,44.808011833433156],[-0.6056463152119752,44.808348388088305],[-0.6057286659423373,44.80862305200351]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de l'Université"},"geometry":{"type":"LineString","coordinates":[[-0.6056351334495721,44.808011833433156],[-0.6056484221922663,44.80801186260178],[-0.6056943918746774,44.808006351660836],[-0.6057385254918778,44.80799576419383],[-0.6057798183241224,44.80798022213372],[-0.605816903650209,44.80796012914219],[-0.6058490630866555,44.80793613857532],[-0.605875440713265,44.80790872798282],[-0.605895197485296,44.80787864463115],[-0.6059080051522441,44.80784670967325],[-0.6059134091792239,44.80781374826475],[-0.6059113338997423,44.807780573551135],[-0.6059018355706497,44.80774808457477],[-0.6058850911107415,44.80771708647018],[-0.6058526999066345,44.807680729014336]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Résidence Crespy I"},"geometry":{"type":"LineString","coordinates":[[-0.5890841607714429,44.8035065501129],[-0.5892726378677615,44.80354429207371]]}},{"type":"Feature","properties":{"nom":"Rue de Megret"},"geometry":{"type":"LineString","coordinates":[[-0.5890841607714429,44.8035065501129],[-0.5893277101316055,44.80291684525887]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Résidence Crespy I"},"geometry":{"type":"LineString","coordinates":[[-0.5892726378677615,44.80354429207371],[-0.5891628548496484,44.80378890572265]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Résidence Crespy I"},"geometry":{"type":"LineString","coordinates":[[-0.5900930684965086,44.803064835654624],[-0.5900259725883658,44.80322072338686]]}},{"type":"Feature","properties":{"nom":"Rue de Tremeuge"},"geometry":{"type":"LineString","coordinates":[[-0.5900930684965086,44.803064835654624],[-0.5893277101316055,44.80291684525887]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Résidence Crespy I"},"geometry":{"type":"LineString","coordinates":[[-0.5900259725883658,44.80322072338686],[-0.5897358420657041,44.803165922689146],[-0.5896731806453948,44.803293474578275]]}},{"type":"Feature","properties":{"nom":"Esplanade du 8 Mai 1945"},"geometry":{"type":"LineString","coordinates":[[-0.587919333101578,44.80914837087973],[-0.5879675058130456,44.80912739370993],[-0.5880277677468514,44.80911360204873],[-0.5881119945963691,44.80910058578673],[-0.5881813991590213,44.809077137138075],[-0.58825704862797,44.80903610566122],[-0.5883272668548667,44.808966779621706]]}},{"type":"Feature","properties":{"nom":"Esplanade du 8 Mai 1945"},"geometry":{"type":"LineString","coordinates":[[-0.587919333101578,44.80914837087973],[-0.58832341738245,44.80933182236562]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Esplanade du 8 Mai 1945"},"geometry":{"type":"LineString","coordinates":[[-0.5883272668548667,44.808966779621706],[-0.5881797231688719,44.80891198002606]]}},{"type":"Feature","properties":{"nom":"Résidence les Harmonies"},"geometry":{"type":"LineString","coordinates":[[-0.5861690395503226,44.81189917006904],[-0.5849977758770828,44.81191870329469]]}},{"type":"Feature","properties":{"nom":"Rue Lamartine"},"geometry":{"type":"LineString","coordinates":[[-0.5861690395503226,44.81189917006904],[-0.5861560852156734,44.811444846293305],[-0.5861018004954792,44.81086318887048]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Résidence les Harmonies"},"geometry":{"type":"LineString","coordinates":[[-0.5849977758770828,44.81191870329469],[-0.5849811595799879,44.81157016079619],[-0.5849510853904242,44.811444724121614],[-0.5849649862050694,44.81122466710213],[-0.5849296460572688,44.81107966851421],[-0.5849697393399184,44.81090229542672]]}},{"type":"Feature","properties":{"nom":"Résidence les Harmonies"},"geometry":{"type":"LineString","coordinates":[[-0.5849977758770828,44.81191870329469],[-0.5848672651510415,44.812093070520305],[-0.5839582489704639,44.81213360458728],[-0.5838699504622034,44.81207918473009],[-0.5838432510798445,44.81184923701481],[-0.5837501989804931,44.8117610961888],[-0.5835592499224659,44.81173891628214],[-0.5835362690043505,44.811271576651585],[-0.5836686558235081,44.811229121345086],[-0.5840751607237636,44.81129072138431],[-0.5841564041322677,44.811282576505334],[-0.5842346781187469,44.81124092470989],[-0.5843666952442133,44.81101345268009],[-0.5844569755138566,44.81094917224136],[-0.5845266756419456,44.81081239400367]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Passage Inférieur du Centre"},"geometry":{"type":"LineString","coordinates":[[-0.6315243641467698,44.80392518549436],[-0.6315705860256372,44.80400811833426],[-0.631639502590326,44.804105820957325],[-0.6317636074982431,44.80426608128143],[-0.6320456722632278,44.80478649787301],[-0.6322151558794488,44.80515079027539]]}},{"type":"Feature","properties":{"nom":"Avenue Roger Chaumet"},"geometry":{"type":"LineString","coordinates":[[-0.6315243641467698,44.80392518549436],[-0.6315340391954343,44.80387388904114],[-0.6316085245585873,44.80376674305387]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue des Poilus"},"geometry":{"type":"LineString","coordinates":[[-0.6322151558794488,44.80515079027539],[-0.6318972150442006,44.80522787563589]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Résidence Pacaris"},"geometry":{"type":"LineString","coordinates":[[-0.5817347652098784,44.80154978936739],[-0.5819966268097939,44.80132705822135],[-0.5820486414210113,44.80131911430711],[-0.5823120971842611,44.801480439965296]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Michel Montaigne"},"geometry":{"type":"LineString","coordinates":[[-0.5817347652098784,44.80154978936739],[-0.5813093901470782,44.80146841891647]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue du Professeur Jeanneney"},"geometry":{"type":"LineString","coordinates":[[-0.5823120971842611,44.801480439965296],[-0.5834060449157008,44.80059704873425],[-0.5834441836997187,44.80057350681739],[-0.5834936025775972,44.800562491143026],[-0.5835423164432371,44.80056455949858],[-0.5835794510121128,44.80058185615917],[-0.5838946256883838,44.80088108504668],[-0.5839187422932206,44.800933203016335]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Michel Montaigne"},"geometry":{"type":"LineString","coordinates":[[-0.581996432624606,44.80159884038343],[-0.5817347652098784,44.80154978936739]]}},{"type":"Feature","properties":{"nom":"Résidence Pacaris"},"geometry":{"type":"LineString","coordinates":[[-0.581996432624606,44.80159884038343],[-0.5819514807793132,44.801655295946674],[-0.5816992778520566,44.801854301558414],[-0.5816513165908256,44.80188472811434],[-0.581610994422657,44.801875188131],[-0.5812774436243036,44.80167517105108],[-0.5812554181841285,44.80164649802068],[-0.581272358004822,44.80154849641453],[-0.5813093901470782,44.80146841891647]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Michel Montaigne"},"geometry":{"type":"LineString","coordinates":[[-0.5813093901470782,44.80146841891647],[-0.5809830269145462,44.80141257539398]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Antoine Carles"},"geometry":{"type":"LineString","coordinates":[[-0.5836002037568148,44.80364523865101],[-0.5826711868171895,44.80315617672418]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Lafontaine"},"geometry":{"type":"LineString","coordinates":[[-0.5836002037568148,44.80364523865101],[-0.5828735045100534,44.80483162648224]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Blumerel"},"geometry":{"type":"LineString","coordinates":[[-0.5826711868171895,44.80315617672418],[-0.5825067725348939,44.803310080280106]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue du Relais"},"geometry":{"type":"LineString","coordinates":[[-0.6067089864241451,44.79436691118033],[-0.6069622169139407,44.794299424675565],[-0.6069871808747022,44.79426368070168],[-0.6068891777483558,44.79407428213781],[-0.6068156243160784,44.79400067523964]]}},{"type":"Feature","properties":{"nom":"Rue du Relais"},"geometry":{"type":"LineString","coordinates":[[-0.6067089864241451,44.79436691118033],[-0.6061315950818825,44.79452485079389],[-0.6061092063287035,44.79456132364093],[-0.6063805818624042,44.79507717995475],[-0.6064285442523097,44.79511178212509],[-0.6065960838034486,44.79514268204756]]}},{"type":"Feature","properties":{"nom":"Rue du Relais"},"geometry":{"type":"LineString","coordinates":[[-0.6068156243160784,44.79400067523964],[-0.6067089864241451,44.79436691118033]]}},{"type":"Feature","properties":{"nom":"Avenue Georges Clémenceau"},"geometry":{"type":"LineString","coordinates":[[-0.5923260252980941,44.80541946553582],[-0.5925213926379727,44.80542343703885],[-0.5925915620587203,44.80540626707868],[-0.5945591266873305,44.804573269848255]]}},{"type":"Feature","properties":{"nom":"Cours de la Libération"},"geometry":{"type":"LineString","coordinates":[[-0.5923260252980941,44.80541946553582],[-0.5923897774172039,44.80526679765398],[-0.5927545423625904,44.80435463593653]]}},{"type":"Feature","properties":{"nom":"Avenue Georges Lasserre"},"geometry":{"type":"LineString","coordinates":[[-0.5923260252980941,44.80541946553582],[-0.5922567476898352,44.805410420472995]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Georges Clémenceau"},"geometry":{"type":"LineString","coordinates":[[-0.5945591266873305,44.804573269848255],[-0.5956951221808845,44.80408803249884]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Georges Clémenceau"},"geometry":{"type":"LineString","coordinates":[[-0.5979900250654584,44.80311454502185],[-0.5990658311729893,44.80265108440509],[-0.5991426121969289,44.802606135801256]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de l'Université"},"geometry":{"type":"LineString","coordinates":[[-0.5991426121969289,44.802606135801256],[-0.5995421972143224,44.802855449810416],[-0.5998764053370857,44.8030911574618],[-0.5999606482400087,44.80319001391978],[-0.6000794837444764,44.80339299164127],[-0.6004314517284105,44.80409530318383],[-0.6004092627113612,44.80421004994941]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue du Haut Carre"},"geometry":{"type":"LineString","coordinates":[[-0.5957016899524444,44.81082479978316],[-0.5958060278811761,44.81085014770082],[-0.5959376042354896,44.81087598569019],[-0.5968088279811378,44.81102716396431],[-0.5968638291658955,44.81104263051395],[-0.5969074745628412,44.81106268998081],[-0.5969620455177489,44.8111057352392],[-0.5969860945557242,44.811140286994984],[-0.597010833216417,44.811202111843194],[-0.5972166531379761,44.811713936264894]]}},{"type":"Feature","properties":{"nom":"Impasse des Mésanges"},"geometry":{"type":"LineString","coordinates":[[-0.5829114531768446,44.796488604084416],[-0.5828224141858932,44.796421866246604]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Impasse des Mésanges"},"geometry":{"type":"LineString","coordinates":[[-0.5829114531768446,44.796488604084416],[-0.5828373192713951,44.7965436374562]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Impasse des Mésanges"},"geometry":{"type":"LineString","coordinates":[[-0.5836766845477668,44.79691508101888],[-0.5834433321419371,44.79684496396522],[-0.5833646630283282,44.796808707691135],[-0.5829114531768446,44.796488604084416]]}},{"type":"Feature","properties":{"nom":"Chemin Bénédigues"},"geometry":{"type":"LineString","coordinates":[[-0.5836766845477668,44.79691508101888],[-0.5837427845097533,44.796753193138706],[-0.5837611277281213,44.79672874344472],[-0.5837972155731294,44.79670481553668],[-0.5838394896553647,44.796694925573334],[-0.5838847328635979,44.79669413035713],[-0.5847198183399579,44.79681752619857],[-0.5847798261838104,44.796818156943374],[-0.5848285086423236,44.796809595995924]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Michel Montaigne"},"geometry":{"type":"LineString","coordinates":[[-0.5839626726056485,44.80214458791417],[-0.5838073745205168,44.80200336910829],[-0.5837484089939643,44.80196667218367],[-0.5836775655209633,44.80193836676357],[-0.5835883601740453,44.80191388279703],[-0.582923523265462,44.8017866446877]]}},{"type":"Feature","properties":{"nom":"Rue Blumerel"},"geometry":{"type":"LineString","coordinates":[[-0.5839626726056485,44.80214458791417],[-0.5838428615218176,44.80220988906455],[-0.583779240354156,44.80225909656631]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Michel Montaigne"},"geometry":{"type":"LineString","coordinates":[[-0.582923523265462,44.8017866446877],[-0.5824356880312024,44.80168364462371]]}},{"type":"Feature","properties":{"nom":"Rue Léon Blum"},"geometry":{"type":"LineString","coordinates":[[-0.582923523265462,44.8017866446877],[-0.5838852843041873,44.80099947645523],[-0.5839187422932206,44.800933203016335]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Michel Montaigne"},"geometry":{"type":"LineString","coordinates":[[-0.5824356880312024,44.80168364462371],[-0.5821407023838101,44.80162375322326]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Marly"},"geometry":{"type":"LineString","coordinates":[[-0.5981196130069676,44.79920231276052],[-0.5980014255585253,44.799118942266496],[-0.5964093157695478,44.798490890947136]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Cours de la Libération"},"geometry":{"type":"LineString","coordinates":[[-0.5981196130069676,44.79920231276052],[-0.597256936689572,44.79972064159159],[-0.5967529805243248,44.800022591958026],[-0.5966733187427891,44.80008015155433],[-0.5966113719988965,44.80013165584795],[-0.5965555336345896,44.80019386689131],[-0.59644967915179,44.800320356824194]]}},{"type":"Feature","properties":{"nom":"Cours de la Libération"},"geometry":{"type":"LineString","coordinates":[[-0.5981196130069676,44.79920231276052],[-0.5981996355267528,44.79928031462285]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Marly"},"geometry":{"type":"LineString","coordinates":[[-0.5964093157695478,44.798490890947136],[-0.595370898235511,44.79809223046674]]}},{"type":"Feature","properties":{"nom":"Allée des Peupliers"},"geometry":{"type":"LineString","coordinates":[[-0.5964093157695478,44.798490890947136],[-0.5934654355815312,44.80036847519943],[-0.5933378311746387,44.800416106713314]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Place du 1er Mai"},"geometry":{"type":"LineString","coordinates":[[-0.595370898235511,44.79809223046674],[-0.5953040466994333,44.79806506719086],[-0.5952728247133372,44.79805740633734],[-0.5952346629585121,44.798058162349264]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Montesquieu"},"geometry":{"type":"LineString","coordinates":[[-0.5855319951303288,44.80322276786811],[-0.5854588170026435,44.80317120592257],[-0.5853775015213957,44.80310476672781],[-0.5852609005493866,44.80300196579246],[-0.5851539687440491,44.80289390546677],[-0.5850293573638515,44.80274163172824],[-0.5849728585554742,44.802663239901385],[-0.5849224302725724,44.80258276499253],[-0.5848810808779509,44.80249975185944],[-0.5848662743403445,44.80245697934697],[-0.5848564855151995,44.802413508187605],[-0.5848526095385463,44.80236949033107],[-0.5848554432137658,44.80232553123434],[-0.5848641193352211,44.80228192847666],[-0.5848780232605109,44.80223897167391],[-0.5848965403459194,44.802196950441534],[-0.5849194292064982,44.802156052550295],[-0.5849821415010599,44.80208259314067]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Condorcet"},"geometry":{"type":"LineString","coordinates":[[-0.5855319951303288,44.80322276786811],[-0.5855008242930735,44.80324239743687],[-0.5854334023476077,44.803285419965626],[-0.5854024122569524,44.80329981906845],[-0.5853685241823788,44.803310345922064],[-0.5853324343180979,44.80331598767871],[-0.585221360409289,44.803324443518036],[-0.5851842444408011,44.803325793651375],[-0.5851471317467515,44.80332516187252],[-0.5851102525296307,44.80332218059734],[-0.5850738593605325,44.80331684186658],[-0.585038331092779,44.803309133738566],[-0.5849699810954359,44.80328840740146],[-0.5841008354229333,44.802985019746664],[-0.5840053833237241,44.80295370653722]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Montesquieu"},"geometry":{"type":"LineString","coordinates":[[-0.5849821415010599,44.80208259314067],[-0.5850189161934375,44.80204472854534],[-0.5850568615214399,44.80200993198804],[-0.585098889213611,44.80197770918335],[-0.5851729305762308,44.80191907417385]]}},{"type":"Feature","properties":{"nom":"Place Peydavant"},"geometry":{"type":"LineString","coordinates":[[-0.5849821415010599,44.80208259314067],[-0.5852927989512563,44.80214642503167]]}},{"type":"Feature","properties":{"nom":"Place Peydavant"},"geometry":{"type":"LineString","coordinates":[[-0.5849821415010599,44.80208259314067],[-0.5845809853481179,44.80199815396006]]}},{"type":"Feature","properties":{"nom":"Rue Peydavant"},"geometry":{"type":"LineString","coordinates":[[-0.5851729305762308,44.80191907417385],[-0.5851807333266363,44.80192450335854],[-0.5852132537747067,44.80193879211583],[-0.5852493646199031,44.801947742944144],[-0.5852872643857296,44.80195087213809],[-0.5853253114250806,44.8019482314481],[-0.585361605939593,44.80193979068075],[-0.5853664302049465,44.80193801712926]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Peydavant"},"geometry":{"type":"LineString","coordinates":[[-0.5853664302049465,44.80193801712926],[-0.5853945342375834,44.80192605111729],[-0.585422482635424,44.80190751403869],[-0.585444249840796,44.80188520821931],[-0.5854586289761966,44.80186007252648],[-0.5854651696709479,44.801834416894806]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Peydavant"},"geometry":{"type":"LineString","coordinates":[[-0.5854651696709479,44.801834416894806],[-0.5854634989586976,44.80180614021261],[-0.5854536412724859,44.80177987686994],[-0.5854361979764507,44.80175574437894],[-0.5854117412939939,44.801734805677114],[-0.5853816067110019,44.80171818972313],[-0.5853470961562035,44.801706486041276],[-0.5853098959873745,44.80170036212053],[-0.5852716701885647,44.8017001258312],[-0.5852343129381321,44.801705717460564],[-0.5852274849938373,44.80170782441463]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Peydavant"},"geometry":{"type":"LineString","coordinates":[[-0.5852274849938373,44.80170782441463],[-0.5851495033491008,44.80153219107884]]}},{"type":"Feature","properties":{"nom":"Rue Peydavant"},"geometry":{"type":"LineString","coordinates":[[-0.5852274849938373,44.80170782441463],[-0.5851994546724691,44.8017169054496],[-0.585168829747565,44.80173309463922],[-0.5851439143747236,44.80175360792707],[-0.5851256628779079,44.80177751441675],[-0.5851201875665865,44.80179119926634]]}},{"type":"Feature","properties":{"nom":"Rue Aldona"},"geometry":{"type":"LineString","coordinates":[[-0.5910056690595032,44.7984976041222],[-0.5895145995675709,44.798263440100435]]}},{"type":"Feature","properties":{"nom":"Place du Président Wilson"},"geometry":{"type":"LineString","coordinates":[[-0.5910056690595032,44.7984976041222],[-0.59081552314347,44.79905238759902],[-0.5908214358577824,44.799110754220074],[-0.5908372662186695,44.79916178130587],[-0.5908153296507723,44.79921382067324],[-0.5907424423278052,44.799292871840485]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Aldona"},"geometry":{"type":"LineString","coordinates":[[-0.5895145995675709,44.798263440100435],[-0.5877750460731076,44.79799448753065]]}},{"type":"Feature","properties":{"nom":"Rue Aldona"},"geometry":{"type":"LineString","coordinates":[[-0.5874940924930621,44.79876580341441],[-0.5874301042376504,44.79893303199433]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Aldona"},"geometry":{"type":"LineString","coordinates":[[-0.5874301042376504,44.79893303199433],[-0.587333371843338,44.79895833349873],[-0.5872897108986389,44.79896628666916],[-0.5871901509034066,44.79897257988817],[-0.5871011491301221,44.798969621901605],[-0.5850808771295336,44.798833524260765],[-0.5850419113984853,44.798837635202695],[-0.585015235590998,44.79884406116928]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue du Général Chanzy"},"geometry":{"type":"LineString","coordinates":[[-0.5874301042376504,44.79893303199433],[-0.5873847952942227,44.79908733010081],[-0.5867477686237127,44.800852667230565]]}},{"type":"Feature","properties":{"nom":"Rue Gabriel Faure"},"geometry":{"type":"LineString","coordinates":[[-0.6058602084364522,44.79786435749591],[-0.6071072432096107,44.79876914928914]]}},{"type":"Feature","properties":{"nom":"Rue Jules Massenet"},"geometry":{"type":"LineString","coordinates":[[-0.6058602084364522,44.79786435749591],[-0.6051360946018491,44.79834322327829]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de Villemejan"},"geometry":{"type":"LineString","coordinates":[[-0.6071072432096107,44.79876914928914],[-0.6065470639244804,44.79939101050488]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Camille Pelletan"},"geometry":{"type":"LineString","coordinates":[[-0.5977875452259982,44.8131112532041],[-0.5980670834990757,44.813033949301065],[-0.598307278978279,44.81296500568366],[-0.5990303093113795,44.8127284572901],[-0.5992043566156884,44.81268448541703],[-0.5999910045164841,44.81255888102683],[-0.6000842403541052,44.812542147747884]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Camille Pelletan"},"geometry":{"type":"LineString","coordinates":[[-0.6000842403541052,44.812542147747884],[-0.6003481849213284,44.81248677115931],[-0.6005709443936075,44.81246494703294]]}},{"type":"Feature","properties":{"nom":"Rue André Gide"},"geometry":{"type":"LineString","coordinates":[[-0.6000842403541052,44.812542147747884],[-0.6000637616945013,44.81250198855945],[-0.6000136438664618,44.812445201319136],[-0.5999308361509307,44.81237359410098],[-0.5995044106604542,44.81213936191611],[-0.5994367858293375,44.81210618948996],[-0.5993565927707848,44.81207845931682],[-0.5992699220337789,44.81206048277275],[-0.5991837117250365,44.81205393204763],[-0.5990300202554011,44.812055011327324],[-0.5989753179126946,44.81206259738529],[-0.5989134276417752,44.812078698397514],[-0.598180141040079,44.81229881543261],[-0.5975106500427024,44.81243610629011]]}},{"type":"Feature","properties":{"nom":"Rue Frédéric Sevene"},"geometry":{"type":"LineString","coordinates":[[-0.5810666445856678,44.80424561790561],[-0.5808928090668181,44.804286673179625],[-0.5807488871936071,44.804359125680534]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Clément Thomas"},"geometry":{"type":"LineString","coordinates":[[-0.5810666445856678,44.80424561790561],[-0.5810664585556685,44.804120410507124],[-0.5810698140814963,44.80399518168156],[-0.5810581950693176,44.80391609564227],[-0.581043175686349,44.80386170890745]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Frédéric Sevene"},"geometry":{"type":"LineString","coordinates":[[-0.5807488871936071,44.804359125680534],[-0.5806433604767209,44.80442433380759],[-0.5805798037661352,44.804492994910674],[-0.5805073940907326,44.80465543920559],[-0.5804569191870467,44.80483286711872],[-0.5800845142245711,44.80596132892959],[-0.5800319463776891,44.806060271437744],[-0.5799391335305457,44.80617948777433],[-0.5798561249134772,44.80625893979868],[-0.5794287913091821,44.80658262885887]]}},{"type":"Feature","properties":{"nom":"Rue Jules Guesde"},"geometry":{"type":"LineString","coordinates":[[-0.5963189105283733,44.80485238606977],[-0.5973690746633866,44.80445380231567]]}},{"type":"Feature","properties":{"nom":"Rue Matteoti"},"geometry":{"type":"LineString","coordinates":[[-0.5963189105283733,44.80485238606977],[-0.5956951221808845,44.80408803249884]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Jules Guesde"},"geometry":{"type":"LineString","coordinates":[[-0.5973690746633866,44.80445380231567],[-0.5984066689433065,44.80404866973753]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Debussy"},"geometry":{"type":"LineString","coordinates":[[-0.6051360946018491,44.79834322327829],[-0.6065470639244804,44.79939101050488]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Jules Valles"},"geometry":{"type":"LineString","coordinates":[[-0.586804278974005,44.813557993963954],[-0.5847905382966339,44.81362056946996]]}},{"type":"Feature","properties":{"nom":"Rue Lamartine"},"geometry":{"type":"LineString","coordinates":[[-0.586804278974005,44.813557993963954],[-0.5867538962503042,44.81347031161888],[-0.5866759275563211,44.81336232983947],[-0.586411832963497,44.813016905663964],[-0.5863411349325663,44.81292202654684],[-0.5863038493318639,44.81286176635362],[-0.5862677591195563,44.81279020825787]]}},{"type":"Feature","properties":{"nom":"Rue Lamartine"},"geometry":{"type":"LineString","coordinates":[[-0.586804278974005,44.813557993963954],[-0.5868288775389746,44.81361162768098],[-0.5868430232988615,44.813653880363304],[-0.5868851074284233,44.813860371809284],[-0.5869103158812776,44.814306111755855]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Jules Valles"},"geometry":{"type":"LineString","coordinates":[[-0.5847905382966339,44.81362056946996],[-0.5840087065161284,44.81364925808745]]}},{"type":"Feature","properties":{"nom":"Rue Lafitte"},"geometry":{"type":"LineString","coordinates":[[-0.5849219860206252,44.799108507861185],[-0.5849374947614797,44.79893470176171],[-0.5849475093637726,44.798900425269274],[-0.5849626735640122,44.7988757152751],[-0.5849845874674969,44.798857818885494],[-0.585015235590998,44.79884406116928]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Cité Duprat Et Durand"},"geometry":{"type":"LineString","coordinates":[[-0.5849219860206252,44.799108507861185],[-0.584624345277576,44.79910545838478],[-0.5845034664131551,44.7992165556342]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Lafitte"},"geometry":{"type":"LineString","coordinates":[[-0.5859913165365825,44.79604678625102],[-0.5860323705535917,44.79589118155161]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Lafitte"},"geometry":{"type":"LineString","coordinates":[[-0.5860323705535917,44.79589118155161],[-0.5861596889364554,44.79540171578158]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Lafitte"},"geometry":{"type":"LineString","coordinates":[[-0.5863172883442309,44.79475842595066],[-0.5863975534160996,44.79446646168854],[-0.5864790128978815,44.79424048965854],[-0.5865401267186039,44.79406776702903]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Maurice Ravel"},"geometry":{"type":"LineString","coordinates":[[-0.5863172883442309,44.79475842595066],[-0.5887778931031118,44.79492023813073]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Pierre Corneille"},"geometry":{"type":"LineString","coordinates":[[-0.6237420017448931,44.80334184354475],[-0.6237854723855056,44.80244520763538]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Blaise Pascal"},"geometry":{"type":"LineString","coordinates":[[-0.5841417671664542,44.80780318649656],[-0.5838043431839468,44.80837808926339]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Robespierre"},"geometry":{"type":"LineString","coordinates":[[-0.5838043431839468,44.80837808926339],[-0.5830314995900483,44.808371088178305]]}},{"type":"Feature","properties":{"nom":"Rue Blaise Pascal"},"geometry":{"type":"LineString","coordinates":[[-0.5850986212444692,44.80621552009868],[-0.5847038209642228,44.80686249834282]]}},{"type":"Feature","properties":{"nom":"Rue Frédéric Sevene"},"geometry":{"type":"LineString","coordinates":[[-0.5850986212444692,44.80621552009868],[-0.5849876235953666,44.80613983686355]]}},{"type":"Feature","properties":{"nom":"Rue Frédéric Sevene"},"geometry":{"type":"LineString","coordinates":[[-0.5850986212444692,44.80621552009868],[-0.5856885106011497,44.80648770921924],[-0.5858690067682033,44.80658001760952],[-0.5859312438765092,44.80662709269295]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Blaise Pascal"},"geometry":{"type":"LineString","coordinates":[[-0.5847038209642228,44.80686249834282],[-0.5844384020875807,44.80730298439016]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Blumerel"},"geometry":{"type":"LineString","coordinates":[[-0.5825067725348939,44.803310080280106],[-0.5823466062177725,44.80347330833263]]}},{"type":"Feature","properties":{"nom":"Rue Edouard Herriot"},"geometry":{"type":"LineString","coordinates":[[-0.5825067725348939,44.803310080280106],[-0.581742359284271,44.803038507850836]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Blumerel"},"geometry":{"type":"LineString","coordinates":[[-0.5823466062177725,44.80347330833263],[-0.5819241425744195,44.803882972506976],[-0.5818033658076843,44.80399595484546],[-0.581659112406581,44.80408544440446],[-0.5814155341873469,44.80420553622495],[-0.5813624680708289,44.80427602942861]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Frédéric Sevene"},"geometry":{"type":"LineString","coordinates":[[-0.5813624680708289,44.80427602942861],[-0.5812007891825703,44.804254095760825],[-0.5810666445856678,44.80424561790561]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Cours de la Libération"},"geometry":{"type":"LineString","coordinates":[[-0.5960955461028271,44.80064098746413],[-0.5961152525674497,44.80066279483778],[-0.5961601688831016,44.800695245524565],[-0.5962136134296593,44.80072040011352],[-0.5962732347035993,44.80073707179627],[-0.5963364622886191,44.80074462118647],[-0.596400358148639,44.800742600687954],[-0.5964472687166597,44.8007340007718]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de l'Université"},"geometry":{"type":"LineString","coordinates":[[-0.5964472687166597,44.8007340007718],[-0.5965582160638913,44.8008513827091],[-0.5967604728489094,44.80105731044049],[-0.5979988960069387,44.80186392163605],[-0.5991426121969289,44.802606135801256]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Cours de la Libération"},"geometry":{"type":"LineString","coordinates":[[-0.5964472687166597,44.8007340007718],[-0.5964623967240166,44.800731090165144],[-0.5965197072826585,44.80071072089456],[-0.5965703030351481,44.8006820962064]]}},{"type":"Feature","properties":{"nom":"Cours de la Libération"},"geometry":{"type":"LineString","coordinates":[[-0.600032246774405,44.798081784266614],[-0.5998593535718492,44.79818202390513],[-0.5985643386194901,44.79894691092332],[-0.5981196130069676,44.79920231276052]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue François Rabelais"},"geometry":{"type":"LineString","coordinates":[[-0.600032246774405,44.798081784266614],[-0.5998714173251674,44.79791932188868],[-0.5997815792081415,44.7978502797926],[-0.5997444328869818,44.79781866557593]]}},{"type":"Feature","properties":{"nom":"Avenue de l'Université"},"geometry":{"type":"LineString","coordinates":[[-0.6032483547232231,44.80789937519473],[-0.6024832081017839,44.80785361709681],[-0.6021693836075397,44.80784346760613],[-0.6016872423585642,44.80781684711325],[-0.6014591912984921,44.80777596401466],[-0.6012361508389614,44.807685646738456],[-0.6010954559109337,44.80759884765725],[-0.6009506036750458,44.80747587681038],[-0.6008390553247239,44.80732491684311]]}},{"type":"Feature","properties":{"nom":"Avenue de l'Université"},"geometry":{"type":"LineString","coordinates":[[-0.6032483547232231,44.80789937519473],[-0.6032398452665743,44.80796972897076]]}},{"type":"Feature","properties":{"nom":"Avenue Prévost"},"geometry":{"type":"LineString","coordinates":[[-0.6032483547232231,44.80789937519473],[-0.6032584369381895,44.807807622033835],[-0.6032463633667129,44.80769747323436],[-0.6031835001439588,44.80757443006975],[-0.6029063912671518,44.80705235166629]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de l'Université"},"geometry":{"type":"LineString","coordinates":[[-0.6008390553247239,44.80732491684311],[-0.6007290629329844,44.80702464095927],[-0.6005427197009086,44.80666105414587]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de l'Université"},"geometry":{"type":"LineString","coordinates":[[-0.6032398452665743,44.80796972897076],[-0.6040862033879802,44.80802308816946],[-0.6044102554291122,44.80802678270622],[-0.6046669698534264,44.80801603512214],[-0.6049138040245279,44.80799298852568],[-0.6053857356036779,44.80792308022486]]}},{"type":"Feature","properties":{"nom":"Rue de la Vieille Tour"},"geometry":{"type":"LineString","coordinates":[[-0.6004399085619743,44.807585639041214],[-0.6006124035503495,44.80752315662399],[-0.6007627289438932,44.8075149747893],[-0.6008795044312589,44.807547040725375]]}},{"type":"Feature","properties":{"nom":"Rue de la Vieille Tour"},"geometry":{"type":"LineString","coordinates":[[-0.6004399085619743,44.807585639041214],[-0.6007358852897697,44.80735466712789]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de l'Université"},"geometry":{"type":"LineString","coordinates":[[-0.6008795044312589,44.807547040725375],[-0.601083801841782,44.8076999287757],[-0.6013702754122733,44.80781715441462],[-0.6016425013496721,44.80787240336805],[-0.602132299432441,44.807904096450656],[-0.6024593348230423,44.80792112432897],[-0.6031165359859968,44.80796273513895],[-0.6032398452665743,44.80796972897076]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue du 19 Mars 1962"},"geometry":{"type":"LineString","coordinates":[[-0.5957169283102807,44.79632937035617],[-0.5954041624021152,44.79748951947677],[-0.5952346629585121,44.798058162349264]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue François Rabelais"},"geometry":{"type":"LineString","coordinates":[[-0.5957169283102807,44.79632937035617],[-0.5953694502999431,44.79629585589488],[-0.5949731293696177,44.79627235214532],[-0.5948658704777255,44.79626871633933]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Place du 1er Mai"},"geometry":{"type":"LineString","coordinates":[[-0.5952346629585121,44.798058162349264],[-0.5952131881691041,44.79806478666288],[-0.5951699318819951,44.798091377143336],[-0.594898196507284,44.7982785100566]]}},{"type":"Feature","properties":{"nom":"Cours Gambetta"},"geometry":{"type":"LineString","coordinates":[[-0.5898720404281652,44.81345825178031],[-0.5901832032794003,44.813250522037926],[-0.5905276978511486,44.81301516516125],[-0.59069381739304,44.81289461693631],[-0.5907714977003081,44.812804875596846]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Cours Gambetta"},"geometry":{"type":"LineString","coordinates":[[-0.5907714977003081,44.812804875596846],[-0.5907958574139518,44.81280383641524],[-0.5908352676488767,44.81279655689838],[-0.5908716670376737,44.81278360717028],[-0.5908991722573637,44.81276805557285]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Cours Gambetta"},"geometry":{"type":"LineString","coordinates":[[-0.5897857054238459,44.81339890989978],[-0.5894912002426408,44.813595753457896],[-0.5889939979524347,44.81393150166272],[-0.5887850089633541,44.81407096556667]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Raymond Poincare"},"geometry":{"type":"LineString","coordinates":[[-0.5897857054238459,44.81339890989978],[-0.5895381796612378,44.81321214406544],[-0.5894544608780478,44.813172447314024],[-0.5893577190473525,44.81314919598265],[-0.5874394502332281,44.81301107708922]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Cours Gambetta"},"geometry":{"type":"LineString","coordinates":[[-0.5908991722573637,44.81276805557285],[-0.5909034472362737,44.812765578495956],[-0.5909293900218038,44.81274322998895],[-0.590948162073535,44.81271750456253],[-0.5909589520926906,44.81268959889512],[-0.5909614539990063,44.81266069371542],[-0.5909553673102153,44.81263205965662],[-0.5909511668127475,44.812623544396445]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Cours Gambetta"},"geometry":{"type":"LineString","coordinates":[[-0.590615027273328,44.81275324319808],[-0.5905485095692103,44.81285965756235],[-0.5904563026006492,44.81293967799133],[-0.5899485281572142,44.813288375888696],[-0.5897857054238459,44.81339890989978]]}},{"type":"Feature","properties":{"nom":"Cours Gambetta"},"geometry":{"type":"LineString","coordinates":[[-0.590615027273328,44.81275324319808],[-0.5906433891114764,44.812773787451505],[-0.5906772864777297,44.81278974295795],[-0.5906896860220451,44.81279376557689]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Cours Gambetta"},"geometry":{"type":"LineString","coordinates":[[-0.5906896860220451,44.81279376557689],[-0.5907151533216196,44.81280034840929],[-0.5907553140878655,44.812805116199584],[-0.5907714977003081,44.812804875596846]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de Villemejan"},"geometry":{"type":"LineString","coordinates":[[-0.6065470639244804,44.79939101050488],[-0.6061927458767559,44.79975627139223]]}},{"type":"Feature","properties":{"nom":"Rue Doyen Henri Vizioz"},"geometry":{"type":"LineString","coordinates":[[-0.5958535522035362,44.81201358750806],[-0.5957016899524444,44.81082479978316]]}},{"type":"Feature","properties":{"nom":"Impasse Doyen Henri Vizioz"},"geometry":{"type":"LineString","coordinates":[[-0.5958535522035362,44.81201358750806],[-0.5956737382215742,44.812028009427486],[-0.5954147285449465,44.81212600812668],[-0.5950539714450978,44.81219560304909],[-0.5949821653898325,44.81223129282504],[-0.594871339916261,44.81231704014313],[-0.5946333376497162,44.81235014458704]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Pierre Noailles"},"geometry":{"type":"LineString","coordinates":[[-0.5913855063098329,44.810568396335654],[-0.5915059958476927,44.81057882506527],[-0.5915647133387504,44.810576790969876],[-0.5920218479019826,44.81051866672442]]}},{"type":"Feature","properties":{"nom":"Cours de la Libération"},"geometry":{"type":"LineString","coordinates":[[-0.5913855063098329,44.810568396335654],[-0.5913875190001728,44.81054383050787],[-0.591381533154683,44.81051681475529],[-0.5913672956651731,44.81049141075643],[-0.5913453901569167,44.81046886122681]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Pierre Noailles"},"geometry":{"type":"LineString","coordinates":[[-0.5920218479019826,44.81051866672442],[-0.5922877783847363,44.810485045889244],[-0.5933586256701098,44.81029439020979],[-0.5934688957326942,44.810278925819105],[-0.5941901639134951,44.81028631546872]]}},{"type":"Feature","properties":{"nom":"Impasse des Briques"},"geometry":{"type":"LineString","coordinates":[[-0.5920218479019826,44.81051866672442],[-0.5919607284167003,44.81025674671239]]}},{"type":"Feature","properties":{"nom":"Rue Pierre Noailles"},"geometry":{"type":"LineString","coordinates":[[-0.5944228342264861,44.81006231609056],[-0.5945533708938209,44.80972858078369],[-0.5945808512477164,44.809674113537696],[-0.594616591539749,44.809616142302644],[-0.5946769974785924,44.80953568178889],[-0.5947496424228284,44.80945870798201],[-0.5948284216877263,44.80939081871319],[-0.5950739627061115,44.80920487609095],[-0.5952680107222161,44.80906172799206],[-0.5953507532251736,44.809014792273146],[-0.5954219513776814,44.80898362543968],[-0.5957266658883242,44.80887607405456],[-0.5959649222885526,44.80879251279228],[-0.5961333278654951,44.80873737329461],[-0.5964048988148536,44.80866654039342],[-0.5965845512959245,44.808633475068696],[-0.596769838742345,44.808609599819775],[-0.5968754036219301,44.80859788406469],[-0.5973931236108091,44.808551784473686],[-0.5978712484691127,44.808503872132526],[-0.5979044299964055,44.80849822837738],[-0.5979413498683702,44.80848760192193],[-0.5979952493613764,44.808461124374034],[-0.5980889229424843,44.8084150118628]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Pierre Noailles"},"geometry":{"type":"LineString","coordinates":[[-0.5944228342264861,44.81006231609056],[-0.5944004351257461,44.8100582495383],[-0.5943774464355764,44.810056904073946],[-0.594354505244212,44.81005834964841],[-0.5943321111292474,44.810062480393896],[-0.5943110162640742,44.81006918245979],[-0.5942918409173845,44.81007825608442],[-0.5942749471610891,44.81008941958086],[-0.5942608289715072,44.810102477178496],[-0.5942499635055617,44.81011696338905],[-0.5942427072317411,44.81013250662338],[-0.5941909183568125,44.810257825699686],[-0.5941890479904948,44.81027247809178],[-0.5941901639134951,44.81028631546872]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Pierre Noailles"},"geometry":{"type":"LineString","coordinates":[[-0.5980889229424843,44.8084150118628],[-0.5981067637449384,44.808431202812514],[-0.5981344554242116,44.80844708214756],[-0.5981666375957528,44.80845786490175],[-0.5982014916404421,44.80846279785972],[-0.5982371063146863,44.80846167123372],[-0.5982712083317555,44.80845455693476],[-0.598301920119451,44.808441784608036],[-0.5983275240803287,44.8084242193312],[-0.5983464289124987,44.80840272218954],[-0.5983574558761621,44.80837868171107],[-0.5983600071891754,44.808352657301484]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Pierre Romain"},"geometry":{"type":"LineString","coordinates":[[-0.5839926048931097,44.805442794196125],[-0.5848800257630388,44.80408206975226]]}},{"type":"Feature","properties":{"nom":"Rue Frédéric Sevene"},"geometry":{"type":"LineString","coordinates":[[-0.5839926048931097,44.805442794196125],[-0.583502280394917,44.805131337274695],[-0.583204235694667,44.80498182319573],[-0.5828735045100534,44.80483162648224]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Antoine Carles"},"geometry":{"type":"LineString","coordinates":[[-0.5848800257630388,44.80408206975226],[-0.5836002037568148,44.80364523865101]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Place du 1er Mai"},"geometry":{"type":"LineString","coordinates":[[-0.594898196507284,44.7982785100566],[-0.5950341181897741,44.7983501527892]]}},{"type":"Feature","properties":{"nom":"Rue Calixte Camelle"},"geometry":{"type":"LineString","coordinates":[[-0.594898196507284,44.7982785100566],[-0.5942055605025433,44.79804610025062]]}},{"type":"Feature","properties":{"nom":"Place du 1er Mai"},"geometry":{"type":"LineString","coordinates":[[-0.5950341181897741,44.7983501527892],[-0.595370898235511,44.79809223046674]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue du Professeur Arnozan"},"geometry":{"type":"LineString","coordinates":[[-0.5880525730551078,44.80870096572785],[-0.5881691368308702,44.80848577673915],[-0.5883137467476924,44.80818448546386],[-0.5887617020151555,44.80746699421062],[-0.5888287887820327,44.80734741083005]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue du Professeur Arnozan"},"geometry":{"type":"LineString","coordinates":[[-0.5880525730551078,44.80870096572785],[-0.5880009960901588,44.8086936745718],[-0.5879490890951463,44.80869531189805],[-0.5878989934571109,44.80870572007875]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue César Franck"},"geometry":{"type":"LineString","coordinates":[[-0.5833254041750363,44.79571293010645],[-0.5832555378090325,44.795753146017745],[-0.5832271725725099,44.79575476042887],[-0.5832006890042392,44.79575000982645],[-0.5831794974524254,44.79574491231279],[-0.5831548151005556,44.79573046620842],[-0.5827995422326325,44.79544303896483]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Camille Saint-Saëns"},"geometry":{"type":"LineString","coordinates":[[-0.5827995422326325,44.79544303896483],[-0.5827263613068654,44.79559686185562],[-0.5826967176719626,44.795645088623786],[-0.58266853671454,44.795680207463164],[-0.5823519493253732,44.79602960833392],[-0.5822565001424345,44.79625673810243]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Fernand Monlun"},"geometry":{"type":"LineString","coordinates":[[-0.6328870155811008,44.79910027617863],[-0.6328130258522322,44.79912480038317],[-0.6311324422268266,44.79922387400509]]}},{"type":"Feature","properties":{"nom":"Rue Blaise Pascal"},"geometry":{"type":"LineString","coordinates":[[-0.6328870155811008,44.79910027617863],[-0.6327586572354493,44.79892258670855],[-0.6326526022515895,44.79875949899196],[-0.6326010835463975,44.79863061276353],[-0.6324753154092333,44.79809439571101]]}},{"type":"Feature","properties":{"nom":"Rue Maurice Berteaux"},"geometry":{"type":"LineString","coordinates":[[-0.5876207778322377,44.81232353005264],[-0.5876833796143399,44.811924385372386],[-0.587769795632363,44.81130198763022]]}},{"type":"Feature","properties":{"nom":"Avenue Maréchal de Lattre de Tassigny"},"geometry":{"type":"LineString","coordinates":[[-0.5876207778322377,44.81232353005264],[-0.5861854658165723,44.812315730242524]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Maurice Berteaux"},"geometry":{"type":"LineString","coordinates":[[-0.587769795632363,44.81130198763022],[-0.5878802718810091,44.8104521851498]]}},{"type":"Feature","properties":{"nom":"Passage Joguet"},"geometry":{"type":"LineString","coordinates":[[-0.587769795632363,44.81130198763022],[-0.5883677434567133,44.811338707097136]]}},{"type":"Feature","properties":{"nom":"Rue de Megret"},"geometry":{"type":"LineString","coordinates":[[-0.5899764767772134,44.80123120461399],[-0.5901976242756848,44.800820476484965],[-0.5902259155593931,44.80074652692611],[-0.5905132997828084,44.79979447630037],[-0.5907424423278052,44.799292871840485]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue du Général Bordas"},"geometry":{"type":"LineString","coordinates":[[-0.5899764767772134,44.80123120461399],[-0.5892428261966974,44.801140946932136]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue du Général Sarrail"},"geometry":{"type":"LineString","coordinates":[[-0.5907424423278052,44.799292871840485],[-0.58992678783263,44.799169445830465]]}},{"type":"Feature","properties":{"nom":"Rue de Megret"},"geometry":{"type":"LineString","coordinates":[[-0.5907424423278052,44.799292871840485],[-0.5908689969751137,44.799204018804296],[-0.5909787378990278,44.799131641028026],[-0.5913554988771722,44.7988510293862],[-0.5915140667730234,44.79873179787754],[-0.5916468256867602,44.79864509009591]]}},{"type":"Feature","properties":{"nom":"Rue Rosa Bonheur"},"geometry":{"type":"LineString","coordinates":[[-0.628875764665801,44.807471374277796],[-0.6298909344003979,44.80713449809973]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Goya"},"geometry":{"type":"LineString","coordinates":[[-0.628875764665801,44.807471374277796],[-0.6287778736268587,44.80733351621315],[-0.6287634251334943,44.80732109518429],[-0.6287384554084998,44.807314414841954],[-0.6287066572146164,44.80731786156016],[-0.6284258411300346,44.80741807490818]]}},{"type":"Feature","properties":{"nom":"Avenue de Fontaudin"},"geometry":{"type":"LineString","coordinates":[[-0.6208754813095524,44.80034561747293],[-0.6195375283914707,44.800241821394124]]}},{"type":"Feature","properties":{"nom":"Place de la Rotonde"},"geometry":{"type":"LineString","coordinates":[[-0.6208754813095524,44.80034561747293],[-0.6208742299291716,44.80036799801875],[-0.620878737879494,44.80039343820603],[-0.620888882990496,44.80041797825118],[-0.6209043731932952,44.800440996866186],[-0.6209249220636534,44.800461962668486],[-0.620943311439065,44.8004787632976],[-0.6209787873644508,44.8004956504983],[-0.62101065266104,44.80050742780505],[-0.6210446856568697,44.800515442662274],[-0.6210805999159307,44.80051916368715]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Place de la Rotonde"},"geometry":{"type":"LineString","coordinates":[[-0.6210805999159307,44.80051916368715],[-0.6211161620229523,44.80051929257274],[-0.6211515793432013,44.80051510204961],[-0.6211856060690247,44.80050690203565],[-0.6212173695687816,44.80049490048195],[-0.6212460028625871,44.80047939524836],[-0.6212707821850113,44.800460949882556],[-0.6212910874606636,44.800439764297394],[-0.6213063381484791,44.80041666773398],[-0.6213161780207516,44.80039203187052],[-0.621319849440657,44.80036588083269]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de Saige"},"geometry":{"type":"LineString","coordinates":[[-0.6307665484608452,44.797685210289806],[-0.630737406271222,44.797443454373465]]}},{"type":"Feature","properties":{"nom":"Avenue Bitaly"},"geometry":{"type":"LineString","coordinates":[[-0.6307665484608452,44.797685210289806],[-0.6321897311485453,44.79761003666069]]}},{"type":"Feature","properties":{"nom":"Avenue Jean Lartaut"},"geometry":{"type":"LineString","coordinates":[[-0.6160580420874954,44.79373137093818],[-0.6165414159607582,44.79462615359431],[-0.6168116988168031,44.79508163835017]]}},{"type":"Feature","properties":{"nom":"Avenue Jean Babin"},"geometry":{"type":"LineString","coordinates":[[-0.6160580420874954,44.79373137093818],[-0.6158412493795113,44.793883834861006],[-0.6156768201359397,44.79399961355941]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Jean Babin"},"geometry":{"type":"LineString","coordinates":[[-0.6156768201359397,44.79399961355941],[-0.6156526050200689,44.79398669082804],[-0.6156264329505059,44.79397887497639],[-0.6155989374492497,44.793974164029656],[-0.6155706291935013,44.79397263183339],[-0.6155333858256525,44.793975887879235]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Albert Schweitzer"},"geometry":{"type":"LineString","coordinates":[[-0.6172610122507112,44.800198493889766],[-0.6172314681172758,44.80018538057009],[-0.6171994866039048,44.80017576793086],[-0.6171658479108231,44.800169991488595],[-0.617131189042176,44.80016812106552],[-0.6170966520956501,44.800170210419054],[-0.6170629947050957,44.800176235454266],[-0.6170312157736493,44.80018598423407],[-0.6170019353839317,44.80019925687478],[-0.6169761411589644,44.800215661633864],[-0.6169543212736119,44.80023491273792],[-0.6169370676121894,44.800256360782846],[-0.6169246743947955,44.80027864516549]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Allée Ausone"},"geometry":{"type":"LineString","coordinates":[[-0.6169246743947955,44.80027864516549],[-0.6168689808707637,44.800250058303284],[-0.61676208790433,44.800224180649046],[-0.6166974923740572,44.800200921468296],[-0.6166373703695116,44.800170313330554],[-0.6165143987043628,44.80008981579835],[-0.6160350696250945,44.79971986121379],[-0.6159351826868764,44.79963016129116]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Albert Schweitzer"},"geometry":{"type":"LineString","coordinates":[[-0.6169246743947955,44.80027864516549],[-0.6169181496341023,44.800303715660036],[-0.6169169114561555,44.80032834777615],[-0.6169212349803718,44.800352893097326],[-0.6169309431724723,44.800376546503315],[-0.6169460078373359,44.800398858473734],[-0.6169658787591578,44.800419125838864],[-0.6169898907244851,44.80043682925261],[-0.6170177629827337,44.800451527224496],[-0.6170348711673813,44.80045800961697]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Albert Schweitzer"},"geometry":{"type":"LineString","coordinates":[[-0.6153385571934318,44.80267772650684],[-0.6154575479359946,44.80263214540256],[-0.6156542235918762,44.80256832999024],[-0.6159017594379852,44.80247821444909],[-0.6160638040894652,44.80240090582401],[-0.6161682410152266,44.80234722875872],[-0.6162824796343164,44.802274322454544],[-0.6163707939225889,44.80220971725499],[-0.6164873226050801,44.8021208832577],[-0.6165456603077095,44.802064527845275],[-0.616637048825239,44.80197027735285],[-0.6167556010158722,44.80183102215729]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Albert Schweitzer"},"geometry":{"type":"LineString","coordinates":[[-0.6153385571934318,44.80267772650684],[-0.6153364654040295,44.802644372137614],[-0.6153268250556507,44.802611708134364],[-0.6153100657452605,44.80258053158951],[-0.615303508186988,44.80257281271715]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Albert Schweitzer"},"geometry":{"type":"LineString","coordinates":[[-0.6167556010158722,44.80183102215729],[-0.6168169825126848,44.80174655389446],[-0.6168934612424188,44.801582061939314],[-0.6169483635547244,44.801428615680656],[-0.6170028382115869,44.80118365836639],[-0.6170516024396403,44.80089609305333],[-0.6171022081499608,44.80062981886935],[-0.6171282843380691,44.800555391475335],[-0.6171720137256175,44.800471934783396]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Albert Schweitzer"},"geometry":{"type":"LineString","coordinates":[[-0.6173385760408895,44.8002771919352],[-0.6173264381199073,44.800255147256394],[-0.6173090305525012,44.800233810685334],[-0.6172869599803396,44.80021478442294],[-0.6172610122507112,44.800198493889766]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Albert Schweitzer"},"geometry":{"type":"LineString","coordinates":[[-0.6173385760408895,44.8002771919352],[-0.6174583932696283,44.80017834298948],[-0.6177700580488659,44.80001150404143]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Albert Schweitzer"},"geometry":{"type":"LineString","coordinates":[[-0.6177700580488659,44.80001150404143],[-0.6193161410168009,44.79906940487892],[-0.6194418446698561,44.798961628216425]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Albert Schweitzer"},"geometry":{"type":"LineString","coordinates":[[-0.610457696199699,44.805133490765726],[-0.610494982551119,44.80515302623778],[-0.6105361716787757,44.80516820391094],[-0.6105802195094183,44.80517851642828],[-0.6106259725743102,44.80518373015118],[-0.6106723980547848,44.80518351753583],[-0.6107277124972792,44.80517572599702]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Accès Maison de Retraite Mutualiste"},"geometry":{"type":"LineString","coordinates":[[-0.6107277124972792,44.80517572599702],[-0.6108150033848274,44.80530672801345],[-0.6108135071079033,44.805371725311815],[-0.610790529885136,44.8054048846083],[-0.610758030528832,44.80543753544147],[-0.6107024923740417,44.80546398125446],[-0.6100281494112885,44.805710327171916]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Albert Schweitzer"},"geometry":{"type":"LineString","coordinates":[[-0.6107277124972792,44.80517572599702],[-0.6107621223100063,44.80516751707603],[-0.6108030385396361,44.805152075120866],[-0.6108399996450758,44.80513207439936],[-0.6108722704371572,44.80510789858727],[-0.610897931726438,44.80508123011038],[-0.610917236087017,44.80505206095512],[-0.6109306041913777,44.8050190265257],[-0.6109359769232754,44.804985615346844],[-0.6109336575526042,44.80495262854044],[-0.6109244770091288,44.804921210804665],[-0.6109243507247113,44.804921214813355]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Nancel Pénard"},"geometry":{"type":"LineString","coordinates":[[-0.624018432989894,44.81007380965053],[-0.6268000100219724,44.80943708538574]]}},{"type":"Feature","properties":{"nom":"Avenue Hector Domecq"},"geometry":{"type":"LineString","coordinates":[[-0.624018432989894,44.81007380965053],[-0.6246231752046867,44.811427684732095]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Nancel Pénard"},"geometry":{"type":"LineString","coordinates":[[-0.6286497829100846,44.809017575311366],[-0.6286521056448674,44.80902632942319],[-0.6286588245100269,44.809042600414614],[-0.6286691492622496,44.80905785553454],[-0.6286826783866089,44.80907174725648],[-0.6286992629531496,44.80908391999414],[-0.6287183751534566,44.80909403025061],[-0.6287394984983771,44.809101914333915],[-0.6287620995157397,44.809107138841654],[-0.6287856786949662,44.80910980979316],[-0.6288094669567306,44.80910977155664],[-0.629184852615813,44.80908644455927]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue du Colonel René Fonck"},"geometry":{"type":"LineString","coordinates":[[-0.6295164631937994,44.809867159990326],[-0.629585442485553,44.809839194970834]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Roger Marcade"},"geometry":{"type":"LineString","coordinates":[[-0.6295164631937994,44.809867159990326],[-0.6296444746802012,44.81032448459668],[-0.629701263834446,44.810717870193166],[-0.6297100870767479,44.81076353139339],[-0.6297303675670795,44.81081026833573],[-0.6297581496549187,44.81084550542065],[-0.6298015615988709,44.81089582824699],[-0.630105762234423,44.8111767311133]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Colonel Robert Jacqui"},"geometry":{"type":"LineString","coordinates":[[-0.630105762234423,44.8111767311133],[-0.6302392559181363,44.81128696741555],[-0.6303439092502123,44.8113773146495],[-0.630389883473615,44.81139998984562],[-0.6304396422063093,44.811414436693155],[-0.6304983166058676,44.81142175259234],[-0.6305429279038695,44.8114207791762],[-0.6314140812463336,44.81133198471517],[-0.6317246189851098,44.811299549583595],[-0.6318455929708662,44.81126325695497]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Roger Marcade"},"geometry":{"type":"LineString","coordinates":[[-0.629184852615813,44.80908644455927],[-0.6292500974961024,44.80912580138969],[-0.6292830461420539,44.8091466404735],[-0.6293066470193782,44.80916372403659],[-0.6293225348865245,44.809184927299725],[-0.6293406392288704,44.80923128330798],[-0.6295164631937994,44.809867159990326]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Nancel Pénard"},"geometry":{"type":"LineString","coordinates":[[-0.629184852615813,44.80908644455927],[-0.6292866856569652,44.80908184416916],[-0.6293100458423282,44.80907902688786],[-0.6293323634785113,44.809073720518974],[-0.6293560511976012,44.809064046406846]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue des Echoppes"},"geometry":{"type":"LineString","coordinates":[[-0.615914663117892,44.80523173783854],[-0.6149722993800102,44.80301952321189],[-0.6150150402426817,44.802875833309585]]}},{"type":"Feature","properties":{"nom":"Place Chambrelent"},"geometry":{"type":"LineString","coordinates":[[-0.615914663117892,44.80523173783854],[-0.6158830300495386,44.805241841893476],[-0.6158536261824958,44.80525520814961],[-0.6158277087252438,44.805271706556645],[-0.6158057602588184,44.805290961444776],[-0.615788510297553,44.805312499206494],[-0.6157762982267275,44.80533567847554],[-0.6157694690720027,44.80535994778347],[-0.6157682415733241,44.80538475968095],[-0.615772570626146,44.80540939493484],[-0.6157785186711434,44.80542352907227]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Albert Schweitzer"},"geometry":{"type":"LineString","coordinates":[[-0.6150150402426817,44.802875833309585],[-0.6150252384660432,44.80287704057554],[-0.6150720465516963,44.802876904026824],[-0.6151183957190242,44.802871467139155],[-0.6151627649602274,44.80286068817538],[-0.615204172218471,44.802845048769846],[-0.615239654429878,44.802825724109816]]}},{"type":"Feature","properties":{"nom":"Rue Edouard Herriot"},"geometry":{"type":"LineString","coordinates":[[-0.5818440451069568,44.802451306972245],[-0.5820663909934288,44.80216883506007]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Edouard Herriot"},"geometry":{"type":"LineString","coordinates":[[-0.5820663909934288,44.80216883506007],[-0.5821560683356397,44.80205430950675]]}},{"type":"Feature","properties":{"nom":"Avenue Espeleta"},"geometry":{"type":"LineString","coordinates":[[-0.5898432957757949,44.81017036133909],[-0.5912290658125761,44.81024498686175]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Espeleta"},"geometry":{"type":"LineString","coordinates":[[-0.5898432957757949,44.81017036133909],[-0.5897865465220927,44.81016944982386],[-0.5897660433831342,44.810175501783306],[-0.5897471870710399,44.810185645531945],[-0.5897178156650436,44.810205759870755],[-0.5896953532557284,44.8102311511603],[-0.5896856406540187,44.810260103692954],[-0.5896643451299463,44.810466792888754],[-0.5896315190587665,44.81053710171911]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Albert Schweitzer"},"geometry":{"type":"LineString","coordinates":[[-0.6209525813577348,44.796990254580784],[-0.6209883616111087,44.797016050297394]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Albert Schweitzer"},"geometry":{"type":"LineString","coordinates":[[-0.6209525813577348,44.796990254580784],[-0.6204169498377229,44.79735773276919]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Albert Schweitzer"},"geometry":{"type":"LineString","coordinates":[[-0.6209883616111087,44.797016050297394],[-0.6210075664953562,44.79702570832341],[-0.6210385234299463,44.79703715415457],[-0.6210715216635927,44.79704484155538],[-0.621105797944393,44.79704870474341],[-0.6211405890182478,44.79704867793801],[-0.6211749940740346,44.79704451957051],[-0.6212078992917575,44.79703662544278],[-0.6212388052444724,44.79702510154128]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Albert Schweitzer"},"geometry":{"type":"LineString","coordinates":[[-0.6079458835492219,44.80595719005264],[-0.6082688621229223,44.805782183011985],[-0.6086387028655863,44.80560992209255],[-0.6090136710331437,44.80546704437491],[-0.6094089157991988,44.805352979001576],[-0.6102919756124691,44.80512001392482],[-0.610457696199699,44.805133490765726]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Albert Schweitzer"},"geometry":{"type":"LineString","coordinates":[[-0.6079458835492219,44.80595719005264],[-0.6078964088953601,44.80591678083899]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de Collegno"},"geometry":{"type":"LineString","coordinates":[[-0.6078964088953601,44.80591678083899],[-0.6078302525593452,44.805872666855656],[-0.6077219503111821,44.80583043016253],[-0.6076431280068599,44.80581644514331],[-0.6075600175791895,44.8058208828806],[-0.6071178372245689,44.805933187131934]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Albert Schweitzer"},"geometry":{"type":"LineString","coordinates":[[-0.6078964088953601,44.80591678083899],[-0.6077716800222357,44.805996226583915],[-0.6073527494165163,44.80631426392598],[-0.6068867313727507,44.80665640353449],[-0.6065554926701945,44.8069139137733],[-0.6063456560278409,44.8070913638738],[-0.605757491691602,44.80762330174275]]}},{"type":"Feature","properties":{"nom":"Rue de Suzon"},"geometry":{"type":"LineString","coordinates":[[-0.5823728634221069,44.811295159599865],[-0.5823498690403354,44.81140163939471],[-0.5823237210808098,44.81155307906197]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue de Suzon"},"geometry":{"type":"LineString","coordinates":[[-0.5823237210808098,44.81155307906197],[-0.5822195256664939,44.81197586969005]]}},{"type":"Feature","properties":{"nom":"Rue de Suzon"},"geometry":{"type":"LineString","coordinates":[[-0.5891885489291463,44.810515857685246],[-0.5887035242411404,44.810498010601194]]}},{"type":"Feature","properties":{"nom":"Place Joliot Curie"},"geometry":{"type":"LineString","coordinates":[[-0.5891885489291463,44.810515857685246],[-0.5892150208258056,44.810245948030406]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Pierre Curie"},"geometry":{"type":"LineString","coordinates":[[-0.5887035242411404,44.810498010601194],[-0.5885869552620311,44.811032269844475],[-0.5885868525057598,44.811089565096644],[-0.5886814800999837,44.81154437538894],[-0.5886991732985334,44.81157651688587],[-0.5887240558786314,44.811600144042565],[-0.5887597569719424,44.81161460187101],[-0.5888038793038597,44.811622037871665],[-0.589314061184245,44.81162305646567],[-0.5893995354674162,44.81164017740682]]}},{"type":"Feature","properties":{"nom":"Rue de Suzon"},"geometry":{"type":"LineString","coordinates":[[-0.5887035242411404,44.810498010601194],[-0.5885996266639701,44.81047966877779],[-0.5880578329857499,44.81046261899177],[-0.5878802718810091,44.8104521851498]]}},{"type":"Feature","properties":{"nom":"Rue de Suzon"},"geometry":{"type":"LineString","coordinates":[[-0.582596396707485,44.81053449802052],[-0.5825102298295658,44.81067719844516],[-0.5824756769460262,44.81075854925551],[-0.5824512659663289,44.81083408567679],[-0.5824004241989866,44.8111094444553],[-0.5823728634221069,44.811295159599865]]}},{"type":"Feature","properties":{"nom":"Impasse Suzon"},"geometry":{"type":"LineString","coordinates":[[-0.582596396707485,44.81053449802052],[-0.5824877823165049,44.810489094626234],[-0.5822935844466851,44.81045935813457],[-0.5819808875274844,44.810424705063134],[-0.5817200878902408,44.8104187744898]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue de Suzon"},"geometry":{"type":"LineString","coordinates":[[-0.582596396707485,44.81053449802052],[-0.5827608332558103,44.81052517520639],[-0.5828788700545551,44.81052875399449],[-0.5832376806298483,44.810574383277476]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Impasse de la Fauvette"},"geometry":{"type":"LineString","coordinates":[[-0.5817200878902408,44.8104187744898],[-0.5818780991626679,44.8088520567097]]}},{"type":"Feature","properties":{"nom":"Impasse Suzon"},"geometry":{"type":"LineString","coordinates":[[-0.5817200878902408,44.8104187744898],[-0.5812918061196057,44.810424061772686],[-0.5809781861309301,44.81040916286215]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de l'Université"},"geometry":{"type":"LineString","coordinates":[[-0.6004092627113612,44.80421004994941],[-0.6004031871109291,44.804212043923265],[-0.6003664081634719,44.804230954406414],[-0.6003349725257094,44.80425438002206],[-0.600309954985261,44.804281295846266],[-0.6002921946162614,44.80431095466363],[-0.6002820197436155,44.80434253534246],[-0.6002799831918216,44.80437475923374],[-0.6002816167230712,44.80438470667476]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue de Suzon"},"geometry":{"type":"LineString","coordinates":[[-0.5851117818471763,44.81090727732481],[-0.5849697393399184,44.81090229542672]]}},{"type":"Feature","properties":{"nom":"Rue Peydavant"},"geometry":{"type":"LineString","coordinates":[[-0.5851117818471763,44.81090727732481],[-0.5851579712044871,44.81038235731549],[-0.5851517060606226,44.81025517937484],[-0.5850621839157236,44.80935907642656],[-0.5849621448807082,44.808981544439824],[-0.5849714183548708,44.80880307072202],[-0.5850959289495298,44.808524217323345]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de Thouars"},"geometry":{"type":"LineString","coordinates":[[-0.5922783509610803,44.796444976952124],[-0.5922619312697354,44.79666268358289]]}},{"type":"Feature","properties":{"nom":"Rue André Messager"},"geometry":{"type":"LineString","coordinates":[[-0.5922783509610803,44.796444976952124],[-0.5921876898744992,44.79643360775383],[-0.5909773960995183,44.796359769140246],[-0.5897684222230885,44.79628065133203]]}},{"type":"Feature","properties":{"nom":"Avenue de Thouars"},"geometry":{"type":"LineString","coordinates":[[-0.5924129675978201,44.79487752946063],[-0.5924227244326273,44.794971176905655],[-0.592417404659201,44.7951477257731],[-0.5923415956072579,44.79592698879076]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de Thouars"},"geometry":{"type":"LineString","coordinates":[[-0.5923415956072579,44.79592698879076],[-0.5923109617560379,44.79619270781825]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Résidence les Ombrages"},"geometry":{"type":"LineString","coordinates":[[-0.5923415956072579,44.79592698879076],[-0.5898589085239744,44.79578531672493]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Peydavant"},"geometry":{"type":"LineString","coordinates":[[-0.5857400198724079,44.802234706479176],[-0.5857026307136758,44.802227169701524],[-0.5856791696139334,44.80221198506938],[-0.5856704225483048,44.80218696917707],[-0.5856630460078622,44.80214405157162],[-0.5856592534212801,44.802093748004225],[-0.585649515288388,44.80201705910807],[-0.585628353359424,44.80194890472344],[-0.5855878060285796,44.801874196645564],[-0.5855655326411606,44.801854820823344],[-0.5855310142731254,44.801844206832044],[-0.5854651696709479,44.801834416894806]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Place Joliot Curie"},"geometry":{"type":"LineString","coordinates":[[-0.5892150208258056,44.810245948030406],[-0.5885996140983818,44.81021726093555]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Passage Mairie"},"geometry":{"type":"LineString","coordinates":[[-0.5885996140983818,44.81021726093555],[-0.5884971601343006,44.8102119353497],[-0.5884732557712753,44.81018368313062],[-0.5885014872928597,44.809885072212275]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Nelson Mandela"},"geometry":{"type":"LineString","coordinates":[[-0.6295206167811596,44.806458345196894],[-0.6292068035750316,44.805857500152804]]}},{"type":"Feature","properties":{"nom":"Avenue Jean Jaurès"},"geometry":{"type":"LineString","coordinates":[[-0.6295206167811596,44.806458345196894],[-0.6300846702457197,44.806308641964954],[-0.6306234818854873,44.80621829611289]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Nelson Mandela"},"geometry":{"type":"LineString","coordinates":[[-0.6292068035750316,44.805857500152804],[-0.6290182849240853,44.80555840129723]]}},{"type":"Feature","properties":{"nom":"Rue Adrien Ducourt"},"geometry":{"type":"LineString","coordinates":[[-0.6292068035750316,44.805857500152804],[-0.6288126939101333,44.80598105799353],[-0.628784496817115,44.80598943456038],[-0.6287643105293776,44.80600043822628],[-0.628760187260216,44.80601534352154],[-0.6287655184404249,44.80602967693025],[-0.6289597013617284,44.80649110669704],[-0.6290203614854815,44.80660240666163]]}},{"type":"Feature","properties":{"nom":"Cours de la Libération"},"geometry":{"type":"LineString","coordinates":[[-0.5930434137916174,44.803644041633945],[-0.5934361361385686,44.80267325106588]]}},{"type":"Feature","properties":{"nom":"Rue de Tremeuge"},"geometry":{"type":"LineString","coordinates":[[-0.5930434137916174,44.803644041633945],[-0.5929742433737365,44.803628480598185]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue du Lycée"},"geometry":{"type":"LineString","coordinates":[[-0.5934361361385686,44.80267325106588],[-0.5933681929699226,44.802659092840265]]}},{"type":"Feature","properties":{"nom":"Avenue du Lycée"},"geometry":{"type":"LineString","coordinates":[[-0.5934361361385686,44.80267325106588],[-0.5941101284050473,44.803090834537365]]}},{"type":"Feature","properties":{"nom":"Cours de la Libération"},"geometry":{"type":"LineString","coordinates":[[-0.5934361361385686,44.80267325106588],[-0.5936100667772646,44.80223202842981],[-0.593751791100703,44.801885148170584],[-0.5937916863746345,44.80182488375475],[-0.5938418315239782,44.80177681685403]]}},{"type":"Feature","properties":{"nom":"Cours de la Libération"},"geometry":{"type":"LineString","coordinates":[[-0.5915715782126126,44.806807000539166],[-0.5915753813942688,44.806819162196575],[-0.5915882405594408,44.806838645159615],[-0.5916084990576307,44.806855428560446]]}},{"type":"Feature","properties":{"nom":"Avenue Maréchal Leclerc"},"geometry":{"type":"LineString","coordinates":[[-0.5915715782126126,44.806807000539166],[-0.5915090177488784,44.80680708866843],[-0.5913368025222011,44.80679496035687],[-0.5908938621177842,44.8067209348852],[-0.5905757280150876,44.80668206352678],[-0.5903967975998345,44.806669785464045],[-0.5901752386690532,44.80668821935534]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Cours de la Libération"},"geometry":{"type":"LineString","coordinates":[[-0.5916084990576307,44.806855428560446],[-0.5916465437470868,44.80692239687728],[-0.591541951911806,44.807203670542116],[-0.591434871456327,44.80749162052985],[-0.5914020637957571,44.807645435404126],[-0.5913832404552399,44.80773530094656],[-0.5913609287638117,44.80797634404888],[-0.5913598799122404,44.80823166939641],[-0.5913142621860418,44.8089740336309],[-0.59129860866703,44.809352421551786],[-0.5912978182357062,44.809603775083744],[-0.5912922195264352,44.80981654518834],[-0.5912520546581699,44.81011634475008]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Cours de la Libération"},"geometry":{"type":"LineString","coordinates":[[-0.5933681929699226,44.802659092840265],[-0.5929742433737365,44.803628480598185]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue de Tremeuge"},"geometry":{"type":"LineString","coordinates":[[-0.5929742433737365,44.803628480598185],[-0.5926428126483259,44.803556705180576],[-0.5921218055751118,44.80346029306825]]}},{"type":"Feature","properties":{"nom":"Cours de la Libération"},"geometry":{"type":"LineString","coordinates":[[-0.5929742433737365,44.803628480598185],[-0.5926887131867463,44.804341941868636]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue du Général Sarrail"},"geometry":{"type":"LineString","coordinates":[[-0.587860065877693,44.79886460859568],[-0.5878226089338402,44.7988299376929],[-0.5877730627359907,44.798814475270966],[-0.5874940924930621,44.79876580341441]]}},{"type":"Feature","properties":{"nom":"Rue du Général Sarrail"},"geometry":{"type":"LineString","coordinates":[[-0.587860065877693,44.79886460859568],[-0.5877814769738232,44.798864295342476],[-0.5876659685007506,44.798880640791104],[-0.5874301042376504,44.79893303199433]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Blaise Pascal"},"geometry":{"type":"LineString","coordinates":[[-0.6324753154092333,44.79809439571101],[-0.6324122003337981,44.79782561889528],[-0.6323443220543825,44.79772220840872],[-0.6321897311485453,44.79761003666069]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Bougnard"},"geometry":{"type":"LineString","coordinates":[[-0.6321897311485453,44.79761003666069],[-0.6321758318754092,44.79734121927321]]}},{"type":"Feature","properties":{"nom":"Rue du Pont de Chiquet"},"geometry":{"type":"LineString","coordinates":[[-0.6242393931306023,44.80716894678864],[-0.624213976538619,44.80713779162566],[-0.6241864102516906,44.80712200451378],[-0.6241642196396385,44.80710919903593],[-0.623740383983217,44.806959471475096],[-0.6236435928320284,44.806901298311644]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de Chiquet"},"geometry":{"type":"LineString","coordinates":[[-0.6236435928320284,44.806901298311644],[-0.6226363449300576,44.80618073546984]]}},{"type":"Feature","properties":{"nom":"Avenue de Candau"},"geometry":{"type":"LineString","coordinates":[[-0.6236435928320284,44.806901298311644],[-0.6233650667962933,44.80716889130704]]}},{"type":"Feature","properties":{"nom":"Rue François Mitterrand"},"geometry":{"type":"LineString","coordinates":[[-0.6012665955153395,44.80519957824972],[-0.6036159512370042,44.80457764572556],[-0.6036623771838412,44.80455518553956],[-0.6037022191099721,44.804528609979336],[-0.6037277736859025,44.80449816312676],[-0.6037433263291937,44.80446560094496],[-0.6039291014783689,44.803988312301755],[-0.603936893684687,44.80394698772371],[-0.6039275725233191,44.80389908888381],[-0.6037883598926465,44.803629468683006]]}},{"type":"Feature","properties":{"nom":"Avenue des Arts Et Metiers"},"geometry":{"type":"LineString","coordinates":[[-0.6012665955153395,44.80519957824972],[-0.6009801384404047,44.80465094733964],[-0.600955876153085,44.80460892631881],[-0.6009256674504355,44.80457096710187],[-0.6008591839170515,44.804523526585875],[-0.6007471674791848,44.80446221351912]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Voie 2 Faculté des Sciences"},"geometry":{"type":"LineString","coordinates":[[-0.5951234192899467,44.80810890524155],[-0.5951433313396866,44.808109627117844],[-0.5951857012991568,44.80810522513437],[-0.5952260705730569,44.808095121116175],[-0.5952629404614367,44.80807963268061],[-0.5952946971936125,44.80805926125106],[-0.5952993982979592,44.80805550937134]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Voie 1 Faculté des Sciences"},"geometry":{"type":"LineString","coordinates":[[-0.5952993982979592,44.80805550937134],[-0.5957916772073627,44.80794446111475],[-0.5977172695857862,44.80742792452227]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Voie 1 Faculté des Sciences"},"geometry":{"type":"LineString","coordinates":[[-0.5921882974571633,44.80894562386988],[-0.5921641751785341,44.80894638565836],[-0.5921304510027753,44.80895348616225],[-0.592100105254654,44.80896606504779],[-0.5920747461435735,44.80898353104136],[-0.592062101007606,44.808997893070945]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Voie 2 Faculté des Sciences"},"geometry":{"type":"LineString","coordinates":[[-0.592062101007606,44.808997893070945],[-0.591431092111132,44.809155283153466]]}},{"type":"Feature","properties":{"nom":"Voie 1 Faculté des Sciences"},"geometry":{"type":"LineString","coordinates":[[-0.592062101007606,44.808997893070945],[-0.5920560745649794,44.80900474944799],[-0.5920450280480412,44.809028519599096],[-0.5920424066246759,44.809053465004695],[-0.5920481262695825,44.80907823708883],[-0.5920620861449233,44.809101217559316]]}},{"type":"Feature","properties":{"nom":"Esplanade du 8 Mai 1945"},"geometry":{"type":"LineString","coordinates":[[-0.588214814102791,44.809443166299296],[-0.5880106565638757,44.80968237757569],[-0.5879808132003606,44.80970304683394],[-0.5879394087743228,44.80971282052969],[-0.5878922305646256,44.80971115578071],[-0.5878528898809628,44.809701226527025],[-0.587258968721268,44.80943205713267]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Esplanade du 8 Mai 1945"},"geometry":{"type":"LineString","coordinates":[[-0.588214814102791,44.809443166299296],[-0.588373883302409,44.8094493184656],[-0.5884052365925718,44.809442744302494]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue du Professeur Arnozan"},"geometry":{"type":"LineString","coordinates":[[-0.587258968721268,44.80943205713267],[-0.5869946792994337,44.809725860605276],[-0.5869553984093602,44.80975349323368],[-0.5862566885838594,44.810043427025995],[-0.586101036755573,44.81007391743919]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue du Professeur Arnozan"},"geometry":{"type":"LineString","coordinates":[[-0.5881968501730691,44.80882730336783],[-0.5881915726533976,44.80880350809471],[-0.5881709789856449,44.80876947624122],[-0.5881395344612194,44.808740020517845],[-0.5880991079476455,44.80871670343523],[-0.5880525730551078,44.80870096572785]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Esplanade du 8 Mai 1945"},"geometry":{"type":"LineString","coordinates":[[-0.58832341738245,44.80933182236562],[-0.588214814102791,44.809443166299296]]}},{"type":"Feature","properties":{"nom":"Esplanade du 8 Mai 1945"},"geometry":{"type":"LineString","coordinates":[[-0.58832341738245,44.80933182236562],[-0.5884433216987119,44.8093329041959]]}},{"type":"Feature","properties":{"nom":"Rue Jean Grousset"},"geometry":{"type":"LineString","coordinates":[[-0.5806814180138815,44.79511636493524],[-0.5812455094831308,44.79524426406048],[-0.5813456481642605,44.795235165102824]]}},{"type":"Feature","properties":{"nom":"Chemin de Leysotte"},"geometry":{"type":"LineString","coordinates":[[-0.5806814180138815,44.79511636493524],[-0.5806043656541814,44.795242563083505],[-0.5799400704288935,44.796031422002244]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Henry de Montherlant"},"geometry":{"type":"LineString","coordinates":[[-0.5813456481642605,44.795235165102824],[-0.5814020732661829,44.79509871614635],[-0.5814178892816545,44.79459772472216],[-0.5814796208099137,44.794428589117054],[-0.5818017654633052,44.79409946398881]]}},{"type":"Feature","properties":{"nom":"Rue Léon Jouhaux"},"geometry":{"type":"LineString","coordinates":[[-0.5813456481642605,44.795235165102824],[-0.5814070565054914,44.79515449987575],[-0.5814590044536805,44.79513538803406],[-0.5815268367652134,44.7951337021418],[-0.5816037171448818,44.79510659847528],[-0.5823002342521046,44.79475135758907],[-0.5823949811105213,44.79467585719096],[-0.5825727753321275,44.79448928213151]]}},{"type":"Feature","properties":{"nom":"Avenue Pasteur"},"geometry":{"type":"LineString","coordinates":[[-0.6309973778869389,44.806155553294545],[-0.6311754385788592,44.80612572631919]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Place de la Cinquième République"},"geometry":{"type":"LineString","coordinates":[[-0.6311754385788592,44.80612572631919],[-0.6309416636166261,44.80546791955571]]}},{"type":"Feature","properties":{"nom":"Avenue des Deux Ponts"},"geometry":{"type":"LineString","coordinates":[[-0.6209176256124728,44.80151418988168],[-0.6193901306760591,44.8013866079945]]}},{"type":"Feature","properties":{"nom":"Avenue des Chasseurs"},"geometry":{"type":"LineString","coordinates":[[-0.6209176256124728,44.80151418988168],[-0.6210805999159307,44.80051916368715]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Henri Dunant"},"geometry":{"type":"LineString","coordinates":[[-0.6182464372634308,44.80245301211074],[-0.6181932316981493,44.80232903850005],[-0.6181629346302326,44.80228378958777],[-0.6181110438310794,44.802255352533635],[-0.6180417737508069,44.80224233207226],[-0.6179611440555854,44.80224588792956],[-0.6178877662049538,44.80226822062627],[-0.6175403009299302,44.80250997641841],[-0.6173187328141713,44.802632780677655]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Herman Lemoine"},"geometry":{"type":"LineString","coordinates":[[-0.6308833205895168,44.80716534165337],[-0.631075393174946,44.807574857356464]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue François Coppée"},"geometry":{"type":"LineString","coordinates":[[-0.631075393174946,44.807574857356464],[-0.6303581801530276,44.807816474705625]]}},{"type":"Feature","properties":{"nom":"Rue Herman Lemoine"},"geometry":{"type":"LineString","coordinates":[[-0.6306339972617606,44.808185392863834],[-0.6306906246377165,44.808272768398595],[-0.6308268009744906,44.80857434652392]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Pierre Curie"},"geometry":{"type":"LineString","coordinates":[[-0.6306339972617606,44.808185392863834],[-0.6303581801530276,44.807816474705625]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Nancel Pénard"},"geometry":{"type":"LineString","coordinates":[[-0.6308268009744906,44.80857434652392],[-0.6310360631124109,44.80852343532635],[-0.6311894296243841,44.80850124324869],[-0.6312670798827145,44.808500475910186],[-0.6313472792120202,44.808506023097124],[-0.6314882678486665,44.808546473775664],[-0.6316046141759817,44.8085995120527],[-0.6318755916354046,44.80876490225784]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Herman Lemoine"},"geometry":{"type":"LineString","coordinates":[[-0.6311664048647538,44.8079710236816],[-0.6311640363388192,44.80790128425703],[-0.6311673870528454,44.8078158678148],[-0.6311613664021591,44.807774531331326],[-0.6311429926012534,44.807719896454806],[-0.631075393174946,44.807574857356464]]}},{"type":"Feature","properties":{"nom":"Rue Herman Lemoine"},"geometry":{"type":"LineString","coordinates":[[-0.6311664048647538,44.8079710236816],[-0.6310948359874182,44.80803015138066],[-0.6309440649781628,44.80807946585717],[-0.6306339972617606,44.808185392863834]]}},{"type":"Feature","properties":{"nom":"Rue Jean Monnet"},"geometry":{"type":"LineString","coordinates":[[-0.6311664048647538,44.8079710236816],[-0.6312183966845824,44.80798882200619],[-0.6312693929276687,44.80800286856623],[-0.6313261832264202,44.80801447802858],[-0.631400662567728,44.80801561348974],[-0.6322953326742453,44.807865072908555]]}},{"type":"Feature","properties":{"nom":"Allée Georges Brassens"},"geometry":{"type":"LineString","coordinates":[[-0.6081304002606294,44.8076860611186],[-0.6081203400511479,44.80767493972986],[-0.6081173224089411,44.80761864363496],[-0.6081256461982065,44.807600002705456],[-0.6081467923460471,44.80759617902009],[-0.6083023348352704,44.80759250600897],[-0.6083608681400925,44.807601729324546]]}},{"type":"Feature","properties":{"nom":"Allée Georges Brassens"},"geometry":{"type":"LineString","coordinates":[[-0.6083608681400925,44.807601729324546],[-0.608304246659037,44.80764730577728],[-0.6082279955581746,44.80768656852333],[-0.6081579717035079,44.807689870813746],[-0.6081304002606294,44.8076860611186]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Marc Desbats"},"geometry":{"type":"LineString","coordinates":[[-0.618594700473303,44.80386687048051],[-0.6192476310239643,44.803967887880596],[-0.6194472370006355,44.80398297581156],[-0.6195972048874813,44.80398135618289],[-0.6197281520693905,44.8039730449495],[-0.6198124150619269,44.80396081435652]]}},{"type":"Feature","properties":{"nom":"Rue Louis Armand"},"geometry":{"type":"LineString","coordinates":[[-0.618594700473303,44.80386687048051],[-0.618595492450848,44.80392584986956],[-0.618735329903082,44.80433127996516],[-0.6187065175775098,44.80437219367516]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Louis Armand"},"geometry":{"type":"LineString","coordinates":[[-0.6187065175775098,44.80437219367516],[-0.6185796463020825,44.804534146268935],[-0.6186917202843472,44.804934694390035],[-0.6188697461705239,44.80524089870388]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Henri Dunant"},"geometry":{"type":"LineString","coordinates":[[-0.6181716384499761,44.802999044575934],[-0.6183351803731513,44.802723862034924],[-0.6182464372634308,44.80245301211074]]}},{"type":"Feature","properties":{"nom":"Rue Louis Braille"},"geometry":{"type":"LineString","coordinates":[[-0.6181716384499761,44.802999044575934],[-0.6190864475974243,44.80327892452546],[-0.6191427807609999,44.80330352639809],[-0.6191935018189553,44.803440280460485]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Léon Duguit"},"geometry":{"type":"LineString","coordinates":[[-0.6155228591083164,44.798835583950826],[-0.6153042674900776,44.79887253079592],[-0.6144839948647209,44.799098138127405],[-0.6130188090616121,44.79948701121046]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Allée Ausone"},"geometry":{"type":"LineString","coordinates":[[-0.6155228591083164,44.798835583950826],[-0.6152654804808804,44.798364973747326],[-0.6150089132604547,44.79789109428041],[-0.6148726813755127,44.797617157607036]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Léon Duguit"},"geometry":{"type":"LineString","coordinates":[[-0.6130188090616121,44.79948701121046],[-0.6121891942954869,44.79974956201924],[-0.6120769482267334,44.799787628886115],[-0.6120152747744724,44.79979481247025],[-0.6119466999963092,44.79978473909176],[-0.6119155669364443,44.79976239634537],[-0.6116085694985325,44.79923245844444],[-0.6115908033336732,44.79921545644587],[-0.6115625504020434,44.79920878668436],[-0.6115382273318947,44.79920829793205],[-0.6115097414434093,44.799214067013764],[-0.6114853060383519,44.79922592319244],[-0.6103173890921755,44.80012933307853],[-0.6098102949794868,44.80054386642339],[-0.6096747182570297,44.80062564089148],[-0.6095588933797128,44.80069147420939]]}},{"type":"Feature","properties":{"nom":"Rue du 11 Novembre"},"geometry":{"type":"LineString","coordinates":[[-0.6208364325521509,44.811430275159225],[-0.6206044790784373,44.81189789414409],[-0.6205962854832917,44.81193265686024],[-0.6205937352908419,44.811972644954544],[-0.6206014743999353,44.812005188967795],[-0.6217658448298949,44.81397031605175]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue du Vallon"},"geometry":{"type":"LineString","coordinates":[[-0.6208364325521509,44.811430275159225],[-0.6220677986690202,44.813720449606464]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de la Paillère"},"geometry":{"type":"LineString","coordinates":[[-0.6086453402267731,44.796098491349674],[-0.6085877055614487,44.79609131192823]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de la Paillère"},"geometry":{"type":"LineString","coordinates":[[-0.6086453402267731,44.796098491349674],[-0.6089309237750757,44.79614960414153],[-0.6092201768736885,44.796194654296194],[-0.6093296767989641,44.79621991546355]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue du Relais"},"geometry":{"type":"LineString","coordinates":[[-0.6085877055614487,44.79609131192823],[-0.6083034349545852,44.79554163781109]]}},{"type":"Feature","properties":{"nom":"Avenue de la Paillère"},"geometry":{"type":"LineString","coordinates":[[-0.6085877055614487,44.79609131192823],[-0.6081092980994777,44.79606018908337]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de Gradignan"},"geometry":{"type":"LineString","coordinates":[[-0.6243497290246917,44.79999677088432],[-0.6243970870013743,44.80008390397228]]}},{"type":"Feature","properties":{"nom":"Avenue de l'Armistice"},"geometry":{"type":"LineString","coordinates":[[-0.6243497290246917,44.79999677088432],[-0.6232012006720995,44.8003703697135]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Brémontier"},"geometry":{"type":"LineString","coordinates":[[-0.6243970870013743,44.80008390397228],[-0.6286027052433694,44.800164557580324]]}},{"type":"Feature","properties":{"nom":"Avenue de Gradignan"},"geometry":{"type":"LineString","coordinates":[[-0.6243970870013743,44.80008390397228],[-0.6245693022808264,44.80051478083818],[-0.6248167158546375,44.80108108882604]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue François Rabelais"},"geometry":{"type":"LineString","coordinates":[[-0.5978580732608683,44.79681376542394],[-0.5975387306824177,44.7967081121789],[-0.5972938299217984,44.796635685873376],[-0.5970455231811215,44.796569492389416],[-0.5967940685367388,44.79650961362468],[-0.5965398559308785,44.796456217386655],[-0.5962829133280477,44.79640975318296],[-0.5958938856143271,44.796351070038696],[-0.5957169283102807,44.79632937035617]]}},{"type":"Feature","properties":{"nom":"Rue Fenelon"},"geometry":{"type":"LineString","coordinates":[[-0.5978580732608683,44.79681376542394],[-0.5977397996493297,44.7969742505215]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Frédéric Sevene"},"geometry":{"type":"LineString","coordinates":[[-0.5828735045100534,44.80483162648224],[-0.5824016378533508,44.8046561473278]]}},{"type":"Feature","properties":{"nom":"Résidence Coppelia"},"geometry":{"type":"LineString","coordinates":[[-0.5824016378533508,44.8046561473278],[-0.5829089660054215,44.80374908018679],[-0.582903258633229,44.80370611090439],[-0.5823466062177725,44.80347330833263]]}},{"type":"Feature","properties":{"nom":"Rue Frédéric Sevene"},"geometry":{"type":"LineString","coordinates":[[-0.5824016378533508,44.8046561473278],[-0.58174436688198,44.80442101575134],[-0.5813624680708289,44.80427602942861]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de Brivazac"},"geometry":{"type":"LineString","coordinates":[[-0.6182176013896765,44.80773911700815],[-0.6172808617504135,44.80516892842583],[-0.617199029463869,44.805092888259615]]}},{"type":"Feature","properties":{"nom":"Avenue de Candau"},"geometry":{"type":"LineString","coordinates":[[-0.6182176013896765,44.80773911700815],[-0.6180447855913631,44.80774380343511],[-0.6178696202248375,44.807755410659645],[-0.6177372086172762,44.807766738795095],[-0.6176193463973825,44.807780036280654],[-0.6174045816680589,44.80780992796342],[-0.6171814706695877,44.8078499938077],[-0.6170217073769195,44.807881198466156]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de Candau"},"geometry":{"type":"LineString","coordinates":[[-0.6170217073769195,44.807881198466156],[-0.615993843363658,44.808079542423435]]}},{"type":"Feature","properties":{"nom":"Rue du Bas-Brion"},"geometry":{"type":"LineString","coordinates":[[-0.6170217073769195,44.807881198466156],[-0.6170590958455054,44.807989010215174],[-0.6173561572583983,44.808381244432795],[-0.6176221330863448,44.808862838302616],[-0.6177472367798235,44.8092290114272]]}},{"type":"Feature","properties":{"nom":"Avenue de Candau"},"geometry":{"type":"LineString","coordinates":[[-0.6081571627327063,44.80861901020956],[-0.6079841940339353,44.80861927204642],[-0.6075546169061771,44.80865830059767],[-0.6068208514468201,44.808679498308685],[-0.6061346070944351,44.80882313845703],[-0.6058105533287731,44.80886602147036]]}},{"type":"Feature","properties":{"nom":"Rue de Peybouquey"},"geometry":{"type":"LineString","coordinates":[[-0.6081571627327063,44.80861901020956],[-0.6082347158446524,44.80920497076243]]}},{"type":"Feature","properties":{"nom":"Allée du Baron Sarget"},"geometry":{"type":"LineString","coordinates":[[-0.6081571627327063,44.80861901020956],[-0.608112945028603,44.808422050582635],[-0.6081246474862915,44.808226920418235],[-0.6081205669977053,44.80817588284182],[-0.6080748822995544,44.807963565585]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Pierre Wiehn"},"geometry":{"type":"LineString","coordinates":[[-0.6308126080649018,44.79835630695447],[-0.6308370291801229,44.798442728590366],[-0.6309016010460454,44.79909233469294],[-0.6309348584462041,44.79934918338002],[-0.63095750505447,44.79939737595474],[-0.6310068594694284,44.79942967178872]]}},{"type":"Feature","properties":{"nom":"Avenue Aristide Briand"},"geometry":{"type":"LineString","coordinates":[[-0.6308126080649018,44.79835630695447],[-0.6271881635251993,44.798497818255925],[-0.6271351822596878,44.79853653249432],[-0.6270247250366625,44.79947566576465]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Raymond Poincaré"},"geometry":{"type":"LineString","coordinates":[[-0.6270247250366625,44.79947566576465],[-0.6254249678062518,44.79940560197039],[-0.6253323561851043,44.79940567155491],[-0.6252628069394983,44.79941635645798]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de l'Armistice"},"geometry":{"type":"LineString","coordinates":[[-0.6232012006720995,44.8003703697135],[-0.6230746515274989,44.80038007653527],[-0.6221299012503636,44.80037440640367]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Pierre Corneille"},"geometry":{"type":"LineString","coordinates":[[-0.6232012006720995,44.8003703697135],[-0.6224215481183756,44.79934951528238],[-0.6223351685152967,44.7992937122823],[-0.6213004097149313,44.79914595828795]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de l'Armistice"},"geometry":{"type":"LineString","coordinates":[[-0.6221299012503636,44.80037440640367],[-0.621319849440657,44.80036588083269]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Place de la Rotonde"},"geometry":{"type":"LineString","coordinates":[[-0.621319849440657,44.80036588083269],[-0.6213186695944687,44.800341055352014],[-0.6213114060205586,44.800316063253675],[-0.6212985166110381,44.80029215112416],[-0.6212804253703502,44.8002700261308],[-0.6212575506546714,44.80025030553417],[-0.6212305520699511,44.80023341874604],[-0.6212000948648919,44.80021988508263],[-0.6211669536217501,44.80020995012894],[-0.6211277020072631,44.80020345272752]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Allée des Roses du Haut-Brion"},"geometry":{"type":"LineString","coordinates":[[-0.6226363449300576,44.80618073546984],[-0.6219867823531581,44.806820565912034],[-0.6219414548120491,44.80699334807181],[-0.6219974203338794,44.807096603254664]]}},{"type":"Feature","properties":{"nom":"Avenue de Chiquet"},"geometry":{"type":"LineString","coordinates":[[-0.6226363449300576,44.80618073546984],[-0.6225543114140023,44.806113713653644],[-0.6225024468729391,44.80605356820456]]}},{"type":"Feature","properties":{"nom":"Place de la Cinquième République"},"geometry":{"type":"LineString","coordinates":[[-0.6307163518160297,44.8053924150303],[-0.6309416133724075,44.80606804888352]]}},{"type":"Feature","properties":{"nom":"Rue du Chanoine Dufraisse"},"geometry":{"type":"LineString","coordinates":[[-0.6307163518160297,44.8053924150303],[-0.6300931266018449,44.80559094399586],[-0.6298412361821026,44.80565600613529]]}},{"type":"Feature","properties":{"nom":"Place de la Cinquième République"},"geometry":{"type":"LineString","coordinates":[[-0.6307163518160297,44.8053924150303],[-0.6307088981800342,44.80529617307907],[-0.6306521263403831,44.80514015827631]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue du Colonel Picot"},"geometry":{"type":"LineString","coordinates":[[-0.6124134883332674,44.8052897517341],[-0.614133694372727,44.80488918499556]]}},{"type":"Feature","properties":{"nom":"Avenue Fanning Lafontaine"},"geometry":{"type":"LineString","coordinates":[[-0.6124134883332674,44.8052897517341],[-0.6120315589483181,44.804418707609955]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Phenix Haut-Brion"},"geometry":{"type":"LineString","coordinates":[[-0.614133694372727,44.80488918499556],[-0.6145145899145501,44.80572097974112]]}},{"type":"Feature","properties":{"nom":"Impasse du Colonel René Fonck"},"geometry":{"type":"LineString","coordinates":[[-0.6303966248624713,44.809837360339436],[-0.6303509051251266,44.809661984916325],[-0.630309504474032,44.80962952480249],[-0.6301869250232973,44.809594070291]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Cours de la Libération"},"geometry":{"type":"LineString","coordinates":[[-0.591273267525887,44.81043447493098],[-0.5912467317430934,44.81042900696891],[-0.5912083993093299,44.810427154382694],[-0.5911704477705335,44.81043141532778],[-0.5911565152469914,44.810435278298364]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Cours de la Libération"},"geometry":{"type":"LineString","coordinates":[[-0.5911550088205666,44.81066296284028],[-0.5911852801766597,44.81066948395665],[-0.5912236127698668,44.81067133655116],[-0.5912464814650292,44.810668722841385]]}},{"type":"Feature","properties":{"nom":"Cours de la Libération"},"geometry":{"type":"LineString","coordinates":[[-0.5911550088205666,44.81066296284028],[-0.5911565033885516,44.81075804214991],[-0.5911321498354094,44.81101509401335],[-0.5910434441448559,44.811405156485975],[-0.5909977016778092,44.81150578068215],[-0.5909497422039967,44.81160332197381],[-0.590722824530259,44.812456263784824],[-0.5906903391271844,44.81254016451701]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Cours Gambetta"},"geometry":{"type":"LineString","coordinates":[[-0.5906903391271844,44.81254016451701],[-0.590662354809472,44.81255005603101],[-0.5906305746531598,44.812568084639544],[-0.5906046318310939,44.812590433078],[-0.590587153787817,44.81261458620894]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Cours Gambetta"},"geometry":{"type":"LineString","coordinates":[[-0.590587153787817,44.81261458620894],[-0.5905859859703673,44.812616154461374],[-0.590575069480945,44.81264406408083],[-0.5905726936862072,44.81267296526501],[-0.5905786538849247,44.812701603330616],[-0.5905929979854905,44.812728715618526],[-0.590615027273328,44.81275324319808]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Maréchal de Lattre de Tassigny"},"geometry":{"type":"LineString","coordinates":[[-0.590587153787817,44.81261458620894],[-0.5905358480089682,44.812607647851706],[-0.5904893317149522,44.8125922707685],[-0.5893594529373799,44.81248406737403]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue du Lycée"},"geometry":{"type":"LineString","coordinates":[[-0.5941101284050473,44.803090834537365],[-0.594810758112071,44.80352351693588]]}},{"type":"Feature","properties":{"nom":"Avenue du Château"},"geometry":{"type":"LineString","coordinates":[[-0.5941101284050473,44.803090834537365],[-0.5958868153279412,44.801686235444606]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Alfred Charlionnet"},"geometry":{"type":"LineString","coordinates":[[-0.594810758112071,44.80352351693588],[-0.5971281849445176,44.80254005614149]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue du Lycée"},"geometry":{"type":"LineString","coordinates":[[-0.594810758112071,44.80352351693588],[-0.595640292336261,44.80404274296636],[-0.5956951221808845,44.80408803249884]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Brémontier"},"geometry":{"type":"LineString","coordinates":[[-0.6286027052433694,44.800164557580324],[-0.6297496433576556,44.80021038452647],[-0.6297867719500068,44.800217307080665],[-0.6298109667242544,44.80023383098723],[-0.6298237272753545,44.80025162066945],[-0.6298294413672663,44.80027404936201],[-0.6297793136039866,44.800651479411094],[-0.6297668851998197,44.80069322459682]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue des Charmilles"},"geometry":{"type":"LineString","coordinates":[[-0.6297668851998197,44.80069322459682],[-0.6296945247448813,44.80117775324009],[-0.6296479257059912,44.80120932846217],[-0.628473035099161,44.801135835085994]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Azam"},"geometry":{"type":"LineString","coordinates":[[-0.6297668851998197,44.80069322459682],[-0.6285498687749147,44.80061567178153]]}},{"type":"Feature","properties":{"nom":"Rue de Chenevière"},"geometry":{"type":"LineString","coordinates":[[-0.6283827483430332,44.801882537913045],[-0.628473035099161,44.801135835085994]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue de Chenevière"},"geometry":{"type":"LineString","coordinates":[[-0.628473035099161,44.801135835085994],[-0.6285498687749147,44.80061567178153]]}},{"type":"Feature","properties":{"nom":"Avenue des Charmilles"},"geometry":{"type":"LineString","coordinates":[[-0.628473035099161,44.801135835085994],[-0.6267055904211111,44.801112215789686]]}},{"type":"Feature","properties":{"nom":"Avenue Bitaly"},"geometry":{"type":"LineString","coordinates":[[-0.6321758318754092,44.79734121927321],[-0.630737406271222,44.797443454373465]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Bougnard"},"geometry":{"type":"LineString","coordinates":[[-0.6321758318754092,44.79734121927321],[-0.6321856700625847,44.797264423666846],[-0.6322105865270966,44.79718597537696]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Ernest Renan"},"geometry":{"type":"LineString","coordinates":[[-0.6322105865270966,44.79718597537696],[-0.6344272758899904,44.797052365539315],[-0.6347527507738805,44.79694503264647]]}},{"type":"Feature","properties":{"nom":"Avenue Bougnard"},"geometry":{"type":"LineString","coordinates":[[-0.6322105865270966,44.79718597537696],[-0.6322505699848869,44.79705749959577],[-0.6327736574192151,44.79601022880757]]}},{"type":"Feature","properties":{"nom":"Avenue Jean Jaurès"},"geometry":{"type":"LineString","coordinates":[[-0.6180778051564332,44.81154192413539],[-0.6193323930943462,44.811126185161505]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue de Carles"},"geometry":{"type":"LineString","coordinates":[[-0.6180778051564332,44.81154192413539],[-0.6175045797927119,44.81063130724919]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Jean Jaurès"},"geometry":{"type":"LineString","coordinates":[[-0.6193323930943462,44.811126185161505],[-0.6194675806402434,44.811102515753376],[-0.619752120584885,44.81097040770494],[-0.6198349122372658,44.81088219392614]]}},{"type":"Feature","properties":{"nom":"Rue du Bas-Brion"},"geometry":{"type":"LineString","coordinates":[[-0.6193323930943462,44.811126185161505],[-0.6192838733498268,44.81108304764549],[-0.6184989583193068,44.81034843710847]]}},{"type":"Feature","properties":{"nom":"Avenue Jean Jaurès"},"geometry":{"type":"LineString","coordinates":[[-0.6198349122372658,44.81088219392614],[-0.6197183112795247,44.810891489590595],[-0.6193681410392823,44.811054602582765],[-0.6193323930943462,44.811126185161505]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Jean Jaurès"},"geometry":{"type":"LineString","coordinates":[[-0.6198349122372658,44.81088219392614],[-0.6199400407258951,44.810830217920476]]}},{"type":"Feature","properties":{"nom":"Rue Auguste Renoir"},"geometry":{"type":"LineString","coordinates":[[-0.6060638161924718,44.79663106410612],[-0.6060509589422991,44.796716780202075],[-0.6060755109616408,44.79676140340056],[-0.6062731049713567,44.796886388278814]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Auguste Renoir"},"geometry":{"type":"LineString","coordinates":[[-0.6060638161924718,44.79663106410612],[-0.6059079132524073,44.79656781491607]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Vincent Van Gogh"},"geometry":{"type":"LineString","coordinates":[[-0.6062731049713567,44.796886388278814],[-0.6062384746510979,44.796935500567905],[-0.6060646683392302,44.79706947001512],[-0.6060515855655876,44.79710303532343],[-0.6062054888302197,44.797205083374266],[-0.6062420038829148,44.7972346436974],[-0.6062516361617374,44.79727334410128],[-0.6062007210507739,44.797310901675424]]}},{"type":"Feature","properties":{"nom":"Rue Edgar Degas"},"geometry":{"type":"LineString","coordinates":[[-0.6062731049713567,44.796886388278814],[-0.6064614523655365,44.79674421021824],[-0.6065516739068227,44.7967383762709],[-0.6067464333318602,44.796872638699845],[-0.6066713039284501,44.79693366533655]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Allée Ausone"},"geometry":{"type":"LineString","coordinates":[[-0.6159351826868764,44.79963016129116],[-0.6156499588352282,44.79908485727348],[-0.6155228591083164,44.798835583950826]]}},{"type":"Feature","properties":{"nom":"Allée Paul Pascal"},"geometry":{"type":"LineString","coordinates":[[-0.6159351826868764,44.79963016129116],[-0.6148548850088098,44.7999222318196],[-0.6134612050310447,44.800307666080954]]}},{"type":"Feature","properties":{"nom":"Avenue de Candau"},"geometry":{"type":"LineString","coordinates":[[-0.6226144229930793,44.807611869660086],[-0.6224730517517213,44.807657810509525],[-0.622329571596123,44.80769435957245],[-0.6221842790811792,44.80771213871639],[-0.6207757593926647,44.80773671572647]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de Candau"},"geometry":{"type":"LineString","coordinates":[[-0.6207757593926647,44.80773671572647],[-0.6198157907617171,44.80774853275552]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Allée Georges Simenon"},"geometry":{"type":"LineString","coordinates":[[-0.6207757593926647,44.80773671572647],[-0.6208438246939155,44.80756726410974],[-0.6208753055605339,44.807510410245456],[-0.6211193583536668,44.80726995538044],[-0.6210701817858093,44.80721431798189],[-0.6210431820372987,44.807195449262856]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de Breuil"},"geometry":{"type":"LineString","coordinates":[[-0.5958868153279412,44.801686235444606],[-0.5971281849445176,44.80254005614149]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue du Parc des Sports"},"geometry":{"type":"LineString","coordinates":[[-0.6309737197054233,44.80456056167586],[-0.6309691985118024,44.80450485396512],[-0.6307358512522636,44.8037873977151]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Boulevard Saint Martin"},"geometry":{"type":"LineString","coordinates":[[-0.6307358512522636,44.8037873977151],[-0.6314561092610305,44.80373152224987],[-0.6316085245585873,44.80376674305387]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Fanning Lafontaine"},"geometry":{"type":"LineString","coordinates":[[-0.6137095978648442,44.80830933152997],[-0.6137000929088473,44.80821423555608],[-0.6127699290240495,44.80610926622104]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de Candau"},"geometry":{"type":"LineString","coordinates":[[-0.6137095978648442,44.80830933152997],[-0.6114962642955332,44.80822504568887],[-0.6112784149081802,44.808223944986764],[-0.6110810559583879,44.80826309100258],[-0.6107818220617072,44.80833645919468],[-0.6105426687780775,44.80842152201208],[-0.6103927881971604,44.80848330192842]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Fanning Lafontaine"},"geometry":{"type":"LineString","coordinates":[[-0.6127699290240495,44.80610926622104],[-0.6125250585888145,44.8055516828129]]}},{"type":"Feature","properties":{"nom":"Esplanade des Antilles"},"geometry":{"type":"LineString","coordinates":[[-0.6143089022443278,44.795925838115174],[-0.6162816263743869,44.79540521177599]]}},{"type":"Feature","properties":{"nom":"Avenue Jean Babin"},"geometry":{"type":"LineString","coordinates":[[-0.6143089022443278,44.795925838115174],[-0.6141607998750656,44.79618494001125]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Roger Cohé"},"geometry":{"type":"LineString","coordinates":[[-0.6322953326742453,44.807865072908555],[-0.6323687254836189,44.80800560234595],[-0.6323905696131303,44.80805102775719],[-0.6324014687974893,44.808087433957105]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Cours Lamartine"},"geometry":{"type":"LineString","coordinates":[[-0.6299514419578577,44.8049585728237],[-0.6309737197054233,44.80456056167586]]}},{"type":"Feature","properties":{"nom":"Rue Byron"},"geometry":{"type":"LineString","coordinates":[[-0.6299514419578577,44.8049585728237],[-0.6296198397404436,44.803868150264506]]}},{"type":"Feature","properties":{"nom":"Avenue du Poujeau"},"geometry":{"type":"LineString","coordinates":[[-0.6270343374935502,44.80807700681343],[-0.6262970044470864,44.80771351675207]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Jean Jaurès"},"geometry":{"type":"LineString","coordinates":[[-0.6262970044470864,44.80771351675207],[-0.627816776758649,44.806980587079366],[-0.628077623263275,44.80687588042583]]}},{"type":"Feature","properties":{"nom":"Avenue du Poujeau"},"geometry":{"type":"LineString","coordinates":[[-0.6281220146836525,44.80859624319518],[-0.6279863039801784,44.80854913404517],[-0.627804781448351,44.80844367027255],[-0.6270343374935502,44.80807700681343]]}},{"type":"Feature","properties":{"nom":"Avenue François Coppée"},"geometry":{"type":"LineString","coordinates":[[-0.6281220146836525,44.80859624319518],[-0.6282293320247212,44.80850588921426],[-0.6286706524024379,44.80836209049072]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue de l'Amiral Prouhet"},"geometry":{"type":"LineString","coordinates":[[-0.6270386649190198,44.803331257509726],[-0.6287231002914556,44.8030738482182],[-0.6287819529086899,44.80305323288457],[-0.628816560716313,44.803021984712565],[-0.6288258310307495,44.802995710832896],[-0.6288534679758239,44.80246991038936]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue du Cardinal"},"geometry":{"type":"LineString","coordinates":[[-0.6270386649190198,44.803331257509726],[-0.6270127358337537,44.80327993744292],[-0.6269061112833607,44.802572156871925],[-0.6269081382588043,44.80248142592167]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue du Cardinal"},"geometry":{"type":"LineString","coordinates":[[-0.6269081382588043,44.80248142592167],[-0.626912201111341,44.802431328490826],[-0.6268196929754306,44.80186600150498]]}},{"type":"Feature","properties":{"nom":"Avenue Denis Diderot"},"geometry":{"type":"LineString","coordinates":[[-0.6195687979613381,44.7969955702812],[-0.619632270141256,44.79706949042175],[-0.62000703560565,44.79721079353747],[-0.6204169498377229,44.79735773276919]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Albert Schweitzer"},"geometry":{"type":"LineString","coordinates":[[-0.6204169498377229,44.79735773276919],[-0.6199205615843131,44.79770954571217],[-0.6198341319574392,44.79778787682651],[-0.6197786949287285,44.797860086636454],[-0.6197420186573377,44.79791674542534]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Allée de la Boétie"},"geometry":{"type":"LineString","coordinates":[[-0.6134612050310447,44.800307666080954],[-0.6131061225000746,44.799654764639726],[-0.6130188090616121,44.79948701121046]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Raymond Boivin"},"geometry":{"type":"LineString","coordinates":[[-0.6207756796871756,44.802417021304976],[-0.6192614171451878,44.802438103692516]]}},{"type":"Feature","properties":{"nom":"Avenue des Chasseurs"},"geometry":{"type":"LineString","coordinates":[[-0.6207756796871756,44.802417021304976],[-0.6209176256124728,44.80151418988168]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Pey Berland"},"geometry":{"type":"LineString","coordinates":[[-0.6092841275076156,44.80081351866447],[-0.6090653389529017,44.80083334365167],[-0.6089749828407462,44.80082702247377],[-0.6088896288733325,44.80081369619789]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Pey Berland"},"geometry":{"type":"LineString","coordinates":[[-0.6092841275076156,44.80081351866447],[-0.6092872134389681,44.800824410846154],[-0.6092952706295212,44.80084397338659],[-0.6093076799333551,44.80086231681581],[-0.6093240400121736,44.80087909353607],[-0.6093439326374661,44.80089368623924],[-0.6093668414517708,44.80090593114398],[-0.6093768517601454,44.800910207684005]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Pey Berland"},"geometry":{"type":"LineString","coordinates":[[-0.6088896288733325,44.80081369619789],[-0.6085799584066818,44.800788479981314],[-0.6080043730763947,44.80067702210039],[-0.6074385571916169,44.80050327451889],[-0.6067595134788911,44.80015574212107]]}},{"type":"Feature","properties":{"nom":"Avenue Phenix Haut-Brion"},"geometry":{"type":"LineString","coordinates":[[-0.6137206908151805,44.804021385254835],[-0.614133694372727,44.80488918499556]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Esplanade des Antilles"},"geometry":{"type":"LineString","coordinates":[[-0.6195693809825837,44.79434475553062],[-0.6196800405722029,44.7945013115898]]}},{"type":"Feature","properties":{"nom":"Esplanade des Antilles"},"geometry":{"type":"LineString","coordinates":[[-0.6195693809825837,44.79434475553062],[-0.6214063507691692,44.793851257111]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Esplanade des Antilles"},"geometry":{"type":"LineString","coordinates":[[-0.6196800405722029,44.7945013115898],[-0.6214998958983052,44.794007185475536]]}},{"type":"Feature","properties":{"nom":"Allée Maine de Biran"},"geometry":{"type":"LineString","coordinates":[[-0.6196800405722029,44.7945013115898],[-0.6207090517644245,44.796434535973084]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Marc Desbats"},"geometry":{"type":"LineString","coordinates":[[-0.6177762813257962,44.80365923002183],[-0.618345051263509,44.803812475306586],[-0.618594700473303,44.80386687048051]]}},{"type":"Feature","properties":{"nom":"Rue Henri Dunant"},"geometry":{"type":"LineString","coordinates":[[-0.6177762813257962,44.80365923002183],[-0.6181716384499761,44.802999044575934]]}},{"type":"Feature","properties":{"nom":"Avenue du Maréchal Juin"},"geometry":{"type":"LineString","coordinates":[[-0.6293204244529603,44.79411999485734],[-0.6299894216177588,44.79420431001102],[-0.6300986751286143,44.79421550612817]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue du Maréchal Juin"},"geometry":{"type":"LineString","coordinates":[[-0.6300986751286143,44.79421550612817],[-0.6301554624670233,44.79422126038577],[-0.6302761572107939,44.79421524538567]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Rémi Belleau"},"geometry":{"type":"LineString","coordinates":[[-0.602782077306796,44.79565498770984],[-0.6009368419951288,44.79497610594576],[-0.6008332212950126,44.79496587468037],[-0.6007391107869555,44.794988402491136],[-0.6004554726115798,44.79519916794754]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Piste Cyclable Thouars"},"geometry":{"type":"LineString","coordinates":[[-0.5924110577336282,44.796670224070986],[-0.5924120055885662,44.79652299995097],[-0.5924389591219411,44.796194159508005]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Résidence Raba 2"},"geometry":{"type":"LineString","coordinates":[[-0.5924110577336282,44.796670224070986],[-0.5924878194613906,44.79667374462788]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue du Général Bordas"},"geometry":{"type":"LineString","coordinates":[[-0.5885653989972357,44.80106764762856],[-0.5877041787751051,44.80096663185932]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue du Général Margueritte"},"geometry":{"type":"LineString","coordinates":[[-0.5877041787751051,44.80096663185932],[-0.5879596389119017,44.8001921565681],[-0.5879684525217116,44.800179267056144],[-0.5879797101290751,44.80016702109408],[-0.5880356658461944,44.80012688090375]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue du Général Bordas"},"geometry":{"type":"LineString","coordinates":[[-0.5877041787751051,44.80096663185932],[-0.5867477686237127,44.800852667230565]]}},{"type":"Feature","properties":{"nom":"Rue du Général Percin"},"geometry":{"type":"LineString","coordinates":[[-0.5895090725482314,44.800385584844534],[-0.58992678783263,44.799169445830465]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue du Général Percin"},"geometry":{"type":"LineString","coordinates":[[-0.5895090725482314,44.800385584844534],[-0.5892428261966974,44.801140946932136]]}},{"type":"Feature","properties":{"nom":"Rue du Général Sarrail"},"geometry":{"type":"LineString","coordinates":[[-0.58992678783263,44.799169445830465],[-0.5892437059848279,44.799063900248946]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Voie 1 Faculté des Sciences"},"geometry":{"type":"LineString","coordinates":[[-0.5977172695857862,44.80742792452227],[-0.597874059368516,44.8074157438142],[-0.5979524659489079,44.80740810890347],[-0.5988915706544438,44.807154774322285]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Voie 1 Faculté des Sciences"},"geometry":{"type":"LineString","coordinates":[[-0.5977172695857862,44.80742792452227],[-0.597854529927741,44.80760179742024],[-0.5980661419872498,44.80799106177666]]}},{"type":"Feature","properties":{"nom":"Voie 1 Faculté des Sciences"},"geometry":{"type":"LineString","coordinates":[[-0.5977172695857862,44.80742792452227],[-0.5974342271774864,44.806883431617564]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Voie 1 Faculté des Sciences"},"geometry":{"type":"LineString","coordinates":[[-0.5988915706544438,44.807154774322285],[-0.5995847070439414,44.80697111145264],[-0.5996286700816077,44.80694502371109],[-0.5996391429552208,44.80691312145729],[-0.5996080759009443,44.806864276637434]]}},{"type":"Feature","properties":{"nom":"Voie 1 Faculté des Sciences"},"geometry":{"type":"LineString","coordinates":[[-0.5986420259585337,44.80668658521703],[-0.5988426315947495,44.807068947301644]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Voie 2 Faculté des Sciences"},"geometry":{"type":"LineString","coordinates":[[-0.5986420259585337,44.80668658521703],[-0.5986085122932912,44.80660098221495],[-0.5985102987368742,44.80659255893835],[-0.5974342271774864,44.806883431617564]]}},{"type":"Feature","properties":{"nom":"Voie 1 Faculté des Sciences"},"geometry":{"type":"LineString","coordinates":[[-0.5988426315947495,44.807068947301644],[-0.5978031134926304,44.807341223397415],[-0.5977510058625681,44.807378762978466],[-0.5977172695857862,44.80742792452227]]}},{"type":"Feature","properties":{"nom":"Voie 1 Faculté des Sciences"},"geometry":{"type":"LineString","coordinates":[[-0.5988426315947495,44.807068947301644],[-0.5988915706544438,44.807154774322285]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Cours de la Libération"},"geometry":{"type":"LineString","coordinates":[[-0.591431092111132,44.809155283153466],[-0.5914839063504418,44.80826441673125],[-0.5915018630781435,44.80803675315485],[-0.5914934469368046,44.80787730359128]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Voie 2 Faculté des Sciences"},"geometry":{"type":"LineString","coordinates":[[-0.6000262959420235,44.806251188302866],[-0.5999348309531958,44.80632245574727],[-0.5998900748003526,44.80634738377534],[-0.5998325830138282,44.80636694958399],[-0.5992828698886403,44.8065164069221],[-0.5989344322699931,44.8066063743094]]}},{"type":"Feature","properties":{"nom":"Avenue de l'Université"},"geometry":{"type":"LineString","coordinates":[[-0.6000262959420235,44.806251188302866],[-0.600060223085032,44.80627371606054],[-0.6000995468708117,44.806291478794876],[-0.6001424767978303,44.80630417284332],[-0.600171475528634,44.80630856983659]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Voie 2 Faculté des Sciences"},"geometry":{"type":"LineString","coordinates":[[-0.5989344322699931,44.8066063743094],[-0.5986420259585337,44.80668658521703]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Roul"},"geometry":{"type":"LineString","coordinates":[[-0.5943365232877257,44.806354562138054],[-0.5947896707780729,44.80624727667067],[-0.5953226814922169,44.806134221973636]]}},{"type":"Feature","properties":{"nom":"Impasse Roul"},"geometry":{"type":"LineString","coordinates":[[-0.5943365232877257,44.806354562138054],[-0.5942781595498954,44.8063033480999],[-0.5941898322559428,44.806282988130604],[-0.5938749719654605,44.80632707823243],[-0.5936575716898786,44.80631475967341]]}},{"type":"Feature","properties":{"nom":"Avenue Roul"},"geometry":{"type":"LineString","coordinates":[[-0.5943365232877257,44.806354562138054],[-0.5940634620328182,44.8064257077243],[-0.593749511142539,44.8064904875932],[-0.5933108051042018,44.80656154999093],[-0.592899132447576,44.80660347097803],[-0.5926728544520203,44.80664566032003],[-0.5923547711049446,44.80672335842478],[-0.5921605825632146,44.80675410074487],[-0.5919754450763087,44.806776336560645],[-0.5918630512275317,44.806781595907665]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Ernest Renan"},"geometry":{"type":"LineString","coordinates":[[-0.5953226814922169,44.806134221973636],[-0.5951509690186139,44.80529017486023]]}},{"type":"Feature","properties":{"nom":"Avenue Roul"},"geometry":{"type":"LineString","coordinates":[[-0.5953226814922169,44.806134221973636],[-0.5960323517262976,44.805982879768784],[-0.5961729812650408,44.805957264236206],[-0.5963748769008166,44.80593403532045]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Roger Chaumet"},"geometry":{"type":"LineString","coordinates":[[-0.6316085245585873,44.80376674305387],[-0.6317755599815049,44.803604212865146],[-0.631872080810827,44.80354356705513]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue du Relais"},"geometry":{"type":"LineString","coordinates":[[-0.6065960838034486,44.79514268204756],[-0.6075399926453159,44.79530020462924]]}},{"type":"Feature","properties":{"nom":"Résidence les Ombrages"},"geometry":{"type":"LineString","coordinates":[[-0.5898589085239744,44.79578531672493],[-0.5899479844179094,44.79503572498155],[-0.5913537011187363,44.79501395070779],[-0.5924129675978201,44.79487752946063]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rond-point de la Médaille Militaire"},"geometry":{"type":"LineString","coordinates":[[-0.6302761572107939,44.79421524538567],[-0.6302847239099877,44.79423677223508],[-0.6302978490150781,44.79425635188144],[-0.6303152913315477,44.794274172190185],[-0.6303365118563365,44.79428970986326],[-0.630360856647935,44.794302625438924],[-0.6303879299434385,44.79431266129845],[-0.6304168196130063,44.794319396138],[-0.6304296964116521,44.79432096689277]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rond-point de la Médaille Militaire"},"geometry":{"type":"LineString","coordinates":[[-0.6304296964116521,44.79432096689277],[-0.6304470149531787,44.794322756178836],[-0.6304773739582742,44.7943226877932],[-0.6305075121814364,44.79431911317031],[-0.6305362989393375,44.7943121584943],[-0.6309071398690205,44.7941820380093]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de Saige"},"geometry":{"type":"LineString","coordinates":[[-0.6304296964116521,44.79432096689277],[-0.6304058027417296,44.79447595354736],[-0.6303931736083461,44.79455265789623]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Esplanade Charles de Gaulle"},"geometry":{"type":"LineString","coordinates":[[-0.6318972150442006,44.80522787563589],[-0.631700007696165,44.80477699651276]]}},{"type":"Feature","properties":{"nom":"Rue des Poilus"},"geometry":{"type":"LineString","coordinates":[[-0.6318972150442006,44.80522787563589],[-0.6314907472446162,44.805315804114095],[-0.6312936765512386,44.805381281255926],[-0.6310311958108813,44.80544893631451],[-0.6309416636166261,44.80546791955571]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Eugène Et Marc Dulout"},"geometry":{"type":"LineString","coordinates":[[-0.631700007696165,44.80477699651276],[-0.6322121990324753,44.804561645228155]]}},{"type":"Feature","properties":{"nom":"Rond-point Plume la Poule"},"geometry":{"type":"LineString","coordinates":[[-0.5848152581641884,44.80002097670167],[-0.584823946514801,44.80001827063563],[-0.5848514384041558,44.80000461247142],[-0.5848732153146589,44.79998654027504],[-0.584888081579911,44.79996517271796],[-0.5848948583079588,44.799941898190326],[-0.5848933768158041,44.79991807323484],[-0.584883737742695,44.79989531615156],[-0.584866277504544,44.79987496755884],[-0.5848423427184414,44.79985833623324],[-0.5848152076639289,44.79984721067967]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Lafitte"},"geometry":{"type":"LineString","coordinates":[[-0.5848152076639289,44.79984721067967],[-0.5848745420644292,44.79976778005969],[-0.5849219860206252,44.799108507861185]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rond-point Plume la Poule"},"geometry":{"type":"LineString","coordinates":[[-0.5848152076639289,44.79984721067967],[-0.5847811153178921,44.799840177929354],[-0.5847476836218268,44.799839700309704],[-0.5847151315753353,44.799845230427906],[-0.5846854516196511,44.79985625507602],[-0.5846706106451018,44.799865821105186]]}},{"type":"Feature","properties":{"nom":"Rue du 19 Mars 1962"},"geometry":{"type":"LineString","coordinates":[[-0.6320923791784995,44.81123934229949],[-0.6318710706919177,44.81019945317003]]}},{"type":"Feature","properties":{"nom":"Avenue Colonel Robert Jacqui"},"geometry":{"type":"LineString","coordinates":[[-0.6320923791784995,44.81123934229949],[-0.6334066349679124,44.81109917839348]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Mail Pierre Mendès France"},"geometry":{"type":"LineString","coordinates":[[-0.6318710706919177,44.81019945317003],[-0.631543529639951,44.810387736416686],[-0.6314331489596068,44.8104033316262],[-0.6309912993060639,44.81066543778118]]}},{"type":"Feature","properties":{"nom":"Rue Dourout"},"geometry":{"type":"LineString","coordinates":[[-0.582926096946988,44.80891678917791],[-0.582596396707485,44.81053449802052]]}},{"type":"Feature","properties":{"nom":"Résidence la Boétie"},"geometry":{"type":"LineString","coordinates":[[-0.582926096946988,44.80891678917791],[-0.5824634086743018,44.80885695508423],[-0.5818707986583633,44.80878751802392],[-0.5814757888340496,44.80876599535923],[-0.5813256223797156,44.808544619005495]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Résidence Crespy I"},"geometry":{"type":"LineString","coordinates":[[-0.5891628548496484,44.80378890572265],[-0.5890468881739451,44.804019571503474]]}},{"type":"Feature","properties":{"nom":"Résidence Crespy I"},"geometry":{"type":"LineString","coordinates":[[-0.5891628548496484,44.80378890572265],[-0.5893550784513267,44.80383193426334],[-0.5895540975018551,44.80339479164763],[-0.5895402813859256,44.80334766444167]]}},{"type":"Feature","properties":{"nom":"Résidence Crespy I"},"geometry":{"type":"LineString","coordinates":[[-0.5896731806453948,44.803293474578275],[-0.5902629811953956,44.803407909148746],[-0.5903015988135556,44.8033087710468],[-0.5902601349755588,44.80326062493925],[-0.5900259725883658,44.80322072338686]]}},{"type":"Feature","properties":{"nom":"Résidence Crespy I"},"geometry":{"type":"LineString","coordinates":[[-0.5896731806453948,44.803293474578275],[-0.5895402813859256,44.80334766444167]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Résidence Château Raba"},"geometry":{"type":"LineString","coordinates":[[-0.5977397996493297,44.7969742505215],[-0.598340238553185,44.79720919580894]]}},{"type":"Feature","properties":{"nom":"Rue Fenelon"},"geometry":{"type":"LineString","coordinates":[[-0.5977397996493297,44.7969742505215],[-0.5969775878878063,44.79802151633341],[-0.5969300603777217,44.7980891399777],[-0.5969918950318113,44.798133216314305]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Résidence Raba 2"},"geometry":{"type":"LineString","coordinates":[[-0.5922619312697354,44.79666268358289],[-0.5924110577336282,44.796670224070986]]}},{"type":"Feature","properties":{"nom":"Avenue de Thouars"},"geometry":{"type":"LineString","coordinates":[[-0.5922619312697354,44.79666268358289],[-0.5922214191211087,44.79700744633009],[-0.5921843731680444,44.79734083928537]]}},{"type":"Feature","properties":{"nom":"Rue de Compostelle"},"geometry":{"type":"LineString","coordinates":[[-0.609292376100524,44.79406793627747],[-0.6096161550702309,44.794183685429104]]}},{"type":"Feature","properties":{"nom":"Rue Léo Ferré"},"geometry":{"type":"LineString","coordinates":[[-0.6096161550702309,44.794183685429104],[-0.6095831599544377,44.79425076358718],[-0.6098307675918202,44.79474619754953],[-0.6098041661993026,44.794780012345896],[-0.6090098538580561,44.79499124498106],[-0.6089914340021404,44.79502642141042],[-0.6094181761785373,44.79587335001899],[-0.6093804401984299,44.79590715775977],[-0.6086453402267731,44.796098491349674]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue de Compostelle"},"geometry":{"type":"LineString","coordinates":[[-0.6096161550702309,44.794183685429104],[-0.6102377641172693,44.79436438733048],[-0.6105819573232397,44.79443030040655]]}},{"type":"Feature","properties":{"nom":"Allée Baudrimont"},"geometry":{"type":"LineString","coordinates":[[-0.6027296980286029,44.80673175962899],[-0.6015473838064842,44.807046746653825]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Prévost"},"geometry":{"type":"LineString","coordinates":[[-0.6027296980286029,44.80673175962899],[-0.6024013038858907,44.80610770975058]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Résidence Michel Montaigne"},"geometry":{"type":"LineString","coordinates":[[-0.582654089070662,44.80271207266947],[-0.5831183975565108,44.802133084830125]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Résidence Michel Montaigne"},"geometry":{"type":"LineString","coordinates":[[-0.582654089070662,44.80271207266947],[-0.5825764361023581,44.8026780356692],[-0.5823824907116107,44.802592892016165],[-0.5822225659064574,44.802790523505124]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Henry de Montherlant"},"geometry":{"type":"LineString","coordinates":[[-0.5816756531470041,44.795922453916624],[-0.5815380589027282,44.79588868285579],[-0.5814732549235175,44.79584748460213],[-0.5814372947108952,44.795800153210344],[-0.581356943586693,44.79549847817847],[-0.5813518493489928,44.79537369545283],[-0.5813456481642605,44.795235165102824]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Jacques Juillac"},"geometry":{"type":"LineString","coordinates":[[-0.5873405205806616,44.81311328679103],[-0.587507771417311,44.81325682730876],[-0.5882334710459839,44.81387964457536],[-0.5882836764128162,44.81390751766863],[-0.5886514671698074,44.81402581361711],[-0.5887850089633541,44.81407096556667]]}},{"type":"Feature","properties":{"nom":"Rue Jacques Juillac"},"geometry":{"type":"LineString","coordinates":[[-0.5873405205806616,44.81311328679103],[-0.587041665128302,44.812862104636736],[-0.5870014528229264,44.812836167974545],[-0.5869533553365147,44.812815704674364],[-0.5868924492112061,44.81280294184921],[-0.586828819542169,44.81279521936008],[-0.5862677591195563,44.81279020825787]]}},{"type":"Feature","properties":{"nom":"Rue Maurice Berteaux"},"geometry":{"type":"LineString","coordinates":[[-0.5873405205806616,44.81311328679103],[-0.5874394502332281,44.81301107708922]]}},{"type":"Feature","properties":{"nom":"Rue de Megret"},"geometry":{"type":"LineString","coordinates":[[-0.5879740703110379,44.80459364035909],[-0.587784386056661,44.80454467402358],[-0.5873478577180511,44.80444115657791]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue de Megret"},"geometry":{"type":"LineString","coordinates":[[-0.5873478577180511,44.80444115657791],[-0.5867244760266841,44.8043076775135]]}},{"type":"Feature","properties":{"nom":"Avenue Paul Lapie"},"geometry":{"type":"LineString","coordinates":[[-0.5873478577180511,44.80444115657791],[-0.5879957097363121,44.802660342236095]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Peydavant"},"geometry":{"type":"LineString","coordinates":[[-0.5851495033491008,44.80153219107884],[-0.5849576140738918,44.80109963195287],[-0.5849531781805696,44.80108526862295],[-0.584918103457541,44.8008427032057],[-0.5849157167020617,44.8004991167341],[-0.584901669286926,44.80032408035752],[-0.5848873902476819,44.80020228956969],[-0.5848768565687293,44.80013055623425],[-0.5848531622910493,44.80005878732148],[-0.5848152581641884,44.80002097670167]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Robespierre"},"geometry":{"type":"LineString","coordinates":[[-0.5850959289495298,44.808524217323345],[-0.5838043431839468,44.80837808926339]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Peydavant"},"geometry":{"type":"LineString","coordinates":[[-0.5850959289495298,44.808524217323345],[-0.5853168094815572,44.808167198079275]]}},{"type":"Feature","properties":{"nom":"Rue Ambroise Pare"},"geometry":{"type":"LineString","coordinates":[[-0.5850959289495298,44.808524217323345],[-0.5861563400219824,44.80864203725283]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Peydavant"},"geometry":{"type":"LineString","coordinates":[[-0.5864864687442536,44.80581270157772],[-0.5865034209105237,44.80571298705664],[-0.5865690362884969,44.80533176401814],[-0.5866361089763721,44.80492923565233],[-0.5866746519603945,44.8046721880755]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Léo Delibes"},"geometry":{"type":"LineString","coordinates":[[-0.584141209074514,44.795217084931785],[-0.5833254041750363,44.79571293010645]]}},{"type":"Feature","properties":{"nom":"Rue d'Alembert"},"geometry":{"type":"LineString","coordinates":[[-0.584141209074514,44.795217084931785],[-0.5846472686524727,44.79564658849234]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Gustave Courbet"},"geometry":{"type":"LineString","coordinates":[[-0.5846472686524727,44.79564658849234],[-0.5848533112551045,44.7955054213432],[-0.5849910017310761,44.79542270967738],[-0.5850319923870405,44.795365746929185],[-0.5850659103723002,44.79529270233151],[-0.585051126765477,44.795219751746686],[-0.5849855407068508,44.795168040524224],[-0.5848900376167527,44.79514384648763],[-0.584790537238073,44.79517337702367]]}},{"type":"Feature","properties":{"nom":"Rue d'Alembert"},"geometry":{"type":"LineString","coordinates":[[-0.5846472686524727,44.79564658849234],[-0.5847300149816487,44.79570163250422],[-0.5847781845475827,44.795721463465725]]}},{"type":"Feature","properties":{"nom":"Résidence le Prado"},"geometry":{"type":"LineString","coordinates":[[-0.5846472686524727,44.79564658849234],[-0.5852664622881532,44.795726519264385],[-0.5853450185170811,44.795716205499474],[-0.5853964467092139,44.7956602647751]]}},{"type":"Feature","properties":{"nom":"Rue Gabriel Faure"},"geometry":{"type":"LineString","coordinates":[[-0.6042882382750667,44.79684094366318],[-0.6051643027973448,44.79734565370451],[-0.6058602084364522,44.79786435749591]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Gabriel Faure"},"geometry":{"type":"LineString","coordinates":[[-0.6042882382750667,44.79684094366318],[-0.6043015427615663,44.79682709967243],[-0.6043125792764688,44.796805310200725],[-0.6043154335148863,44.796782158566785],[-0.6043097072060759,44.79675936896613],[-0.6042959953553246,44.796738363864144],[-0.6042750248552663,44.79672065162491],[-0.6042482577090789,44.796707356983966],[-0.604217649743204,44.79669940886188],[-0.6041852661857061,44.796697462462895],[-0.6041532535664538,44.796701449756725],[-0.6041237584157965,44.796711302714655],[-0.6040987560359596,44.79672623807645],[-0.604094233275002,44.79673079546311]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue des Flamboyants"},"geometry":{"type":"LineString","coordinates":[[-0.6201737519763828,44.80505418675388],[-0.6207580646347948,44.80506171139595]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue des Flamboyants"},"geometry":{"type":"LineString","coordinates":[[-0.6207580646347948,44.80506171139595],[-0.6209765883858974,44.80501529813661]]}},{"type":"Feature","properties":{"nom":"Rue des Flamboyants"},"geometry":{"type":"LineString","coordinates":[[-0.6207580646347948,44.80506171139595],[-0.6202864288590101,44.80518005017042]]}},{"type":"Feature","properties":{"nom":"Rue Robespierre"},"geometry":{"type":"LineString","coordinates":[[-0.5825067803575857,44.808361672208974],[-0.582223347048623,44.80830700119719],[-0.5814737141394966,44.8081419763692]]}},{"type":"Feature","properties":{"nom":"Rue Jouis"},"geometry":{"type":"LineString","coordinates":[[-0.5825067803575857,44.808361672208974],[-0.5841858371471785,44.80558750187525]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Frédéric Sevene"},"geometry":{"type":"LineString","coordinates":[[-0.5841858371471785,44.80558750187525],[-0.5839926048931097,44.805442794196125]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Lafitte"},"geometry":{"type":"LineString","coordinates":[[-0.5856717428526199,44.79693579087962],[-0.5856117122030445,44.79704668255914],[-0.585448166292606,44.79736469286718],[-0.5851507788091184,44.79797797637938],[-0.5851168591768824,44.79807543313699],[-0.584984869444343,44.79865278398458],[-0.5849744606561111,44.79869292822052],[-0.584977520995132,44.798744178335795],[-0.585015235590998,44.79884406116928]]}},{"type":"Feature","properties":{"nom":"Rue Lafitte"},"geometry":{"type":"LineString","coordinates":[[-0.5856717428526199,44.79693579087962],[-0.5857694496967596,44.79669633556681],[-0.5859913165365825,44.79604678625102]]}},{"type":"Feature","properties":{"nom":"Chemin Bénédigues"},"geometry":{"type":"LineString","coordinates":[[-0.5856717428526199,44.79693579087962],[-0.5853851966016531,44.79689735213065],[-0.5848285086423236,44.796809595995924]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue de Suzon"},"geometry":{"type":"LineString","coordinates":[[-0.5861018004954792,44.81086318887048],[-0.5859845926135046,44.81088922412883],[-0.5854254764783853,44.81090702889927],[-0.5851117818471763,44.81090727732481]]}},{"type":"Feature","properties":{"nom":"Rue Lamartine"},"geometry":{"type":"LineString","coordinates":[[-0.5861018004954792,44.81086318887048],[-0.5860744512494211,44.81075514235164],[-0.586087117329687,44.8101573214773],[-0.586101036755573,44.81007391743919]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Lamartine"},"geometry":{"type":"LineString","coordinates":[[-0.586101036755573,44.81007391743919],[-0.5861144545900808,44.80993566947612],[-0.5861563400219824,44.80864203725283]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue César Franck"},"geometry":{"type":"LineString","coordinates":[[-0.5848285086423236,44.796809595995924],[-0.5850169643146096,44.79611696207837],[-0.5850193902134347,44.796086798297395],[-0.5850023742812925,44.796055265606725],[-0.5849717317571858,44.796028396322626],[-0.584917160415909,44.79601345149175],[-0.584550601354561,44.79595978695407],[-0.5844971066755662,44.795960121885095],[-0.5844453276825956,44.79597787856817],[-0.5839721605433712,44.79625664083094]]}},{"type":"Feature","properties":{"nom":"Rue Blaise Pascal"},"geometry":{"type":"LineString","coordinates":[[-0.5844384020875807,44.80730298439016],[-0.5841417671664542,44.80780318649656]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Impasse des Acacias"},"geometry":{"type":"LineString","coordinates":[[-0.5807320014946282,44.79863200587201],[-0.581086460953338,44.79885730911431],[-0.581117210519938,44.79888183393539]]}},{"type":"Feature","properties":{"nom":"Impasse des Bleuets"},"geometry":{"type":"LineString","coordinates":[[-0.5807320014946282,44.79863200587201],[-0.5810459800769706,44.79835836100999]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Blumerel"},"geometry":{"type":"LineString","coordinates":[[-0.583779240354156,44.80225909656631],[-0.5836206208357682,44.80235958108798],[-0.5829773948842143,44.80285700859803]]}},{"type":"Feature","properties":{"nom":"Rue Lafontaine"},"geometry":{"type":"LineString","coordinates":[[-0.583779240354156,44.80225909656631],[-0.5838561565533614,44.80233216131662],[-0.5840214904145854,44.80249639498091],[-0.5840454397181574,44.80252545730956],[-0.5840655525816808,44.80255590167351],[-0.5840818178198008,44.80258754826163],[-0.5840940867889167,44.80262004143532],[-0.5841022220233854,44.802653205362546],[-0.5841060804628767,44.802686774307496],[-0.5841058923088552,44.80272038068938],[-0.5841013993973294,44.8027539425629],[-0.5840928263396867,44.80278700244013],[-0.5840800356669424,44.80281938448854],[-0.5840295974202206,44.80291375799513],[-0.5840053833237241,44.80295370653722]]}},{"type":"Feature","properties":{"nom":"Rue du Bois Gentil"},"geometry":{"type":"LineString","coordinates":[[-0.583594741220704,44.799262579054854],[-0.5836314252312519,44.79924007378001],[-0.58366202783672,44.79920929244566],[-0.5836843096349736,44.79917084611297],[-0.5838850510735177,44.79855745999362]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Pacaris"},"geometry":{"type":"LineString","coordinates":[[-0.583594741220704,44.799262579054854],[-0.5832923617410791,44.79910797790636],[-0.5829402645496848,44.79893917806156],[-0.5827289793055835,44.798831340566984]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de Breuil"},"geometry":{"type":"LineString","coordinates":[[-0.5971281849445176,44.80254005614149],[-0.5977955031681217,44.80299827663063],[-0.597913280144674,44.80308102995233],[-0.5979900250654584,44.80311454502185]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Calixte Camelle"},"geometry":{"type":"LineString","coordinates":[[-0.5942055605025433,44.79804610025062],[-0.5923505719694316,44.79740711467132]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Cours de la Libération"},"geometry":{"type":"LineString","coordinates":[[-0.5927545423625904,44.80435463593653],[-0.5930434137916174,44.803644041633945]]}},{"type":"Feature","properties":{"nom":"Rue Alfred Charlionnet"},"geometry":{"type":"LineString","coordinates":[[-0.5927545423625904,44.80435463593653],[-0.5928818422751819,44.80432836445688],[-0.5929500293409798,44.80430783372962],[-0.5930876841834949,44.80425484085722],[-0.594810758112071,44.80352351693588]]}},{"type":"Feature","properties":{"nom":"Rue Alfred Charlionnet"},"geometry":{"type":"LineString","coordinates":[[-0.5927545423625904,44.80435463593653],[-0.5926887131867463,44.804341941868636]]}},{"type":"Feature","properties":{"nom":"Cours de la Libération"},"geometry":{"type":"LineString","coordinates":[[-0.6030959881292656,44.796167611720165],[-0.6034283903360506,44.79591529769285]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Cours de la Libération"},"geometry":{"type":"LineString","coordinates":[[-0.6030959881292656,44.796167611720165],[-0.6029775749561365,44.79611911546831]]}},{"type":"Feature","properties":{"nom":"Rue Gabriel Faure"},"geometry":{"type":"LineString","coordinates":[[-0.6030959881292656,44.796167611720165],[-0.604094233275002,44.79673079546311]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Cours de la Libération"},"geometry":{"type":"LineString","coordinates":[[-0.6034283903360506,44.79591529769285],[-0.6039887601312252,44.7954786555727]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Cours de la Libération"},"geometry":{"type":"LineString","coordinates":[[-0.5910571820878934,44.810593805537806],[-0.591064842376468,44.810607075991314],[-0.5910866215297996,44.8106296295616],[-0.5911149799611192,44.810648101897804],[-0.5911484667740644,44.81066154790002],[-0.5911550088205666,44.81066296284028]]}},{"type":"Feature","properties":{"nom":"Rue de Suzon"},"geometry":{"type":"LineString","coordinates":[[-0.5910571820878934,44.810593805537806],[-0.5909585918400966,44.81060988973802],[-0.590879501047489,44.81061193609171],[-0.5905232485977291,44.810552647589326],[-0.5902234056482158,44.8105213046118],[-0.5900801846626157,44.81051771753086],[-0.5897444609170819,44.8105137195487],[-0.5896315190587665,44.81053710171911]]}},{"type":"Feature","properties":{"nom":"Cours de la Libération"},"geometry":{"type":"LineString","coordinates":[[-0.6021125593266066,44.796799076337216],[-0.601778041738363,44.79705010191015],[-0.6015717121996816,44.79718815701013],[-0.6014062180306077,44.79728726403015],[-0.6002719999343514,44.79794600713293],[-0.600032246774405,44.798081784266614]]}},{"type":"Feature","properties":{"nom":"Cours de la Libération"},"geometry":{"type":"LineString","coordinates":[[-0.6021125593266066,44.796799076337216],[-0.6022145735222436,44.796866559883405]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Cours de la Libération"},"geometry":{"type":"LineString","coordinates":[[-0.6022145735222436,44.796866559883405],[-0.6030959881292656,44.796167611720165]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Cours de la Libération"},"geometry":{"type":"LineString","coordinates":[[-0.5965714569927393,44.80037406839496],[-0.5965496063379294,44.80035845449937],[-0.5964961619808105,44.80033330006744],[-0.59644967915179,44.800320356824194]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Cours de la Libération"},"geometry":{"type":"LineString","coordinates":[[-0.5965714569927393,44.80037406839496],[-0.5966065505768284,44.80029368618983],[-0.5966421564433161,44.800243825663614],[-0.5966890680479796,44.80019468857001],[-0.5967895070909665,44.80011728434324],[-0.5970630569834293,44.79995513252617],[-0.5981996355267528,44.79928031462285]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Cours de la Libération"},"geometry":{"type":"LineString","coordinates":[[-0.59644967915179,44.800320356824194],[-0.5964365410597219,44.8003166285008],[-0.5963733139310687,44.80030907916642],[-0.5963094185501041,44.800311099648546],[-0.5962473803957882,44.800322610089026],[-0.5961900701269465,44.800342979222755],[-0.5961399683688416,44.800371407962906],[-0.5960992695628712,44.8004065657782],[-0.5960696574508229,44.800447048207396],[-0.5960526614748141,44.800491005252994],[-0.5960516029257379,44.800504460980235]]}},{"type":"Feature","properties":{"nom":"Avenue des Erables"},"geometry":{"type":"LineString","coordinates":[[-0.6222925693597104,44.810466415289795],[-0.6232630403559571,44.81263813827225]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Nancel Pénard"},"geometry":{"type":"LineString","coordinates":[[-0.6222925693597104,44.810466415289795],[-0.6230681813424483,44.8102911840886]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Robert Escarpit"},"geometry":{"type":"LineString","coordinates":[[-0.6101889075141375,44.80350458555031],[-0.6101801842884359,44.80365421992753],[-0.610206470894454,44.803867872979],[-0.6102692445527341,44.80406406284131],[-0.6105283300895166,44.80455814100816],[-0.6106006068118239,44.804776729961674]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Albert Schweitzer"},"geometry":{"type":"LineString","coordinates":[[-0.6106006068118239,44.804776729961674],[-0.6105555555458666,44.804784736149614],[-0.6105129720634351,44.80479779870992],[-0.6104738497376451,44.804815615860576],[-0.6104392913358336,44.80483761210394],[-0.6104101470629192,44.8048632199577],[-0.610387014558631,44.80489187995684],[-0.6103708590590293,44.80492284080355],[-0.6103617505497511,44.804955199451264],[-0.6103603574437853,44.80497740406887]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Jacques Chaban Delmas"},"geometry":{"type":"LineString","coordinates":[[-0.5893995354674162,44.81164017740682],[-0.5893946812002283,44.81164960900728],[-0.5893917698490269,44.8116719510796],[-0.5893974469546659,44.81169402214993],[-0.5894113591477376,44.81171421189336],[-0.5894322745472114,44.81173102778901],[-0.5894588461655127,44.81174316110927],[-0.5894712877183582,44.81174583129971]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Jacques Chaban Delmas"},"geometry":{"type":"LineString","coordinates":[[-0.5894712877183582,44.81174583129971],[-0.5894889915955749,44.811749686662],[-0.5895205357187211,44.81175022267025],[-0.5895511995099065,44.8117447509677],[-0.5895784681385476,44.8117335310762],[-0.589600623776862,44.8117174279415],[-0.589615723996806,44.81169776400813],[-0.5896229686826812,44.81167591575606],[-0.5896215689214397,44.811653439472536],[-0.5896116367034588,44.81163213325877],[-0.5895941513251375,44.811613497602615],[-0.5895700808805486,44.811598853178495],[-0.5895415301630279,44.81158948479116],[-0.5895103009684368,44.81158587607232],[-0.5894924222691592,44.81158734105841]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de l'Université"},"geometry":{"type":"LineString","coordinates":[[-0.600171475528634,44.80630856983659],[-0.6001879688616436,44.806311290751964],[-0.6002343700708929,44.806312704675065],[-0.600280538200863,44.80630836068337],[-0.6003248371071614,44.806298400647876],[-0.6003661414122264,44.80628304035933],[-0.6003712714452328,44.80628008541878]]}},{"type":"Feature","properties":{"nom":"Avenue de l'Université"},"geometry":{"type":"LineString","coordinates":[[-0.600171475528634,44.80630856983659],[-0.6002370989939261,44.80635639834469],[-0.6002826991601264,44.806417922566894],[-0.6003802276684883,44.80660833529063]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de l'Université"},"geometry":{"type":"LineString","coordinates":[[-0.6003712714452328,44.80628008541878],[-0.6004029693428196,44.8062628672184],[-0.6004343442787473,44.80623845263771],[-0.6004552821986776,44.80621508908806]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de l'Université"},"geometry":{"type":"LineString","coordinates":[[-0.599956256747319,44.80612656908074],[-0.5999559228819504,44.806131354014994],[-0.5999620246643437,44.806164221128526],[-0.5999761415146336,44.80619575357184],[-0.5999975914733543,44.80622516218688],[-0.6000262959420235,44.806251188302866]]}},{"type":"Feature","properties":{"nom":"Avenue de l'Université"},"geometry":{"type":"LineString","coordinates":[[-0.6007358852897697,44.80735466712789],[-0.6008390553247239,44.80732491684311]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de l'Université"},"geometry":{"type":"LineString","coordinates":[[-0.6007358852897697,44.80735466712789],[-0.6008795044312589,44.807547040725375]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue du Général Margueritte"},"geometry":{"type":"LineString","coordinates":[[-0.5880356658461944,44.80012688090375],[-0.5880231571514054,44.80010682695326],[-0.588015116049456,44.80008537090995],[-0.5880124057429235,44.80006825077964],[-0.588013315841325,44.80004831397582],[-0.5883960860467061,44.79893904008061]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue de Verdun"},"geometry":{"type":"LineString","coordinates":[[-0.5880356658461944,44.80012688090375],[-0.5888327396472829,44.80026468961341]]}},{"type":"Feature","properties":{"nom":"Rue du Maréchal Foch"},"geometry":{"type":"LineString","coordinates":[[-0.5888327396472829,44.80026468961341],[-0.5892437059848279,44.799063900248946]]}},{"type":"Feature","properties":{"nom":"Rue de Verdun"},"geometry":{"type":"LineString","coordinates":[[-0.5888327396472829,44.80026468961341],[-0.5895090725482314,44.800385584844534]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Prévost"},"geometry":{"type":"LineString","coordinates":[[-0.6029063912671518,44.80705235166629],[-0.6027296980286029,44.80673175962899]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Debussy"},"geometry":{"type":"LineString","coordinates":[[-0.604111969837402,44.79685463755314],[-0.6037216585126362,44.797204726582656],[-0.6037028575219571,44.79722577112107],[-0.6036934902817037,44.7972479580397],[-0.6036983070576454,44.79726834425349],[-0.6037165704416053,44.797293348995304],[-0.6051360946018491,44.79834322327829]]}},{"type":"Feature","properties":{"nom":"Rue Gabriel Faure"},"geometry":{"type":"LineString","coordinates":[[-0.604111969837402,44.79685463755314],[-0.6041333633495584,44.79686494963479],[-0.6041639657718203,44.79687280787559],[-0.6041963550463374,44.796874844185176],[-0.6042283621381364,44.796870766974635],[-0.6042578629736161,44.796861003894286],[-0.6042828653712338,44.79684606849776],[-0.6042882382750667,44.79684094366318]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Dourout"},"geometry":{"type":"LineString","coordinates":[[-0.5830314995900483,44.808371088178305],[-0.582926096946988,44.80891678917791]]}},{"type":"Feature","properties":{"nom":"Rue Robespierre"},"geometry":{"type":"LineString","coordinates":[[-0.5830314995900483,44.808371088178305],[-0.5825067803575857,44.808361672208974]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue du Professeur Arnozan"},"geometry":{"type":"LineString","coordinates":[[-0.5878989934571109,44.80870572007875],[-0.5878985733962901,44.808656278438136],[-0.5879133190691808,44.808610592268735],[-0.5881589115750767,44.80821783574398],[-0.588322763537062,44.80795530317108],[-0.5885370847150049,44.80761929278278],[-0.5886581373609443,44.80743765211994],[-0.5886778278341419,44.80737181164313],[-0.5886892546935539,44.80732974323805]]}},{"type":"Feature","properties":{"nom":"Rue du Professeur Arnozan"},"geometry":{"type":"LineString","coordinates":[[-0.5878411980233785,44.808960402602814],[-0.5878295212829524,44.80895374453358],[-0.5877980712366706,44.80892419881176],[-0.5877774777567956,44.80889016688674],[-0.5877690061891921,44.80885368073574],[-0.5877737931600661,44.80881470450807]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue du Professeur Arnozan"},"geometry":{"type":"LineString","coordinates":[[-0.5878411980233785,44.808960402602814],[-0.5878699478536283,44.80897706171185],[-0.5879169880987768,44.80899278355843],[-0.5879680545444791,44.80900000078214],[-0.5880199618127187,44.8089983634471],[-0.5880699313891591,44.80898795919719],[-0.5881148338577947,44.808969337159716],[-0.5881522048686085,44.808943565977096],[-0.5881797231688719,44.80891198002606]]}},{"type":"Feature","properties":{"nom":"Rue du Professeur Arnozan"},"geometry":{"type":"LineString","coordinates":[[-0.5877737931600661,44.80881470450807],[-0.5877891905082092,44.80878151917059],[-0.5878168520114754,44.80875019903867],[-0.5878542230141327,44.8087244279529],[-0.5878989934571109,44.80870572007875]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue de Megret"},"geometry":{"type":"LineString","coordinates":[[-0.5893277101316055,44.80291684525887],[-0.5899764767772134,44.80123120461399]]}},{"type":"Feature","properties":{"nom":"Rue de Tremeuge"},"geometry":{"type":"LineString","coordinates":[[-0.5893277101316055,44.80291684525887],[-0.5879957097363121,44.802660342236095]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Herman Lemoine"},"geometry":{"type":"LineString","coordinates":[[-0.6307440648849332,44.806857015563125],[-0.6308228069958516,44.80703232765483]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue des Roses"},"geometry":{"type":"LineString","coordinates":[[-0.6225024468729391,44.80605356820456],[-0.6203579837622806,44.80579151082335]]}},{"type":"Feature","properties":{"nom":"Avenue de Chiquet"},"geometry":{"type":"LineString","coordinates":[[-0.6225024468729391,44.80605356820456],[-0.6224613147631213,44.80599506275945],[-0.6224417892651352,44.805895782007745],[-0.6224407517219616,44.805808794384184],[-0.6224477000784474,44.805726056595354],[-0.6224749750294986,44.80563654574861],[-0.6226454477593392,44.80532285044612],[-0.6233837381286472,44.80430535103232],[-0.6234301620012386,44.80417829556763]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Place de la Rotonde"},"geometry":{"type":"LineString","coordinates":[[-0.6211277020072631,44.80020345272752],[-0.6210962280620484,44.80020193251621],[-0.6210604341508559,44.800204153181646],[-0.6210256519866348,44.80021039538001],[-0.6209926279117554,44.800220455181694],[-0.6209623664605869,44.80023421052297],[-0.6209356026851959,44.800251277668224],[-0.6209129397183759,44.80027118699994],[-0.620895101322692,44.800293374976256],[-0.6208825643659315,44.80031737599955],[-0.6208754813095524,44.80034561747293]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue des Chasseurs"},"geometry":{"type":"LineString","coordinates":[[-0.6211277020072631,44.80020345272752],[-0.6213004097149313,44.79914595828795]]}},{"type":"Feature","properties":{"nom":"Avenue Marc Desbats"},"geometry":{"type":"LineString","coordinates":[[-0.6164543226763436,44.803260855030295],[-0.6167453060802395,44.80336708893274]]}},{"type":"Feature","properties":{"nom":"Rue du Sable"},"geometry":{"type":"LineString","coordinates":[[-0.6164543226763436,44.803260855030295],[-0.6168285557962804,44.80209841143373],[-0.6168791979063539,44.80194158747085],[-0.6168391325300605,44.80186566024569],[-0.6167556010158722,44.80183102215729]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Etienne Marcel"},"geometry":{"type":"LineString","coordinates":[[-0.6324539626388954,44.80672359754805],[-0.6325920429160863,44.8067159446926],[-0.6327101795127357,44.8067110906548],[-0.6332361872648015,44.80662438438843]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Jean Babin"},"geometry":{"type":"LineString","coordinates":[[-0.6155333858256525,44.793975887879235],[-0.6155150003343454,44.79397926501141],[-0.6154889310513023,44.79398721043652],[-0.6154650679663705,44.79399805846027],[-0.6154440254664889,44.79401151930165],[-0.6154261541432936,44.79402713139891],[-0.6154120740266681,44.79404469487382],[-0.6154021244365604,44.794063568357515],[-0.6153966616078093,44.794083380192184],[-0.6153956460811245,44.79410350104953],[-0.6153991815732995,44.79412356730009],[-0.615407096727245,44.7941428637257],[-0.6154193689965467,44.794161030707826],[-0.6154355914160596,44.794177630769035],[-0.6154612586161684,44.79419555204469]]}},{"type":"Feature","properties":{"nom":"Avenue Camille Jullian"},"geometry":{"type":"LineString","coordinates":[[-0.6155333858256525,44.793975887879235],[-0.6150382268229753,44.793035756445974]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Jean Babin"},"geometry":{"type":"LineString","coordinates":[[-0.6154612586161684,44.79419555204469],[-0.6152358745688526,44.79442855631564],[-0.6150797995591784,44.79463503429334],[-0.6150024983682802,44.79474397006756],[-0.6148701229340214,44.79495113564059],[-0.6144286227959143,44.79572258881573]]}},{"type":"Feature","properties":{"nom":"Avenue Jean Babin"},"geometry":{"type":"LineString","coordinates":[[-0.6154612586161684,44.79419555204469],[-0.6154779893937518,44.79420411852564],[-0.6155031154014182,44.79421340900411],[-0.6155300811831919,44.794219758318505],[-0.615557985997172,44.7942229248549],[-0.6155863191564409,44.794222834767886],[-0.6156143230908581,44.794219512143265],[-0.6156411139730908,44.79421298508247],[-0.6156559924187647,44.79421016985492]]}},{"type":"Feature","properties":{"nom":"Avenue Léon Duguit"},"geometry":{"type":"LineString","coordinates":[[-0.6197420186573377,44.79791674542534],[-0.6194786248644971,44.79783045100641],[-0.6193415050909358,44.79783292325726],[-0.6178180737614022,44.79822614617144]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Albert Schweitzer"},"geometry":{"type":"LineString","coordinates":[[-0.6197420186573377,44.79791674542534],[-0.619674985431359,44.79806220178395],[-0.6196534263183395,44.79814603499814],[-0.6195621258338636,44.79854783037248],[-0.61954823353056,44.79862682528336],[-0.6195334642132676,44.798693867006456],[-0.6195059889727553,44.79877617687853],[-0.6194440544979725,44.798863817364484],[-0.6193705422846755,44.79893633192673]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Albert Schweitzer"},"geometry":{"type":"LineString","coordinates":[[-0.6193705422846755,44.79893633192673],[-0.6192666141752466,44.799022155831324],[-0.6191949743718183,44.79908217916486],[-0.6191225174967163,44.79913322010869],[-0.6177134374746924,44.79998024457636],[-0.617381254762092,44.80015683440266],[-0.6172610122507112,44.800198493889766]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Albert Schweitzer"},"geometry":{"type":"LineString","coordinates":[[-0.6103603574437853,44.80497740406887],[-0.6103658722406546,44.80502100931274],[-0.6103789898494902,44.805052662443366],[-0.6103989517907268,44.805082476822214],[-0.6104254491939214,44.80510956142019],[-0.610457696199699,44.805133490765726]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Albert Schweitzer"},"geometry":{"type":"LineString","coordinates":[[-0.6103603574437853,44.80497740406887],[-0.6102416731476096,44.80505630049977],[-0.6093609804982133,44.805292703326025],[-0.6089328820933197,44.80542366556679],[-0.6085024915423672,44.805586768337015],[-0.6081042800352606,44.80578893545684],[-0.6078964088953601,44.80591678083899]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Albert Schweitzer"},"geometry":{"type":"LineString","coordinates":[[-0.6234178340187196,44.79431128839112],[-0.6234293696050142,44.79429353467743],[-0.6234423775206727,44.79426096032506],[-0.623447983227195,44.79422736066147],[-0.6234472882692765,44.79421630251364]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue du Maréchal Juin"},"geometry":{"type":"LineString","coordinates":[[-0.6234178340187196,44.79431128839112],[-0.6237221181089105,44.79435185913626],[-0.6247273891165576,44.79453692240349],[-0.6249724780782864,44.79455352265644],[-0.6252296224110706,44.794548568385494],[-0.6254792438607671,44.79452457544526],[-0.6258143132994877,44.79445713964546],[-0.6270886859262708,44.794153454899394]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Albert Schweitzer"},"geometry":{"type":"LineString","coordinates":[[-0.6234472882692765,44.79421630251364],[-0.6234458588040597,44.79419355689098],[-0.6234360607683638,44.794160448048565],[-0.6234190187604384,44.794128831195835],[-0.6233951680713367,44.79409959329795],[-0.623379009221982,44.79408605511891]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Nancel Pénard"},"geometry":{"type":"LineString","coordinates":[[-0.6293560511976012,44.809064046406846],[-0.6293719767148879,44.80905570096907],[-0.6293881639829623,44.80904347357378],[-0.6294015915521055,44.809029622638924],[-0.6294115186519919,44.80901444205471],[-0.6294179679267837,44.80899829143424],[-0.629420588809221,44.80898163238363]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Nancel Pénard"},"geometry":{"type":"LineString","coordinates":[[-0.629420588809221,44.80898163238363],[-0.629652082695442,44.80898028122187],[-0.6298357784740931,44.80896342907721],[-0.6300172199596933,44.80892484828186]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Nancel Pénard"},"geometry":{"type":"LineString","coordinates":[[-0.629420588809221,44.80898163238363],[-0.6294196565290228,44.80896481645575],[-0.6294148261779847,44.8089483951602],[-0.6294063729855621,44.80893272004912],[-0.6293945778425069,44.80891823257752],[-0.6293795896871496,44.8089052883294],[-0.6293618100380457,44.80889423482468],[-0.6293417610440407,44.808885325654884],[-0.6293200911471531,44.80887881038025],[-0.6292971905398143,44.80887485671662],[-0.6292736963422004,44.80887353441843],[-0.6287725252732359,44.80890087469299],[-0.6287495026144481,44.80890503235491],[-0.6287238129443788,44.80891305861358]]}},{"type":"Feature","properties":{"nom":"Rue Edouard Herriot"},"geometry":{"type":"LineString","coordinates":[[-0.5814665934575787,44.80293981469017],[-0.5818440451069568,44.802451306972245]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Francisco Ferrer"},"geometry":{"type":"LineString","coordinates":[[-0.5831112470882293,44.81130090973327],[-0.5823728634221069,44.811295159599865]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Eugène Et Marc Dulout"},"geometry":{"type":"LineString","coordinates":[[-0.6308082702318089,44.805101932908464],[-0.6310054379205055,44.80505005617093]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Louis Laugaa"},"geometry":{"type":"LineString","coordinates":[[-0.6308082702318089,44.805101932908464],[-0.6306521263403831,44.80514015827631]]}},{"type":"Feature","properties":{"nom":"Avenue Eugène Et Marc Dulout"},"geometry":{"type":"LineString","coordinates":[[-0.6310054379205055,44.80505005617093],[-0.631700007696165,44.80477699651276]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Albert Schweitzer"},"geometry":{"type":"LineString","coordinates":[[-0.615303508186988,44.80257281271715],[-0.6152864964207331,44.80255173351191],[-0.615256667312281,44.80252601707166],[-0.6152213755605574,44.80250398750852],[-0.6151816708648136,44.80248624203316],[-0.6151384709982685,44.802473291968006],[-0.6150929350149372,44.80246546080013],[-0.6150462106887153,44.80246289220998],[-0.6149994457920003,44.80246572988077],[-0.6149540237413818,44.80247383975708],[-0.6149109434836983,44.802487009925166],[-0.6148714565204808,44.80250502044121],[-0.6148365336181026,44.802527209874604],[-0.6148070361770309,44.802553190517365],[-0.6147836711369854,44.802582129156775],[-0.61476728863565,44.80261345827888],[-0.6147625339756065,44.80263045494609]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Albert Schweitzer"},"geometry":{"type":"LineString","coordinates":[[-0.6147625339756065,44.80263045494609],[-0.6147580792273154,44.80264618091557],[-0.6147563766644196,44.80267956579638],[-0.6147622452297926,44.802712619964204],[-0.6147790223180165,44.802748120007365]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Albert Schweitzer"},"geometry":{"type":"LineString","coordinates":[[-0.6147625339756065,44.80263045494609],[-0.614598453051524,44.802679360079466],[-0.613496601667769,44.802763828463895],[-0.6133540134994483,44.80278421322541],[-0.6131457210272049,44.80282019760035]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Albert Schweitzer"},"geometry":{"type":"LineString","coordinates":[[-0.6147790223180165,44.802748120007365],[-0.614795752078701,44.802774793403024],[-0.6148225199575824,44.802802138670415],[-0.6148551519737177,44.8028261446386],[-0.6148928397129124,44.80284602625028],[-0.614934424102314,44.80286146000727],[-0.6149789817149987,44.80287184467361],[-0.6150150402426817,44.802875833309585]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Albert Schweitzer"},"geometry":{"type":"LineString","coordinates":[[-0.6213182259154546,44.79683321692945],[-0.6213754986914892,44.7967701363326],[-0.6214078181817128,44.79672874971149],[-0.6222035070004565,44.796173176638625],[-0.6224653251436485,44.795922331894936],[-0.6225583555844427,44.79580820526483],[-0.6226574597696795,44.795651816008714],[-0.6227210744785149,44.79548835961729],[-0.623041379539649,44.794585876764295],[-0.6230671298693938,44.79452857390379],[-0.6231164019748372,44.79447916964883],[-0.6231775707522589,44.79442983674528]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Albert Schweitzer"},"geometry":{"type":"LineString","coordinates":[[-0.6213182259154546,44.79683321692945],[-0.6212775698220261,44.79678820861615],[-0.6212349465970253,44.796764252395086]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Albert Schweitzer"},"geometry":{"type":"LineString","coordinates":[[-0.6231775707522589,44.79442983674528],[-0.6232246360340484,44.794423832992166],[-0.6232697548294568,44.79441302671984],[-0.6233116419193608,44.79439709854741],[-0.6233495792825354,44.79437670194018],[-0.6233823212594589,44.794352146845085],[-0.6234091554857965,44.794324176632806],[-0.6234178340187196,44.79431128839112]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue François Coppée"},"geometry":{"type":"LineString","coordinates":[[-0.6286706524024379,44.80836209049072],[-0.6293441143335687,44.80814088793653]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Goya"},"geometry":{"type":"LineString","coordinates":[[-0.6293441143335687,44.80814088793653],[-0.628875764665801,44.807471374277796]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue François Coppée"},"geometry":{"type":"LineString","coordinates":[[-0.6293441143335687,44.80814088793653],[-0.6303581801530276,44.807816474705625]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Allée Fernand Daguin"},"geometry":{"type":"LineString","coordinates":[[-0.6071178372245689,44.805933187131934],[-0.6068737935162611,44.80547285645166],[-0.6068788460365943,44.80544035652477],[-0.6069260040929072,44.8054194932643],[-0.607950940714577,44.805144392773784],[-0.6079819304096579,44.80510377330623],[-0.607974868224023,44.805059676593075],[-0.6075186009733935,44.80418854536408]]}},{"type":"Feature","properties":{"nom":"Avenue de Collegno"},"geometry":{"type":"LineString","coordinates":[[-0.6071178372245689,44.805933187131934],[-0.6058777899405831,44.806265275312114],[-0.605848050437367,44.80626522721314],[-0.6058186525035695,44.806258502158755],[-0.6058008971288182,44.80624167907911],[-0.6056844644651586,44.806002687415926]]}},{"type":"Feature","properties":{"nom":"Allée Geoffroy Saint Hilaire"},"geometry":{"type":"LineString","coordinates":[[-0.6075186009733935,44.80418854536408],[-0.6100017784272912,44.80351286738155],[-0.6101889075141375,44.80350458555031]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Esplanade du 8 Mai 1945"},"geometry":{"type":"LineString","coordinates":[[-0.5884052365925718,44.809442744302494],[-0.5884217979114016,44.80942825916713],[-0.5884433216987119,44.8093329041959]]}},{"type":"Feature","properties":{"nom":"Avenue de Thouars"},"geometry":{"type":"LineString","coordinates":[[-0.5933858786547904,44.799536648197865],[-0.5934177642341696,44.79962599311371],[-0.5934280812983581,44.79969611136094],[-0.5934215705793868,44.79982306263804],[-0.5933327965604626,44.800272404632096],[-0.5933378311746387,44.800416106713314]]}},{"type":"Feature","properties":{"nom":"Rue Léon Bourgeois"},"geometry":{"type":"LineString","coordinates":[[-0.5933858786547904,44.799536648197865],[-0.5935226534972625,44.79949611353793],[-0.5950341181897741,44.7983501527892]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Place des Droits de l'Homme et du Citoyen"},"geometry":{"type":"LineString","coordinates":[[-0.6297406522332688,44.805356804530206],[-0.6298412361821026,44.80565600613529]]}},{"type":"Feature","properties":{"nom":"Avenue Louis Laugaa"},"geometry":{"type":"LineString","coordinates":[[-0.6297406522332688,44.805356804530206],[-0.6293759743209543,44.805437265972536],[-0.6292255265951838,44.805477559656374],[-0.6290182849240853,44.80555840129723]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Gambetta"},"geometry":{"type":"LineString","coordinates":[[-0.6330096504694444,44.80516829540005],[-0.63286743820531,44.80497780590039]]}},{"type":"Feature","properties":{"nom":"Place Germaine Tillion"},"geometry":{"type":"LineString","coordinates":[[-0.6330096504694444,44.80516829540005],[-0.6323132574139818,44.80535818369297]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Gambetta"},"geometry":{"type":"LineString","coordinates":[[-0.63286743820531,44.80497780590039],[-0.6327029084058575,44.80475442771743],[-0.6326781083125196,44.80469621477551],[-0.6324972230262332,44.80443615401674]]}},{"type":"Feature","properties":{"nom":"Rue des Poilus"},"geometry":{"type":"LineString","coordinates":[[-0.63286743820531,44.80497780590039],[-0.633645900316175,44.804753042016685]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue de Tremeuge"},"geometry":{"type":"LineString","coordinates":[[-0.5921218055751118,44.80346029306825],[-0.5915990886301392,44.803357521495506]]}},{"type":"Feature","properties":{"nom":"Résidence Santillane"},"geometry":{"type":"LineString","coordinates":[[-0.5921218055751118,44.80346029306825],[-0.5917861784203291,44.80428523458168],[-0.5912725273716545,44.80418600579809]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue de Tremeuge"},"geometry":{"type":"LineString","coordinates":[[-0.5915990886301392,44.803357521495506],[-0.5910668377371494,44.803253624036394]]}},{"type":"Feature","properties":{"nom":"Résidence Santillane"},"geometry":{"type":"LineString","coordinates":[[-0.5915990886301392,44.803357521495506],[-0.5912725273716545,44.80418600579809]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue du Général Bordas"},"geometry":{"type":"LineString","coordinates":[[-0.58600702822517,44.8007377500221],[-0.585970707689142,44.80076609991251],[-0.5858914425051014,44.8008546272021],[-0.5858157990720313,44.80094646334614],[-0.5857341732693,44.80103569550913],[-0.5856488940025563,44.80112315107179],[-0.5855596919311252,44.80120856827141],[-0.5854660395668815,44.80129160340103],[-0.5853680464074918,44.801371982752094],[-0.5852641076434639,44.80144831559702],[-0.5851495033491008,44.80153219107884]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de l'Université"},"geometry":{"type":"LineString","coordinates":[[-0.6007471674791848,44.80446221351912],[-0.6007656266090102,44.8044376672032],[-0.600779651529618,44.804406955492446],[-0.6007857513570579,44.80437496327611],[-0.6007837353086343,44.8043426875024],[-0.6007736651711555,44.804311117121586],[-0.6007558665292493,44.804281412896984],[-0.6007309006839782,44.80425445787905],[-0.6006994552154997,44.80423113112104],[-0.6006628378897702,44.80421211187704],[-0.600621977611209,44.80419809139395],[-0.6005781652854597,44.80418947921323],[-0.6005624050351719,44.804188356648226]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Nancel Pénard"},"geometry":{"type":"LineString","coordinates":[[-0.6202000052487621,44.81094462359676],[-0.6200476726549595,44.81097622682765],[-0.619935245200211,44.810926762624696]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Nancel Pénard"},"geometry":{"type":"LineString","coordinates":[[-0.6202000052487621,44.81094462359676],[-0.6205284245130067,44.81087246378458]]}},{"type":"Feature","properties":{"nom":"Avenue du Vallon"},"geometry":{"type":"LineString","coordinates":[[-0.6202000052487621,44.81094462359676],[-0.6202566293124819,44.81102813039847],[-0.6205413373877039,44.81112437627026],[-0.6206897558564304,44.81118442213069]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Nancel Pénard"},"geometry":{"type":"LineString","coordinates":[[-0.619935245200211,44.810926762624696],[-0.6198349122372658,44.81088219392614]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Pacaris"},"geometry":{"type":"LineString","coordinates":[[-0.5826367980250649,44.798750738834926],[-0.5825623129236875,44.79869633382162],[-0.5821326794744244,44.79840764328983],[-0.5815222702920838,44.79799699890225],[-0.5812250803486825,44.79779538678289],[-0.5811058814962979,44.797695276271334]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Pacaris"},"geometry":{"type":"LineString","coordinates":[[-0.5826367980250649,44.798750738834926],[-0.5826252769756187,44.79875875870665],[-0.5826146096272298,44.79877440862122],[-0.5826116359824939,44.79879170788335],[-0.582616738227273,44.79880866266057],[-0.5826293051273863,44.79882358065419],[-0.5826479678020144,44.79883479343604],[-0.5826554480804653,44.79883708007676]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Pacaris"},"geometry":{"type":"LineString","coordinates":[[-0.5811058814962979,44.797695276271334],[-0.5811222045583413,44.79767494433155],[-0.581129341182702,44.79765337027799],[-0.5811279618236558,44.79763116357018],[-0.5811181781801152,44.79761012232174],[-0.5811008372354939,44.79759166116655],[-0.5810771703619295,44.7975772727113],[-0.581049012358213,44.797567980156245]]}},{"type":"Feature","properties":{"nom":"Impasse Mairie"},"geometry":{"type":"LineString","coordinates":[[-0.5896127506596973,44.80994108199276],[-0.5885014872928597,44.809885072212275]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Passage Mairie"},"geometry":{"type":"LineString","coordinates":[[-0.5885014872928597,44.809885072212275],[-0.5884357184487395,44.80988156196186],[-0.58841173029649,44.80985196114969],[-0.5884358148559534,44.80950096338401],[-0.5884052365925718,44.809442744302494]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Voie 1 Faculté des Sciences"},"geometry":{"type":"LineString","coordinates":[[-0.5920620861449233,44.809101217559316],[-0.5920833237562817,44.80912117566137],[-0.59211075591493,44.80913697453161],[-0.5921425472550291,44.80914759114289],[-0.5921770223162955,44.80915253791176],[-0.5922122586493441,44.80915142513561],[-0.5922459829311133,44.809144324608255],[-0.5922764550367651,44.80913174169464],[-0.5923014576779416,44.80911464724327]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Esplanade du 8 Mai 1945"},"geometry":{"type":"LineString","coordinates":[[-0.5884433216987119,44.8093329041959],[-0.5884496275106204,44.80905408229004],[-0.588440489708443,44.809021130382774],[-0.5884180327850829,44.80899985888062],[-0.5883272668548667,44.808966779621706]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Pierre Noailles"},"geometry":{"type":"LineString","coordinates":[[-0.5943043354637455,44.81037197922775],[-0.5943136504963611,44.810373216283445],[-0.5943343098917043,44.810373734545614],[-0.5943548403409727,44.81037218499194],[-0.5943748517399348,44.81036839978373],[-0.594393855711396,44.810362664599566],[-0.594411467758116,44.81035490150907],[-0.5944273314080498,44.81034548210374],[-0.5944407225173641,44.81033496976032]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Herman Lemoine"},"geometry":{"type":"LineString","coordinates":[[-0.6308228069958516,44.80703232765483],[-0.6308833205895168,44.80716534165337]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Jean Charcot"},"geometry":{"type":"LineString","coordinates":[[-0.6120315589483181,44.804418707609955],[-0.6137206908151805,44.804021385254835]]}},{"type":"Feature","properties":{"nom":"Avenue Fanning Lafontaine"},"geometry":{"type":"LineString","coordinates":[[-0.6120315589483181,44.804418707609955],[-0.6119350205019235,44.804228995774906],[-0.6117154585853717,44.80410741972833]]}},{"type":"Feature","properties":{"nom":"Allée Georges Brassens"},"geometry":{"type":"LineString","coordinates":[[-0.6091390095554492,44.80751947833871],[-0.6084853871706092,44.80752697399567]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Allée Georges Brassens"},"geometry":{"type":"LineString","coordinates":[[-0.6084853871706092,44.80752697399567],[-0.6083608681400925,44.807601729324546]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Cours de la Libération"},"geometry":{"type":"LineString","coordinates":[[-0.6039887601312252,44.7954786555727],[-0.6043142144126518,44.795214487797686],[-0.6047093366718237,44.79471903023624],[-0.6049384497657054,44.794366930672375],[-0.6050704052824838,44.794059438838374],[-0.6051568722383457,44.79373059798659],[-0.6052587178431771,44.79311156322309]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de Gradignan"},"geometry":{"type":"LineString","coordinates":[[-0.6248167158546375,44.80108108882604],[-0.6250574579169583,44.80152311339261],[-0.6252738215622851,44.8018510579183]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue des Deux Ponts"},"geometry":{"type":"LineString","coordinates":[[-0.6248167158546375,44.80108108882604],[-0.6235468187345438,44.80153305782432]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de Gradignan"},"geometry":{"type":"LineString","coordinates":[[-0.6230278625711209,44.79802290803133],[-0.6232016659512233,44.79816727002914],[-0.6232568515883903,44.79824613668069],[-0.6233380145767139,44.79842831233607],[-0.62351715536543,44.7988306835563],[-0.6236262062981425,44.7990317888845],[-0.6237362428375728,44.799200252445544],[-0.6238378786593499,44.799355831389505],[-0.6242505867429745,44.7998889472887],[-0.6243497290246917,44.79999677088432]]}},{"type":"Feature","properties":{"nom":"Avenue de Gradignan"},"geometry":{"type":"LineString","coordinates":[[-0.6230278625711209,44.79802290803133],[-0.62280310269126,44.79791124792263],[-0.6220637521887495,44.79768832964385],[-0.6218377001392427,44.797586257738956],[-0.6216094528428143,44.79743714161939],[-0.6212388052444724,44.79702510154128]]}},{"type":"Feature","properties":{"nom":"Allée Jeanne Chanay"},"geometry":{"type":"LineString","coordinates":[[-0.6230278625711209,44.79802290803133],[-0.6230766380044211,44.797979645418174],[-0.6230977354875343,44.79795095727731],[-0.6231147149730231,44.797925192918854],[-0.6231194732177401,44.797890178964],[-0.6229419063962776,44.797400015667755],[-0.62276837826354,44.79670226093422],[-0.6227195929221027,44.796584274090556],[-0.6226420968425924,44.796498641008384],[-0.6225458868614242,44.796423242951676]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Albert Schweitzer"},"geometry":{"type":"LineString","coordinates":[[-0.6212388052444724,44.79702510154128],[-0.6212663286467812,44.79701008200081],[-0.6212903771077768,44.796992110266075],[-0.621309968732785,44.796971668024554],[-0.6213247529603133,44.796949216858536],[-0.6213342642575237,44.79692540217889],[-0.6213382896275583,44.796900861355645],[-0.6213367310466968,44.79687604792815],[-0.6213296449907175,44.79685186093363],[-0.6213182259154546,44.79683321692945]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de Gradignan"},"geometry":{"type":"LineString","coordinates":[[-0.6248421499497538,44.80544780398771],[-0.6242857966554964,44.80616683431997]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue François Rabelais"},"geometry":{"type":"LineString","coordinates":[[-0.593193462358844,44.79621797596893],[-0.5924389591219411,44.796194159508005]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Frédéric Sevene"},"geometry":{"type":"LineString","coordinates":[[-0.5849876235953666,44.80613983686355],[-0.5841858371471785,44.80558750187525]]}},{"type":"Feature","properties":{"nom":"Rue Verdeau"},"geometry":{"type":"LineString","coordinates":[[-0.5849876235953666,44.80613983686355],[-0.5861198120682125,44.80449537688717]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Graham Bell"},"geometry":{"type":"LineString","coordinates":[[-0.6183521141724402,44.80048385125475],[-0.6177700580488659,44.80001150404143]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Mail Pierre Mendès France"},"geometry":{"type":"LineString","coordinates":[[-0.6309912993060639,44.81066543778118],[-0.6309816781326227,44.81072565067979],[-0.6306916282646684,44.810894447494356],[-0.6305753552429254,44.8109049149586],[-0.6301628211966482,44.811140317985114]]}},{"type":"Feature","properties":{"nom":"Rue Nelson Paillou"},"geometry":{"type":"LineString","coordinates":[[-0.6309912993060639,44.81066543778118],[-0.6306107064487226,44.810333015277955]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Roger Marcade"},"geometry":{"type":"LineString","coordinates":[[-0.6301628211966482,44.811140317985114],[-0.6298387235875248,44.81085293357542],[-0.6297863851179157,44.81078947312329],[-0.6297691243754254,44.8106902110446],[-0.6297218291258211,44.810290847235564],[-0.629585442485553,44.809839194970834]]}},{"type":"Feature","properties":{"nom":"Avenue Colonel Robert Jacqui"},"geometry":{"type":"LineString","coordinates":[[-0.6301628211966482,44.811140317985114],[-0.630105762234423,44.8111767311133]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Place de la Cinquième République"},"geometry":{"type":"LineString","coordinates":[[-0.6309416636166261,44.80546791955571],[-0.6308082702318089,44.805101932908464]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de Collegno"},"geometry":{"type":"LineString","coordinates":[[-0.6056844644651586,44.806002687415926],[-0.6053620107596795,44.80537088988191]]}},{"type":"Feature","properties":{"nom":"Impasse du Colonel René Fonck"},"geometry":{"type":"LineString","coordinates":[[-0.6300299939272938,44.80975663521422],[-0.6300665539802885,44.80979060116377],[-0.6301670803130618,44.80983756968866],[-0.6302326330233528,44.809841603305614],[-0.6303966248624713,44.809837360339436]]}},{"type":"Feature","properties":{"nom":"Rue Chateaubriand"},"geometry":{"type":"LineString","coordinates":[[-0.6259480769330436,44.805108556981914],[-0.6264257207198175,44.80572872752301]]}},{"type":"Feature","properties":{"nom":"Avenue Béranger"},"geometry":{"type":"LineString","coordinates":[[-0.6259480769330436,44.805108556981914],[-0.6250197402986414,44.80543061337116],[-0.6249316103386584,44.80545179922281],[-0.6248421499497538,44.80544780398771]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue de Chenevière"},"geometry":{"type":"LineString","coordinates":[[-0.6283159846498326,44.80246624911388],[-0.6283827483430332,44.801882537913045]]}},{"type":"Feature","properties":{"nom":"Rue de l'Amiral Prouhet"},"geometry":{"type":"LineString","coordinates":[[-0.6283159846498326,44.80246624911388],[-0.6269081382588043,44.80248142592167]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Jean Cordier"},"geometry":{"type":"LineString","coordinates":[[-0.6238502063826362,44.812110102232744],[-0.6246231752046867,44.811427684732095]]}},{"type":"Feature","properties":{"nom":"Avenue Maurice Faye"},"geometry":{"type":"LineString","coordinates":[[-0.6238502063826362,44.812110102232744],[-0.6247758361554655,44.81422144580021]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Jean Cordier"},"geometry":{"type":"LineString","coordinates":[[-0.6246231752046867,44.811427684732095],[-0.6254496151827686,44.810692299541095]]}},{"type":"Feature","properties":{"nom":"Avenue Hector Domecq"},"geometry":{"type":"LineString","coordinates":[[-0.6246231752046867,44.811427684732095],[-0.6255499929281934,44.81358177457588]]}},{"type":"Feature","properties":{"nom":"Avenue Jean Jaurès"},"geometry":{"type":"LineString","coordinates":[[-0.6261384776787635,44.80778442185393],[-0.6262970044470864,44.80771351675207]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue du Pont de Chiquet"},"geometry":{"type":"LineString","coordinates":[[-0.6261384776787635,44.80778442185393],[-0.6249092925072115,44.80740696481559],[-0.6248520460804974,44.807394105576876],[-0.6247876652228975,44.807386518354136],[-0.624455380481736,44.80737467638733],[-0.62441545453202,44.807365589021266],[-0.6243864593343019,44.80734921690008],[-0.6243411479644546,44.807293675486406]]}},{"type":"Feature","properties":{"nom":"Avenue Jean Jaurès"},"geometry":{"type":"LineString","coordinates":[[-0.6149636158821615,44.81253617954805],[-0.6162453655944039,44.812137179078924]]}},{"type":"Feature","properties":{"nom":"Rue Rossini"},"geometry":{"type":"LineString","coordinates":[[-0.6149636158821615,44.81253617954805],[-0.6154697640153065,44.813301834604765]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Jean Jaurès"},"geometry":{"type":"LineString","coordinates":[[-0.6162453655944039,44.812137179078924],[-0.6174973955855689,44.811732712827244]]}},{"type":"Feature","properties":{"nom":"Avenue Mozart"},"geometry":{"type":"LineString","coordinates":[[-0.6162453655944039,44.812137179078924],[-0.6167264185774021,44.812885880405375]]}},{"type":"Feature","properties":{"nom":"Rue Auguste Renoir"},"geometry":{"type":"LineString","coordinates":[[-0.6061403033668107,44.796389468898305],[-0.6060638161924718,44.79663106410612]]}},{"type":"Feature","properties":{"nom":"Rue Auguste Renoir"},"geometry":{"type":"LineString","coordinates":[[-0.6061403033668107,44.796389468898305],[-0.6059079132524073,44.79656781491607]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Auguste Renoir"},"geometry":{"type":"LineString","coordinates":[[-0.6059079132524073,44.79656781491607],[-0.6056337756651824,44.79677658077793],[-0.6055341462595111,44.79678775689993],[-0.6050567334529893,44.796471117352944]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Léo Valentin"},"geometry":{"type":"LineString","coordinates":[[-0.6077160928261833,44.809473202346354],[-0.6070114019224195,44.80985200795313]]}},{"type":"Feature","properties":{"nom":"Place du Professeur Piéchaud"},"geometry":{"type":"LineString","coordinates":[[-0.6077160928261833,44.809473202346354],[-0.6082347158446524,44.80920497076243]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Pierre Wiehn"},"geometry":{"type":"LineString","coordinates":[[-0.6317138802751466,44.803460696747564],[-0.6316421029121511,44.80330552186036],[-0.6315897765456633,44.802766148215255],[-0.6315470655030366,44.802321145803056],[-0.6315169722533645,44.80210455383939],[-0.6315015955196683,44.80205730030505],[-0.6314303730376181,44.80188679333691]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Georges Pompidou"},"geometry":{"type":"LineString","coordinates":[[-0.6314303730376181,44.80188679333691],[-0.6317942235850258,44.80183175458292],[-0.6318613026678508,44.80181195605702],[-0.6319174453304689,44.8017812462328],[-0.6319441479387236,44.80174517065194],[-0.6319605095374122,44.80171365924802],[-0.6319516566111693,44.801607282476205],[-0.6319660973756419,44.801573400142665],[-0.632006852774727,44.801541470054566],[-0.6326379737337389,44.801436904643296],[-0.6327094448633475,44.801428586152106],[-0.6327626334814607,44.80142931949511],[-0.633370389361369,44.80141179682576],[-0.633410583765787,44.80141916079589],[-0.6334535441094192,44.80143427370291],[-0.6334762915225891,44.80145390597681],[-0.6334876053757905,44.801480840003684],[-0.633551475932883,44.80202443885787],[-0.63357142696817,44.80205992517739],[-0.6336094064987315,44.802102402569886],[-0.6337264819578062,44.802205321666236],[-0.6339034211751292,44.802374701785695]]}},{"type":"Feature","properties":{"nom":"Avenue Pierre Wiehn"},"geometry":{"type":"LineString","coordinates":[[-0.6314303730376181,44.80188679333691],[-0.6313587518996446,44.80174008123639],[-0.6313066635366836,44.801680487252156]]}},{"type":"Feature","properties":{"nom":"Avenue de Bardanac"},"geometry":{"type":"LineString","coordinates":[[-0.6125672769128109,44.7940197076383],[-0.6119745595212183,44.79445778236543]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de Bardanac"},"geometry":{"type":"LineString","coordinates":[[-0.6119745595212183,44.79445778236543],[-0.6118649377906765,44.7945416183104],[-0.6108716764102907,44.79524851413376]]}},{"type":"Feature","properties":{"nom":"Place du Cardinal"},"geometry":{"type":"LineString","coordinates":[[-0.627149054686297,44.80405002871358],[-0.6271324783500616,44.803995137202875]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Boulevard Saint Martin"},"geometry":{"type":"LineString","coordinates":[[-0.627149054686297,44.80405002871358],[-0.6288499444519569,44.80393154326636]]}},{"type":"Feature","properties":{"nom":"Place du Cardinal"},"geometry":{"type":"LineString","coordinates":[[-0.6257521823861885,44.80431219554282],[-0.6258347801976771,44.80421172903405],[-0.6258604745204708,44.80419403393842],[-0.6258877998187484,44.804181706008556],[-0.6259179820150542,44.80416881860744],[-0.625959449590928,44.804160064447714],[-0.6261942637967857,44.80414362359268],[-0.6265227405338982,44.80412582527825],[-0.627149054686297,44.80405002871358]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de Gradignan"},"geometry":{"type":"LineString","coordinates":[[-0.6257521823861885,44.80431219554282],[-0.6257664823442374,44.804332265321975],[-0.6257750286646305,44.80435272191227],[-0.6257773155487234,44.80436687117453],[-0.6257768141566817,44.804381109323394],[-0.6257708702113112,44.80440202784385],[-0.6257589470606139,44.804421609435856],[-0.6257479237046967,44.804433494912594],[-0.6257186658929844,44.80445471683499]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue des Lacs"},"geometry":{"type":"LineString","coordinates":[[-0.6268196929754306,44.80186600150498],[-0.6283827483430332,44.801882537913045]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue du Cardinal"},"geometry":{"type":"LineString","coordinates":[[-0.6268196929754306,44.80186600150498],[-0.6267055904211111,44.801112215789686]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue de la Ramée"},"geometry":{"type":"LineString","coordinates":[[-0.627080073458247,44.79361836120969],[-0.6271228490174839,44.79362663580185],[-0.6271651816057452,44.79362987981102],[-0.627836075908068,44.793587669035915]]}},{"type":"Feature","properties":{"nom":"Rue des Résédas"},"geometry":{"type":"LineString","coordinates":[[-0.627080073458247,44.79361836120969],[-0.6270454836376967,44.79359541209286],[-0.6270212788505493,44.793562582841204],[-0.6270148447324665,44.79353873566962],[-0.6268444155250309,44.79226335915188]]}},{"type":"Feature","properties":{"nom":"Rue de la Ramée"},"geometry":{"type":"LineString","coordinates":[[-0.627836075908068,44.793587669035915],[-0.6284124019636882,44.793554507407194]]}},{"type":"Feature","properties":{"nom":"Rue de la Ramée"},"geometry":{"type":"LineString","coordinates":[[-0.627836075908068,44.793587669035915],[-0.6278441251990456,44.79375379720857],[-0.6278533162913976,44.79391394341432]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Pey Berland"},"geometry":{"type":"LineString","coordinates":[[-0.6095588933797128,44.80069147420939],[-0.6095433744470546,44.800686111356214],[-0.6095169419858123,44.80067821221731],[-0.6094891856112683,44.80067341790884],[-0.6094606216789674,44.80067189220863],[-0.6094320078361272,44.800673611069556],[-0.609404228006376,44.80067854643998],[-0.6093780398362934,44.80068667427534],[-0.6093537996328163,44.800697622936454],[-0.6093325063404421,44.80071118055606],[-0.6093145218999927,44.800727065401425],[-0.6093003176402956,44.80074472201834],[-0.6092902498764418,44.800763778769024],[-0.6092846692958378,44.800783774111395],[-0.6092835421296164,44.80080416861948],[-0.6092841275076156,44.80081351866447]]}},{"type":"Feature","properties":{"nom":"Rue Marc Sangnier"},"geometry":{"type":"LineString","coordinates":[[-0.6061904248093064,44.80935934252739],[-0.6067367308739857,44.809327157783876]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Marc Sangnier"},"geometry":{"type":"LineString","coordinates":[[-0.6067367308739857,44.809327157783876],[-0.6075898372026082,44.809273619724856]]}},{"type":"Feature","properties":{"nom":"Avenue Marcel Pagnol"},"geometry":{"type":"LineString","coordinates":[[-0.6199814020393726,44.797727427460025],[-0.6207722802030106,44.798098076945784],[-0.6210338750266592,44.798189920842134],[-0.621365980846125,44.79824006230291],[-0.6214167578327167,44.79826691178667]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Albert Schweitzer"},"geometry":{"type":"LineString","coordinates":[[-0.6199814020393726,44.797727427460025],[-0.6204684765805153,44.7973743793357]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue du Maréchal Juin"},"geometry":{"type":"LineString","coordinates":[[-0.6278565756756521,44.794040137058424],[-0.6280772120147169,44.794048141962],[-0.6284686254573436,44.79406393973606],[-0.6288910052258898,44.79408730595882],[-0.6293204244529603,44.79411999485734]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue des Marguerites"},"geometry":{"type":"LineString","coordinates":[[-0.6334931477747833,44.807382520972965],[-0.6321402210686764,44.8075884236563]]}},{"type":"Feature","properties":{"nom":"Rue Etienne Marcel"},"geometry":{"type":"LineString","coordinates":[[-0.6334931477747833,44.807382520972965],[-0.6336468350273577,44.807851273265534]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue du Général Bordas"},"geometry":{"type":"LineString","coordinates":[[-0.5892428261966974,44.801140946932136],[-0.5885653989972357,44.80106764762856]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Allée René Laroumagne"},"geometry":{"type":"LineString","coordinates":[[-0.6033760385970242,44.80532050067225],[-0.6030579491786829,44.805401832883284],[-0.6021666254435213,44.80564680328958]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Allée René Laroumagne"},"geometry":{"type":"LineString","coordinates":[[-0.6021666254435213,44.80564680328958],[-0.601584876390149,44.80579773715195]]}},{"type":"Feature","properties":{"nom":"Allée René Laroumagne"},"geometry":{"type":"LineString","coordinates":[[-0.6021666254435213,44.80564680328958],[-0.6018719681467807,44.80508861502246]]}},{"type":"Feature","properties":{"nom":"Allée René Laroumagne"},"geometry":{"type":"LineString","coordinates":[[-0.6022917175528385,44.80588894695939],[-0.6021666254435213,44.80564680328958]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Voie 1 Faculté des Sciences"},"geometry":{"type":"LineString","coordinates":[[-0.5996080759009443,44.806864276637434],[-0.5992583538122628,44.80694519566831],[-0.5988426315947495,44.807068947301644]]}},{"type":"Feature","properties":{"nom":"Avenue des Facultes"},"geometry":{"type":"LineString","coordinates":[[-0.5996080759009443,44.806864276637434],[-0.5999683281837823,44.80675796006154]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Voie 1 Faculté des Sciences"},"geometry":{"type":"LineString","coordinates":[[-0.5980661419872498,44.80799106177666],[-0.598175104191677,44.80825698384061]]}},{"type":"Feature","properties":{"nom":"Voie 1 Faculté des Sciences"},"geometry":{"type":"LineString","coordinates":[[-0.5980661419872498,44.80799106177666],[-0.6000949198921345,44.80744522031754],[-0.6001726211701689,44.80739060327828],[-0.600184254021919,44.80727700151726],[-0.600137809708099,44.80714523969952],[-0.6003041573304841,44.80685873719832],[-0.600306549408043,44.806789658363755],[-0.6002766793537899,44.806733069436376]]}},{"type":"Feature","properties":{"nom":"Rue Georges Bizet"},"geometry":{"type":"LineString","coordinates":[[-0.587796914409828,44.79791488591274],[-0.5877750460731076,44.79799448753065]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Aldona"},"geometry":{"type":"LineString","coordinates":[[-0.5877750460731076,44.79799448753065],[-0.5874940924930621,44.79876580341441]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Malherbe"},"geometry":{"type":"LineString","coordinates":[[-0.6025536281227533,44.79596940673287],[-0.602782077306796,44.79565498770984]]}},{"type":"Feature","properties":{"nom":"Rue Ronsard"},"geometry":{"type":"LineString","coordinates":[[-0.6025536281227533,44.79596940673287],[-0.6029775749561365,44.79611911546831]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Cours de la Libération"},"geometry":{"type":"LineString","coordinates":[[-0.6029775749561365,44.79611911546831],[-0.6021125593266066,44.796799076337216]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Lamartine"},"geometry":{"type":"LineString","coordinates":[[-0.5862677591195563,44.81279020825787],[-0.5862499193941397,44.81273942413745],[-0.5862286700997095,44.81266028170668],[-0.5862081168638413,44.81255571430498],[-0.5861961879227796,44.812429075256624],[-0.5861854658165723,44.812315730242524]]}},{"type":"Feature","properties":{"nom":"Rue Lamartine"},"geometry":{"type":"LineString","coordinates":[[-0.5861854658165723,44.812315730242524],[-0.5861690395503226,44.81189917006904]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Résidence Jocelin"},"geometry":{"type":"LineString","coordinates":[[-0.5861854658165723,44.812315730242524],[-0.585083395922537,44.812322723297065]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Allée Georges Simenon"},"geometry":{"type":"LineString","coordinates":[[-0.6210431820372987,44.807195449262856],[-0.6206966773237143,44.80705387855583],[-0.6206160801426124,44.80701978018523]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue du Relais"},"geometry":{"type":"LineString","coordinates":[[-0.6075399926453159,44.79530020462924],[-0.6073473808465167,44.794923192266666],[-0.6073108465849874,44.794909487512825],[-0.6066385318067892,44.79508710593935],[-0.6065960838034486,44.79514268204756]]}},{"type":"Feature","properties":{"nom":"Rue du Relais"},"geometry":{"type":"LineString","coordinates":[[-0.6075399926453159,44.79530020462924],[-0.6082477944066069,44.79542278223798]]}},{"type":"Feature","properties":{"nom":"Résidence Parc de Suzon"},"geometry":{"type":"LineString","coordinates":[[-0.583498074377168,44.81186020148482],[-0.5834151477483808,44.8118514635641],[-0.583339522877605,44.81180547207159],[-0.5833320972450592,44.81171859716562]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Résidence Parc de Suzon"},"geometry":{"type":"LineString","coordinates":[[-0.5833320972450592,44.81171859716562],[-0.5833240118119575,44.81143383395952],[-0.5831128403084147,44.81142832487604]]}},{"type":"Feature","properties":{"nom":"Résidence Parc de Suzon"},"geometry":{"type":"LineString","coordinates":[[-0.5833320972450592,44.81171859716562],[-0.583224791348128,44.81171260887287],[-0.5831303031730319,44.81165631158226],[-0.5831192966936468,44.81155864960264]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Pacaris"},"geometry":{"type":"LineString","coordinates":[[-0.5809334049683368,44.79758882598663],[-0.5809148995955872,44.797606614248636],[-0.5809037870823118,44.797627322579665],[-0.5809009882528249,44.797649480684846],[-0.5809065177071692,44.79767128647251],[-0.5809201542524736,44.797691215521326],[-0.5809358583233416,44.7977036927822]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Pacaris"},"geometry":{"type":"LineString","coordinates":[[-0.5809334049683368,44.79758882598663],[-0.580551225556099,44.79734484755646],[-0.580068242143265,44.79702386877795],[-0.5796231749395211,44.79672052167198],[-0.5795537033330288,44.79665100351513]]}},{"type":"Feature","properties":{"nom":"Rue Pacaris"},"geometry":{"type":"LineString","coordinates":[[-0.5809358583233416,44.7977036927822],[-0.5809409190700705,44.797707767263674],[-0.5809672243169812,44.797719820632636],[-0.5809969770617486,44.797726270466526],[-0.5810281346262272,44.79772682075763],[-0.5810584129569158,44.79772136326226],[-0.5810854296505773,44.79771024324407],[-0.5811058814962979,44.797695276271334]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Edmond Michelet"},"geometry":{"type":"LineString","coordinates":[[-0.5809358583233416,44.7977036927822],[-0.5808584173957647,44.797770719640575],[-0.580759003608699,44.797879155128626],[-0.5806907311756506,44.79796751274467],[-0.58038085195626,44.79839272485266]]}},{"type":"Feature","properties":{"nom":"Rue Parmentier"},"geometry":{"type":"LineString","coordinates":[[-0.585610866426628,44.80766229960811],[-0.5844384020875807,44.80730298439016]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue François Rabelais"},"geometry":{"type":"LineString","coordinates":[[-0.5948658704777255,44.79626871633933],[-0.593193462358844,44.79621797596893]]}},{"type":"Feature","properties":{"nom":"Résidence Raba 2"},"geometry":{"type":"LineString","coordinates":[[-0.5926451115140102,44.79696865908753],[-0.5925867961775646,44.79698707642441],[-0.5924861081899795,44.796952873086965],[-0.5924584451942022,44.7969190653337],[-0.5924878194613906,44.79667374462788]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Résidence Raba 2"},"geometry":{"type":"LineString","coordinates":[[-0.5924878194613906,44.79667374462788],[-0.592639381701318,44.79667976655872],[-0.5926733442907576,44.79671112320306],[-0.5926451115140102,44.79696865908753]]}},{"type":"Feature","properties":{"nom":"Avenue des Arts Et Metiers"},"geometry":{"type":"LineString","coordinates":[[-0.601584876390149,44.80579773715195],[-0.6012665955153395,44.80519957824972]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rond-point Plume la Poule"},"geometry":{"type":"LineString","coordinates":[[-0.5846706106451018,44.799865821105186],[-0.5846606362024301,44.79987226104711],[-0.5846422598198197,44.79989211773739],[-0.584631386281011,44.79991462055669],[-0.5846285631198808,44.79993840102652],[-0.5846343211001409,44.79996182094681],[-0.584647945002451,44.79998355163412],[-0.5846687140143846,44.80000217449828],[-0.5846954189829496,44.80001655658468],[-0.5847263568330243,44.80002576067163],[-0.5847594624249837,44.800029131193845],[-0.5847927097471398,44.80002664192913],[-0.5848152581641884,44.80002097670167]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Pacaris"},"geometry":{"type":"LineString","coordinates":[[-0.5846706106451018,44.799865821105186],[-0.5845446748750324,44.79982438925881],[-0.5842750151742157,44.79966704773293],[-0.584055863863987,44.79953045415536],[-0.5838172528492933,44.79939627503608],[-0.5836954339824488,44.799327417824934],[-0.583594741220704,44.799262579054854]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue André Messager"},"geometry":{"type":"LineString","coordinates":[[-0.5897684222230885,44.79628065133203],[-0.5898253807501236,44.79584015404845],[-0.5898589085239744,44.79578531672493]]}},{"type":"Feature","properties":{"nom":"Rue André Messager"},"geometry":{"type":"LineString","coordinates":[[-0.5897684222230885,44.79628065133203],[-0.5884126126163992,44.79620020875445]]}},{"type":"Feature","properties":{"nom":"Rue André Messager"},"geometry":{"type":"LineString","coordinates":[[-0.5884126126163992,44.79620020875445],[-0.5859913165365825,44.79604678625102]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Georges Bizet"},"geometry":{"type":"LineString","coordinates":[[-0.5884126126163992,44.79620020875445],[-0.5880899537441516,44.79708175177864]]}},{"type":"Feature","properties":{"nom":"Rue du Haut Carre"},"geometry":{"type":"LineString","coordinates":[[-0.5944407225173641,44.81033496976032],[-0.5947431460640369,44.810446213011325],[-0.5953333058379465,44.810684745640245]]}},{"type":"Feature","properties":{"nom":"Rue Pierre Noailles"},"geometry":{"type":"LineString","coordinates":[[-0.5944407225173641,44.81033496976032],[-0.5944521996892678,44.81032217576111],[-0.5945133408600697,44.81018043632527],[-0.5945170158935137,44.810164285583184],[-0.5945170002760433,44.81014780105634],[-0.5945132069583248,44.81013161606993],[-0.594505658371524,44.81011609024261],[-0.5944946351421221,44.81010166511787],[-0.5944804179016955,44.810088782235205],[-0.594463402358993,44.810077699335835],[-0.5944439898304671,44.81006876406697],[-0.5944228342264861,44.81006231609056]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Marivaux"},"geometry":{"type":"LineString","coordinates":[[-0.5984941854509571,44.79876959648253],[-0.5997139160059415,44.798065466565966],[-0.5995584697456817,44.797928416799316]]}},{"type":"Feature","properties":{"nom":"Rue Marivaux"},"geometry":{"type":"LineString","coordinates":[[-0.5995584697456817,44.797928416799316],[-0.5983513532798703,44.79863800133438],[-0.5984941854509571,44.79876959648253]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de la Marne"},"geometry":{"type":"LineString","coordinates":[[-0.5959392521576963,44.79447186994839],[-0.5954968380460426,44.79449820011946],[-0.59515921866524,44.79448058846603],[-0.5948698901247353,44.794429920465475],[-0.5941555003119894,44.79425369005078]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de la Marne"},"geometry":{"type":"LineString","coordinates":[[-0.5959392521576963,44.79447186994839],[-0.5959390680250395,44.794393864488775],[-0.5959447113890358,44.794376840644354],[-0.595963724452301,44.79436119567471],[-0.5960224204527539,44.79434285452892],[-0.5965393705192873,44.794300652609074],[-0.59683847161794,44.79421390194165]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Georges Clémenceau"},"geometry":{"type":"LineString","coordinates":[[-0.5956951221808845,44.80408803249884],[-0.5979900250654584,44.80311454502185]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue des Flamboyants"},"geometry":{"type":"LineString","coordinates":[[-0.6202864288590101,44.80518005017042],[-0.6201737519763828,44.80505418675388]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue des Flamboyants"},"geometry":{"type":"LineString","coordinates":[[-0.6202864288590101,44.80518005017042],[-0.6201678190527815,44.80528814201962]]}},{"type":"Feature","properties":{"nom":"Rue Ernest Renan"},"geometry":{"type":"LineString","coordinates":[[-0.5951509690186139,44.80529017486023],[-0.5945591266873305,44.804573269848255]]}},{"type":"Feature","properties":{"nom":"Rue Jules Guesde"},"geometry":{"type":"LineString","coordinates":[[-0.5951509690186139,44.80529017486023],[-0.5963189105283733,44.80485238606977]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Lafitte"},"geometry":{"type":"LineString","coordinates":[[-0.5862735772825147,44.79490789896886],[-0.5863172883442309,44.79475842595066]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Blumerel"},"geometry":{"type":"LineString","coordinates":[[-0.5842133684977429,44.80200895198547],[-0.5839626726056485,44.80214458791417]]}},{"type":"Feature","properties":{"nom":"Rue Peydavant"},"geometry":{"type":"LineString","coordinates":[[-0.5851201875665865,44.80179119926634],[-0.5851151390953323,44.80180360951636],[-0.5851126547813236,44.801830802419424],[-0.5851184993276105,44.801857642697826],[-0.5851322212241612,44.801882973521195],[-0.5851533689567878,44.801905638057626],[-0.5851729305762308,44.80191907417385]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Blumerel"},"geometry":{"type":"LineString","coordinates":[[-0.5829773948842143,44.80285700859803],[-0.5826711868171895,44.80315617672418]]}},{"type":"Feature","properties":{"nom":"Résidence Michel Montaigne"},"geometry":{"type":"LineString","coordinates":[[-0.5829773948842143,44.80285700859803],[-0.582654089070662,44.80271207266947]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Piste Cyclable Thouars"},"geometry":{"type":"LineString","coordinates":[[-0.5923505719694316,44.79740711467132],[-0.5923292350170777,44.79725960360406],[-0.5923761742138395,44.796847436536005],[-0.5923915796231064,44.79679010808445],[-0.5924110577336282,44.796670224070986]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Calixte Camelle"},"geometry":{"type":"LineString","coordinates":[[-0.5923505719694316,44.79740711467132],[-0.5921843731680444,44.79734083928537]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de Thouars"},"geometry":{"type":"LineString","coordinates":[[-0.5921843731680444,44.79734083928537],[-0.5921674174069451,44.79743217761519],[-0.592075271313752,44.79777469763343],[-0.5919795209869134,44.7980715696703],[-0.5919150812532874,44.798257732715236],[-0.591749738721691,44.79856265778556],[-0.5916468256867602,44.79864509009591]]}},{"type":"Feature","properties":{"nom":"Rue Charles Gounod"},"geometry":{"type":"LineString","coordinates":[[-0.5921843731680444,44.79734083928537],[-0.5880899537441516,44.79708175177864]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Cours de la Libération"},"geometry":{"type":"LineString","coordinates":[[-0.5938418315239782,44.80177681685403],[-0.5938869217759313,44.80173899885876],[-0.5939783800105355,44.80168386116087],[-0.595003061518976,44.80107819332798]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Cours de la Libération"},"geometry":{"type":"LineString","coordinates":[[-0.5914934469368046,44.80787730359128],[-0.5914955038673537,44.807768149397134],[-0.5915105515369655,44.80766236845958],[-0.5915349401615435,44.807503414462836],[-0.5916048453184486,44.80724231158861],[-0.5917028232152922,44.80692505131087],[-0.591766336803742,44.8068580488834]]}},{"type":"Feature","properties":{"nom":"Cours de la Libération"},"geometry":{"type":"LineString","coordinates":[[-0.591766336803742,44.8068580488834],[-0.5917530461618853,44.80686457610261],[-0.5917244589228257,44.80687409658636],[-0.5916958079380658,44.80687768181939],[-0.5916634127232887,44.80687586530662],[-0.5916341990419611,44.8068684202106],[-0.5916084990576307,44.806855428560446]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Cours de la Libération"},"geometry":{"type":"LineString","coordinates":[[-0.591766336803742,44.8068580488834],[-0.5918101268319217,44.806836178667034],[-0.5918345249577794,44.806821633226996],[-0.5918524526885063,44.80680284983291],[-0.5918630512275317,44.806781595907665]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Cours de la Libération"},"geometry":{"type":"LineString","coordinates":[[-0.5965703030351481,44.8006820962064],[-0.5966105078610685,44.80064713400643],[-0.5966399934201979,44.800606655431295],[-0.5966571152591831,44.800562694304766],[-0.5966609809813749,44.80051717058117],[-0.596651461465492,44.80047207015828],[-0.5966289326868998,44.80042936295386],[-0.5965945226617212,44.80039090501591],[-0.5965714569927393,44.80037406839496]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Cours de la Libération"},"geometry":{"type":"LineString","coordinates":[[-0.6039085937317981,44.795420660585705],[-0.6039887601312252,44.7954786555727]]}},{"type":"Feature","properties":{"nom":"Cours de la Libération"},"geometry":{"type":"LineString","coordinates":[[-0.6039085937317981,44.795420660585705],[-0.6031698247275253,44.795968441697646],[-0.6029775749561365,44.79611911546831]]}},{"type":"Feature","properties":{"nom":"Esplanade d'Alcala de Henares"},"geometry":{"type":"LineString","coordinates":[[-0.5903439306842265,44.811647667559505],[-0.5902507396256396,44.81214867142865]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Allée François Pommez"},"geometry":{"type":"LineString","coordinates":[[-0.6294033291781501,44.80882408599701],[-0.6293940991229648,44.80880411165057],[-0.6293735963000191,44.80874377910505],[-0.6290654939923932,44.808286074605]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Etienne Marcel"},"geometry":{"type":"LineString","coordinates":[[-0.6321219936157869,44.80681716620748],[-0.6322493369730197,44.80678571413149],[-0.6324150830141619,44.806739162560774],[-0.6324539626388954,44.80672359754805]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de l'Université"},"geometry":{"type":"LineString","coordinates":[[-0.6053857356036779,44.80792308022486],[-0.6054001766340339,44.807937486119535],[-0.6054326700956663,44.807961318969674],[-0.6054700997347832,44.80798112179187],[-0.6055114214751282,44.807996387180324],[-0.6055557287739428,44.808006783535625],[-0.6056017362113596,44.80801199127104],[-0.6056351334495721,44.808011833433156]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de l'Université"},"geometry":{"type":"LineString","coordinates":[[-0.6004552821986776,44.80621508908806],[-0.600459300840116,44.80621054784122],[-0.6004771262259215,44.80617989605552],[-0.6004871301046085,44.80614760012556],[-0.60048911044938,44.80611447719136],[-0.6004830139884674,44.806081700009884],[-0.6004690175607165,44.80605007372619],[-0.6004474467548337,44.80602075910165],[-0.6004191042273229,44.8059944513845],[-0.6004152790420273,44.805991960079176]]}},{"type":"Feature","properties":{"nom":"Avenue de l'Université"},"geometry":{"type":"LineString","coordinates":[[-0.6001917895831032,44.80508794082779],[-0.6001801286553827,44.80506533891499],[-0.6001751297462741,44.80503189640559],[-0.6001113002571422,44.80457918076215]]}},{"type":"Feature","properties":{"nom":"Avenue de l'Université"},"geometry":{"type":"LineString","coordinates":[[-0.6001113002571422,44.80457918076215],[-0.6001919930211759,44.804566447287385],[-0.6002310290208128,44.804567463723345],[-0.6002652944923549,44.804577188982584],[-0.6002929120260635,44.804595952744],[-0.6003172631288484,44.80461914385206],[-0.6003255820382929,44.804655093656024],[-0.6003762695458309,44.805049311332716],[-0.6003701914379115,44.805065448321265],[-0.6003577627118009,44.80508728136275],[-0.6003331205991393,44.80510400598139],[-0.6003071760979338,44.80511203382507],[-0.6002763652487775,44.80511508100307],[-0.6002474654232318,44.80511428422006],[-0.6002234344914212,44.80510837878168],[-0.6001917895831032,44.80508794082779]]}},{"type":"Feature","properties":{"nom":"Avenue de l'Université"},"geometry":{"type":"LineString","coordinates":[[-0.6001113002571422,44.80457918076215],[-0.6000852811907536,44.8043813726086]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue de la Vieille Tour"},"geometry":{"type":"LineString","coordinates":[[-0.6005709443936075,44.81246494703294],[-0.6005489109202315,44.81225404099302],[-0.6004032409470913,44.811165952732004],[-0.6001777192518086,44.81026010596803],[-0.6001605108446603,44.810093998251546]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue de la Vieille Tour"},"geometry":{"type":"LineString","coordinates":[[-0.6001605108446603,44.810093998251546],[-0.6002637299224294,44.80892227291324],[-0.6003365168343558,44.808270294930296]]}},{"type":"Feature","properties":{"nom":"Avenue des Facultes"},"geometry":{"type":"LineString","coordinates":[[-0.6033032501363998,44.80586050945838],[-0.6024013038858907,44.80610770975058]]}},{"type":"Feature","properties":{"nom":"Voie de l'Université 4"},"geometry":{"type":"LineString","coordinates":[[-0.6033032501363998,44.80586050945838],[-0.6038053565986792,44.806815962071745]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue des Facultes"},"geometry":{"type":"LineString","coordinates":[[-0.6024013038858907,44.80610770975058],[-0.6018331508031505,44.80626163727018]]}},{"type":"Feature","properties":{"nom":"Rue Doyen Henri Vizioz"},"geometry":{"type":"LineString","coordinates":[[-0.5972536510442011,44.81180591126048],[-0.5964206283636074,44.811967014130445],[-0.5958535522035362,44.81201358750806]]}},{"type":"Feature","properties":{"nom":"Rue du Haut Carre"},"geometry":{"type":"LineString","coordinates":[[-0.5972536510442011,44.81180591126048],[-0.5973681622161326,44.812083436514975],[-0.5975106500427024,44.81243610629011]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Pierre Noailles"},"geometry":{"type":"LineString","coordinates":[[-0.5941901639134951,44.81028631546872],[-0.5941945325778943,44.810301581463854],[-0.5942017163889127,44.81031531719373],[-0.5942116339015154,44.810328245888506],[-0.594224130788562,44.81033992201472],[-0.5942388225515645,44.81035026763737],[-0.5942555548617322,44.81035883722191],[-0.594273822528686,44.810365646731825],[-0.5942933561386616,44.810370434430695],[-0.5943043354637455,44.81037197922775]]}},{"type":"Feature","properties":{"nom":"Rond-point de la Légion d'Honneur"},"geometry":{"type":"LineString","coordinates":[[-0.5886892546935539,44.80732974323805],[-0.5887206567832344,44.80734226475539],[-0.5887557979583218,44.80734980387392],[-0.5887924808823762,44.80735161918249],[-0.5888287887820327,44.80734741083005]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rond-point de la Légion d'Honneur"},"geometry":{"type":"LineString","coordinates":[[-0.5886892546935539,44.80732974323805],[-0.58866168440338,44.8073116959087],[-0.5886407323645357,44.80729019682212],[-0.5886270748051944,44.80726594530009],[-0.5886221785661602,44.80724420989426]]}},{"type":"Feature","properties":{"nom":"Esplanade du 8 Mai 1945"},"geometry":{"type":"LineString","coordinates":[[-0.5876967809948078,44.80906765093253],[-0.587919333101578,44.80914837087973]]}},{"type":"Feature","properties":{"nom":"Rue du Professeur Arnozan"},"geometry":{"type":"LineString","coordinates":[[-0.5876967809948078,44.80906765093253],[-0.5878411980233785,44.808960402602814]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Eugène Et Marc Dulout"},"geometry":{"type":"LineString","coordinates":[[-0.6324972230262332,44.80443615401674],[-0.6343271677684411,44.80376746507475]]}},{"type":"Feature","properties":{"nom":"Rue César Franck"},"geometry":{"type":"LineString","coordinates":[[-0.5839721605433712,44.79625664083094],[-0.5833254041750363,44.79571293010645]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue César Franck"},"geometry":{"type":"LineString","coordinates":[[-0.5839721605433712,44.79625664083094],[-0.5840965601187471,44.796381356983915]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Peydavant"},"geometry":{"type":"LineString","coordinates":[[-0.5867244760266841,44.8043076775135],[-0.586742943242999,44.804098105472036],[-0.5867200351165935,44.803925150249526],[-0.5866897638792186,44.803723330809916],[-0.5866414389109001,44.80354045736144]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Résidence Parc de Suzon"},"geometry":{"type":"LineString","coordinates":[[-0.5836397916982583,44.81212859390735],[-0.5835181598504503,44.81207945772821],[-0.583498074377168,44.81186020148482]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue du Rond Point"},"geometry":{"type":"LineString","coordinates":[[-0.6145145899145501,44.80572097974112],[-0.6127699290240495,44.80610926622104]]}},{"type":"Feature","properties":{"nom":"Avenue Phenix Haut-Brion"},"geometry":{"type":"LineString","coordinates":[[-0.6145145899145501,44.80572097974112],[-0.6156386765922829,44.808168934866266]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Esplanade des Antilles"},"geometry":{"type":"LineString","coordinates":[[-0.6144286227959143,44.79572258881573],[-0.6162000239246755,44.79524135064804]]}},{"type":"Feature","properties":{"nom":"Avenue Jean Babin"},"geometry":{"type":"LineString","coordinates":[[-0.6144286227959143,44.79572258881573],[-0.6143089022443278,44.795925838115174]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Albert Schweitzer"},"geometry":{"type":"LineString","coordinates":[[-0.6229576027525034,44.794378110453],[-0.6229959303669044,44.79439814909484],[-0.6230380271767303,44.79441374362295],[-0.6230832223265556,44.79442428482021],[-0.6231302418987021,44.79442963310357],[-0.6231775707522589,44.79442983674528]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Albert Schweitzer"},"geometry":{"type":"LineString","coordinates":[[-0.6229576027525034,44.794378110453],[-0.6230065329894773,44.7944702385557],[-0.623007881833746,44.79452190359879],[-0.622998499584751,44.7945497681119],[-0.6229446771716683,44.79470192255521],[-0.6228279547226726,44.7950268794269],[-0.6226888175547365,44.79540587968823],[-0.6226282527213566,44.79555545611212],[-0.6225514224920026,44.79569987535973],[-0.6224591750543634,44.7958345161116],[-0.6223705393675297,44.79594408856817],[-0.6222797711924088,44.79603382039288],[-0.6222142800053897,44.796092929349115],[-0.6221148692430387,44.796175999870194],[-0.6214402181527549,44.79664231874026],[-0.6213139958518566,44.7967215579503],[-0.6212349465970253,44.796764252395086]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Albert Schweitzer"},"geometry":{"type":"LineString","coordinates":[[-0.6212349465970253,44.796764252395086],[-0.6211898407631874,44.79674911331413],[-0.6211560774032907,44.79674334207002],[-0.621121414817604,44.79674138295748],[-0.621086753801537,44.796743477542655],[-0.6210529725600052,44.796749507780675],[-0.6210210755715437,44.79675935160369],[-0.6209916772190072,44.796772719199055],[-0.6209657650414958,44.796789218793606],[-0.6209439477830334,44.7968084706697],[-0.6209334497793274,44.79682060587063]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Albert Schweitzer"},"geometry":{"type":"LineString","coordinates":[[-0.6170348711673813,44.80045800961697],[-0.6170499004003688,44.80055437117076],[-0.6170502946190675,44.80060300361275],[-0.61697962835816,44.80100531093893],[-0.6169503503639924,44.80118803013178],[-0.6169187837436451,44.80134839135547],[-0.6168924403559787,44.801440753744146],[-0.6168568122660602,44.80153638414043],[-0.616825821419348,44.801601058571414],[-0.6167927076211578,44.80167021458375],[-0.6167301170117867,44.801773728855174],[-0.6166342064730959,44.80189875154662],[-0.6165503586931487,44.80199420358758],[-0.6164402360209595,44.80209841836813],[-0.6163112116692124,44.80219782904178],[-0.6161666511965815,44.80229566161493],[-0.6159774135699967,44.802397346684565],[-0.6157918313912205,44.80247864648155],[-0.615571817260901,44.802553653726214],[-0.6154639142190489,44.80257023603777],[-0.6153704507822452,44.802572936844314],[-0.615303508186988,44.80257281271715]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Albert Schweitzer"},"geometry":{"type":"LineString","coordinates":[[-0.6170348711673813,44.80045800961697],[-0.6170485946892249,44.80046297815326],[-0.6170814680759295,44.80047067072388],[-0.617115746124498,44.800474535112365],[-0.6171504073520003,44.80047442363929],[-0.6171720137256175,44.800471934783396]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Albert Schweitzer"},"geometry":{"type":"LineString","coordinates":[[-0.6108199774483072,44.80481444701006],[-0.6107808001779206,44.8047970435848],[-0.610738110337762,44.804784165720726],[-0.6106929576121422,44.80477641067098],[-0.610646742377925,44.804773914143865],[-0.6106006068118239,44.804776729961674]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Nancel Pénard"},"geometry":{"type":"LineString","coordinates":[[-0.6205284245130067,44.81087246378458],[-0.6222925693597104,44.810466415289795]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue du Vallon"},"geometry":{"type":"LineString","coordinates":[[-0.6205284245130067,44.81087246378458],[-0.6206897558564304,44.81118442213069]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de l'Université"},"geometry":{"type":"LineString","coordinates":[[-0.6004152790420273,44.805991960079176],[-0.6004194219007658,44.80591444814489],[-0.6005805773055457,44.80550235433324],[-0.6006272799907852,44.80538502988931],[-0.6006545461952569,44.80528471572321],[-0.6006640080685695,44.80507560510431],[-0.6006119587252647,44.8046312546883],[-0.6006221089494935,44.80453445507072]]}},{"type":"Feature","properties":{"nom":"Avenue de l'Université"},"geometry":{"type":"LineString","coordinates":[[-0.6004152790420273,44.805991960079176],[-0.6003848094757422,44.80597211553534],[-0.6003456121077931,44.805954348901174],[-0.6003025617233329,44.80594174883157],[-0.6002739308007025,44.805937160069774]]}},{"type":"Feature","properties":{"nom":"Avenue de l'Université"},"geometry":{"type":"LineString","coordinates":[[-0.6006221089494935,44.80453445507072],[-0.6006426594849548,44.804529210294945],[-0.6006816050860443,44.80451257327835],[-0.6007157124173687,44.80449140513154],[-0.6007471674791848,44.80446221351912]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Impasse des Acacias"},"geometry":{"type":"LineString","coordinates":[[-0.58038085195626,44.79839272485266],[-0.5804263357493041,44.79844263936947],[-0.5805825453067416,44.7985377118534],[-0.5807320014946282,44.79863200587201]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue des Camélias"},"geometry":{"type":"LineString","coordinates":[[-0.58038085195626,44.79839272485266],[-0.5803079985196377,44.79834214057878],[-0.5798295503254133,44.79815136572929]]}},{"type":"Feature","properties":{"nom":"Rue Edmond Michelet"},"geometry":{"type":"LineString","coordinates":[[-0.58038085195626,44.79839272485266],[-0.5802604971016735,44.79855514735146],[-0.5801201979851714,44.79874684345496],[-0.5800742667089831,44.79882215617057]]}},{"type":"Feature","properties":{"nom":"Cours de la Libération"},"geometry":{"type":"LineString","coordinates":[[-0.5912520546581699,44.81011634475008],[-0.5912290658125761,44.81024498686175]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Espeleta"},"geometry":{"type":"LineString","coordinates":[[-0.5912520546581699,44.81011634475008],[-0.5898639664009762,44.81006134052601]]}},{"type":"Feature","properties":{"nom":"Avenue Espeleta"},"geometry":{"type":"LineString","coordinates":[[-0.5898639664009762,44.81006134052601],[-0.5898432957757949,44.81017036133909]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Francisco Ferrer"},"geometry":{"type":"LineString","coordinates":[[-0.5832376806298483,44.810574383277476],[-0.5831321089724198,44.81129043371454],[-0.5831112470882293,44.81130090973327]]}},{"type":"Feature","properties":{"nom":"Rue de Suzon"},"geometry":{"type":"LineString","coordinates":[[-0.5832376806298483,44.810574383277476],[-0.5839712380041369,44.81070414171307],[-0.5845266756419456,44.81081239400367]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Albert Schweitzer"},"geometry":{"type":"LineString","coordinates":[[-0.6109243507247113,44.804921214813355],[-0.6109078682169812,44.804890389227104],[-0.6108844433263534,44.80486185594839],[-0.6108550051008734,44.80483630614212],[-0.6108199774483072,44.80481444701006]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Albert Schweitzer"},"geometry":{"type":"LineString","coordinates":[[-0.6109243507247113,44.804921214813355],[-0.6109778634207867,44.804874564511614],[-0.6110272552289882,44.804822730119284],[-0.6111009851415007,44.80476552875814],[-0.6112652610657652,44.80464284482136],[-0.6114697276603485,44.80445276356772],[-0.611583089288273,44.80431521058364],[-0.6117154585853717,44.80410741972833]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Albert Schweitzer"},"geometry":{"type":"LineString","coordinates":[[-0.6117154585853717,44.80410741972833],[-0.6119918161579154,44.80363498641018],[-0.612038098281536,44.80356586424403],[-0.6120943476023514,44.80349426351782],[-0.6122070209454944,44.80336799202706],[-0.6123054077384538,44.803280279280585],[-0.6124588637336369,44.803166765170374],[-0.6126697869678392,44.80304755188783],[-0.6128054005550593,44.802984510025624],[-0.6129673496982034,44.80292981987449],[-0.6132006267363936,44.80286043204193]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue de Suzon"},"geometry":{"type":"LineString","coordinates":[[-0.5896315190587665,44.81053710171911],[-0.5891885489291463,44.810515857685246]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de l'Université"},"geometry":{"type":"LineString","coordinates":[[-0.6004523068258636,44.8045365874173],[-0.6004654573699035,44.804540495084915],[-0.6005101061451532,44.804546288283035],[-0.6005554058204732,44.80454629558172],[-0.6006000935370055,44.804540556959594],[-0.6006221089494935,44.80453445507072]]}},{"type":"Feature","properties":{"nom":"Avenue de l'Université"},"geometry":{"type":"LineString","coordinates":[[-0.6004523068258636,44.8045365874173],[-0.600509179884899,44.80463477855403],[-0.6005733752040296,44.80519864421006],[-0.6005184813348118,44.80542793014191],[-0.6003524924280303,44.805815314116046],[-0.6002739308007025,44.805937160069774]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue André Pujol"},"geometry":{"type":"LineString","coordinates":[[-0.6323132574139818,44.80535818369297],[-0.6323063410732528,44.80535083751426],[-0.6322151558794488,44.80515079027539]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Paul Louis Courrier"},"geometry":{"type":"LineString","coordinates":[[-0.5928693700846391,44.799062920016524],[-0.5942055605025433,44.79804610025062]]}},{"type":"Feature","properties":{"nom":"Avenue de Thouars"},"geometry":{"type":"LineString","coordinates":[[-0.5928693700846391,44.799062920016524],[-0.5930135094852443,44.799112145319356],[-0.5930966794062063,44.7991575314657],[-0.5931860090700474,44.799228666593606],[-0.5932346390227299,44.79927811662657],[-0.5932890719379768,44.7993577409731],[-0.593355786352114,44.799476072897974],[-0.5933858786547904,44.799536648197865]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Piste Cyclable Thouars"},"geometry":{"type":"LineString","coordinates":[[-0.5917724060901783,44.798699046797225],[-0.5918262080728558,44.79866095443481],[-0.5918542530380289,44.798625747422626],[-0.5919036377979995,44.79856752606221],[-0.5920635466287136,44.79824241381726],[-0.5921288760566719,44.79807459931594],[-0.5922720098590404,44.79755949289481],[-0.5923505719694316,44.79740711467132]]}},{"type":"Feature","properties":{"nom":"Avenue de Thouars"},"geometry":{"type":"LineString","coordinates":[[-0.5917724060901783,44.798699046797225],[-0.5919524158719314,44.79877371472242],[-0.5928693700846391,44.799062920016524]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Maréchal Leclerc"},"geometry":{"type":"LineString","coordinates":[[-0.5901752386690532,44.80668821935534],[-0.5900668502588153,44.80669722554523],[-0.5898059115588464,44.80676806815446],[-0.5896115332989635,44.80685113260901],[-0.5891428865667643,44.80706941649979],[-0.5889215836520356,44.807171255589246]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Cours de la Libération"},"geometry":{"type":"LineString","coordinates":[[-0.594965116161893,44.80104390037088],[-0.5939644858741517,44.80162538649723],[-0.5938469430457691,44.801694410346975],[-0.5937829356824031,44.80173931199198]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de Thouars"},"geometry":{"type":"LineString","coordinates":[[-0.5937829356824031,44.80173931199198],[-0.5936578669771625,44.80161048284419],[-0.5936113475162896,44.80143863472075],[-0.5936014720252016,44.8012578816845],[-0.5933378311746387,44.800416106713314]]}},{"type":"Feature","properties":{"nom":"Cours de la Libération"},"geometry":{"type":"LineString","coordinates":[[-0.5937829356824031,44.80173931199198],[-0.5937256983954406,44.8017974219153],[-0.5936815058843903,44.801867911286266],[-0.5933681929699226,44.802659092840265]]}},{"type":"Feature","properties":{"nom":"Avenue de Thouars"},"geometry":{"type":"LineString","coordinates":[[-0.5937829356824031,44.80173931199198],[-0.5938418315239782,44.80177681685403]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue de Megret"},"geometry":{"type":"LineString","coordinates":[[-0.5884806678820967,44.80460857465829],[-0.5883571332519366,44.80464317169309],[-0.5882875173174691,44.80465500674462],[-0.5882368607727104,44.80465228094047],[-0.5881834186771948,44.80464342734509],[-0.5879740703110379,44.80459364035909]]}},{"type":"Feature","properties":{"nom":"Résidence Crespy II"},"geometry":{"type":"LineString","coordinates":[[-0.5884806678820967,44.80460857465829],[-0.5883302374673683,44.80493678617436],[-0.5878582517449966,44.804853216293985]]}},{"type":"Feature","properties":{"nom":"Rue de Megret"},"geometry":{"type":"LineString","coordinates":[[-0.5884806678820967,44.80460857465829],[-0.5885406678952725,44.80452829208907],[-0.5887105096135855,44.80420566504319]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Résidence Crespy II"},"geometry":{"type":"LineString","coordinates":[[-0.5878582517449966,44.804853216293985],[-0.5879740703110379,44.80459364035909]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Résidence Verlaine 1"},"geometry":{"type":"LineString","coordinates":[[-0.5861338372861663,44.80013822103367],[-0.586027412261367,44.80060982177523]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Résidence Verlaine 1"},"geometry":{"type":"LineString","coordinates":[[-0.586027412261367,44.80060982177523],[-0.5859920373070406,44.80070218999017]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Résidence Verlaine 1"},"geometry":{"type":"LineString","coordinates":[[-0.586027412261367,44.80060982177523],[-0.5853592721106728,44.800441534982994],[-0.5853133681106805,44.80042361452542],[-0.585262908907567,44.800397550129375],[-0.5852137325584219,44.80036973371973],[-0.5851667937689078,44.800349413620154],[-0.5850661293742216,44.80032781438058],[-0.585046244431454,44.8003193429479],[-0.5850335069241874,44.800309835473655],[-0.5850249128277378,44.800293711505674],[-0.5850179004471148,44.80019925666942],[-0.5850258695419495,44.80017684536448],[-0.5850409482486566,44.80015889419669],[-0.585065213853923,44.80014218482183],[-0.585099758104378,44.80012596216439],[-0.5851383287034368,44.800111414207564],[-0.5851858392247429,44.80009820588894],[-0.585229972873841,44.800089698171526],[-0.5852814104571961,44.80008267173622],[-0.5854018225157706,44.80007392124822]]}},{"type":"Feature","properties":{"nom":"Résidence Verlaine 1"},"geometry":{"type":"LineString","coordinates":[[-0.5854018225157706,44.80007392124822],[-0.5855232293666495,44.80007099458327],[-0.5856560303851288,44.80007428452237],[-0.5861338372861663,44.80013822103367]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Chateaubriand"},"geometry":{"type":"LineString","coordinates":[[-0.6271222134196999,44.80622321408799],[-0.6272030595003117,44.80626800982233],[-0.6272974297225392,44.806329029437876],[-0.6273927257335697,44.80638700142655],[-0.6275035249587216,44.80642437225543]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Jean Jaurès"},"geometry":{"type":"LineString","coordinates":[[-0.6199400407258951,44.810830217920476],[-0.6244699455687088,44.80859043076008],[-0.6257873812750893,44.80795235979245]]}},{"type":"Feature","properties":{"nom":"Rue du Pin Vert"},"geometry":{"type":"LineString","coordinates":[[-0.6257873812750893,44.80795235979245],[-0.6268000100219724,44.80943708538574]]}},{"type":"Feature","properties":{"nom":"Avenue Jean Jaurès"},"geometry":{"type":"LineString","coordinates":[[-0.6257873812750893,44.80795235979245],[-0.6261384776787635,44.80778442185393]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rond-point de la Légion d'Honneur"},"geometry":{"type":"LineString","coordinates":[[-0.5886221785661602,44.80724420989426],[-0.588621415936724,44.80724009019121],[-0.5886238453005082,44.80721406998107],[-0.588634430050641,44.80718896353172],[-0.5886526282769173,44.80716622924626],[-0.5886773705178294,44.80714698184641],[-0.5887075705294533,44.807132066334205],[-0.588741642503092,44.807122433558284],[-0.5887779558604317,44.807118315126935],[-0.588814638637985,44.80712013042883],[-0.5888497740923654,44.80712757961261],[-0.5888817092578301,44.80714053467337],[-0.5889087463842209,44.80715814836274],[-0.5889215836520356,44.807171255589246]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rond-point de la Légion d'Honneur"},"geometry":{"type":"LineString","coordinates":[[-0.5889215836520356,44.807171255589246],[-0.5889296984739978,44.80717964740053],[-0.5889433617377052,44.80720398879167],[-0.5889490151496328,44.80722975397872],[-0.5889465915290962,44.80725586410145],[-0.5889360013047008,44.80728088067426],[-0.5889178031544772,44.807303615004436],[-0.5889127340169472,44.807307558385496]]}},{"type":"Feature","properties":{"nom":"Avenue des Facultes"},"geometry":{"type":"LineString","coordinates":[[-0.6009433766419726,44.80649702704205],[-0.6013164859773779,44.8063971763014],[-0.601656043410043,44.80630490002932],[-0.6018331508031505,44.80626163727018]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue des Arts Et Metiers"},"geometry":{"type":"LineString","coordinates":[[-0.6018331508031505,44.80626163727018],[-0.6017685441052617,44.806145044514714]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de l'Université"},"geometry":{"type":"LineString","coordinates":[[-0.6005427197009086,44.80666105414587],[-0.600500201452968,44.806578093243665]]}},{"type":"Feature","properties":{"nom":"Avenue de l'Université"},"geometry":{"type":"LineString","coordinates":[[-0.600500201452968,44.806578093243665],[-0.6003911459816946,44.80636530484626],[-0.6003712714452328,44.80628008541878]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de Collegno"},"geometry":{"type":"LineString","coordinates":[[-0.6045282040629822,44.8057139575337],[-0.6049214859992097,44.80646674541411],[-0.6049169551672597,44.80650760636224],[-0.6048803760431201,44.806531736759275],[-0.6038053565986792,44.806815962071745]]}},{"type":"Feature","properties":{"nom":"Avenue de Collegno"},"geometry":{"type":"LineString","coordinates":[[-0.6038053565986792,44.806815962071745],[-0.6033246495961759,44.80694172298992],[-0.6029063912671518,44.80705235166629]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Pacaris"},"geometry":{"type":"LineString","coordinates":[[-0.5827289793055835,44.798831340566984],[-0.5827384285713649,44.798826628890204],[-0.5827526002510184,44.7988123999548],[-0.5827594067452039,44.79879570059374],[-0.5827583284342076,44.79877834881188],[-0.5827494770696917,44.79876214271927],[-0.5827337220341308,44.79874885656027]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Chemin Bénédigues"},"geometry":{"type":"LineString","coordinates":[[-0.5827337220341308,44.79874885656027],[-0.5827853745039706,44.79868219042253],[-0.583268278318656,44.79778003242338],[-0.5835407616371732,44.797264467046844],[-0.5836766845477668,44.79691508101888]]}},{"type":"Feature","properties":{"nom":"Rue Pacaris"},"geometry":{"type":"LineString","coordinates":[[-0.5827337220341308,44.79874885656027],[-0.582712552901107,44.79874006487575],[-0.5826886772694229,44.798736583182176],[-0.5826643959799237,44.79873878940399],[-0.5826424758571195,44.79874641621764],[-0.5826367980250649,44.798750738834926]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Pacaris"},"geometry":{"type":"LineString","coordinates":[[-0.5826554480804653,44.79883708007676],[-0.5826707539367423,44.798841101991044],[-0.5826952140534086,44.79884177274662],[-0.5827185589605931,44.79883671340598],[-0.5827289793055835,44.798831340566984]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Voie 2 Faculté des Sciences"},"geometry":{"type":"LineString","coordinates":[[-0.5952249709914197,44.80781373927588],[-0.5952468358245578,44.80782142581367],[-0.5952810036401661,44.8078397134943],[-0.5953096255987316,44.80786241032181],[-0.5953313770930191,44.807888567267035],[-0.5953456968748769,44.80791730125153],[-0.5953517542823621,44.80794746746573],[-0.5953494764025928,44.80797789714909],[-0.5953387903257614,44.808007421536274],[-0.5953203808931142,44.80803484791099],[-0.5952993982979592,44.80805550937134]]}},{"type":"Feature","properties":{"nom":"Voie 2 Faculté des Sciences"},"geometry":{"type":"LineString","coordinates":[[-0.5952249709914197,44.80781373927588],[-0.5952081829491739,44.80780832448617],[-0.595166709232953,44.80780071723235],[-0.5951239638111067,44.807799095580044],[-0.5950815884641671,44.807803407634744],[-0.5950412249771774,44.807813601507114],[-0.5950044814906649,44.80782908587983],[-0.5949725984915655,44.80784946122066],[-0.594947041018141,44.80787387049176],[-0.5949446075557351,44.80787746060429]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Voie 2 Faculté des Sciences"},"geometry":{"type":"LineString","coordinates":[[-0.5949446075557351,44.80787746060429],[-0.5949285051511253,44.80790130079415],[-0.5949179451639134,44.807930821150336],[-0.5949156670563552,44.80796125082529],[-0.5949217242441157,44.80799141706321],[-0.5949359175539288,44.808020155090176],[-0.5949577952313793,44.808046308114015],[-0.5949862908718381,44.80806900901435],[-0.595020585044227,44.80808729278083],[-0.59505911177112,44.80810039816389],[-0.5951005800815373,44.80810791555126],[-0.5951234192899467,44.80810890524155]]}},{"type":"Feature","properties":{"nom":"Voie 2 Faculté des Sciences"},"geometry":{"type":"LineString","coordinates":[[-0.5949446075557351,44.80787746060429],[-0.5947690839190122,44.80788336826787],[-0.5946998469257447,44.80789726706777],[-0.5942009134097537,44.808027438064606],[-0.594128240817669,44.808043066544016],[-0.5940534947521084,44.80805182417166],[-0.5938268212963905,44.80806745393388],[-0.5936005684499777,44.8080857724138],[-0.5935257071650636,44.8080947134956],[-0.5934147029657073,44.80811254340357],[-0.5933056935821438,44.80813598535228],[-0.5932335930355493,44.808152676161235],[-0.5931651963783955,44.808176006072415],[-0.5931021453999266,44.80820592322821],[-0.59304674698904,44.80824289526063],[-0.592968411543013,44.80830167098518],[-0.5924582036963829,44.80870180563772],[-0.5922283428118189,44.80888157207494],[-0.5922101006321526,44.80890358768679],[-0.5921882974571633,44.80894562386988]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de l'Université"},"geometry":{"type":"LineString","coordinates":[[-0.6002739308007025,44.805937160069774],[-0.6002571906097627,44.805934537065355],[-0.600210663417118,44.80593312714963],[-0.6001646218698704,44.80593746711639],[-0.6001202025409176,44.805947520990586],[-0.6000790190830736,44.80596278728954],[-0.6000420649431202,44.805982964323555],[-0.6000106899797618,44.80600737879656],[-0.5999951036373583,44.806025258018686]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Allée du Doyen Georges Brus"},"geometry":{"type":"LineString","coordinates":[[-0.6240391870529518,44.79383701591695],[-0.6240537893794984,44.7938519548657],[-0.6240735513973247,44.79386645912628],[-0.6240964492439905,44.79387852126869],[-0.6241215821500758,44.79388789974787],[-0.6241486693360015,44.79389415309196],[-0.6241767007246009,44.793897313492515],[-0.6242051599693784,44.793897217235376],[-0.6242331632495562,44.793893892489045],[-0.624260084915637,44.793887449278174],[-0.624285167406502,44.79387791174713],[-0.624307807678016,44.79386574953668],[-0.6243273800841981,44.79385107267031],[-0.6243434078431439,44.79383434676631],[-0.6243555404381711,44.79381603341518],[-0.6243633010895383,44.793796598234096],[-0.6243665917990886,44.7937764947641],[-0.6243653202233378,44.793756266453194],[-0.6243595202746701,44.79373645272219],[-0.6243538295028445,44.79372240086953]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Allée du Doyen Georges Brus"},"geometry":{"type":"LineString","coordinates":[[-0.6243538295028445,44.79372240086953],[-0.624334970292798,44.793700120683134],[-0.6243169080768918,44.79368448128721],[-0.6242955725086237,44.79367110822578],[-0.6242714912310648,44.793660345014246],[-0.6242453181412109,44.793652531145405],[-0.624217690182525,44.79364773640068],[-0.624189381857823,44.79364620634789],[-0.6241610244566637,44.793647920865816],[-0.6241292522555596,44.79365568973243],[-0.6241073132304374,44.793660893114975],[-0.6240834519009825,44.793671742946664],[-0.6240621590119209,44.79368521342958],[-0.6240443014253713,44.79370100668777],[-0.6240302240113766,44.793718571230144],[-0.6240202829481174,44.793737535371456],[-0.6240146968491151,44.793757351643734],[-0.6240136899859823,44.79377756248323],[-0.6240172284542063,44.793797628466486],[-0.6240252840076023,44.79381710007585],[-0.6240391870529518,44.79383701591695]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Allée du Doyen Georges Brus"},"geometry":{"type":"LineString","coordinates":[[-0.623379009221982,44.79408605511891],[-0.6240391870529518,44.79383701591695]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Albert Schweitzer"},"geometry":{"type":"LineString","coordinates":[[-0.623379009221982,44.79408605511891],[-0.6233649326886178,44.79407344150927],[-0.6233291153729661,44.79405107091595],[-0.6232888920113646,44.79403307463359],[-0.6232450540560983,44.794019967940415],[-0.6231987547866544,44.7940119843381],[-0.6231514056468902,44.794009439186986],[-0.6231370346267664,44.79401025740016]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Pierre Corneille"},"geometry":{"type":"LineString","coordinates":[[-0.6196697256676994,44.79906661944379],[-0.6195925499988103,44.7990102512667],[-0.6194418446698561,44.798961628216425]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de Genève"},"geometry":{"type":"LineString","coordinates":[[-0.6194581803946418,44.80085421141209],[-0.6195375283914707,44.800241821394124]]}},{"type":"Feature","properties":{"nom":"Rue Charles Bourseul"},"geometry":{"type":"LineString","coordinates":[[-0.6194581803946418,44.80085421141209],[-0.6184777365899734,44.80079802889875]]}},{"type":"Feature","properties":{"nom":"Allée Geoffroy Saint Hilaire"},"geometry":{"type":"LineString","coordinates":[[-0.6062086005106154,44.804538531610724],[-0.6075186009733935,44.80418854536408]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue des Facultés"},"geometry":{"type":"LineString","coordinates":[[-0.6062086005106154,44.804538531610724],[-0.6060049440040546,44.80474992676894],[-0.6057238322161185,44.8049954861119]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Henri Vizioz"},"geometry":{"type":"LineString","coordinates":[[-0.6214998958983052,44.794007185475536],[-0.6220852878886478,44.79512314416106],[-0.6220924487429257,44.79515858918432],[-0.6220922625212997,44.79518381852401],[-0.6220818377405597,44.79520919380688],[-0.6220618295541408,44.79524514386064],[-0.6216927947041473,44.79588577083967],[-0.621666916966101,44.79593100617681],[-0.6216493436109074,44.795959401659815],[-0.6216276660577161,44.795982883165784],[-0.6215999975928964,44.796005654620494],[-0.6215726195635715,44.796024993642874],[-0.6210868183185433,44.796329541637235],[-0.6210598341342806,44.79634508447584],[-0.6210345688713166,44.79635777998568],[-0.6209931226773022,44.796372702293674],[-0.6209362305439071,44.79638946764688],[-0.6207830627101459,44.79642443237376],[-0.6207090517644245,44.796434535973084]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Esplanade des Antilles"},"geometry":{"type":"LineString","coordinates":[[-0.6214998958983052,44.794007185475536],[-0.6232295293179418,44.79352932641312]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Allée Maine de Biran"},"geometry":{"type":"LineString","coordinates":[[-0.6207090517644245,44.796434535973084],[-0.6207399483295032,44.796553813770124],[-0.6208241702150991,44.79665391752819],[-0.6208367372807657,44.79666666959483]]}},{"type":"Feature","properties":{"nom":"Rue Jacques Chaban Delmas"},"geometry":{"type":"LineString","coordinates":[[-0.5894924222691592,44.81158734105841],[-0.5894789472944313,44.811588396836235],[-0.5894497313444721,44.811596795535],[-0.589424772230038,44.81161055489405],[-0.5894060291727687,44.81162862219449],[-0.5893995354674162,44.81164017740682]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Pierre Curie"},"geometry":{"type":"LineString","coordinates":[[-0.5894924222691592,44.81158734105841],[-0.5895011255785437,44.811536080115346],[-0.5895485158701184,44.81113471148511],[-0.5895368594479263,44.81106742786561],[-0.5895467275782218,44.810980007343225],[-0.5895859324901913,44.810898327112554],[-0.5896315190587665,44.81053710171911]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Allée Georges Brassens"},"geometry":{"type":"LineString","coordinates":[[-0.6080748822995544,44.807963565585],[-0.6089467209524296,44.80805796902329],[-0.6090351588021958,44.80805570349236],[-0.6090965047188327,44.808033037969096],[-0.6091413221133111,44.807988916656456],[-0.6091544775464598,44.80793426937],[-0.6091390095554492,44.80751947833871]]}},{"type":"Feature","properties":{"nom":"Allée Georges Brassens"},"geometry":{"type":"LineString","coordinates":[[-0.6080748822995544,44.807963565585],[-0.607778420616625,44.80792153194589],[-0.6077251719231692,44.80789565556416]]}},{"type":"Feature","properties":{"nom":"Allée Jacques Brel"},"geometry":{"type":"LineString","coordinates":[[-0.6077251719231692,44.80789565556416],[-0.6077092098150831,44.807848868398786],[-0.6076857128228177,44.80705895729611],[-0.607715901583938,44.806967106259115]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Allée Maine de Biran"},"geometry":{"type":"LineString","coordinates":[[-0.6208367372807657,44.79666666959483],[-0.6209334497793274,44.79682060587063]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Albert Schweitzer"},"geometry":{"type":"LineString","coordinates":[[-0.6209334497793274,44.79682060587063],[-0.6209266966304785,44.79682991932871],[-0.6209144884189325,44.79685309917056],[-0.6209076624294481,44.79687736881087],[-0.620906437322436,44.79690218078706],[-0.6209107622858779,44.796926725966905],[-0.6209206034504718,44.79695046492537],[-0.6209356744107941,44.79697286627953],[-0.6209525813577348,44.796990254580784]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue du Jasmin"},"geometry":{"type":"LineString","coordinates":[[-0.6197940289716289,44.804594956016665],[-0.6197644570798326,44.8049764093837]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Allée des Pensées"},"geometry":{"type":"LineString","coordinates":[[-0.6197940289716289,44.804594956016665],[-0.6205874967411178,44.80460645449748],[-0.6206653246477516,44.804606589408365]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de la Paillère"},"geometry":{"type":"LineString","coordinates":[[-0.6093296767989641,44.79621991546355],[-0.6093291561101378,44.79624191223031],[-0.6093375415583543,44.79626470732654],[-0.6093461692478424,44.79627722527712],[-0.6093582367014488,44.79628810264326],[-0.6093717405532725,44.79629767325817],[-0.6093915158581251,44.79630839606761]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Causserouge"},"geometry":{"type":"LineString","coordinates":[[-0.6282005990874134,44.807691547607696],[-0.6270343374935502,44.80807700681343]]}},{"type":"Feature","properties":{"nom":"Rue Goya"},"geometry":{"type":"LineString","coordinates":[[-0.6282005990874134,44.807691547607696],[-0.6286706524024379,44.80836209049072]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Goya"},"geometry":{"type":"LineString","coordinates":[[-0.6284258411300346,44.80741807490818],[-0.6281325253156609,44.80752075817051],[-0.6281156728105808,44.80753246611176],[-0.6281071330058481,44.807549584175234],[-0.6281143361287055,44.80756953317888],[-0.6282005990874134,44.807691547607696]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Allée du Parc"},"geometry":{"type":"LineString","coordinates":[[-0.6251557220834865,44.79835525067678],[-0.6252235443623254,44.79853442725268],[-0.6253424211924866,44.79879512357346],[-0.6253570080443737,44.79883393507788],[-0.6253441336001597,44.79894911215404],[-0.6253006823439052,44.79913940284026],[-0.6252653167943789,44.799186653058726],[-0.6251934642305719,44.79927137007889],[-0.6251940218304239,44.799306394869575],[-0.6252216428839411,44.799351276935035],[-0.6252628069394983,44.79941635645798]]}},{"type":"Feature","properties":{"nom":"Rue Marc Sangnier"},"geometry":{"type":"LineString","coordinates":[[-0.6054698997467376,44.808677917346344],[-0.6053167485558499,44.808685474228426],[-0.6050002741756942,44.80861280895958],[-0.6040828411423665,44.808481354663485],[-0.6027342810020733,44.80841669793434],[-0.6022250951286805,44.80836238001198],[-0.6016281928333453,44.80830768443036],[-0.6012323873060919,44.80828166119162],[-0.6003365168343558,44.808270294930296]]}},{"type":"Feature","properties":{"nom":"Rue de la Vieille Tour"},"geometry":{"type":"LineString","coordinates":[[-0.6003365168343558,44.808270294930296],[-0.6003523363859251,44.80782866074097],[-0.6003733332435589,44.80768062133278],[-0.6004399085619743,44.807585639041214]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de Candau"},"geometry":{"type":"LineString","coordinates":[[-0.615993843363658,44.808079542423435],[-0.6156386765922829,44.808168934866266]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de Candau"},"geometry":{"type":"LineString","coordinates":[[-0.6156386765922829,44.808168934866266],[-0.6152163161768321,44.80829063968172],[-0.6149407433761301,44.80833362959324],[-0.6146353778205642,44.80834144227298],[-0.6137095978648442,44.80830933152997]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Frédéric Dard"},"geometry":{"type":"LineString","coordinates":[[-0.6233650667962933,44.80716889130704],[-0.6231515378650831,44.80702912734922],[-0.6231264615499323,44.807020737608084],[-0.6229645715312013,44.80702003888148],[-0.6229354966902789,44.8070265501599],[-0.622907280715257,44.8070467267688],[-0.6227481715748605,44.807221151580805],[-0.6225726617115123,44.80748699272951],[-0.6225691755040994,44.80750602129511],[-0.6225737605166194,44.80752461263547],[-0.6226144229930793,44.807611869660086]]}},{"type":"Feature","properties":{"nom":"Rue Graham Bell"},"geometry":{"type":"LineString","coordinates":[[-0.6184777365899734,44.80079802889875],[-0.618485522849563,44.80065598995257],[-0.6184751143584594,44.80060506367932],[-0.6184349093767768,44.80055112175027],[-0.6183521141724402,44.80048385125475]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue des Chênes"},"geometry":{"type":"LineString","coordinates":[[-0.6177472367798235,44.8092290114272],[-0.6167811065759444,44.80945359434755],[-0.616645315066495,44.80943935484138],[-0.6165364233574833,44.80939399196652],[-0.61646524674378,44.80932247684998],[-0.615993843363658,44.808079542423435]]}},{"type":"Feature","properties":{"nom":"Rue Chiquet Brion"},"geometry":{"type":"LineString","coordinates":[[-0.6177472367798235,44.8092290114272],[-0.6178619529184397,44.809224011545496],[-0.6186893706113094,44.80773942310523]]}},{"type":"Feature","properties":{"nom":"Rue du Bas-Brion"},"geometry":{"type":"LineString","coordinates":[[-0.6177472367798235,44.8092290114272],[-0.6178290677973141,44.80954485299855],[-0.6179463556914555,44.80970984842017],[-0.6184989583193068,44.81034843710847]]}},{"type":"Feature","properties":{"nom":"Avenue de Candau"},"geometry":{"type":"LineString","coordinates":[[-0.6186893706113094,44.80773942310523],[-0.6182176013896765,44.80773911700815]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Roger Cohé"},"geometry":{"type":"LineString","coordinates":[[-0.6334066349679124,44.81109917839348],[-0.6346531266442413,44.81261582828942]]}},{"type":"Feature","properties":{"nom":"Rue Dignac"},"geometry":{"type":"LineString","coordinates":[[-0.6309738476311294,44.807133985290996],[-0.6316353811792683,44.80694675051257],[-0.6317468675861465,44.80689859927188]]}},{"type":"Feature","properties":{"nom":"Rue Dignac"},"geometry":{"type":"LineString","coordinates":[[-0.6309738476311294,44.807133985290996],[-0.6308833205895168,44.80716534165337]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Albert Schweitzer"},"geometry":{"type":"LineString","coordinates":[[-0.6204684765805153,44.7973743793357],[-0.6209883616111087,44.797016050297394]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Albert Schweitzer"},"geometry":{"type":"LineString","coordinates":[[-0.6204684765805153,44.7973743793357],[-0.6204169498377229,44.79735773276919]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Cours Gambetta"},"geometry":{"type":"LineString","coordinates":[[-0.5908003747528613,44.81253101600426],[-0.5907787072792661,44.812528547097024],[-0.5907381641463062,44.81252982687515],[-0.5906987540808859,44.81253710635883],[-0.5906903391271844,44.81254016451701]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Chateaubriand"},"geometry":{"type":"LineString","coordinates":[[-0.6275920194000862,44.80652960157727],[-0.627788254837084,44.80667206946449],[-0.6278569569200072,44.806732783477294],[-0.627903370118661,44.80678030825671],[-0.6279585768594929,44.806846951464244],[-0.6280055653490072,44.806865517990936],[-0.628077623263275,44.80687588042583]]}},{"type":"Feature","properties":{"nom":"Rue Chateaubriand"},"geometry":{"type":"LineString","coordinates":[[-0.6275920194000862,44.80652960157727],[-0.6276184584627973,44.80652674852308],[-0.6276386435663601,44.8065206495224],[-0.6276562573550565,44.80651214417997],[-0.6276774713309989,44.806494623383934]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Alexandre Jaubert"},"geometry":{"type":"LineString","coordinates":[[-0.628077623263275,44.80687588042583],[-0.6284258411300346,44.80741807490818]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Chateaubriand"},"geometry":{"type":"LineString","coordinates":[[-0.628077623263275,44.80687588042583],[-0.6280748824696294,44.80684652016259],[-0.6280619371304181,44.806819406628655],[-0.6277380396005221,44.806568765394],[-0.6276774713309989,44.806494623383934]]}},{"type":"Feature","properties":{"nom":"Avenue Jean Jaurès"},"geometry":{"type":"LineString","coordinates":[[-0.628077623263275,44.80687588042583],[-0.6283175187347362,44.80680688869197],[-0.6290203614854815,44.80660240666163]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de Gradignan"},"geometry":{"type":"LineString","coordinates":[[-0.6256155342448166,44.80460184989887],[-0.6254839110316924,44.80468517533525],[-0.625412944756455,44.804725137248546],[-0.6253919753631582,44.804738115318315],[-0.6253773011304238,44.80475602857069],[-0.6252467953998022,44.80497863358408],[-0.6251569503101162,44.80508923728474],[-0.6248421499497538,44.80544780398771]]}},{"type":"Feature","properties":{"nom":"Rue Chateaubriand"},"geometry":{"type":"LineString","coordinates":[[-0.6256155342448166,44.80460184989887],[-0.6256515929207398,44.80466328919732],[-0.6256792607284879,44.804690975514546]]}},{"type":"Feature","properties":{"nom":"Rue Chateaubriand"},"geometry":{"type":"LineString","coordinates":[[-0.6256792607284879,44.804690975514546],[-0.6256808520038644,44.80470156946084],[-0.6257622381237632,44.80484239266766],[-0.6258285714502998,44.80493264189838],[-0.6259480769330436,44.805108556981914]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Jean Jaurès"},"geometry":{"type":"LineString","coordinates":[[-0.6174973955855689,44.811732712827244],[-0.6180778051564332,44.81154192413539]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Francis Plante"},"geometry":{"type":"LineString","coordinates":[[-0.6174973955855689,44.811732712827244],[-0.6180171131666972,44.81246612657396]]}},{"type":"Feature","properties":{"nom":"Avenue Azam"},"geometry":{"type":"LineString","coordinates":[[-0.6311618754544944,44.800779946141475],[-0.6297668851998197,44.80069322459682]]}},{"type":"Feature","properties":{"nom":"Avenue Pierre Wiehn"},"geometry":{"type":"LineString","coordinates":[[-0.6311618754544944,44.800779946141475],[-0.6311166921227062,44.80050654248247]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Passage Clément Thomas"},"geometry":{"type":"LineString","coordinates":[[-0.581043175686349,44.80386170890745],[-0.5802724655869758,44.80381471774699],[-0.5801867371211297,44.8038034536805]]}},{"type":"Feature","properties":{"nom":"Rue Clément Thomas"},"geometry":{"type":"LineString","coordinates":[[-0.581043175686349,44.80386170890745],[-0.5809750774084989,44.803755394867444],[-0.5808904299093264,44.803669870160576],[-0.5804100776007701,44.8032597179412]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Descartes"},"geometry":{"type":"LineString","coordinates":[[-0.5858764711911255,44.80673826182572],[-0.5857051846189175,44.806765685612355],[-0.5847038209642228,44.80686249834282]]}},{"type":"Feature","properties":{"nom":"Rond-point Crespy"},"geometry":{"type":"LineString","coordinates":[[-0.5858764711911255,44.80673826182572],[-0.5858791298973353,44.80675057570142],[-0.585893314414082,44.80677579279143],[-0.5859150255991216,44.80679812419042],[-0.5859431700374432,44.806816469335665],[-0.585976347527421,44.80682988146932],[-0.5860118123630705,44.80683708913506]]}},{"type":"Feature","properties":{"nom":"Rond-point Crespy"},"geometry":{"type":"LineString","coordinates":[[-0.5858764711911255,44.80673826182572],[-0.5858731840266255,44.80672374765225],[-0.5858757748189329,44.80669664146815],[-0.5858867725761041,44.80667063047827],[-0.5859056258139903,44.80664702023356],[-0.5859312438765092,44.80662709269295]]}},{"type":"Feature","properties":{"nom":"Rue Peydavant"},"geometry":{"type":"LineString","coordinates":[[-0.5860118123630705,44.80683708913506],[-0.5860038221047741,44.80688678729566],[-0.5860167644909039,44.80692920220184],[-0.5860127062527715,44.80697315811535],[-0.585610866426628,44.80766229960811]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Béranger"},"geometry":{"type":"LineString","coordinates":[[-0.6273931098724322,44.80459851259172],[-0.62596287340999,44.805103454483124],[-0.6259480769330436,44.805108556981914]]}},{"type":"Feature","properties":{"nom":"Rue Bossuet"},"geometry":{"type":"LineString","coordinates":[[-0.6273931098724322,44.80459851259172],[-0.627149054686297,44.80405002871358]]}},{"type":"Feature","properties":{"nom":"Rue Razon"},"geometry":{"type":"LineString","coordinates":[[-0.6313345077378727,44.801901565174525],[-0.6294073278673378,44.80192776872536],[-0.6283827483430332,44.801882537913045]]}},{"type":"Feature","properties":{"nom":"Avenue Pierre Wiehn"},"geometry":{"type":"LineString","coordinates":[[-0.6313345077378727,44.801901565174525],[-0.6314783672824089,44.80327336510994],[-0.6314813869813739,44.80331326598157],[-0.6314927031809078,44.803350289514356],[-0.6315278629932808,44.80338015576388],[-0.6315731149546422,44.8034015021162],[-0.6317138802751466,44.803460696747564]]}},{"type":"Feature","properties":{"nom":"Rue Georges Pompidou"},"geometry":{"type":"LineString","coordinates":[[-0.6313345077378727,44.801901565174525],[-0.6314303730376181,44.80188679333691]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Fanning Lafontaine"},"geometry":{"type":"LineString","coordinates":[[-0.6125250585888145,44.8055516828129],[-0.6124134883332674,44.8052897517341]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Accès Maison de Retraite Mutualiste"},"geometry":{"type":"LineString","coordinates":[[-0.6125250585888145,44.8055516828129],[-0.6117017660984965,44.80572268210356]]}},{"type":"Feature","properties":{"nom":"Rue Alfred de Musset"},"geometry":{"type":"LineString","coordinates":[[-0.6288499444519569,44.80393154326636],[-0.6292470081060891,44.80508717146898],[-0.6292569572675963,44.805162794691796]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Boulevard Saint Martin"},"geometry":{"type":"LineString","coordinates":[[-0.6288499444519569,44.80393154326636],[-0.6296198397404436,44.803868150264506]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Esplanade des Antilles"},"geometry":{"type":"LineString","coordinates":[[-0.6184503784224944,44.79483267624182],[-0.6196800405722029,44.7945013115898]]}},{"type":"Feature","properties":{"nom":"Impasse du Docteur Paul Fournial"},"geometry":{"type":"LineString","coordinates":[[-0.6184503784224944,44.79483267624182],[-0.6190857935197557,44.79605101324716]]}},{"type":"Feature","properties":{"nom":"Avenue Pierre Wiehn"},"geometry":{"type":"LineString","coordinates":[[-0.6311166921227062,44.80050654248247],[-0.6309852322605088,44.79986573824809],[-0.6309706317758691,44.799784588297754],[-0.6309680186230336,44.799733053597684],[-0.6309711873600478,44.79967890203219]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Montesquieu"},"geometry":{"type":"LineString","coordinates":[[-0.6311166921227062,44.80050654248247],[-0.6330550263178062,44.80018825982236]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Pey Berland"},"geometry":{"type":"LineString","coordinates":[[-0.6067595134788911,44.80015574212107],[-0.6061927458767559,44.79975627139223]]}},{"type":"Feature","properties":{"nom":"Allée Pierre de Coubertin"},"geometry":{"type":"LineString","coordinates":[[-0.6067595134788911,44.80015574212107],[-0.6064220529332797,44.800236347919316],[-0.605885215623023,44.800376062741314]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Pey-Berland"},"geometry":{"type":"LineString","coordinates":[[-0.6061927458767559,44.79975627139223],[-0.6059317490517415,44.799578616180426],[-0.6022145735222436,44.796866559883405]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Pierre Corneille"},"geometry":{"type":"LineString","coordinates":[[-0.6235468187345438,44.80153305782432],[-0.6232012006720995,44.8003703697135]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue des Deux Ponts"},"geometry":{"type":"LineString","coordinates":[[-0.6235468187345438,44.80153305782432],[-0.6221211395213243,44.801523791125014]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue des Chasseurs"},"geometry":{"type":"LineString","coordinates":[[-0.6213004097149313,44.79914595828795],[-0.6214359298816667,44.79832035139863],[-0.6214167578327167,44.79826691178667]]}},{"type":"Feature","properties":{"nom":"Avenue Pierre Corneille"},"geometry":{"type":"LineString","coordinates":[[-0.6213004097149313,44.79914595828795],[-0.6211943184093939,44.79916104726907],[-0.6198129791943336,44.79906305082381],[-0.6196697256676994,44.79906661944379]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue du Maréchal Juin"},"geometry":{"type":"LineString","coordinates":[[-0.6270886859262708,44.794153454899394],[-0.6274282079982271,44.79408244900793],[-0.6275512127806726,44.794066904402],[-0.6277226389497402,44.794048824033965],[-0.6278565756756521,44.794040137058424]]}},{"type":"Feature","properties":{"nom":"Rue du Général Gouraud"},"geometry":{"type":"LineString","coordinates":[[-0.6270886859262708,44.794153454899394],[-0.6271397607279103,44.79464557544812]]}},{"type":"Feature","properties":{"nom":"Allée Serpentine"},"geometry":{"type":"LineString","coordinates":[[-0.6293356239872048,44.7942267997652],[-0.6293462538206912,44.79433537202754],[-0.6293285258844772,44.794355215794624],[-0.6291488154746742,44.794440675501676],[-0.6289672565968061,44.79453898581649],[-0.628513743393875,44.79481100745702],[-0.6280734353191624,44.795192418121346],[-0.6277411178412703,44.79557506630393],[-0.6274711102434121,44.79596482426899],[-0.6274607879048836,44.79611847626145],[-0.6274827948689493,44.79627118709094],[-0.6275300466143741,44.79645714434769],[-0.6275454519386845,44.79659943585607],[-0.6275492906190561,44.79681929818507],[-0.6275501744942098,44.79698817721839],[-0.6275361969122202,44.79722248075931]]}},{"type":"Feature","properties":{"nom":"Allée Serpentine"},"geometry":{"type":"LineString","coordinates":[[-0.6293356239872048,44.7942267997652],[-0.6293204244529603,44.79411999485734]]}},{"type":"Feature","properties":{"nom":"Avenue du Maréchal Juin"},"geometry":{"type":"LineString","coordinates":[[-0.6293356239872048,44.7942267997652],[-0.6299850149512828,44.79426895082378],[-0.6300637174822687,44.794257069772094],[-0.6300986751286143,44.79421550612817]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue de Tremeuge"},"geometry":{"type":"LineString","coordinates":[[-0.5871427200275997,44.802502850829214],[-0.5862241014385443,44.80232760458696]]}},{"type":"Feature","properties":{"nom":"Rue du Général Margueritte"},"geometry":{"type":"LineString","coordinates":[[-0.5871427200275997,44.802502850829214],[-0.5877041787751051,44.80096663185932]]}},{"type":"Feature","properties":{"nom":"Rue du Général Margueritte"},"geometry":{"type":"LineString","coordinates":[[-0.5871427200275997,44.802502850829214],[-0.5867905106293946,44.80346143889426],[-0.5867758335128497,44.803489917178766],[-0.5867523309703795,44.80351687214069],[-0.5867052543016262,44.80353709372638],[-0.5866414389109001,44.80354045736144]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Peydavant"},"geometry":{"type":"LineString","coordinates":[[-0.5866414389109001,44.80354045736144],[-0.5865886070546378,44.803425467501455],[-0.5864069909231818,44.80313797836744],[-0.586373946364976,44.803103077728615],[-0.5859945919392777,44.80275327348517]]}},{"type":"Feature","properties":{"nom":"Rue Montesquieu"},"geometry":{"type":"LineString","coordinates":[[-0.5866414389109001,44.80354045736144],[-0.5864800984443781,44.80355040946131],[-0.586420303209506,44.80355941143457],[-0.5863615593812236,44.803546670521854],[-0.5858053346292776,44.80335350694344],[-0.5856979684373356,44.80330968904041],[-0.5855953349727717,44.80326058718053],[-0.5855319951303288,44.80322276786811]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Allée Peixotto"},"geometry":{"type":"LineString","coordinates":[[-0.5912555154959257,44.80751520978357],[-0.5905515651723987,44.807405373331754],[-0.5901770256962261,44.80736909201326],[-0.5893750442941084,44.80732684118528],[-0.5890792937801159,44.80732842662353],[-0.5890014349804157,44.80732376688344],[-0.5889127340169472,44.807307558385496]]}},{"type":"Feature","properties":{"nom":"Rond-point de la Légion d'Honneur"},"geometry":{"type":"LineString","coordinates":[[-0.5889127340169472,44.807307558385496],[-0.5888930665239506,44.807322952362355],[-0.5888628608630143,44.80733777801807],[-0.5888287887820327,44.80734741083005]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue du Relais"},"geometry":{"type":"LineString","coordinates":[[-0.6082477944066069,44.79542278223798],[-0.6081018694098145,44.79514698415391],[-0.6080696027872224,44.795134765721954],[-0.6075957062509978,44.7952645660447],[-0.6075399926453159,44.79530020462924]]}},{"type":"Feature","properties":{"nom":"Rue du Relais"},"geometry":{"type":"LineString","coordinates":[[-0.6082477944066069,44.79542278223798],[-0.6083034349545852,44.79554163781109]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue du Relais"},"geometry":{"type":"LineString","coordinates":[[-0.6083034349545852,44.79554163781109],[-0.6081092980994777,44.79606018908337]]}},{"type":"Feature","properties":{"nom":"Résidence Parc de Suzon"},"geometry":{"type":"LineString","coordinates":[[-0.5831128403084147,44.81142832487604],[-0.5831112470882293,44.81130090973327]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Résidence Parc de Suzon"},"geometry":{"type":"LineString","coordinates":[[-0.5831192966936468,44.81155864960264],[-0.5823237210808098,44.81155307906197]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Résidence Parc de Suzon"},"geometry":{"type":"LineString","coordinates":[[-0.5831192966936468,44.81155864960264],[-0.5831128403084147,44.81142832487604]]}},{"type":"Feature","properties":{"nom":"Boulevard Saint Martin"},"geometry":{"type":"LineString","coordinates":[[-0.6296198397404436,44.803868150264506],[-0.6307358512522636,44.8037873977151]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Pey Berland"},"geometry":{"type":"LineString","coordinates":[[-0.6093768517601454,44.800910207684005],[-0.609392227574084,44.800915304854115],[-0.6094194483680796,44.80092164759661],[-0.6094477405449926,44.800924893510945],[-0.6094764558320666,44.800924792922395],[-0.6095045840201877,44.80092137789173],[-0.6095170708821552,44.80091872951914]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue des Facultés"},"geometry":{"type":"LineString","coordinates":[[-0.6093768517601454,44.800910207684005],[-0.6090330171219099,44.801145695808486],[-0.6087463550228671,44.80134657854071],[-0.6083970771729191,44.80163466550279],[-0.6081599651827935,44.801836857162016],[-0.6078710582825699,44.802133386560165],[-0.6075601838193506,44.80248331036001],[-0.6074589290933775,44.80261020572636],[-0.6062086005106154,44.804538531610724]]}},{"type":"Feature","properties":{"nom":"Rue Henry de Montherlant"},"geometry":{"type":"LineString","coordinates":[[-0.581049012358213,44.797567980156245],[-0.5811042401309843,44.79736535923975],[-0.5811276450833788,44.797281837287144],[-0.5813185214704116,44.796827040175025],[-0.5814783761385266,44.79643501556176],[-0.5816756531470041,44.795922453916624]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Pacaris"},"geometry":{"type":"LineString","coordinates":[[-0.581049012358213,44.797567980156245],[-0.5810180438256437,44.79756436114913],[-0.5809870762128263,44.797566867649735],[-0.58095823935601,44.797575162349034],[-0.5809334049683368,44.79758882598663]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue de Compostelle"},"geometry":{"type":"LineString","coordinates":[[-0.6105819573232397,44.79443030040655],[-0.6113393276055692,44.794471741482965],[-0.6119745595212183,44.79445778236543]]}},{"type":"Feature","properties":{"nom":"Rue de Compostelle"},"geometry":{"type":"LineString","coordinates":[[-0.6105819573232397,44.79443030040655],[-0.6106522588520107,44.794478154455625],[-0.6107679436214124,44.79457393297544],[-0.6108433791667772,44.79465729678706],[-0.6109014663267107,44.79474040067302],[-0.610927642188038,44.79482100458504],[-0.6109431460304375,44.794894830803685],[-0.6109314692934735,44.79500735497405],[-0.6109058110921812,44.79512086359016],[-0.6108716764102907,44.79524851413376]]}},{"type":"Feature","properties":{"nom":"Avenue des Arts Et Metiers"},"geometry":{"type":"LineString","coordinates":[[-0.6017685441052617,44.806145044514714],[-0.601584876390149,44.80579773715195]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Ambroise Pare"},"geometry":{"type":"LineString","coordinates":[[-0.5869876197288899,44.80872986951243],[-0.5877737931600661,44.80881470450807]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Peydavant"},"geometry":{"type":"LineString","coordinates":[[-0.5866746519603945,44.8046721880755],[-0.5867244760266841,44.8043076775135]]}},{"type":"Feature","properties":{"nom":"Rue Antoine Carles"},"geometry":{"type":"LineString","coordinates":[[-0.5866746519603945,44.8046721880755],[-0.5861198120682125,44.80449537688717]]}},{"type":"Feature","properties":{"nom":"Rue Antoine Carles"},"geometry":{"type":"LineString","coordinates":[[-0.5861198120682125,44.80449537688717],[-0.5848800257630388,44.80408206975226]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Georges Bizet"},"geometry":{"type":"LineString","coordinates":[[-0.5886201223908932,44.795558312862916],[-0.5884126126163992,44.79620020875445]]}},{"type":"Feature","properties":{"nom":"Rue Hector Berlioz"},"geometry":{"type":"LineString","coordinates":[[-0.5886201223908932,44.795558312862916],[-0.5861596889364554,44.79540171578158]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Lafitte"},"geometry":{"type":"LineString","coordinates":[[-0.5861596889364554,44.79540171578158],[-0.5862735772825147,44.79490789896886]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue du Vallon"},"geometry":{"type":"LineString","coordinates":[[-0.6206897558564304,44.81118442213069],[-0.6208364325521509,44.811430275159225]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Gabriel Faure"},"geometry":{"type":"LineString","coordinates":[[-0.604094233275002,44.79673079546311],[-0.6040806537445562,44.79674428781476],[-0.6040690420189989,44.796766996318645],[-0.6040663083311959,44.796790054040066],[-0.6040719138993855,44.79681293755851],[-0.6040857519524935,44.79683393868597],[-0.6041065961696062,44.79685165496167],[-0.604111969837402,44.79685463755314]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Blanqui"},"geometry":{"type":"LineString","coordinates":[[-0.5831887578305832,44.8130770372922],[-0.5846415793250371,44.81303036486458],[-0.5846955641225412,44.81304172552366],[-0.5847264277124679,44.813061832026165],[-0.5847480533528729,44.813086013059646],[-0.5847567315086715,44.81312177221375],[-0.5847905382966339,44.81362056946996]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Bourges"},"geometry":{"type":"LineString","coordinates":[[-0.5822053501379916,44.81203081536906],[-0.5822195256664939,44.81197586969005]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue de Suzon"},"geometry":{"type":"LineString","coordinates":[[-0.5822195256664939,44.81197586969005],[-0.5820505428775261,44.81195894088225],[-0.5819462040872896,44.81195997437604],[-0.5814038097285079,44.81206172884313],[-0.5812389422249887,44.812088628990395],[-0.5809830832725752,44.812082901277265]]}},{"type":"Feature","properties":{"nom":"Rue Bourges"},"geometry":{"type":"LineString","coordinates":[[-0.5824723589146111,44.812248511199655],[-0.582490067994727,44.81226263676386],[-0.5825124379612426,44.81228048904096],[-0.582546648003199,44.81229337427308],[-0.5825820775227311,44.81230144677011],[-0.5826588270171792,44.81231056002393]]}},{"type":"Feature","properties":{"nom":"Rue Bourges"},"geometry":{"type":"LineString","coordinates":[[-0.5824723589146111,44.812248511199655],[-0.5823741712000737,44.81216323347901],[-0.5822557699497675,44.812068322946935],[-0.5822053501379916,44.81203081536906]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Cours de la Libération"},"geometry":{"type":"LineString","coordinates":[[-0.595003061518976,44.80107819332798],[-0.5956578561455381,44.800701218459],[-0.595774021083448,44.80066088231499],[-0.5958302538970383,44.800647573885925],[-0.5958978737692194,44.800638319427264],[-0.5959739481210525,44.80063681493237],[-0.5960955461028271,44.80064098746413]]}},{"type":"Feature","properties":{"nom":"Avenue de Breuil"},"geometry":{"type":"LineString","coordinates":[[-0.595003061518976,44.80107819332798],[-0.5958868153279412,44.801686235444606]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de Breuil"},"geometry":{"type":"LineString","coordinates":[[-0.595003061518976,44.80107819332798],[-0.594965116161893,44.80104390037088]]}},{"type":"Feature","properties":{"nom":"Cours de la Libération"},"geometry":{"type":"LineString","coordinates":[[-0.5960516029257379,44.800504460980235],[-0.5960487952745205,44.80053652895545],[-0.5960583143303593,44.800581629428855],[-0.5960807164692279,44.80062434073841],[-0.5960955461028271,44.80064098746413]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Cours de la Libération"},"geometry":{"type":"LineString","coordinates":[[-0.5960516029257379,44.800504460980235],[-0.5959309872915364,44.80055863064847],[-0.5958849997721064,44.80057188544617],[-0.5958214851930315,44.80058407289871],[-0.5957329840916419,44.800609481645786],[-0.5956846277519224,44.80062938725619],[-0.5956218191447994,44.80066101003569],[-0.594965116161893,44.80104390037088]]}},{"type":"Feature","properties":{"nom":"Cours de la Libération"},"geometry":{"type":"LineString","coordinates":[[-0.6001156711618988,44.798157515156575],[-0.600032246774405,44.798081784266614]]}},{"type":"Feature","properties":{"nom":"Cours de la Libération"},"geometry":{"type":"LineString","coordinates":[[-0.6001156711618988,44.798157515156575],[-0.6007363153333832,44.797795913029184],[-0.6011471230819231,44.797560941994476],[-0.601624488781473,44.797285666493565],[-0.6019543238940018,44.79706091369991],[-0.6022145735222436,44.796866559883405]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de l'Université"},"geometry":{"type":"LineString","coordinates":[[-0.605757491691602,44.80762330174275],[-0.6057145482988456,44.8076104300054],[-0.6056691358300782,44.8076025910679],[-0.6056226659682261,44.80760010050816],[-0.6055762696920832,44.80760283239072],[-0.6055309685626502,44.80761093449851],[-0.6054881348980691,44.80762409308484],[-0.6054488828118246,44.80764191250568],[-0.6054140794659372,44.80766409503106],[-0.6053846901984539,44.807689889404585],[-0.6053615596865048,44.80771863827693],[-0.605345285652203,44.80774978221213],[-0.6053360588329404,44.80778232425827],[-0.6053344964088883,44.80781399278839],[-0.6053373108555657,44.807834712668125]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de l'Université"},"geometry":{"type":"LineString","coordinates":[[-0.6053373108555657,44.807834712668125],[-0.6051873145541915,44.80787649092929],[-0.6048086836417823,44.8079348837127],[-0.6043747780243471,44.80796331771077],[-0.6038104886308437,44.80793435470706],[-0.6032483547232231,44.80789937519473]]}},{"type":"Feature","properties":{"nom":"Avenue de l'Université"},"geometry":{"type":"LineString","coordinates":[[-0.6053373108555657,44.807834712668125],[-0.6053401918614544,44.807848403993674],[-0.605353450516638,44.8078803234028],[-0.6053735427531568,44.80791022455468],[-0.6053857356036779,44.80792308022486]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de l'Université"},"geometry":{"type":"LineString","coordinates":[[-0.6000852811907536,44.8043813726086],[-0.6002051024416202,44.804381273287774],[-0.6002816167230712,44.80438470667476]]}},{"type":"Feature","properties":{"nom":"Avenue de l'Université"},"geometry":{"type":"LineString","coordinates":[[-0.6000852811907536,44.8043813726086],[-0.6000579938504631,44.8041835145103],[-0.5999881139459997,44.8036379351872],[-0.5999744803870597,44.80360602712762],[-0.5999527060266195,44.80358356514508],[-0.5999223500980054,44.80356146486022],[-0.5998836905566615,44.80354620340311]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de l'Université"},"geometry":{"type":"LineString","coordinates":[[-0.6002816167230712,44.80438470667476],[-0.6002860344366656,44.8044068171943],[-0.6003001004996978,44.80443754046262],[-0.6003214882036597,44.80446596007055],[-0.6003497681706776,44.80449127886543],[-0.6003839946460026,44.804512535873315],[-0.6004229917650951,44.80452913773373],[-0.6004523068258636,44.8045365874173]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue du Professeur Arnozan"},"geometry":{"type":"LineString","coordinates":[[-0.5873844207319046,44.80931081429517],[-0.587258968721268,44.80943205713267]]}},{"type":"Feature","properties":{"nom":"Rue du Professeur Arnozan"},"geometry":{"type":"LineString","coordinates":[[-0.5873844207319046,44.80931081429517],[-0.5876967809948078,44.80906765093253]]}},{"type":"Feature","properties":{"nom":"Place du 8 Mai 1945"},"geometry":{"type":"LineString","coordinates":[[-0.5873844207319046,44.80931081429517],[-0.5869495530264315,44.80913490627385],[-0.5869182103407327,44.80911724772109],[-0.5868969801111468,44.80909737856054],[-0.5868897255925573,44.80906824068419],[-0.5868927401554886,44.809039409557116],[-0.5869572195601603,44.80882496356797],[-0.5869876197288899,44.80872986951243]]}},{"type":"Feature","properties":{"nom":"Rue Charles Gounod"},"geometry":{"type":"LineString","coordinates":[[-0.5870244283657843,44.797018707197054],[-0.5859361428374773,44.79694565065381],[-0.5856717428526199,44.79693579087962]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue de Suzon"},"geometry":{"type":"LineString","coordinates":[[-0.5878802718810091,44.8104521851498],[-0.5872933614143089,44.81044015805655],[-0.5872123898312404,44.810444513222485],[-0.5871315852683003,44.81045561919193],[-0.5870585288065299,44.81047125510089],[-0.5869861748702153,44.81049614722422],[-0.5861900730992796,44.810831760005584],[-0.5861018004954792,44.81086318887048]]}},{"type":"Feature","properties":{"nom":"Résidence Crespy I"},"geometry":{"type":"LineString","coordinates":[[-0.5887105096135855,44.80420566504319],[-0.5889352992729378,44.80426162947189]]}},{"type":"Feature","properties":{"nom":"Rue de Megret"},"geometry":{"type":"LineString","coordinates":[[-0.5887105096135855,44.80420566504319],[-0.5890841607714429,44.8035065501129]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Eugène Et Marc Dulout"},"geometry":{"type":"LineString","coordinates":[[-0.6322121990324753,44.804561645228155],[-0.6324972230262332,44.80443615401674]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Jean Babin"},"geometry":{"type":"LineString","coordinates":[[-0.6156559924187647,44.79421016985492],[-0.6156887196234317,44.79419138287469],[-0.6157081737097578,44.7941768014107],[-0.6157242040577976,44.79416007672136],[-0.6157362188332708,44.79414185820801],[-0.6157439824322011,44.794122423615256],[-0.6157472818027955,44.79410241030045],[-0.6157460188800044,44.79408227179733],[-0.6157402274963963,44.794062547532015],[-0.6157300621073226,44.794043683007935],[-0.6157158147032175,44.79402629952435],[-0.6156978866188042,44.79401074465114],[-0.6156768201359397,44.79399961355941]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Albert Schweitzer"},"geometry":{"type":"LineString","coordinates":[[-0.6231370346267664,44.79401025740016],[-0.6231040167018932,44.79401230030511],[-0.6230579767963437,44.79402052344106],[-0.6230142903489584,44.794033986513604],[-0.6229741917014359,44.79405219977939],[-0.6229386683283478,44.79407477144728],[-0.6229088170250151,44.79410103599321],[-0.6228852351978004,44.79413043388792],[-0.6228685033105589,44.794162135888634],[-0.622859207481498,44.79419540265658],[-0.6228581922887556,44.794223541097814]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Albert Schweitzer"},"geometry":{"type":"LineString","coordinates":[[-0.6231370346267664,44.79401025740016],[-0.6232295293179418,44.79352932641312]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Albert Schweitzer"},"geometry":{"type":"LineString","coordinates":[[-0.6228581922887556,44.794223541097814],[-0.6220891500608492,44.794153541378215],[-0.6220459295387379,44.794154287438026],[-0.6220121544319436,44.794178514706246],[-0.6219157960357039,44.794463185128066]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Albert Schweitzer"},"geometry":{"type":"LineString","coordinates":[[-0.6228581922887556,44.794223541097814],[-0.6228575381018047,44.79422923720932],[-0.6228634443436628,44.794262830412706],[-0.6228768697262494,44.79429528322983],[-0.6229018336977635,44.79433016103196]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Impasse Charles Gounod"},"geometry":{"type":"LineString","coordinates":[[-0.5868890728028368,44.797380961659904],[-0.5870244283657843,44.797018707197054]]}},{"type":"Feature","properties":{"nom":"Rue François Rabelais"},"geometry":{"type":"LineString","coordinates":[[-0.5997444328869818,44.79781866557593],[-0.5996610459952546,44.79774554564548],[-0.599608677210136,44.79770720661802],[-0.5994247121537286,44.79757132962293],[-0.599229855218601,44.797443363996436],[-0.5990245244891643,44.797323927028145],[-0.5988108216087672,44.79721223149468],[-0.5986010282207422,44.79711248291793]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Marivaux"},"geometry":{"type":"LineString","coordinates":[[-0.5997444328869818,44.79781866557593],[-0.5995584697456817,44.797928416799316]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Albert Schweitzer"},"geometry":{"type":"LineString","coordinates":[[-0.6194418446698561,44.798961628216425],[-0.6193705422846755,44.79893633192673]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Albert Schweitzer"},"geometry":{"type":"LineString","coordinates":[[-0.6194418446698561,44.798961628216425],[-0.6195021725914712,44.798900793646354],[-0.6195449015210602,44.79884178032961],[-0.6195814077790118,44.798778370789044],[-0.61961484939489,44.798698393336664],[-0.6197865959542884,44.79802018370532],[-0.6198483445901574,44.797873183893095],[-0.6199814020393726,44.797727427460025]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Phenix Haut-Brion"},"geometry":{"type":"LineString","coordinates":[[-0.6132006267363936,44.80286043204193],[-0.6137206908151805,44.804021385254835]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Albert Schweitzer"},"geometry":{"type":"LineString","coordinates":[[-0.6132006267363936,44.80286043204193],[-0.6132796930719145,44.80283999364101],[-0.6135067955756608,44.802803321316375],[-0.6144130858114965,44.80273587784009],[-0.6146243232260284,44.80272871420799],[-0.6147790223180165,44.802748120007365]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Francis Plante"},"geometry":{"type":"LineString","coordinates":[[-0.6180171131666972,44.81246612657396],[-0.6186552030828344,44.813407648599856]]}},{"type":"Feature","properties":{"nom":"Rue d'Alembert"},"geometry":{"type":"LineString","coordinates":[[-0.5839761420156613,44.795077165607054],[-0.584141209074514,44.795217084931785]]}},{"type":"Feature","properties":{"nom":"Rue Edgar Degas"},"geometry":{"type":"LineString","coordinates":[[-0.5839761420156613,44.795077165607054],[-0.5840797735570805,44.794989943369195]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Edgar Degas"},"geometry":{"type":"LineString","coordinates":[[-0.5840797735570805,44.794989943369195],[-0.5844236606875618,44.79478281654653],[-0.584230838390085,44.79425543008137]]}},{"type":"Feature","properties":{"nom":"Rue Edgar Degas"},"geometry":{"type":"LineString","coordinates":[[-0.5840797735570805,44.794989943369195],[-0.5838780242684416,44.79482568689926],[-0.5835818955947589,44.79467359260721],[-0.5837163456751022,44.79452450428282],[-0.5837273810790584,44.79445983817431],[-0.5836897762684092,44.794335179095135]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue de Tremeuge"},"geometry":{"type":"LineString","coordinates":[[-0.5910668377371494,44.803253624036394],[-0.5905249464257029,44.80314674222542]]}},{"type":"Feature","properties":{"nom":"Résidence Santillane"},"geometry":{"type":"LineString","coordinates":[[-0.5910668377371494,44.803253624036394],[-0.5907270103192183,44.804079438664374]]}},{"type":"Feature","properties":{"nom":"Rue de Tremeuge"},"geometry":{"type":"LineString","coordinates":[[-0.5905249464257029,44.80314674222542],[-0.5900930684965086,44.803064835654624]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Résidence Santillane"},"geometry":{"type":"LineString","coordinates":[[-0.5905249464257029,44.80314674222542],[-0.5904664136725409,44.80331388463563],[-0.5903815669251798,44.80351433914252],[-0.5902925021536,44.80364707653377],[-0.5902159882306977,44.80375343248929],[-0.590171096602116,44.80381403797354]]}},{"type":"Feature","properties":{"nom":"Avenue Louis Laugaa"},"geometry":{"type":"LineString","coordinates":[[-0.6290182849240853,44.80555840129723],[-0.6285684873881706,44.80572598444604],[-0.6284511748392223,44.80577103070341],[-0.6283504602057898,44.80581644832542],[-0.6282244937130259,44.8058787957062],[-0.6281343999061584,44.80593711544333],[-0.6279950443851617,44.80603338386267],[-0.6279020485950477,44.80612271271428],[-0.6276472320417161,44.80639863800813]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Cours de la Libération"},"geometry":{"type":"LineString","coordinates":[[-0.5926887131867463,44.804341941868636],[-0.5925756756217709,44.8046214336666],[-0.5923629414503087,44.80515495263081],[-0.5922567476898352,44.805410420472995]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Chateaubriand"},"geometry":{"type":"LineString","coordinates":[[-0.6269556598485034,44.80614553903033],[-0.6271222134196999,44.80622321408799]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue des Facultes"},"geometry":{"type":"LineString","coordinates":[[-0.5999683281837823,44.80675796006154],[-0.6009433766419726,44.80649702704205]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de l'Université"},"geometry":{"type":"LineString","coordinates":[[-0.6003802276684883,44.80660833529063],[-0.6004237858826246,44.806693377047004]]}},{"type":"Feature","properties":{"nom":"Avenue de l'Université"},"geometry":{"type":"LineString","coordinates":[[-0.6004237858826246,44.806693377047004],[-0.6006164642014908,44.80706955323045],[-0.6007358852897697,44.80735466712789]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Cours de la Libération"},"geometry":{"type":"LineString","coordinates":[[-0.5914292510220244,44.809221191179155],[-0.591431092111132,44.809155283153466]]}},{"type":"Feature","properties":{"nom":"Voie 1 Faculté des Sciences"},"geometry":{"type":"LineString","coordinates":[[-0.5914292510220244,44.809221191179155],[-0.5918779057579182,44.80910838491132],[-0.591964754953042,44.809102939930625],[-0.5920620861449233,44.809101217559316]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Esplanade du 8 Mai 1945"},"geometry":{"type":"LineString","coordinates":[[-0.5885482454810009,44.80883927887937],[-0.5881968501730691,44.80882730336783]]}},{"type":"Feature","properties":{"nom":"Allée des Charmes"},"geometry":{"type":"LineString","coordinates":[[-0.5872243072582464,44.79794565051813],[-0.587323430036597,44.797871359204876],[-0.5873510577697331,44.79785787626137],[-0.5873858173825413,44.79784921292544],[-0.5874304460787433,44.79785275964089],[-0.5876443911271026,44.797887358198196],[-0.587796914409828,44.79791488591274]]}},{"type":"Feature","properties":{"nom":"Allée des Charmes"},"geometry":{"type":"LineString","coordinates":[[-0.5872243072582464,44.79794565051813],[-0.5871286171694389,44.797930742521565]]}},{"type":"Feature","properties":{"nom":"Allée des Charmes"},"geometry":{"type":"LineString","coordinates":[[-0.5872243072582464,44.79794565051813],[-0.5873434046687883,44.79796261261956]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de la Paillère"},"geometry":{"type":"LineString","coordinates":[[-0.6095480015968218,44.796184880097506],[-0.6095292750744494,44.7961707008747],[-0.6095022319277369,44.79615705586726],[-0.6094791801326748,44.79615058088907],[-0.6094628380449446,44.79614821692646],[-0.6094297058440028,44.79614845777674],[-0.609403328369066,44.796153528874584]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de la Paillère"},"geometry":{"type":"LineString","coordinates":[[-0.609403328369066,44.796153528874584],[-0.6092786299538921,44.796134065045536],[-0.6091022239964791,44.79611317928631],[-0.6086453402267731,44.796098491349674]]}},{"type":"Feature","properties":{"nom":"Avenue de la Paillère"},"geometry":{"type":"LineString","coordinates":[[-0.609403328369066,44.796153528874584],[-0.6093834161277263,44.7961608270074],[-0.6093700640590616,44.79616782684239],[-0.6093529054355558,44.796180712798815],[-0.6093399336354504,44.796195808026695],[-0.6093339169534729,44.796206808941946],[-0.6093296767989641,44.79621991546355]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de Candau"},"geometry":{"type":"LineString","coordinates":[[-0.6103927881971604,44.80848330192842],[-0.6101947110652945,44.80847463514907],[-0.6096048369498852,44.808500021867175],[-0.6089962798175784,44.80852816028714],[-0.60836880541367,44.808585631956106],[-0.6081571627327063,44.80861901020956]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue du Commandant Lherminier"},"geometry":{"type":"LineString","coordinates":[[-0.6103927881971604,44.80848330192842],[-0.6104009582614842,44.80865212817006],[-0.6103893260190918,44.808692430744564],[-0.6103622018364905,44.80873037918835],[-0.6102890319554364,44.80879797624914],[-0.6101726011162947,44.80885967594491],[-0.6099720337619824,44.80893797220357],[-0.6098690905866834,44.80899961294748],[-0.6097957832122104,44.80904765806693],[-0.6097616398032111,44.80909269234211],[-0.6097235135079464,44.809151149960485],[-0.6096602097524809,44.80926099606958]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Colonel Robert Jacqui"},"geometry":{"type":"LineString","coordinates":[[-0.6318455929708662,44.81126325695497],[-0.6320923791784995,44.81123934229949]]}},{"type":"Feature","properties":{"nom":"Avenue Colonel Robert Jacqui"},"geometry":{"type":"LineString","coordinates":[[-0.6318455929708662,44.81126325695497],[-0.6317249917245114,44.8112592701739],[-0.6305172785593685,44.81138124024923],[-0.6304681540560341,44.811376862585156],[-0.6304263407523278,44.811361981999944],[-0.6303972042151998,44.81134543564304],[-0.63033557803451,44.811293262062975],[-0.6301628211966482,44.811140317985114]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue du Commandant Lherminier"},"geometry":{"type":"LineString","coordinates":[[-0.6096602097524809,44.80926099606958],[-0.6091806218940967,44.80948763867637]]}},{"type":"Feature","properties":{"nom":"Rue du Commandant Lherminier"},"geometry":{"type":"LineString","coordinates":[[-0.6091806218940967,44.80948763867637],[-0.6087107356451487,44.80971568292245],[-0.608524361484987,44.80981113784823],[-0.6084380319378276,44.80983297405924],[-0.608323235867677,44.80983473148223]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Place du Commandant Lherminier"},"geometry":{"type":"LineString","coordinates":[[-0.6091806218940967,44.80948763867637],[-0.6090221208081995,44.80924809294352],[-0.6090463583577566,44.80907535584115]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Cours de la Libération"},"geometry":{"type":"LineString","coordinates":[[-0.5913453901569167,44.81046886122681],[-0.591317031740075,44.81045038894703],[-0.5912835394086535,44.81043685308885],[-0.591273267525887,44.81043447493098]]}},{"type":"Feature","properties":{"nom":"Cours de la Libération"},"geometry":{"type":"LineString","coordinates":[[-0.5913453901569167,44.81046886122681],[-0.5913836861716776,44.810033457263316],[-0.5914137225703756,44.80976811846953],[-0.5914187093093916,44.80950897546958],[-0.5914292510220244,44.809221191179155]]}},{"type":"Feature","properties":{"nom":"Avenue des Deux Ponts"},"geometry":{"type":"LineString","coordinates":[[-0.6221211395213243,44.801523791125014],[-0.6209176256124728,44.80151418988168]]}},{"type":"Feature","properties":{"nom":"Avenue de la Source"},"geometry":{"type":"LineString","coordinates":[[-0.6221211395213243,44.801523791125014],[-0.6221299012503636,44.80037440640367]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue de Chenevière"},"geometry":{"type":"LineString","coordinates":[[-0.6285498687749147,44.80061567178153],[-0.6286027052433694,44.800164557580324]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Résidence Clément Thomas"},"geometry":{"type":"LineString","coordinates":[[-0.5807791026423318,44.8020140742784],[-0.5808780202711453,44.80204420000512],[-0.5811193211162401,44.802168661960984],[-0.5818440451069568,44.802451306972245]]}},{"type":"Feature","properties":{"nom":"Rue Clément Thomas"},"geometry":{"type":"LineString","coordinates":[[-0.5807791026423318,44.8020140742784],[-0.5809830269145462,44.80141257539398]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Clément Thomas"},"geometry":{"type":"LineString","coordinates":[[-0.5809830269145462,44.80141257539398],[-0.5811691452983703,44.80095630755851]]}},{"type":"Feature","properties":{"nom":"Rue Clément Thomas"},"geometry":{"type":"LineString","coordinates":[[-0.5811691452983703,44.80095630755851],[-0.5812278188338076,44.80071745555957],[-0.5813280798233417,44.80021524677312],[-0.5814058414903404,44.80008001787614],[-0.5818333323795117,44.799525615444004],[-0.5826554480804653,44.79883708007676]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rond-point Crespy"},"geometry":{"type":"LineString","coordinates":[[-0.5859312438765092,44.80662709269295],[-0.5859313826052069,44.80662698477916],[-0.5859627641181854,44.80661152830284],[-0.5859981865173716,44.80660143039401],[-0.5860358718281484,44.80659719751367],[-0.5860739352224983,44.806599042222686],[-0.5861104728531408,44.806606871409166],[-0.5861456236711587,44.80662154869525]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Pierre Wiehn"},"geometry":{"type":"LineString","coordinates":[[-0.6312700013020841,44.80121295081171],[-0.6311618754544944,44.800779946141475]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Montaigne"},"geometry":{"type":"LineString","coordinates":[[-0.6312700013020841,44.80121295081171],[-0.6329148018499081,44.80098484856403],[-0.6330841604695993,44.80089349833166],[-0.6331554289449359,44.80075348306539],[-0.6330550263178062,44.80018825982236]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Pierre Wiehn"},"geometry":{"type":"LineString","coordinates":[[-0.631872080810827,44.80354356705513],[-0.6317138802751466,44.803460696747564]]}},{"type":"Feature","properties":{"nom":"Avenue Roger Chaumet"},"geometry":{"type":"LineString","coordinates":[[-0.631872080810827,44.80354356705513],[-0.6319944365127904,44.80350335597874],[-0.63209749388263,44.8034641213908],[-0.6324070040624621,44.80326343884925],[-0.632587308411469,44.80313282373228],[-0.6336087762934078,44.80254608690036],[-0.6339034211751292,44.802374701785695]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue du Chêne Vert"},"geometry":{"type":"LineString","coordinates":[[-0.6175045797927119,44.81063130724919],[-0.6184989583193068,44.81034843710847]]}},{"type":"Feature","properties":{"nom":"Rue du Chêne Vert"},"geometry":{"type":"LineString","coordinates":[[-0.6175045797927119,44.81063130724919],[-0.6160376727461415,44.81109395275266],[-0.6158251967616085,44.81114439730288]]}},{"type":"Feature","properties":{"nom":"Place Chambrelent"},"geometry":{"type":"LineString","coordinates":[[-0.6157785186711434,44.80542352907227],[-0.6157824111233696,44.805433134314846],[-0.6157974823048867,44.805455536328],[-0.6158173545638234,44.805475803881514],[-0.6158415058467568,44.805493683320215],[-0.6158695121804675,44.80550846745477],[-0.6159003463623518,44.80551991868744],[-0.6159334750486757,44.80552760355621],[-0.6159678823114828,44.80553146427341],[-0.6160026728643501,44.80553134913436],[-0.6160451960339756,44.80552540298936]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue du Rond Point"},"geometry":{"type":"LineString","coordinates":[[-0.6157785186711434,44.80542352907227],[-0.6145145899145501,44.80572097974112]]}},{"type":"Feature","properties":{"nom":"Avenue Pey Berland"},"geometry":{"type":"LineString","coordinates":[[-0.6124529785310876,44.80122124830705],[-0.6123028988161515,44.801027111820794],[-0.61214151397942,44.80090495024424],[-0.6119314358582492,44.800787127481435],[-0.6116782422348132,44.800694005068],[-0.611404100780211,44.80064821030148],[-0.6110793868824909,44.80065149438209],[-0.6099727350021602,44.800784006281695],[-0.60963791548459,44.800817874852086]]}},{"type":"Feature","properties":{"nom":"Allée de la Boétie"},"geometry":{"type":"LineString","coordinates":[[-0.6124529785310876,44.80122124830705],[-0.6136317936961506,44.80089355155994],[-0.6136891609441237,44.80084389463964],[-0.6136993430699275,44.8007842964138],[-0.6134612050310447,44.800307666080954]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Raymond Boivin"},"geometry":{"type":"LineString","coordinates":[[-0.6237854723855056,44.80244520763538],[-0.6223787240079985,44.8023952530901],[-0.6218535242761636,44.802397746195254],[-0.6207756796871756,44.802417021304976]]}},{"type":"Feature","properties":{"nom":"Avenue Pierre Corneille"},"geometry":{"type":"LineString","coordinates":[[-0.6237854723855056,44.80244520763538],[-0.6235468187345438,44.80153305782432]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Allée Pierre de Coubertin"},"geometry":{"type":"LineString","coordinates":[[-0.605885215623023,44.800376062741314],[-0.6056357485057866,44.800445498507415],[-0.6024543102625495,44.80131886466178],[-0.6020799340283943,44.80141837272509],[-0.6017307026211157,44.80151735346658],[-0.6013436960531953,44.801617259009255],[-0.6005203244586219,44.80184529300874],[-0.5999089678915647,44.80201391208004],[-0.5992047248805338,44.802551201774975]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Albert Schweitzer"},"geometry":{"type":"LineString","coordinates":[[-0.615239654429878,44.802825724109816],[-0.6152738974569812,44.802800763587854],[-0.6153002569799403,44.80277317098744],[-0.6153202539984124,44.80274298804989],[-0.6153330440311194,44.80271087220388],[-0.6153385571934318,44.80267772650684]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Marc Desbats"},"geometry":{"type":"LineString","coordinates":[[-0.615239654429878,44.802825724109816],[-0.6153253922776348,44.802909658776635],[-0.6154169921340998,44.802982146643814],[-0.6155701253983191,44.803037093951346],[-0.6161896625291661,44.80318089852451],[-0.616276575552105,44.8032008360743],[-0.6163431484066114,44.80321925830456],[-0.6164543226763436,44.803260855030295]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Nancel Pénard"},"geometry":{"type":"LineString","coordinates":[[-0.6230681813424483,44.8102911840886],[-0.624018432989894,44.81007380965053]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Maurice Faye"},"geometry":{"type":"LineString","coordinates":[[-0.6230681813424483,44.8102911840886],[-0.6238502063826362,44.812110102232744]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue du Général Chanzy"},"geometry":{"type":"LineString","coordinates":[[-0.5867477686237127,44.800852667230565],[-0.5862241014385443,44.80232760458696]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue du Général Bordas"},"geometry":{"type":"LineString","coordinates":[[-0.5867477686237127,44.800852667230565],[-0.58600702822517,44.8007377500221]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Jean Cordier"},"geometry":{"type":"LineString","coordinates":[[-0.6254496151827686,44.810692299541095],[-0.6266777308436225,44.80959944136287],[-0.6268000100219724,44.80943708538574]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Place du Souvenir Français"},"geometry":{"type":"LineString","coordinates":[[-0.6254496151827686,44.810692299541095],[-0.6255984636296466,44.81088384750102],[-0.6254341233497007,44.81093691986639]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de Saige"},"geometry":{"type":"LineString","coordinates":[[-0.630562884029604,44.795967954910736],[-0.6304475859348369,44.79508728104028],[-0.6303931736083461,44.79455265789623]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue du Maréchal Lyautey"},"geometry":{"type":"LineString","coordinates":[[-0.6310904512217805,44.79410961270501],[-0.631252066276045,44.79413463019979],[-0.6314170497640901,44.79416692679618]]}},{"type":"Feature","properties":{"nom":"Rond-point de la Médaille Militaire"},"geometry":{"type":"LineString","coordinates":[[-0.6310904512217805,44.79410961270501],[-0.6311039745522418,44.794093326093915],[-0.6311165647959391,44.79407427667028],[-0.6311246510243362,44.79405401980375],[-0.6311281409546257,44.794033098946954],[-0.6311268160436277,44.79401206158276],[-0.6311241504282005,44.7940018771171]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rond-point de la Médaille Militaire"},"geometry":{"type":"LineString","coordinates":[[-0.6311241504282005,44.7940018771171],[-0.6311207102705464,44.79399144713084],[-0.63111011012968,44.793971786946905],[-0.6311077542307001,44.79396852906377],[-0.6310951758557466,44.79395361641694],[-0.6310763088773275,44.79393728305864]]}},{"type":"Feature","properties":{"nom":"Résidence Crespy I"},"geometry":{"type":"LineString","coordinates":[[-0.5890468881739451,44.804019571503474],[-0.5889352992729378,44.80426162947189]]}},{"type":"Feature","properties":{"nom":"Résidence Crespy I"},"geometry":{"type":"LineString","coordinates":[[-0.5890468881739451,44.804019571503474],[-0.5892255924368786,44.80407509786336],[-0.589012285757549,44.80452061776749],[-0.5888401723316949,44.80448154821921]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue du Professeur Arnozan"},"geometry":{"type":"LineString","coordinates":[[-0.5881797231688719,44.80891198002606],[-0.5881961450309104,44.80887696067266],[-0.5882001763737262,44.808840080136335],[-0.5881968501730691,44.80882730336783]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de Bardanac"},"geometry":{"type":"LineString","coordinates":[[-0.6108716764102907,44.79524851413376],[-0.6096484377248717,44.79614619948864],[-0.6095480015968218,44.796184880097506]]}},{"type":"Feature","properties":{"nom":"Avenue Roger Chaumet"},"geometry":{"type":"LineString","coordinates":[[-0.6311606805048848,44.804346679159686],[-0.6315243641467698,44.80392518549436]]}},{"type":"Feature","properties":{"nom":"Avenue Georges Lasserre"},"geometry":{"type":"LineString","coordinates":[[-0.5889610944976797,44.80472886989087],[-0.5886542831473074,44.80465369256098],[-0.5885823663057871,44.80463601009954],[-0.5885264449924408,44.80462131677126],[-0.5884806678820967,44.80460857465829]]}},{"type":"Feature","properties":{"nom":"Résidence Crespy II"},"geometry":{"type":"LineString","coordinates":[[-0.5889610944976797,44.80472886989087],[-0.5886829980587841,44.80541417034074],[-0.5876994344868887,44.805222967194084],[-0.5878582517449966,44.804853216293985]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue du Professeur Jeanneney"},"geometry":{"type":"LineString","coordinates":[[-0.5821407023838101,44.80162375322326],[-0.5823120971842611,44.801480439965296]]}},{"type":"Feature","properties":{"nom":"Rue Michel Montaigne"},"geometry":{"type":"LineString","coordinates":[[-0.5821407023838101,44.80162375322326],[-0.581996432624606,44.80159884038343]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de Villemejan"},"geometry":{"type":"LineString","coordinates":[[-0.6075668450194411,44.79821632599034],[-0.6075071420906382,44.79831361758771],[-0.6074446916455576,44.798409464890945]]}},{"type":"Feature","properties":{"nom":"Allée des Jacquets"},"geometry":{"type":"LineString","coordinates":[[-0.6075668450194411,44.79821632599034],[-0.6082861705142739,44.79856086345614],[-0.6083205954746773,44.798666159103746]]}},{"type":"Feature","properties":{"nom":"Avenue de Villemejan"},"geometry":{"type":"LineString","coordinates":[[-0.6074446916455576,44.798409464890945],[-0.6071072432096107,44.79876914928914]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Chambrelant"},"geometry":{"type":"LineString","coordinates":[[-0.5853168094815572,44.808167198079275],[-0.5841417671664542,44.80780318649656]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Peydavant"},"geometry":{"type":"LineString","coordinates":[[-0.5853168094815572,44.808167198079275],[-0.585610866426628,44.80766229960811]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Jules Valles"},"geometry":{"type":"LineString","coordinates":[[-0.5840087065161284,44.81364925808745],[-0.5833944479768912,44.81367212232056],[-0.5833268487018581,44.81366569396263],[-0.5832773479482455,44.81364707496361],[-0.5832460809664701,44.81361436937356],[-0.5832336345599575,44.81356683807355],[-0.5831887578305832,44.8130770372922]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de l'Université"},"geometry":{"type":"LineString","coordinates":[[-0.5992047248805338,44.802551201774975],[-0.5991426121969289,44.802606135801256]]}},{"type":"Feature","properties":{"nom":"Avenue de l'Université"},"geometry":{"type":"LineString","coordinates":[[-0.5992047248805338,44.802551201774975],[-0.5968193140132685,44.80100671505463],[-0.5966519084589246,44.80082806120818],[-0.5965703030351481,44.8006820962064]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Georges Bizet"},"geometry":{"type":"LineString","coordinates":[[-0.5887778931031118,44.79492023813073],[-0.5886201223908932,44.795558312862916]]}},{"type":"Feature","properties":{"nom":"Place du Muguet"},"geometry":{"type":"LineString","coordinates":[[-0.6192003451272676,44.805816641880824],[-0.6188697461705239,44.80524089870388]]}},{"type":"Feature","properties":{"nom":"Avenue des Roses"},"geometry":{"type":"LineString","coordinates":[[-0.6192003451272676,44.805816641880824],[-0.6190762675168572,44.805843741373984]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue des Arts"},"geometry":{"type":"LineString","coordinates":[[-0.6128294430135697,44.797650377098066],[-0.6127276070434479,44.79763442451352],[-0.6125340938868502,44.7975829185907],[-0.6110890519033626,44.79708705296016],[-0.6107118818609878,44.796945347124755],[-0.6100838541284331,44.79663432044443],[-0.6098558033544615,44.79649787728235],[-0.6095368093002356,44.79629306465444]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Albert Schweitzer"},"geometry":{"type":"LineString","coordinates":[[-0.6229018336977635,44.79433016103196],[-0.6229246857275096,44.79435357540785],[-0.6229576027525034,44.794378110453]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Nancel Pénard"},"geometry":{"type":"LineString","coordinates":[[-0.6318755916354046,44.80876490225784],[-0.6322626407585338,44.80897892416717],[-0.6324363146384291,44.80903598643754],[-0.6328764318135781,44.80911814029118]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Résidence Antheor"},"geometry":{"type":"LineString","coordinates":[[-0.6318755916354046,44.80876490225784],[-0.6316810128686386,44.80893840083794],[-0.6316642469017522,44.80896352905602],[-0.6316701914566658,44.80899360746052],[-0.6317489890832049,44.809300259656155],[-0.6317338025877063,44.809466949392714],[-0.6317279396063193,44.80958478620214],[-0.6318210605368292,44.810014305949]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Nancel Pénard"},"geometry":{"type":"LineString","coordinates":[[-0.6300172199596933,44.80892484828186],[-0.6302240382772087,44.80886122472536],[-0.6304729864693318,44.808749232320224],[-0.6308268009744906,44.80857434652392]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Albert Schweitzer"},"geometry":{"type":"LineString","coordinates":[[-0.6171720137256175,44.800471934783396],[-0.617184694104715,44.80047036039925],[-0.617217475548208,44.80046247144449],[-0.6172481259448459,44.80045086676043],[-0.6172757839339125,44.80043593407935],[-0.6172997144347655,44.80041805711452],[-0.6173193142778841,44.80039770547182],[-0.6173339803037736,44.800375348753285],[-0.6173434938134287,44.800351534416315],[-0.6173475267618401,44.80032708364803],[-0.617345975445065,44.80030236007947],[-0.6173385760408895,44.8002771919352]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de l'Université"},"geometry":{"type":"LineString","coordinates":[[-0.6005624050351719,44.804188356648226],[-0.6005329387669479,44.80418658697797],[-0.6004878190628526,44.80418945662009],[-0.6004440689953974,44.80419804816299],[-0.6004092627113612,44.80421004994941]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de l'Université"},"geometry":{"type":"LineString","coordinates":[[-0.6005624050351719,44.804188356648226],[-0.6002757533293365,44.80358171734711],[-0.6000841805279902,44.80322709131136],[-0.6000106262750843,44.80312312224615],[-0.599842441912155,44.80297278315944],[-0.5995900681935169,44.8028054704204],[-0.5992047248805338,44.802551201774975]]}},{"type":"Feature","properties":{"nom":"Rue Aldona"},"geometry":{"type":"LineString","coordinates":[[-0.5916468256867602,44.79864509009591],[-0.5915421817258038,44.79858803986696],[-0.5910056690595032,44.7984976041222]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de Thouars"},"geometry":{"type":"LineString","coordinates":[[-0.5916468256867602,44.79864509009591],[-0.5917497936407278,44.798687419707996],[-0.5917724060901783,44.798699046797225]]}},{"type":"Feature","properties":{"nom":"Avenue Paul Lapie"},"geometry":{"type":"LineString","coordinates":[[-0.5879957097363121,44.802660342236095],[-0.5885653989972357,44.80106764762856]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue de Tremeuge"},"geometry":{"type":"LineString","coordinates":[[-0.5879957097363121,44.802660342236095],[-0.5871427200275997,44.802502850829214]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Pasteur"},"geometry":{"type":"LineString","coordinates":[[-0.6306234818854873,44.80621829611289],[-0.6309973778869389,44.806155553294545]]}},{"type":"Feature","properties":{"nom":"Rue Herman Lemoine"},"geometry":{"type":"LineString","coordinates":[[-0.6306234818854873,44.80621829611289],[-0.6306365218612896,44.80626661526872],[-0.6306450702024092,44.80635813790758],[-0.6306486321612742,44.8063745095646],[-0.6306590124033353,44.806398681046375],[-0.6306750517124591,44.806430329018575],[-0.6306803317925543,44.806457906319956],[-0.6306849891099978,44.80664837521006],[-0.6306929410031198,44.80668622687498],[-0.6307440648849332,44.806857015563125]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Louis Laugaa"},"geometry":{"type":"LineString","coordinates":[[-0.6306521263403831,44.80514015827631],[-0.6299725716897439,44.80531823402517],[-0.6297406522332688,44.805356804530206]]}},{"type":"Feature","properties":{"nom":"Rue Frédéric Chopin"},"geometry":{"type":"LineString","coordinates":[[-0.5847781845475827,44.795721463465725],[-0.5860323705535917,44.79589118155161]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Impasse du Colonel René Fonck"},"geometry":{"type":"LineString","coordinates":[[-0.6310324710411841,44.80977418478704],[-0.6303966248624713,44.809837360339436]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Place du Professeur Piéchaud"},"geometry":{"type":"LineString","coordinates":[[-0.6075898372026082,44.809273619724856],[-0.607652215883496,44.809384695151834],[-0.6077160928261833,44.809473202346354]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Esplanade des Antilles"},"geometry":{"type":"LineString","coordinates":[[-0.6214063507691692,44.793851257111],[-0.6214998958983052,44.794007185475536]]}},{"type":"Feature","properties":{"nom":"Esplanade des Antilles"},"geometry":{"type":"LineString","coordinates":[[-0.6214063507691692,44.793851257111],[-0.6232763658724012,44.79333649635493]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Pierre Wiehn"},"geometry":{"type":"LineString","coordinates":[[-0.6313066635366836,44.801680487252156],[-0.6312995222207741,44.8017559353992],[-0.6313345077378727,44.801901565174525]]}},{"type":"Feature","properties":{"nom":"Avenue Pierre Wiehn"},"geometry":{"type":"LineString","coordinates":[[-0.6313066635366836,44.801680487252156],[-0.6312700013020841,44.80121295081171]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue des Charmilles"},"geometry":{"type":"LineString","coordinates":[[-0.6267055904211111,44.801112215789686],[-0.6248167158546375,44.80108108882604]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Nancel Pénard"},"geometry":{"type":"LineString","coordinates":[[-0.6287238129443788,44.80891305861358],[-0.6287074745382106,44.80892087662859],[-0.6286897093991939,44.80893216333948],[-0.6286747208997054,44.808945343310945],[-0.6286629915694278,44.80896004081721],[-0.628654625064914,44.808975892215436],[-0.6286499776270127,44.80899252580751],[-0.6286491472518573,44.80900948804858],[-0.6286497829100846,44.809017575311366]]}},{"type":"Feature","properties":{"nom":"Avenue du Poujeau"},"geometry":{"type":"LineString","coordinates":[[-0.6287238129443788,44.80891305861358],[-0.6286311977843426,44.808848990854706],[-0.6282559941049614,44.80866007291163],[-0.6281220146836525,44.80859624319518]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue du Maréchal Lyautey"},"geometry":{"type":"LineString","coordinates":[[-0.6324882849617394,44.79416964742149],[-0.6331204935544414,44.79415791866978],[-0.6333199899073376,44.79415767051185]]}},{"type":"Feature","properties":{"nom":"Avenue du Maréchal Lyautey"},"geometry":{"type":"LineString","coordinates":[[-0.6324882849617394,44.79416964742149],[-0.6324854611337549,44.794114786306004]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Maurice Berteaux"},"geometry":{"type":"LineString","coordinates":[[-0.5874394502332281,44.81301107708922],[-0.5876207778322377,44.81232353005264]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Matteoti"},"geometry":{"type":"LineString","coordinates":[[-0.5963748769008166,44.80593403532045],[-0.5963189105283733,44.80485238606977]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Roul"},"geometry":{"type":"LineString","coordinates":[[-0.5963748769008166,44.80593403532045],[-0.5966193334440264,44.805927746919046],[-0.5970339972000122,44.805931839752795],[-0.5974384797343806,44.80592283083548]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Cours de la Libération"},"geometry":{"type":"LineString","coordinates":[[-0.5918630512275317,44.806781595907665],[-0.591864857049954,44.80676016103547],[-0.5918592053241648,44.8067376343106],[-0.5918490500224921,44.80672087229625]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Ambroise Pare"},"geometry":{"type":"LineString","coordinates":[[-0.5861563400219824,44.80864203725283],[-0.5869876197288899,44.80872986951243]]}},{"type":"Feature","properties":{"nom":"Rue Lamartine"},"geometry":{"type":"LineString","coordinates":[[-0.5861563400219824,44.80864203725283],[-0.5862044440575361,44.80717469710045],[-0.5861920048825989,44.80707162915579],[-0.5861557287428911,44.806995828290184],[-0.5861258770579253,44.80692828887539],[-0.5861240457568794,44.80682526250225]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue des Violettes"},"geometry":{"type":"LineString","coordinates":[[-0.6303931736083461,44.79455265789623],[-0.6315336025557304,44.79460533740075],[-0.633202368626908,44.794832825789584]]}},{"type":"Feature","properties":{"nom":"Avenue des Facultes"},"geometry":{"type":"LineString","coordinates":[[-0.6057238322161185,44.8049954861119],[-0.6053676163335752,44.80520964438705],[-0.6051171421916265,44.8053260432795],[-0.6046422978811481,44.80549675584039],[-0.6033032501363998,44.80586050945838]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Résidence Crespy I"},"geometry":{"type":"LineString","coordinates":[[-0.5895402813859256,44.80334766444167],[-0.589372434552278,44.80333845840935],[-0.5892726378677615,44.80354429207371]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Résidence Crespy II"},"geometry":{"type":"LineString","coordinates":[[-0.5898878302914718,44.80493116959223],[-0.5893099438875146,44.806364659315726],[-0.5892967260994052,44.80639624474574],[-0.5892766750127097,44.80642579376009],[-0.5892498553294387,44.80645231341251],[-0.5892168481120404,44.80647497462609],[-0.5891791576366742,44.806493549764134],[-0.5891380579988676,44.80650817878141],[-0.5890952693347523,44.80652006854119],[-0.5890509882544411,44.80652831202116],[-0.5890057591057982,44.806533522616334],[-0.5889598624619168,44.806536141881296],[-0.5875250355600304,44.80651961025519],[-0.5874793218971461,44.80651907028844],[-0.5874340494491475,44.806515453606394],[-0.5873893612969355,44.80650902594351],[-0.5873462006249638,44.80649867657264],[-0.5873054514693663,44.80648437761389],[-0.5872668132942509,44.80646739969259],[-0.5872321133087565,44.80644660420395],[-0.5872016544470632,44.80642279233301],[-0.5871764582144867,44.8063961120306],[-0.5871592214412641,44.806367198902755],[-0.5871470786250186,44.806336773896476],[-0.587138289684099,44.80630534229956],[-0.587132482301994,44.806240486421785],[-0.5871271698635787,44.80614291525641],[-0.5871227460915611,44.806077925660745],[-0.5871091648032141,44.806014215767746],[-0.5870953971215871,44.80598411224665],[-0.5870767545543621,44.80595497320072],[-0.5870508176364474,44.80592858648197],[-0.5870200082307858,44.80590523603547],[-0.5869841185172867,44.80588564906566],[-0.5869432715666157,44.805871803485914],[-0.586871380938855,44.80585524351578],[-0.586782444662698,44.80583723923063],[-0.5866938001752457,44.805819856248924],[-0.5866060516017306,44.80581280434881],[-0.5864864687442536,44.80581270157772]]}},{"type":"Feature","properties":{"nom":"Avenue Georges Lasserre"},"geometry":{"type":"LineString","coordinates":[[-0.5898878302914718,44.80493116959223],[-0.5892744946297488,44.80480337757599],[-0.5889610944976797,44.80472886989087]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue de Suzon"},"geometry":{"type":"LineString","coordinates":[[-0.5845266756419456,44.81081239400367],[-0.5849697393399184,44.81090229542672]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Edouard Herriot"},"geometry":{"type":"LineString","coordinates":[[-0.5821560683356397,44.80205430950675],[-0.5824356880312024,44.80168364462371]]}},{"type":"Feature","properties":{"nom":"Résidence Michel Montaigne"},"geometry":{"type":"LineString","coordinates":[[-0.5821560683356397,44.80205430950675],[-0.5824957689921371,44.8021882808271],[-0.5824133024455259,44.80229870602808],[-0.5820663909934288,44.80216883506007]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Place du Théatre de Verdure"},"geometry":{"type":"LineString","coordinates":[[-0.6308029509226473,44.79340748890225],[-0.630787271331482,44.79322881235479],[-0.6308111164620588,44.793075088275856],[-0.6306669053178622,44.79197228945535]]}},{"type":"Feature","properties":{"nom":"Rue de la Ramée"},"geometry":{"type":"LineString","coordinates":[[-0.6308029509226473,44.79340748890225],[-0.6314036276194981,44.793369300565004]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Maréchal Leclerc"},"geometry":{"type":"LineString","coordinates":[[-0.5878866023049307,44.80723804824538],[-0.5881419074841618,44.80725755977209],[-0.5883793790124525,44.80725484264933],[-0.5884712406536647,44.8072506834324],[-0.5886221785661602,44.80724420989426]]}},{"type":"Feature","properties":{"nom":"Rue du Professeur Roux"},"geometry":{"type":"LineString","coordinates":[[-0.5878866023049307,44.80723804824538],[-0.5878531095493886,44.80734441032008],[-0.5870242927718372,44.808660341002444],[-0.5869876197288899,44.80872986951243]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Georges Lasserre"},"geometry":{"type":"LineString","coordinates":[[-0.5922567476898352,44.805410420472995],[-0.5920951648995038,44.805381872126084],[-0.5919189780319195,44.80534587141796],[-0.5908768346438454,44.805135111541]]}},{"type":"Feature","properties":{"nom":"Cours de la Libération"},"geometry":{"type":"LineString","coordinates":[[-0.5922567476898352,44.805410420472995],[-0.5920486432489971,44.80592886448956],[-0.59177833957402,44.80660004681237],[-0.5917228175241306,44.80668043065457]]}},{"type":"Feature","properties":{"nom":"Rue Michel Slitinsky"},"geometry":{"type":"LineString","coordinates":[[-0.5908768346438454,44.805135111541],[-0.5906837568081132,44.80561703771333],[-0.5905348321161508,44.80598080558536],[-0.5905150214038407,44.80608124173051],[-0.5903879310139973,44.80640756665086],[-0.5903578595570199,44.806450944462185],[-0.5901752386690532,44.80668821935534]]}},{"type":"Feature","properties":{"nom":"Avenue Georges Lasserre"},"geometry":{"type":"LineString","coordinates":[[-0.5908768346438454,44.805135111541],[-0.5898878302914718,44.80493116959223]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue du Haut Carre"},"geometry":{"type":"LineString","coordinates":[[-0.5975106500427024,44.81243610629011],[-0.5977875452259982,44.8131112532041]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Jean Cocteau"},"geometry":{"type":"LineString","coordinates":[[-0.5806009916716915,44.80272159659935],[-0.5811214153243898,44.80289897681461],[-0.5811628656707487,44.80291037317946],[-0.5812126574797136,44.802917543295294],[-0.5814665934575787,44.80293981469017]]}},{"type":"Feature","properties":{"nom":"Rue Clément Thomas"},"geometry":{"type":"LineString","coordinates":[[-0.5806009916716915,44.80272159659935],[-0.5807228930412999,44.802233570901166],[-0.5807791026423318,44.8020140742784]]}},{"type":"Feature","properties":{"nom":"Avenue de la Marne"},"geometry":{"type":"LineString","coordinates":[[-0.596962525832824,44.7942880795142],[-0.596718890129175,44.794375688623745],[-0.5965060776399489,44.7944159299597],[-0.5959392521576963,44.79447186994839]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Lafontaine"},"geometry":{"type":"LineString","coordinates":[[-0.5840053833237241,44.80295370653722],[-0.5836404782601111,44.80356442762278],[-0.5836002037568148,44.80364523865101]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Blanqui"},"geometry":{"type":"LineString","coordinates":[[-0.5821933875355502,44.81311505203595],[-0.5831887578305832,44.8130770372922]]}},{"type":"Feature","properties":{"nom":"Rue Bourges"},"geometry":{"type":"LineString","coordinates":[[-0.5821933875355502,44.81311505203595],[-0.5822014951453914,44.81306020737292],[-0.582204613199869,44.813002457062105],[-0.582195095432896,44.812837097007254],[-0.5821805715737989,44.81265838237581],[-0.5821412127605833,44.8124160415655]]}},{"type":"Feature","properties":{"nom":"Rue Bourges"},"geometry":{"type":"LineString","coordinates":[[-0.5821412127605833,44.8124160415655],[-0.5821412938540521,44.81236847600874],[-0.5821621961695906,44.81220999509623],[-0.5822053501379916,44.81203081536906]]}},{"type":"Feature","properties":{"nom":"Rue Bourges"},"geometry":{"type":"LineString","coordinates":[[-0.5821412127605833,44.8124160415655],[-0.5822168541435998,44.812374744402945],[-0.5823742292670113,44.81229448033498],[-0.5824723589146111,44.812248511199655]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Cours de la Libération"},"geometry":{"type":"LineString","coordinates":[[-0.5981996355267528,44.79928031462285],[-0.5983424144731566,44.79920021807931],[-0.6001156711618988,44.798157515156575]]}},{"type":"Feature","properties":{"nom":"Avenue Maréchal de Lattre de Tassigny"},"geometry":{"type":"LineString","coordinates":[[-0.5893594529373799,44.81248406737403],[-0.5884670082335232,44.81239448681385],[-0.5876207778322377,44.81232353005264]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Jacques Chaban Delmas"},"geometry":{"type":"LineString","coordinates":[[-0.5893594529373799,44.81248406737403],[-0.5893886249477766,44.81236928349199],[-0.5894599697557291,44.81182419928541],[-0.5894712877183582,44.81174583129971]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Etienne Marcel"},"geometry":{"type":"LineString","coordinates":[[-0.6332361872648015,44.80662438438843],[-0.6334931477747833,44.807382520972965]]}},{"type":"Feature","properties":{"nom":"Rue Georges Trendel"},"geometry":{"type":"LineString","coordinates":[[-0.6332361872648015,44.80662438438843],[-0.6334527769779731,44.806579450175484],[-0.6335082336786833,44.806535789514335],[-0.6335255720281684,44.80648965310059],[-0.6334240624110101,44.80614598217266],[-0.633397283165561,44.805887755899924]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Albert Schweitzer"},"geometry":{"type":"LineString","coordinates":[[-0.6058526999066345,44.807680729014336],[-0.6059872695018079,44.80751575540195],[-0.6061221952362326,44.80737671412465],[-0.6062565548650382,44.80724886086562],[-0.6064437405939739,44.80708555147519],[-0.606603973250565,44.80695057160916],[-0.6068313258916518,44.806769953148645],[-0.6077533522424334,44.80609157500647],[-0.6079458835492219,44.80595719005264]]}},{"type":"Feature","properties":{"nom":"Avenue de l'Université"},"geometry":{"type":"LineString","coordinates":[[-0.6058526999066345,44.807680729014336],[-0.6058319662825128,44.80766282926865],[-0.605796933194583,44.807640878692865],[-0.605757491691602,44.80762330174275]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Pierre Noailles"},"geometry":{"type":"LineString","coordinates":[[-0.5983600071891754,44.808352657301484],[-0.5985133829700419,44.80833654485694],[-0.5985687189015938,44.808333082649355],[-0.5987343814282154,44.80834756950181],[-0.5987899755560617,44.80834824280326],[-0.5988454433870515,44.808344866369325],[-0.5989001702869653,44.80833772989387],[-0.5989535079408616,44.80832658364371],[-0.5990050999131776,44.808311799227035],[-0.5990550079434781,44.80829436559926],[-0.5991571898185568,44.80826293662551],[-0.5992105385806428,44.8082519700641],[-0.5992650997585891,44.80824420807641],[-0.5993754289391398,44.80823585241999],[-0.5995421884606948,44.80822940427641],[-0.5999314250111244,44.80822321160716],[-0.6000415579701354,44.80823197716155],[-0.6003365168343558,44.808270294930296]]}},{"type":"Feature","properties":{"nom":"Rue Pierre Noailles"},"geometry":{"type":"LineString","coordinates":[[-0.5983600071891754,44.808352657301484],[-0.5983543185804354,44.80832842496084],[-0.5983403395491766,44.80830517554584],[-0.598318830649017,44.80828495688503],[-0.5982911389986774,44.80826907759502],[-0.598258956908695,44.80825829487593],[-0.5982241029818597,44.80825336193469],[-0.5981884884356033,44.80825448855746],[-0.598175104191677,44.80825698384061]]}},{"type":"Feature","properties":{"nom":"Rue Pierre Noailles"},"geometry":{"type":"LineString","coordinates":[[-0.598175104191677,44.80825698384061],[-0.5981543865269713,44.80826160283149],[-0.5981236748031078,44.80827437511933],[-0.5980980708468993,44.80829194035003],[-0.5980791659571215,44.80831343745036],[-0.5980680125969882,44.808337481898235],[-0.5980652899651232,44.80836279105752],[-0.5980711496447659,44.80838773865554],[-0.5980852548808018,44.80841098410915],[-0.5980889229424843,44.8084150118628]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue du Général Gouraud"},"geometry":{"type":"LineString","coordinates":[[-0.6271397607279103,44.79464557544812],[-0.6266830599784304,44.794669960616694],[-0.6266368958617939,44.794688278550694],[-0.6266070196033975,44.79471814825758],[-0.6266006637778646,44.794751862137645],[-0.626651901013641,44.79515209207201]]}},{"type":"Feature","properties":{"nom":"Rue du Général Gouraud"},"geometry":{"type":"LineString","coordinates":[[-0.626651901013641,44.79515209207201],[-0.6266812867006435,44.795180792495515],[-0.6267205374850893,44.79519134169497],[-0.6267583068312391,44.79519040739846],[-0.6276425572872322,44.79514670866255],[-0.6276818471716424,44.79513978001658],[-0.6277109623352108,44.7951259692284],[-0.6277301061956784,44.79510247721528],[-0.6277350050826055,44.795079799965855],[-0.627689816862455,44.79467126975945],[-0.6276576663209917,44.79464085611041],[-0.6276006070947003,44.79462474962859],[-0.6271397607279103,44.79464557544812]]}},{"type":"Feature","properties":{"nom":"Rue du Général Koenig"},"geometry":{"type":"LineString","coordinates":[[-0.6324821773750492,44.79407471367852],[-0.6324424028235368,44.79358998032634]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Georges Bizet"},"geometry":{"type":"LineString","coordinates":[[-0.5880899537441516,44.79708175177864],[-0.587796914409828,44.79791488591274]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Charles Gounod"},"geometry":{"type":"LineString","coordinates":[[-0.5880899537441516,44.79708175177864],[-0.5870244283657843,44.797018707197054]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue des Roses"},"geometry":{"type":"LineString","coordinates":[[-0.6196479004013254,44.80571168586368],[-0.6192003451272676,44.805816641880824]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Pasteur"},"geometry":{"type":"LineString","coordinates":[[-0.633397283165561,44.805887755899924],[-0.6324496511934334,44.80593829283401]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Gambetta"},"geometry":{"type":"LineString","coordinates":[[-0.633397283165561,44.805887755899924],[-0.6333958559356109,44.805828976606094],[-0.6333763991174778,44.805763206203544],[-0.6333611761235757,44.805728469632705],[-0.6333332032594494,44.80567414168953],[-0.63320172125122,44.805471238509334],[-0.633171993686215,44.805401111792165],[-0.6331285166762349,44.80531962325583]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Albert Schweitzer"},"geometry":{"type":"LineString","coordinates":[[-0.6131457210272049,44.80282019760035],[-0.612865978007332,44.802911330050875],[-0.6127279699885666,44.802970484397314],[-0.6125839031423049,44.80304199222661],[-0.6124376263584324,44.8031327577409],[-0.6122808241948917,44.80324133345106],[-0.6121804089566304,44.803331002343064],[-0.6120377369710926,44.803483359676555],[-0.6119837921032429,44.80355740951318],[-0.6119359879848945,44.803622436171246],[-0.6117246316080097,44.80399128170782],[-0.611609849393684,44.80418491159654],[-0.6115092999059415,44.804327012359145],[-0.6114140580000519,44.8044366947833],[-0.6113277220276336,44.804528978575675],[-0.6112302010882644,44.80461441078422],[-0.6111287609394298,44.804693841691],[-0.6110180428676794,44.804760505029506],[-0.6109513723332212,44.80478496226963],[-0.6108199774483072,44.80481444701006]]}},{"type":"Feature","properties":{"nom":"Avenue Pey Berland"},"geometry":{"type":"LineString","coordinates":[[-0.6131457210272049,44.80282019760035],[-0.6125998138991972,44.801573583455145],[-0.6124529785310876,44.80122124830705]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Edouard Herriot"},"geometry":{"type":"LineString","coordinates":[[-0.581742359284271,44.803038507850836],[-0.5814665934575787,44.80293981469017]]}},{"type":"Feature","properties":{"nom":"Résidence Clément Thomas"},"geometry":{"type":"LineString","coordinates":[[-0.581742359284271,44.803038507850836],[-0.581979099813943,44.802741259935196],[-0.5822066482409058,44.80246105612574]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Voie 1 Faculté des Sciences"},"geometry":{"type":"LineString","coordinates":[[-0.6002766793537899,44.806733069436376],[-0.6002329645957412,44.806650251454165]]}},{"type":"Feature","properties":{"nom":"Voie 1 Faculté des Sciences"},"geometry":{"type":"LineString","coordinates":[[-0.6002329645957412,44.806650251454165],[-0.6001973295634049,44.80657255031752],[-0.6001536528787481,44.80652470489435],[-0.6001142908939995,44.80650063376368],[-0.6000701011779578,44.80648427779792],[-0.6000239709706738,44.806475164866164],[-0.5999641946606086,44.806472504461425],[-0.5990734619459711,44.806711467022254],[-0.5990160386491407,44.8067127043345],[-0.5989766255742842,44.80669367847544],[-0.5989634588475646,44.80667510042032],[-0.5989344322699931,44.8066063743094]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de la Paillère"},"geometry":{"type":"LineString","coordinates":[[-0.6081092980994777,44.79606018908337],[-0.6073937712994234,44.79600433658666],[-0.6063096567689085,44.795842520704404]]}},{"type":"Feature","properties":{"nom":"Avenue de la Paillère"},"geometry":{"type":"LineString","coordinates":[[-0.6063096567689085,44.795842520704404],[-0.6048339085700761,44.795610684071555]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Auguste Renoir"},"geometry":{"type":"LineString","coordinates":[[-0.6063096567689085,44.795842520704404],[-0.6062165705893053,44.79614436735729]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de Candau"},"geometry":{"type":"LineString","coordinates":[[-0.6191155935746175,44.80774793270232],[-0.6186893706113094,44.80773942310523]]}},{"type":"Feature","properties":{"nom":"Impasse Candau"},"geometry":{"type":"LineString","coordinates":[[-0.6191155935746175,44.80774793270232],[-0.6193821098394551,44.807139587390644]]}},{"type":"Feature","properties":{"nom":"Rue Graham Bell"},"geometry":{"type":"LineString","coordinates":[[-0.6184440781769963,44.80100764276105],[-0.6184499042469171,44.800943227963295],[-0.6184777365899734,44.80079802889875]]}},{"type":"Feature","properties":{"nom":"Rue Chateaubriand"},"geometry":{"type":"LineString","coordinates":[[-0.6276774713309989,44.806494623383934],[-0.6276840654164638,44.80648388856143],[-0.6276878142604473,44.806475412319465],[-0.6276904398259062,44.806463691563344],[-0.6276902463456826,44.806451538755084],[-0.627687401165344,44.80644029034312],[-0.6276831877805137,44.80643121913035],[-0.6276725314982629,44.80641760560021],[-0.6276611944043453,44.806408075452836],[-0.6276472320417161,44.80639863800813]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rond-point Crespy"},"geometry":{"type":"LineString","coordinates":[[-0.5861240457568794,44.80682526250225],[-0.5860886343059274,44.80683532250555],[-0.5860509488432163,44.806839555403144],[-0.5860118123630705,44.80683708913506]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Jean Jaurès"},"geometry":{"type":"LineString","coordinates":[[-0.6290203614854815,44.80660240666163],[-0.6294283912792256,44.80648281815557]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue du Maréchal Lyautey"},"geometry":{"type":"LineString","coordinates":[[-0.6324854611337549,44.794114786306004],[-0.6324821773750492,44.79407471367852]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Voie 2 Faculté des Sciences"},"geometry":{"type":"LineString","coordinates":[[-0.5974342271774864,44.806883431617564],[-0.5958860300252984,44.80730270564037],[-0.5953256108039215,44.80773119586228],[-0.5952249709914197,44.80781373927588]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Roul"},"geometry":{"type":"LineString","coordinates":[[-0.5974384797343806,44.80592283083548],[-0.598503457195701,44.805929589372]]}},{"type":"Feature","properties":{"nom":"Rue du Docteur Dupeux"},"geometry":{"type":"LineString","coordinates":[[-0.5974384797343806,44.80592283083548],[-0.5973690746633866,44.80445380231567]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de Saige"},"geometry":{"type":"LineString","coordinates":[[-0.6312288707516215,44.79381052774058],[-0.6312674803386352,44.79377875633229],[-0.6313436484821172,44.793702545180565],[-0.6334080384075472,44.79128477499163],[-0.6335081160316466,44.79105006073519]]}},{"type":"Feature","properties":{"nom":"Avenue de Saige"},"geometry":{"type":"LineString","coordinates":[[-0.6312288707516215,44.79381052774058],[-0.6311403000456135,44.793880648788274],[-0.6310763088773275,44.79393728305864]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rond-point de la Médaille Militaire"},"geometry":{"type":"LineString","coordinates":[[-0.6310763088773275,44.79393728305864],[-0.6310541857856857,44.793923485938],[-0.6310291910194082,44.793912302861],[-0.6310018579217356,44.793904167217434],[-0.6309732078862519,44.79389922655864],[-0.6309436310068466,44.79389764859816],[-0.6309142636098519,44.793899397050225],[-0.6308854901317049,44.79390454972601],[-0.6308584355721827,44.79391289053619],[-0.6304006651069844,44.794060830216736],[-0.6303726116505446,44.794069382964906],[-0.6303470346451828,44.79408109967004],[-0.6303242845628143,44.794095518726834],[-0.6303051019762096,44.794112346241484],[-0.6302978682609254,44.79412203599371]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue du Haut Carre"},"geometry":{"type":"LineString","coordinates":[[-0.5972166531379761,44.811713936264894],[-0.5972536510442011,44.81180591126048]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Gambetta"},"geometry":{"type":"LineString","coordinates":[[-0.6331285166762349,44.80531962325583],[-0.6330096504694444,44.80516829540005]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue du Docteur Albert Schweitzer"},"geometry":{"type":"LineString","coordinates":[[-0.6232295293179418,44.79352932641312],[-0.6232763658724012,44.79333649635493]]}},{"type":"Feature","properties":{"nom":"Rue Auguste Renoir"},"geometry":{"type":"LineString","coordinates":[[-0.6062165705893053,44.79614436735729],[-0.6061403033668107,44.796389468898305]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Allée Edouard Manet"},"geometry":{"type":"LineString","coordinates":[[-0.6062165705893053,44.79614436735729],[-0.6067772826860622,44.79622918958117],[-0.6069505704167555,44.79628720187755],[-0.6069750399804364,44.7964194781173]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue Roger Cohé"},"geometry":{"type":"LineString","coordinates":[[-0.6319839823463206,44.80700867766565],[-0.6321437358089756,44.80698348760759],[-0.6321551389995546,44.80697970027553],[-0.6321645022481974,44.80697165405251],[-0.6321691078827614,44.80696240849734],[-0.6321689445737956,44.80695178380184],[-0.6321219936157869,44.80681716620748]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Cours de la Libération"},"geometry":{"type":"LineString","coordinates":[[-0.5917228175241306,44.80668043065457],[-0.5917093553724799,44.80668234980004],[-0.5916813407291034,44.80669151141458],[-0.5916256576879978,44.806721440014826],[-0.5916010487437976,44.80673593325577],[-0.5915833878840339,44.806753594050186],[-0.5915727415861389,44.80677438339978],[-0.5915698063875107,44.806796070418244],[-0.5915715782126126,44.806807000539166]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue du Pont de Chiquet"},"geometry":{"type":"LineString","coordinates":[[-0.6243411479644546,44.807293675486406],[-0.6242393931306023,44.80716894678864]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de Gradignan"},"geometry":{"type":"LineString","coordinates":[[-0.6256255858329896,44.804118601845786],[-0.6256309069148038,44.80426916582181]]}},{"type":"Feature","properties":{"nom":"Passage Françoise Dolto"},"geometry":{"type":"LineString","coordinates":[[-0.6319981444093928,44.810183684844965],[-0.632822504502535,44.809975210079436]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de Gradignan"},"geometry":{"type":"LineString","coordinates":[[-0.6256309069148038,44.80426916582181],[-0.6256426564041526,44.80426953318824],[-0.6256692271731027,44.80427252168953],[-0.6256910946650486,44.804277771560514],[-0.6257044756993364,44.80428257653887],[-0.6257172027943432,44.80428826028153],[-0.6257371603933585,44.804300564940576],[-0.6257521823861885,44.80431219554282]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue du Maréchal Lyautey"},"geometry":{"type":"LineString","coordinates":[[-0.6319064118916216,44.794038513165184],[-0.6313033925421753,44.79385481159717],[-0.6312288707516215,44.79381052774058]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rond-point de la Médaille Militaire"},"geometry":{"type":"LineString","coordinates":[[-0.6302978682609254,44.79412203599371],[-0.6302899692820373,44.79413120648],[-0.6302793575573499,44.79415154390092],[-0.6302733591019212,44.794172815055575],[-0.6302723187342687,44.794194468432394],[-0.6302761572107939,44.79421524538567]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Camille Saint-Saëns"},"geometry":{"type":"LineString","coordinates":[[-0.5836461685000797,44.794846686020186],[-0.583580832285504,44.79489666840283],[-0.5828446280968299,44.7953684722123],[-0.5827995422326325,44.79544303896483]]}},{"type":"Feature","properties":{"nom":"Rue d'Alembert"},"geometry":{"type":"LineString","coordinates":[[-0.5836461685000797,44.794846686020186],[-0.5837668100483687,44.794906932276966],[-0.5839761420156613,44.795077165607054]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Cours de la Libération"},"geometry":{"type":"LineString","coordinates":[[-0.5918490500224921,44.80672087229625],[-0.5918412828058065,44.806614135599126],[-0.5919700774147114,44.80629257444009],[-0.5921660507144769,44.80581282433813],[-0.5923260252980941,44.80541946553582]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Cours de la Libération"},"geometry":{"type":"LineString","coordinates":[[-0.5918490500224921,44.80672087229625],[-0.5918265519465282,44.806700934867294],[-0.5918009511338614,44.80668781444307],[-0.5917711448063439,44.806680296953935],[-0.591740451227781,44.80667862393789],[-0.5917228175241306,44.80668043065457]]}},{"type":"Feature","properties":{"nom":"Place Bitaly"},"geometry":{"type":"LineString","coordinates":[[-0.6309221672473588,44.79752646843733],[-0.6320032309721466,44.79746330061289]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Avenue de Gradignan"},"geometry":{"type":"LineString","coordinates":[[-0.6257186658929844,44.80445471683499],[-0.6256929405630863,44.804464628936145],[-0.6256731164123094,44.80447004616434],[-0.6256533803629942,44.8044725894132],[-0.6256292429478596,44.80447355026168],[-0.6256116815454894,44.80447219595927],[-0.6255972920101133,44.80446997489925],[-0.6255814707323305,44.80446636389337]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Chateaubriand"},"geometry":{"type":"LineString","coordinates":[[-0.6257186658929844,44.80445471683499],[-0.6257009824525093,44.80452409285669],[-0.6256986116441727,44.804580443310535],[-0.6256970738426726,44.80463293898663],[-0.625695584062968,44.80466054968195],[-0.6256792607284879,44.804690975514546]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Rue Blumerel"},"geometry":{"type":"LineString","coordinates":[[-0.5842133684977429,44.80200895198547],[-0.584341590760821,44.80194411950809],[-0.5844760048016592,44.801872033368106],[-0.5845646978369996,44.80183098220742],[-0.5846658913618529,44.80179531144972],[-0.584750823944423,44.80177531110105],[-0.5848536747407324,44.80176629484492],[-0.5849531948594707,44.801768932415065],[-0.5850656636308562,44.80178415428938],[-0.5851201875665865,44.80179119926634]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Résidence Santillane"},"geometry":{"type":"LineString","coordinates":[[-0.5907270103192183,44.804079438664374],[-0.5901538950581474,44.80396110844472]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Résidence Santillane"},"geometry":{"type":"LineString","coordinates":[[-0.5901538950581474,44.80396110844472],[-0.5901096215239574,44.80409676265784],[-0.590060846646444,44.80425782228568]]}},{"type":"Feature","properties":{"nom":"Résidence Santillane"},"geometry":{"type":"LineString","coordinates":[[-0.5901538950581474,44.80396110844472],[-0.590171096602116,44.80381403797354]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Résidence Santillane"},"geometry":{"type":"LineString","coordinates":[[-0.590171096602116,44.80381403797354],[-0.5899055471763629,44.80376250960788]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Résidence Santillane"},"geometry":{"type":"LineString","coordinates":[[-0.5899055471763629,44.80376250960788],[-0.5900176331889045,44.803482518418],[-0.5899712909915953,44.80347098858278]]}},{"type":"Feature","properties":{"nom":"Résidence Santillane"},"geometry":{"type":"LineString","coordinates":[[-0.5899055471763629,44.80376250960788],[-0.5897418357629141,44.80415781513457]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}},{"type":"Feature","properties":{"nom":"Unknown"},"geometry":{"type":"LineString","coordinates":[[0,0],[0,0]]}}]} \ No newline at end of file diff --git a/out-1.geojson b/out-1.geojson deleted file mode 100644 index f011e214..00000000 --- a/out-1.geojson +++ /dev/null @@ -1 +0,0 @@ -{"type":"FeatureCollection","features":[{"type":"Feature","properties":{"id":19986,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.598503457195701,44.805929589372]}},{"type":"Feature","properties":{"id":649,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5999951036373583,44.806025258018686]}},{"type":"Feature","properties":{"id":20477,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5889352992729378,44.80426162947189]}},{"type":"Feature","properties":{"id":8849,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5888401723316949,44.80448154821921]}},{"type":"Feature","properties":{"id":565,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5923014576779416,44.80911464724327]}},{"type":"Feature","properties":{"id":20529,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.595118792724725,44.80826399273431]}},{"type":"Feature","properties":{"id":37644,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6312988395560757,44.806953711851584]}},{"type":"Feature","properties":{"id":25322,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6309171201956937,44.80701688540854]}},{"type":"Feature","properties":{"id":16751,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6192614171451878,44.802438103692516]}},{"type":"Feature","properties":{"id":16491,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6193901306760591,44.8013866079945]}},{"type":"Feature","properties":{"id":16648,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6195375283914707,44.800241821394124]}},{"type":"Feature","properties":{"id":27475,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6195571001638541,44.800067877994806]}},{"type":"Feature","properties":{"id":16492,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6317468675861465,44.80689859927188]}},{"type":"Feature","properties":{"id":19473,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6077811541581584,44.80684108265683]}},{"type":"Feature","properties":{"id":16917,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.607715901583938,44.806967106259115]}},{"type":"Feature","properties":{"id":16627,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6197644570798326,44.8049764093837]}},{"type":"Feature","properties":{"id":16888,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.619434263251487,44.80508024381205]}},{"type":"Feature","properties":{"id":17199,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6192984980148553,44.80512068753395]}},{"type":"Feature","properties":{"id":17074,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6188697461705239,44.80524089870388]}},{"type":"Feature","properties":{"id":16769,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6252738215622851,44.8018510579183]}},{"type":"Feature","properties":{"id":16770,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6255429995479178,44.80249765613825]}},{"type":"Feature","properties":{"id":16652,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6256676068307824,44.803400556478046]}},{"type":"Feature","properties":{"id":22272,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6254961069676005,44.80434026530025]}},{"type":"Feature","properties":{"id":57283,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6255814707323305,44.80446636389337]}},{"type":"Feature","properties":{"id":25688,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5924389591219411,44.796194159508005]}},{"type":"Feature","properties":{"id":19946,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5923109617560379,44.79619270781825]}},{"type":"Feature","properties":{"id":16429,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.629585442485553,44.809839194970834]}},{"type":"Feature","properties":{"id":16426,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6301869250232973,44.809594070291]}},{"type":"Feature","properties":{"id":31584,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6058105533287731,44.80886602147036]}},{"type":"Feature","properties":{"id":25589,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6063400223491766,44.810836189241876]}},{"type":"Feature","properties":{"id":19899,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5912290658125761,44.81024498686175]}},{"type":"Feature","properties":{"id":20137,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5911565152469914,44.810435278298364]}},{"type":"Feature","properties":{"id":29050,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5912464814650292,44.810668722841385]}},{"type":"Feature","properties":{"id":24223,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5913207195900397,44.8106456601919]}},{"type":"Feature","properties":{"id":27350,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5909511668127475,44.812623544396445]}},{"type":"Feature","properties":{"id":30130,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.590891021962493,44.81256004356215]}},{"type":"Feature","properties":{"id":16186,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6167453060802395,44.80336708893274]}},{"type":"Feature","properties":{"id":16183,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.617199029463869,44.805092888259615]}},{"type":"Feature","properties":{"id":16375,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6276472320417161,44.80639863800813]}},{"type":"Feature","properties":{"id":57263,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6275035249587216,44.80642437225543]}},{"type":"Feature","properties":{"id":16460,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6294283912792256,44.80648281815557]}},{"type":"Feature","properties":{"id":16461,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6298909344003979,44.80713449809973]}},{"type":"Feature","properties":{"id":25671,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6093915158581251,44.79630839606761]}},{"type":"Feature","properties":{"id":15961,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6095368093002356,44.79629306465444]}},{"type":"Feature","properties":{"id":15979,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6050567334529893,44.796471117352944]}},{"type":"Feature","properties":{"id":15980,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6048339085700761,44.795610684071555]}},{"type":"Feature","properties":{"id":19802,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5953333058379465,44.810684745640245]}},{"type":"Feature","properties":{"id":19803,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.595254869181587,44.81137085787207]}},{"type":"Feature","properties":{"id":19816,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5861456236711587,44.80662154869525]}},{"type":"Feature","properties":{"id":58723,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5862094348735556,44.806745356618016]}},{"type":"Feature","properties":{"id":17232,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6112758976534942,44.812906173888436]}},{"type":"Feature","properties":{"id":16948,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6131783922998356,44.81317699595155]}},{"type":"Feature","properties":{"id":17246,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6324496511934334,44.80593829283401]}},{"type":"Feature","properties":{"id":17247,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6313232630557205,44.80610605296365]}},{"type":"Feature","properties":{"id":22264,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6288534679758239,44.80246991038936]}},{"type":"Feature","properties":{"id":22265,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6293327530723806,44.80245758969772]}},{"type":"Feature","properties":{"id":15878,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6162816263743869,44.79540521177599]}},{"type":"Feature","properties":{"id":15877,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6168956162527585,44.795241569770326]}},{"type":"Feature","properties":{"id":16624,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6311324422268266,44.79922387400509]}},{"type":"Feature","properties":{"id":24283,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6308623117393518,44.79828166195963]}},{"type":"Feature","properties":{"id":17421,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6310068594694284,44.79942967178872]}},{"type":"Feature","properties":{"id":17298,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6309711873600478,44.79967890203219]}},{"type":"Feature","properties":{"id":16540,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6268000100219724,44.80943708538574]}},{"type":"Feature","properties":{"id":16428,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6271167540555563,44.81045664227241]}},{"type":"Feature","properties":{"id":16431,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6274574680346562,44.81176640446349]}},{"type":"Feature","properties":{"id":27672,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6171929150616469,44.79703612275271]}},{"type":"Feature","properties":{"id":17043,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6178180737614022,44.79822614617144]}},{"type":"Feature","properties":{"id":16030,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6198157907617171,44.80774853275552]}},{"type":"Feature","properties":{"id":16031,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6203579837622806,44.80579151082335]}},{"type":"Feature","properties":{"id":16608,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6324014687974893,44.808087433957105]}},{"type":"Feature","properties":{"id":16546,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6328764318135781,44.80911814029118]}},{"type":"Feature","properties":{"id":27886,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6318478280770993,44.80695050696602]}},{"type":"Feature","properties":{"id":17129,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6321402210686764,44.8075884236563]}},{"type":"Feature","properties":{"id":16128,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6276631170427468,44.80521949652113]}},{"type":"Feature","properties":{"id":15831,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6292569572675963,44.805162794691796]}},{"type":"Feature","properties":{"id":17022,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6242857966554964,44.80616683431997]}},{"type":"Feature","properties":{"id":16376,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6264257207198175,44.80572872752301]}},{"type":"Feature","properties":{"id":16251,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6271324783500616,44.803995137202875]}},{"type":"Feature","properties":{"id":57282,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6260456600254464,44.80406568709261]}},{"type":"Feature","properties":{"id":16291,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6160451960339756,44.80552540298936]}},{"type":"Feature","properties":{"id":16292,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6161900184432482,44.80532874127065]}},{"type":"Feature","properties":{"id":31835,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.61475110339749,44.79739329170675]}},{"type":"Feature","properties":{"id":15990,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6141607998750656,44.79618494001125]}},{"type":"Feature","properties":{"id":17059,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6292460675686923,44.79350349109471]}},{"type":"Feature","properties":{"id":17370,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6303640321588959,44.79343483472454]}},{"type":"Feature","properties":{"id":26709,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6284124019636882,44.793554507407194]}},{"type":"Feature","properties":{"id":16435,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6070114019224195,44.80985200795313]}},{"type":"Feature","properties":{"id":17037,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6067216609943213,44.810010552473784]}},{"type":"Feature","properties":{"id":29759,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6095170708821552,44.80091872951914]}},{"type":"Feature","properties":{"id":17280,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.60963791548459,44.800817874852086]}},{"type":"Feature","properties":{"id":17119,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6082347158446524,44.80920497076243]}},{"type":"Feature","properties":{"id":36352,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.608323235867677,44.80983473148223]}},{"type":"Feature","properties":{"id":16440,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6082974034579984,44.8099233740803]}},{"type":"Feature","properties":{"id":16284,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6070065521135677,44.81079775978465]}},{"type":"Feature","properties":{"id":15885,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6168116988168031,44.79508163835017]}},{"type":"Feature","properties":{"id":15884,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6183588167645683,44.79466389064747]}},{"type":"Feature","properties":{"id":15886,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6162000239246755,44.79524135064804]}},{"type":"Feature","properties":{"id":16921,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6198124150619269,44.80396081435652]}},{"type":"Feature","properties":{"id":16391,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6234301620012386,44.80417829556763]}},{"type":"Feature","properties":{"id":25910,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6278541662325295,44.793963642612205]}},{"type":"Feature","properties":{"id":30140,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6278533162913976,44.79391394341432]}},{"type":"Feature","properties":{"id":30099,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6309071398690205,44.7941820380093]}},{"type":"Feature","properties":{"id":26552,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6314170497640901,44.79416692679618]}},{"type":"Feature","properties":{"id":19987,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5984066689433065,44.80404866973753]}},{"type":"Feature","properties":{"id":19995,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5859945919392777,44.80275327348517]}},{"type":"Feature","properties":{"id":19996,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5862241014385443,44.80232760458696]}},{"type":"Feature","properties":{"id":20004,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5892437059848279,44.799063900248946]}},{"type":"Feature","properties":{"id":37097,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5883960860467061,44.79893904008061]}},{"type":"Feature","properties":{"id":24279,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6275361969122202,44.79722248075931]}},{"type":"Feature","properties":{"id":24276,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6252628069394983,44.79941635645798]}},{"type":"Feature","properties":{"id":19741,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5911660667008316,44.8129569095402]}},{"type":"Feature","properties":{"id":20542,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5921025824436333,44.81289446071338]}},{"type":"Feature","properties":{"id":19552,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.581117210519938,44.79888183393539]}},{"type":"Feature","properties":{"id":19553,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5811476582560566,44.79898500943584]}},{"type":"Feature","properties":{"id":26647,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5814737141394966,44.8081419763692]}},{"type":"Feature","properties":{"id":20334,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.580958284944962,44.80802947790924]}},{"type":"Feature","properties":{"id":20328,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6004554726115798,44.79519916794754]}},{"type":"Feature","properties":{"id":19941,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5986010282207422,44.79711248291793]}},{"type":"Feature","properties":{"id":25911,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5826588270171792,44.81231056002393]}},{"type":"Feature","properties":{"id":24950,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5836514704914351,44.81236324867341]}},{"type":"Feature","properties":{"id":27580,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5850304000323213,44.80045316333416]}},{"type":"Feature","properties":{"id":20438,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5859920373070406,44.80070218999017]}},{"type":"Feature","properties":{"id":16092,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.630737406271222,44.797443454373465]}},{"type":"Feature","properties":{"id":24278,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6306944067410274,44.79700575772121]}},{"type":"Feature","properties":{"id":30945,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6056351334495721,44.808011833433156]}},{"type":"Feature","properties":{"id":16230,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6057286659423373,44.80862305200351]}},{"type":"Feature","properties":{"id":20210,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5890841607714429,44.8035065501129]}},{"type":"Feature","properties":{"id":20476,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5892726378677615,44.80354429207371]}},{"type":"Feature","properties":{"id":20388,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5900930684965086,44.803064835654624]}},{"type":"Feature","properties":{"id":22370,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5900259725883658,44.80322072338686]}},{"type":"Feature","properties":{"id":20485,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.587919333101578,44.80914837087973]}},{"type":"Feature","properties":{"id":20482,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5883272668548667,44.808966779621706]}},{"type":"Feature","properties":{"id":20118,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5861690395503226,44.81189917006904]}},{"type":"Feature","properties":{"id":20501,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5849977758770828,44.81191870329469]}},{"type":"Feature","properties":{"id":20366,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5849697393399184,44.81090229542672]}},{"type":"Feature","properties":{"id":24285,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6315243641467698,44.80392518549436]}},{"type":"Feature","properties":{"id":17302,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6322151558794488,44.80515079027539]}},{"type":"Feature","properties":{"id":20222,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5817347652098784,44.80154978936739]}},{"type":"Feature","properties":{"id":25679,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5823120971842611,44.801480439965296]}},{"type":"Feature","properties":{"id":20221,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.581996432624606,44.80159884038343]}},{"type":"Feature","properties":{"id":20223,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5813093901470782,44.80146841891647]}},{"type":"Feature","properties":{"id":23187,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.630181560447226,44.792005531352444]}},{"type":"Feature","properties":{"id":19630,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5836002037568148,44.80364523865101]}},{"type":"Feature","properties":{"id":19631,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5826711868171895,44.80315617672418]}},{"type":"Feature","properties":{"id":17553,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6067089864241451,44.79436691118033]}},{"type":"Feature","properties":{"id":17552,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6068156243160784,44.79400067523964]}},{"type":"Feature","properties":{"id":20038,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5923260252980941,44.80541946553582]}},{"type":"Feature","properties":{"id":19894,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5945591266873305,44.804573269848255]}},{"type":"Feature","properties":{"id":19730,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5979900250654584,44.80311454502185]}},{"type":"Feature","properties":{"id":20034,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5991426121969289,44.802606135801256]}},{"type":"Feature","properties":{"id":19848,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5957016899524444,44.81082479978316]}},{"type":"Feature","properties":{"id":20216,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5829114531768446,44.796488604084416]}},{"type":"Feature","properties":{"id":20217,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5828224141858932,44.796421866246604]}},{"type":"Feature","properties":{"id":19672,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5836766845477668,44.79691508101888]}},{"type":"Feature","properties":{"id":19691,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5839626726056485,44.80214458791417]}},{"type":"Feature","properties":{"id":20123,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.582923523265462,44.8017866446877]}},{"type":"Feature","properties":{"id":19867,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5824356880312024,44.80168364462371]}},{"type":"Feature","properties":{"id":20148,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5981196130069676,44.79920231276052]}},{"type":"Feature","properties":{"id":20188,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5964093157695478,44.798490890947136]}},{"type":"Feature","properties":{"id":20189,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.595370898235511,44.79809223046674]}},{"type":"Feature","properties":{"id":19808,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5855319951303288,44.80322276786811]}},{"type":"Feature","properties":{"id":20228,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5849821415010599,44.80208259314067]}},{"type":"Feature","properties":{"id":22361,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5851729305762308,44.80191907417385]}},{"type":"Feature","properties":{"id":22362,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5853664302049465,44.80193801712926]}},{"type":"Feature","properties":{"id":23614,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5854651696709479,44.801834416894806]}},{"type":"Feature","properties":{"id":22359,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5852274849938373,44.80170782441463]}},{"type":"Feature","properties":{"id":19574,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5910056690595032,44.7984976041222]}},{"type":"Feature","properties":{"id":19575,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5895145995675709,44.798263440100435]}},{"type":"Feature","properties":{"id":19577,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5874940924930621,44.79876580341441]}},{"type":"Feature","properties":{"id":19578,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5874301042376504,44.79893303199433]}},{"type":"Feature","properties":{"id":19964,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6058602084364522,44.79786435749591]}},{"type":"Feature","properties":{"id":19965,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6071072432096107,44.79876914928914]}},{"type":"Feature","properties":{"id":19746,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5977875452259982,44.8131112532041]}},{"type":"Feature","properties":{"id":19615,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6000842403541052,44.812542147747884]}},{"type":"Feature","properties":{"id":19795,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5810666445856678,44.80424561790561]}},{"type":"Feature","properties":{"id":19710,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5807488871936071,44.804359125680534]}},{"type":"Feature","properties":{"id":20104,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5963189105283733,44.80485238606977]}},{"type":"Feature","properties":{"id":19839,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5973690746633866,44.80445380231567]}},{"type":"Feature","properties":{"id":19823,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6051360946018491,44.79834322327829]}},{"type":"Feature","properties":{"id":20107,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.586804278974005,44.813557993963954]}},{"type":"Feature","properties":{"id":19686,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5847905382966339,44.81362056946996]}},{"type":"Feature","properties":{"id":19854,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5849219860206252,44.799108507861185]}},{"type":"Feature","properties":{"id":19579,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.585015235590998,44.79884406116928]}},{"type":"Feature","properties":{"id":19620,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5859913165365825,44.79604678625102]}},{"type":"Feature","properties":{"id":19950,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5860323705535917,44.79589118155161]}},{"type":"Feature","properties":{"id":20111,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5863172883442309,44.79475842595066]}},{"type":"Feature","properties":{"id":20112,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5865401267186039,44.79406776702903]}},{"type":"Feature","properties":{"id":16653,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6237420017448931,44.80334184354475]}},{"type":"Feature","properties":{"id":20280,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5933378311746387,44.800416106713314]}},{"type":"Feature","properties":{"id":19680,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5841417671664542,44.80780318649656]}},{"type":"Feature","properties":{"id":19679,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5838043431839468,44.80837808926339]}},{"type":"Feature","properties":{"id":19683,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5850986212444692,44.80621552009868]}},{"type":"Feature","properties":{"id":19682,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5847038209642228,44.80686249834282]}},{"type":"Feature","properties":{"id":19694,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5825067725348939,44.803310080280106]}},{"type":"Feature","properties":{"id":19695,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5823466062177725,44.80347330833263]}},{"type":"Feature","properties":{"id":19696,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5813624680708289,44.80427602942861]}},{"type":"Feature","properties":{"id":29092,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5960955461028271,44.80064098746413]}},{"type":"Feature","properties":{"id":29090,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5964472687166597,44.8007340007718]}},{"type":"Feature","properties":{"id":22866,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.600032246774405,44.798081784266614]}},{"type":"Feature","properties":{"id":25955,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6032483547232231,44.80789937519473]}},{"type":"Feature","properties":{"id":20352,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6008390553247239,44.80732491684311]}},{"type":"Feature","properties":{"id":20354,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6032398452665743,44.80796972897076]}},{"type":"Feature","properties":{"id":20392,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6004399085619743,44.807585639041214]}},{"type":"Feature","properties":{"id":25654,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6008795044312589,44.807547040725375]}},{"type":"Feature","properties":{"id":19942,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5957169283102807,44.79632937035617]}},{"type":"Feature","properties":{"id":20307,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5952346629585121,44.798058162349264]}},{"type":"Feature","properties":{"id":19976,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5898720404281652,44.81345825178031]}},{"type":"Feature","properties":{"id":19740,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5907714977003081,44.812804875596846]}},{"type":"Feature","properties":{"id":30133,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5897857054238459,44.81339890989978]}},{"type":"Feature","properties":{"id":30127,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5887850089633541,44.81407096556667]}},{"type":"Feature","properties":{"id":23469,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5908991722573637,44.81276805557285]}},{"type":"Feature","properties":{"id":26434,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.590615027273328,44.81275324319808]}},{"type":"Feature","properties":{"id":30131,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5906896860220451,44.81279376557689]}},{"type":"Feature","properties":{"id":19824,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6065470639244804,44.79939101050488]}},{"type":"Feature","properties":{"id":19844,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5958535522035362,44.81201358750806]}},{"type":"Feature","properties":{"id":20139,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5913855063098329,44.810568396335654]}},{"type":"Feature","properties":{"id":19731,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5920218479019826,44.81051866672442]}},{"type":"Feature","properties":{"id":28642,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5944228342264861,44.81006231609056]}},{"type":"Feature","properties":{"id":23370,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5980889229424843,44.8084150118628]}},{"type":"Feature","properties":{"id":19953,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5839926048931097,44.805442794196125]}},{"type":"Feature","properties":{"id":19629,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5848800257630388,44.80408206975226]}},{"type":"Feature","properties":{"id":19735,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.594898196507284,44.7982785100566]}},{"type":"Feature","properties":{"id":20126,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5950341181897741,44.7983501527892]}},{"type":"Feature","properties":{"id":20308,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5816715327550772,44.79859323230218]}},{"type":"Feature","properties":{"id":20316,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5880525730551078,44.80870096572785]}},{"type":"Feature","properties":{"id":29242,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5888287887820327,44.80734741083005]}},{"type":"Feature","properties":{"id":19761,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5833254041750363,44.79571293010645]}},{"type":"Feature","properties":{"id":19748,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5827995422326325,44.79544303896483]}},{"type":"Feature","properties":{"id":16094,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6328870155811008,44.79910027617863]}},{"type":"Feature","properties":{"id":20160,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5876207778322377,44.81232353005264]}},{"type":"Feature","properties":{"id":20098,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.587769795632363,44.81130198763022]}},{"type":"Feature","properties":{"id":19988,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5899764767772134,44.80123120461399]}},{"type":"Feature","properties":{"id":20003,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5907424423278052,44.799292871840485]}},{"type":"Feature","properties":{"id":16768,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.628875764665801,44.807471374277796]}},{"type":"Feature","properties":{"id":16647,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6208754813095524,44.80034561747293]}},{"type":"Feature","properties":{"id":16344,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6210805999159307,44.80051916368715]}},{"type":"Feature","properties":{"id":16089,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6307665484608452,44.797685210289806]}},{"type":"Feature","properties":{"id":16954,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6160580420874954,44.79373137093818]}},{"type":"Feature","properties":{"id":24465,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6156768201359397,44.79399961355941]}},{"type":"Feature","properties":{"id":16525,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6172610122507112,44.800198493889766]}},{"type":"Feature","properties":{"id":15986,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6169246743947955,44.80027864516549]}},{"type":"Feature","properties":{"id":16508,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6153385571934318,44.80267772650684]}},{"type":"Feature","properties":{"id":27338,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6167556010158722,44.80183102215729]}},{"type":"Feature","properties":{"id":16506,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6173385760408895,44.8002771919352]}},{"type":"Feature","properties":{"id":28446,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6177700580488659,44.80001150404143]}},{"type":"Feature","properties":{"id":16515,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.610457696199699,44.805133490765726]}},{"type":"Feature","properties":{"id":30017,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6107277124972792,44.80517572599702]}},{"type":"Feature","properties":{"id":16539,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.624018432989894,44.81007380965053]}},{"type":"Feature","properties":{"id":16541,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6286497829100846,44.809017575311366]}},{"type":"Feature","properties":{"id":24368,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6295164631937994,44.809867159990326]}},{"type":"Feature","properties":{"id":24367,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.630105762234423,44.8111767311133]}},{"type":"Feature","properties":{"id":24369,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.629184852615813,44.80908644455927]}},{"type":"Feature","properties":{"id":16293,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.615914663117892,44.80523173783854]}},{"type":"Feature","properties":{"id":16510,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6150150402426817,44.802875833309585]}},{"type":"Feature","properties":{"id":19864,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5818440451069568,44.802451306972245]}},{"type":"Feature","properties":{"id":19865,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5820663909934288,44.80216883506007]}},{"type":"Feature","properties":{"id":19897,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5898432957757949,44.81017036133909]}},{"type":"Feature","properties":{"id":16522,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6209525813577348,44.796990254580784]}},{"type":"Feature","properties":{"id":16502,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6209883616111087,44.797016050297394]}},{"type":"Feature","properties":{"id":16516,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6079458835492219,44.80595719005264]}},{"type":"Feature","properties":{"id":16418,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6078964088953601,44.80591678083899]}},{"type":"Feature","properties":{"id":19933,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5823728634221069,44.811295159599865]}},{"type":"Feature","properties":{"id":24951,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5823237210808098,44.81155307906197]}},{"type":"Feature","properties":{"id":27869,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5891885489291463,44.810515857685246]}},{"type":"Feature","properties":{"id":20296,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5887035242411404,44.810498010601194]}},{"type":"Feature","properties":{"id":19841,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.582596396707485,44.81053449802052]}},{"type":"Feature","properties":{"id":19914,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5817200878902408,44.8104187744898]}},{"type":"Feature","properties":{"id":23249,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6004092627113612,44.80421004994941]}},{"type":"Feature","properties":{"id":20286,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5851117818471763,44.81090727732481]}},{"type":"Feature","properties":{"id":19617,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5922783509610803,44.796444976952124]}},{"type":"Feature","properties":{"id":20377,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5924129675978201,44.79487752946063]}},{"type":"Feature","properties":{"id":20376,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5923415956072579,44.79592698879076]}},{"type":"Feature","properties":{"id":58725,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5857400198724079,44.802234706479176]}},{"type":"Feature","properties":{"id":27870,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5892150208258056,44.810245948030406]}},{"type":"Feature","properties":{"id":36388,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5885996140983818,44.81021726093555]}},{"type":"Feature","properties":{"id":40117,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6295206167811596,44.806458345196894]}},{"type":"Feature","properties":{"id":34718,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6292068035750316,44.805857500152804]}},{"type":"Feature","properties":{"id":20143,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5930434137916174,44.803644041633945]}},{"type":"Feature","properties":{"id":20144,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5934361361385686,44.80267325106588]}},{"type":"Feature","properties":{"id":38841,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5915715782126126,44.806807000539166]}},{"type":"Feature","properties":{"id":59022,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5916084990576307,44.806855428560446]}},{"type":"Feature","properties":{"id":38856,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5933681929699226,44.802659092840265]}},{"type":"Feature","properties":{"id":38854,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5929742433737365,44.803628480598185]}},{"type":"Feature","properties":{"id":19947,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.587860065877693,44.79886460859568]}},{"type":"Feature","properties":{"id":52048,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6324753154092333,44.79809439571101]}},{"type":"Feature","properties":{"id":16090,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6321897311485453,44.79761003666069]}},{"type":"Feature","properties":{"id":54609,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6242393931306023,44.80716894678864]}},{"type":"Feature","properties":{"id":16223,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6236435928320284,44.806901298311644]}},{"type":"Feature","properties":{"id":42838,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6012665955153395,44.80519957824972]}},{"type":"Feature","properties":{"id":42839,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6037883598926465,44.803629468683006]}},{"type":"Feature","properties":{"id":622,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5951234192899467,44.80810890524155]}},{"type":"Feature","properties":{"id":633,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5952993982979592,44.80805550937134]}},{"type":"Feature","properties":{"id":652,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5921882974571633,44.80894562386988]}},{"type":"Feature","properties":{"id":20528,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.592062101007606,44.808997893070945]}},{"type":"Feature","properties":{"id":13302,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.588214814102791,44.809443166299296]}},{"type":"Feature","properties":{"id":20309,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.587258968721268,44.80943205713267]}},{"type":"Feature","properties":{"id":13285,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5881968501730691,44.80882730336783]}},{"type":"Feature","properties":{"id":13289,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.58832341738245,44.80933182236562]}},{"type":"Feature","properties":{"id":20136,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5806814180138815,44.79511636493524]}},{"type":"Feature","properties":{"id":20061,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5813456481642605,44.795235165102824]}},{"type":"Feature","properties":{"id":37643,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6309973778869389,44.806155553294545]}},{"type":"Feature","properties":{"id":16402,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6311754385788592,44.80612572631919]}},{"type":"Feature","properties":{"id":16343,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6209176256124728,44.80151418988168]}},{"type":"Feature","properties":{"id":16874,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6182464372634308,44.80245301211074]}},{"type":"Feature","properties":{"id":19488,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6173187328141713,44.802632780677655]}},{"type":"Feature","properties":{"id":16493,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6308833205895168,44.80716534165337]}},{"type":"Feature","properties":{"id":16674,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.631075393174946,44.807574857356464]}},{"type":"Feature","properties":{"id":16463,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6306339972617606,44.808185392863834]}},{"type":"Feature","properties":{"id":16544,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6308268009744906,44.80857434652392]}},{"type":"Feature","properties":{"id":31145,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6311664048647538,44.8079710236816]}},{"type":"Feature","properties":{"id":19516,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6081304002606294,44.8076860611186]}},{"type":"Feature","properties":{"id":16759,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6083608681400925,44.807601729324546]}},{"type":"Feature","properties":{"id":17072,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.618594700473303,44.80386687048051]}},{"type":"Feature","properties":{"id":17073,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6187065175775098,44.80437219367516]}},{"type":"Feature","properties":{"id":16873,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6181716384499761,44.802999044575934]}},{"type":"Feature","properties":{"id":19424,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6191935018189553,44.803440280460485]}},{"type":"Feature","properties":{"id":15989,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6155228591083164,44.798835583950826]}},{"type":"Feature","properties":{"id":17010,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6130188090616121,44.79948701121046]}},{"type":"Feature","properties":{"id":17197,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6208364325521509,44.811430275159225]}},{"type":"Feature","properties":{"id":16937,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6217658448298949,44.81397031605175]}},{"type":"Feature","properties":{"id":17208,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6086453402267731,44.796098491349674]}},{"type":"Feature","properties":{"id":17209,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6085877055614487,44.79609131192823]}},{"type":"Feature","properties":{"id":15937,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6243497290246917,44.79999677088432]}},{"type":"Feature","properties":{"id":16166,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6243970870013743,44.80008390397228]}},{"type":"Feature","properties":{"id":19917,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5978580732608683,44.79681376542394]}},{"type":"Feature","properties":{"id":19954,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5828735045100534,44.80483162648224]}},{"type":"Feature","properties":{"id":19955,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5824016378533508,44.8046561473278]}},{"type":"Feature","properties":{"id":16182,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6182176013896765,44.80773911700815]}},{"type":"Feature","properties":{"id":16021,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6170217073769195,44.807881198466156]}},{"type":"Feature","properties":{"id":16016,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6081571627327063,44.80861901020956]}},{"type":"Feature","properties":{"id":15929,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6308126080649018,44.79835630695447]}},{"type":"Feature","properties":{"id":15930,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6270247250366625,44.79947566576465]}},{"type":"Feature","properties":{"id":15938,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6232012006720995,44.8003703697135]}},{"type":"Feature","properties":{"id":15939,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6221299012503636,44.80037440640367]}},{"type":"Feature","properties":{"id":15940,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.621319849440657,44.80036588083269]}},{"type":"Feature","properties":{"id":16389,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6226363449300576,44.80618073546984]}},{"type":"Feature","properties":{"id":16309,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6307163518160297,44.8053924150303]}},{"type":"Feature","properties":{"id":16405,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6309416133724075,44.80606804888352]}},{"type":"Feature","properties":{"id":16424,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6124134883332674,44.8052897517341]}},{"type":"Feature","properties":{"id":16425,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.614133694372727,44.80488918499556]}},{"type":"Feature","properties":{"id":16427,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6303966248624713,44.809837360339436]}},{"type":"Feature","properties":{"id":23170,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.591273267525887,44.81043447493098]}},{"type":"Feature","properties":{"id":24225,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5911550088205666,44.81066296284028]}},{"type":"Feature","properties":{"id":30129,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5906903391271844,44.81254016451701]}},{"type":"Feature","properties":{"id":19873,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.590587153787817,44.81261458620894]}},{"type":"Feature","properties":{"id":19781,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5941101284050473,44.803090834537365]}},{"type":"Feature","properties":{"id":19587,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.594810758112071,44.80352351693588]}},{"type":"Feature","properties":{"id":16165,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6286027052433694,44.800164557580324]}},{"type":"Feature","properties":{"id":16004,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6297668851998197,44.80069322459682]}},{"type":"Feature","properties":{"id":16384,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6283827483430332,44.801882537913045]}},{"type":"Feature","properties":{"id":16340,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.628473035099161,44.801135835085994]}},{"type":"Feature","properties":{"id":16091,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6321758318754092,44.79734121927321]}},{"type":"Feature","properties":{"id":16133,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6322105865270966,44.79718597537696]}},{"type":"Feature","properties":{"id":16260,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6180778051564332,44.81154192413539]}},{"type":"Feature","properties":{"id":16018,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6193323930943462,44.811126185161505]}},{"type":"Feature","properties":{"id":16555,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6198349122372658,44.81088219392614]}},{"type":"Feature","properties":{"id":15981,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6060638161924718,44.79663106410612]}},{"type":"Feature","properties":{"id":15982,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6062731049713567,44.796886388278814]}},{"type":"Feature","properties":{"id":15987,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6159351826868764,44.79963016129116]}},{"type":"Feature","properties":{"id":28916,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6226144229930793,44.807611869660086]}},{"type":"Feature","properties":{"id":16224,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6207757593926647,44.80773671572647]}},{"type":"Feature","properties":{"id":19729,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5958868153279412,44.801686235444606]}},{"type":"Feature","properties":{"id":17023,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6309737197054233,44.80456056167586]}},{"type":"Feature","properties":{"id":17229,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6307358512522636,44.8037873977151]}},{"type":"Feature","properties":{"id":16228,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6137095978648442,44.80830933152997]}},{"type":"Feature","properties":{"id":16605,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6127699290240495,44.80610926622104]}},{"type":"Feature","properties":{"id":15879,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6143089022443278,44.795925838115174]}},{"type":"Feature","properties":{"id":31144,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6322953326742453,44.807865072908555]}},{"type":"Feature","properties":{"id":16190,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6299514419578577,44.8049585728237]}},{"type":"Feature","properties":{"id":16268,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6270343374935502,44.80807700681343]}},{"type":"Feature","properties":{"id":16953,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6262970044470864,44.80771351675207]}},{"type":"Feature","properties":{"id":16671,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6281220146836525,44.80859624319518]}},{"type":"Feature","properties":{"id":15841,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6270386649190198,44.803331257509726]}},{"type":"Feature","properties":{"id":15843,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6269081382588043,44.80248142592167]}},{"type":"Feature","properties":{"id":31837,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6195687979613381,44.7969955702812]}},{"type":"Feature","properties":{"id":15955,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6204169498377229,44.79735773276919]}},{"type":"Feature","properties":{"id":17008,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6134612050310447,44.800307666080954]}},{"type":"Feature","properties":{"id":16342,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6207756796871756,44.802417021304976]}},{"type":"Feature","properties":{"id":17282,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6092841275076156,44.80081351866447]}},{"type":"Feature","properties":{"id":22908,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6088896288733325,44.80081369619789]}},{"type":"Feature","properties":{"id":16926,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6137206908151805,44.804021385254835]}},{"type":"Feature","properties":{"id":15883,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6195693809825837,44.79434475553062]}},{"type":"Feature","properties":{"id":15875,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6196800405722029,44.7945013115898]}},{"type":"Feature","properties":{"id":16872,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6177762813257962,44.80365923002183]}},{"type":"Feature","properties":{"id":17060,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6293204244529603,44.79411999485734]}},{"type":"Feature","properties":{"id":23345,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6300986751286143,44.79421550612817]}},{"type":"Feature","properties":{"id":20162,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.602782077306796,44.79565498770984]}},{"type":"Feature","properties":{"id":25687,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5924110577336282,44.796670224070986]}},{"type":"Feature","properties":{"id":17642,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6062007210507739,44.797310901675424]}},{"type":"Feature","properties":{"id":19990,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5885653989972357,44.80106764762856]}},{"type":"Feature","properties":{"id":19991,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5877041787751051,44.80096663185932]}},{"type":"Feature","properties":{"id":20001,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5895090725482314,44.800385584844534]}},{"type":"Feature","properties":{"id":20002,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.58992678783263,44.799169445830465]}},{"type":"Feature","properties":{"id":20530,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5977172695857862,44.80742792452227]}},{"type":"Feature","properties":{"id":20532,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5988915706544438,44.807154774322285]}},{"type":"Feature","properties":{"id":20534,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5986420259585337,44.80668658521703]}},{"type":"Feature","properties":{"id":20535,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5988426315947495,44.807068947301644]}},{"type":"Feature","properties":{"id":20140,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.591431092111132,44.809155283153466]}},{"type":"Feature","properties":{"id":23331,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6000262959420235,44.806251188302866]}},{"type":"Feature","properties":{"id":57743,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5989344322699931,44.8066063743094]}},{"type":"Feature","properties":{"id":20348,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5943365232877257,44.806354562138054]}},{"type":"Feature","properties":{"id":19892,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5953226814922169,44.806134221973636]}},{"type":"Feature","properties":{"id":23042,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6316085245585873,44.80376674305387]}},{"type":"Feature","properties":{"id":17520,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6219974203338794,44.807096603254664]}},{"type":"Feature","properties":{"id":17554,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6065960838034486,44.79514268204756]}},{"type":"Feature","properties":{"id":20430,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5898589085239744,44.79578531672493]}},{"type":"Feature","properties":{"id":26551,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6302761572107939,44.79421524538567]}},{"type":"Feature","properties":{"id":26550,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6304296964116521,44.79432096689277]}},{"type":"Feature","properties":{"id":28691,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6318972150442006,44.80522787563589]}},{"type":"Feature","properties":{"id":28692,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.631700007696165,44.80477699651276]}},{"type":"Feature","properties":{"id":20292,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5848152581641884,44.80002097670167]}},{"type":"Feature","properties":{"id":20109,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5848152076639289,44.79984721067967]}},{"type":"Feature","properties":{"id":16433,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6320923791784995,44.81123934229949]}},{"type":"Feature","properties":{"id":26644,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6318710706919177,44.81019945317003]}},{"type":"Feature","properties":{"id":19842,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.582926096946988,44.80891678917791]}},{"type":"Feature","properties":{"id":20469,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5813256223797156,44.808544619005495]}},{"type":"Feature","properties":{"id":22367,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5891628548496484,44.80378890572265]}},{"type":"Feature","properties":{"id":22369,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5896731806453948,44.803293474578275]}},{"type":"Feature","properties":{"id":19918,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5977397996493297,44.7969742505215]}},{"type":"Feature","properties":{"id":20506,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.598340238553185,44.79720919580894]}},{"type":"Feature","properties":{"id":20375,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5922619312697354,44.79666268358289]}},{"type":"Feature","properties":{"id":17561,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.609292376100524,44.79406793627747]}},{"type":"Feature","properties":{"id":17562,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6096161550702309,44.794183685429104]}},{"type":"Feature","properties":{"id":20410,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6027296980286029,44.80673175962899]}},{"type":"Feature","properties":{"id":20411,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6015473838064842,44.807046746653825]}},{"type":"Feature","properties":{"id":20450,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.582654089070662,44.80271207266947]}},{"type":"Feature","properties":{"id":20453,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5831183975565108,44.802133084830125]}},{"type":"Feature","properties":{"id":20060,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5816756531470041,44.795922453916624]}},{"type":"Feature","properties":{"id":20071,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5873405205806616,44.81311328679103]}},{"type":"Feature","properties":{"id":20481,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5879740703110379,44.80459364035909]}},{"type":"Feature","properties":{"id":20213,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5873478577180511,44.80444115657791]}},{"type":"Feature","properties":{"id":19689,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5851495033491008,44.80153219107884]}},{"type":"Feature","properties":{"id":19598,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5850959289495298,44.808524217323345]}},{"type":"Feature","properties":{"id":20287,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5864864687442536,44.80581270157772]}},{"type":"Feature","properties":{"id":19583,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.584141209074514,44.795217084931785]}},{"type":"Feature","properties":{"id":19584,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5846472686524727,44.79564658849234]}},{"type":"Feature","properties":{"id":26871,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6042882382750667,44.79684094366318]}},{"type":"Feature","properties":{"id":16628,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6201737519763828,44.80505418675388]}},{"type":"Feature","properties":{"id":16629,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6207580646347948,44.80506171139595]}},{"type":"Feature","properties":{"id":20102,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5825067803575857,44.808361672208974]}},{"type":"Feature","properties":{"id":19952,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5841858371471785,44.80558750187525]}},{"type":"Feature","properties":{"id":19670,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5856717428526199,44.79693579087962]}},{"type":"Feature","properties":{"id":20119,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5861018004954792,44.81086318887048]}},{"type":"Feature","properties":{"id":20120,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.586101036755573,44.81007391743919]}},{"type":"Feature","properties":{"id":19671,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5848285086423236,44.796809595995924]}},{"type":"Feature","properties":{"id":19681,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5844384020875807,44.80730298439016]}},{"type":"Feature","properties":{"id":19551,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5807320014946282,44.79863200587201]}},{"type":"Feature","properties":{"id":19688,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5810459800769706,44.79835836100999]}},{"type":"Feature","properties":{"id":19692,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.583779240354156,44.80225909656631]}},{"type":"Feature","properties":{"id":19697,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.583594741220704,44.799262579054854]}},{"type":"Feature","properties":{"id":19698,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5838850510735177,44.79855745999362]}},{"type":"Feature","properties":{"id":19588,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5971281849445176,44.80254005614149]}},{"type":"Feature","properties":{"id":19734,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5942055605025433,44.79804610025062]}},{"type":"Feature","properties":{"id":19586,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5927545423625904,44.80435463593653]}},{"type":"Feature","properties":{"id":19963,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6030959881292656,44.796167611720165]}},{"type":"Feature","properties":{"id":17056,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6034283903360506,44.79591529769285]}},{"type":"Feature","properties":{"id":24224,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5910571820878934,44.810593805537806]}},{"type":"Feature","properties":{"id":27462,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6021125593266066,44.796799076337216]}},{"type":"Feature","properties":{"id":20149,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6022145735222436,44.796866559883405]}},{"type":"Feature","properties":{"id":29095,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5965714569927393,44.80037406839496]}},{"type":"Feature","properties":{"id":29094,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.59644967915179,44.800320356824194]}},{"type":"Feature","properties":{"id":16537,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6222925693597104,44.810466415289795]}},{"type":"Feature","properties":{"id":16583,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6232630403559571,44.81263813827225]}},{"type":"Feature","properties":{"id":30942,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6101889075141375,44.80350458555031]}},{"type":"Feature","properties":{"id":29758,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6106006068118239,44.804776729961674]}},{"type":"Feature","properties":{"id":25389,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5893995354674162,44.81164017740682]}},{"type":"Feature","properties":{"id":30059,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5894712877183582,44.81174583129971]}},{"type":"Feature","properties":{"id":23329,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.600171475528634,44.80630856983659]}},{"type":"Feature","properties":{"id":23317,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6003712714452328,44.80628008541878]}},{"type":"Feature","properties":{"id":25438,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.599956256747319,44.80612656908074]}},{"type":"Feature","properties":{"id":26731,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6007358852897697,44.80735466712789]}},{"type":"Feature","properties":{"id":19999,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5880356658461944,44.80012688090375]}},{"type":"Feature","properties":{"id":20170,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5888327396472829,44.80026468961341]}},{"type":"Feature","properties":{"id":20407,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6029063912671518,44.80705235166629]}},{"type":"Feature","properties":{"id":25046,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.604111969837402,44.79685463755314]}},{"type":"Feature","properties":{"id":19843,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5830314995900483,44.808371088178305]}},{"type":"Feature","properties":{"id":19845,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5946333376497162,44.81235014458704]}},{"type":"Feature","properties":{"id":20314,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5878989934571109,44.80870572007875]}},{"type":"Feature","properties":{"id":20313,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5878411980233785,44.808960402602814]}},{"type":"Feature","properties":{"id":19601,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5877737931600661,44.80881470450807]}},{"type":"Feature","properties":{"id":20209,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5893277101316055,44.80291684525887]}},{"type":"Feature","properties":{"id":16885,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6307440648849332,44.806857015563125]}},{"type":"Feature","properties":{"id":16390,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6225024468729391,44.80605356820456]}},{"type":"Feature","properties":{"id":16345,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6211277020072631,44.80020345272752]}},{"type":"Feature","properties":{"id":16185,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6164543226763436,44.803260855030295]}},{"type":"Feature","properties":{"id":27888,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6324539626388954,44.80672359754805]}},{"type":"Feature","properties":{"id":24466,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6155333858256525,44.793975887879235]}},{"type":"Feature","properties":{"id":24467,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6154612586161684,44.79419555204469]}},{"type":"Feature","properties":{"id":16523,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6197420186573377,44.79791674542534]}},{"type":"Feature","properties":{"id":16524,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6193705422846755,44.79893633192673]}},{"type":"Feature","properties":{"id":16532,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6103603574437853,44.80497740406887]}},{"type":"Feature","properties":{"id":16533,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6234178340187196,44.79431128839112]}},{"type":"Feature","properties":{"id":24049,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6234472882692765,44.79421630251364]}},{"type":"Feature","properties":{"id":16542,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6293560511976012,44.809064046406846]}},{"type":"Feature","properties":{"id":30479,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.629420588809221,44.80898163238363]}},{"type":"Feature","properties":{"id":19863,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5814665934575787,44.80293981469017]}},{"type":"Feature","properties":{"id":24949,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5831112470882293,44.81130090973327]}},{"type":"Feature","properties":{"id":16404,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6308082702318089,44.805101932908464]}},{"type":"Feature","properties":{"id":36295,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6310054379205055,44.80505005617093]}},{"type":"Feature","properties":{"id":16527,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.615303508186988,44.80257281271715]}},{"type":"Feature","properties":{"id":16528,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6147625339756065,44.80263045494609]}},{"type":"Feature","properties":{"id":16511,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6147790223180165,44.802748120007365]}},{"type":"Feature","properties":{"id":16500,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6213182259154546,44.79683321692945]}},{"type":"Feature","properties":{"id":16499,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6231775707522589,44.79442983674528]}},{"type":"Feature","properties":{"id":16672,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6286706524024379,44.80836209049072]}},{"type":"Feature","properties":{"id":16673,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6293441143335687,44.80814088793653]}},{"type":"Feature","properties":{"id":16419,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6071178372245689,44.805933187131934]}},{"type":"Feature","properties":{"id":16677,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6075186009733935,44.80418854536408]}},{"type":"Feature","properties":{"id":36338,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5884052365925718,44.809442744302494]}},{"type":"Feature","properties":{"id":20125,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5933858786547904,44.799536648197865]}},{"type":"Feature","properties":{"id":16750,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6297406522332688,44.805356804530206]}},{"type":"Feature","properties":{"id":15809,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6298412361821026,44.80565600613529]}},{"type":"Feature","properties":{"id":35012,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6330096504694444,44.80516829540005]}},{"type":"Feature","properties":{"id":16714,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.63286743820531,44.80497780590039]}},{"type":"Feature","properties":{"id":20385,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5921218055751118,44.80346029306825]}},{"type":"Feature","properties":{"id":20386,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5915990886301392,44.803357521495506]}},{"type":"Feature","properties":{"id":19993,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.58600702822517,44.8007377500221]}},{"type":"Feature","properties":{"id":25408,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6007471674791848,44.80446221351912]}},{"type":"Feature","properties":{"id":16535,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6202000052487621,44.81094462359676]}},{"type":"Feature","properties":{"id":54610,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.619935245200211,44.810926762624696]}},{"type":"Feature","properties":{"id":48659,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5826367980250649,44.798750738834926]}},{"type":"Feature","properties":{"id":30633,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5811058814962979,44.797695276271334]}},{"type":"Feature","properties":{"id":49410,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5896127506596973,44.80994108199276]}},{"type":"Feature","properties":{"id":20159,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5885014872928597,44.809885072212275]}},{"type":"Feature","properties":{"id":614,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5920620861449233,44.809101217559316]}},{"type":"Feature","properties":{"id":13307,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5884433216987119,44.8093329041959]}},{"type":"Feature","properties":{"id":28940,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5943043354637455,44.81037197922775]}},{"type":"Feature","properties":{"id":16882,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6308228069958516,44.80703232765483]}},{"type":"Feature","properties":{"id":16607,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6120315589483181,44.804418707609955]}},{"type":"Feature","properties":{"id":16757,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6091390095554492,44.80751947833871]}},{"type":"Feature","properties":{"id":16758,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6084853871706092,44.80752697399567]}},{"type":"Feature","properties":{"id":17057,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6039887601312252,44.7954786555727]}},{"type":"Feature","properties":{"id":5936,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6052587178431771,44.79311156322309]}},{"type":"Feature","properties":{"id":16341,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6248167158546375,44.80108108882604]}},{"type":"Feature","properties":{"id":16773,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6230278625711209,44.79802290803133]}},{"type":"Feature","properties":{"id":16501,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6212388052444724,44.79702510154128]}},{"type":"Feature","properties":{"id":16040,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6248421499497538,44.80544780398771]}},{"type":"Feature","properties":{"id":19945,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.593193462358844,44.79621797596893]}},{"type":"Feature","properties":{"id":19951,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5849876235953666,44.80613983686355]}},{"type":"Feature","properties":{"id":16211,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6150382268229753,44.793035756445974]}},{"type":"Feature","properties":{"id":30956,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6183521141724402,44.80048385125475]}},{"type":"Feature","properties":{"id":27894,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6309912993060639,44.81066543778118]}},{"type":"Feature","properties":{"id":27893,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6301628211966482,44.811140317985114]}},{"type":"Feature","properties":{"id":16403,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6309416636166261,44.80546791955571]}},{"type":"Feature","properties":{"id":16421,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6056844644651586,44.806002687415926]}},{"type":"Feature","properties":{"id":23488,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6300299939272938,44.80975663521422]}},{"type":"Feature","properties":{"id":16039,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6259480769330436,44.805108556981914]}},{"type":"Feature","properties":{"id":15842,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6283159846498326,44.80246624911388]}},{"type":"Feature","properties":{"id":16462,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6303581801530276,44.807816474705625]}},{"type":"Feature","properties":{"id":16939,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6238502063826362,44.812110102232744]}},{"type":"Feature","properties":{"id":16869,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6246231752046867,44.811427684732095]}},{"type":"Feature","properties":{"id":16952,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6261384776787635,44.80778442185393]}},{"type":"Feature","properties":{"id":16949,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6149636158821615,44.81253617954805]}},{"type":"Feature","properties":{"id":16950,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6162453655944039,44.812137179078924]}},{"type":"Feature","properties":{"id":15977,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6061403033668107,44.796389468898305]}},{"type":"Feature","properties":{"id":15978,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6059079132524073,44.79656781491607]}},{"type":"Feature","properties":{"id":31834,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6148726813755127,44.797617157607036]}},{"type":"Feature","properties":{"id":30018,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6100281494112885,44.805710327171916]}},{"type":"Feature","properties":{"id":17036,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6077160928261833,44.809473202346354]}},{"type":"Feature","properties":{"id":30757,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6317138802751466,44.803460696747564]}},{"type":"Feature","properties":{"id":30758,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6314303730376181,44.80188679333691]}},{"type":"Feature","properties":{"id":25034,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6125672769128109,44.7940197076383]}},{"type":"Feature","properties":{"id":16014,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6119745595212183,44.79445778236543]}},{"type":"Feature","properties":{"id":16129,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.627149054686297,44.80405002871358]}},{"type":"Feature","properties":{"id":16255,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6257521823861885,44.80431219554282]}},{"type":"Feature","properties":{"id":16252,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6268196929754306,44.80186600150498]}},{"type":"Feature","properties":{"id":17372,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6304017045255174,44.79375586260076]}},{"type":"Feature","properties":{"id":17369,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.627080073458247,44.79361836120969]}},{"type":"Feature","properties":{"id":25437,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.627836075908068,44.793587669035915]}},{"type":"Feature","properties":{"id":26807,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6268444155250309,44.79226335915188]}},{"type":"Feature","properties":{"id":17749,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6095588933797128,44.80069147420939]}},{"type":"Feature","properties":{"id":31586,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6061904248093064,44.80935934252739]}},{"type":"Feature","properties":{"id":16436,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6067367308739857,44.809327157783876]}},{"type":"Feature","properties":{"id":16504,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6199814020393726,44.797727427460025]}},{"type":"Feature","properties":{"id":16347,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6214167578327167,44.79826691178667]}},{"type":"Feature","properties":{"id":25908,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6278565756756521,44.794040137058424]}},{"type":"Feature","properties":{"id":16590,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6334931477747833,44.807382520972965]}},{"type":"Feature","properties":{"id":17039,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6247758361554655,44.81422144580021]}},{"type":"Feature","properties":{"id":19989,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5892428261966974,44.801140946932136]}},{"type":"Feature","properties":{"id":20522,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6033760385970242,44.80532050067225]}},{"type":"Feature","properties":{"id":20520,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6021666254435213,44.80564680328958]}},{"type":"Feature","properties":{"id":30378,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6022917175528385,44.80588894695939]}},{"type":"Feature","properties":{"id":20401,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5996080759009443,44.806864276637434]}},{"type":"Feature","properties":{"id":57744,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5980661419872498,44.80799106177666]}},{"type":"Feature","properties":{"id":34169,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.587796914409828,44.79791488591274]}},{"type":"Feature","properties":{"id":19576,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5877750460731076,44.79799448753065]}},{"type":"Feature","properties":{"id":19554,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5808042810274717,44.79918463227966]}},{"type":"Feature","properties":{"id":20161,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6025536281227533,44.79596940673287]}},{"type":"Feature","properties":{"id":23330,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6029775749561365,44.79611911546831]}},{"type":"Feature","properties":{"id":20073,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5862677591195563,44.81279020825787]}},{"type":"Feature","properties":{"id":20116,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5861854658165723,44.812315730242524]}},{"type":"Feature","properties":{"id":20124,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5839187422932206,44.800933203016335]}},{"type":"Feature","properties":{"id":29726,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6210431820372987,44.807195449262856]}},{"type":"Feature","properties":{"id":17517,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6206160801426124,44.80701978018523]}},{"type":"Feature","properties":{"id":17555,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6075399926453159,44.79530020462924]}},{"type":"Feature","properties":{"id":24953,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.583498074377168,44.81186020148482]}},{"type":"Feature","properties":{"id":24954,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5833320972450592,44.81171859716562]}},{"type":"Feature","properties":{"id":20418,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5936575716898786,44.80631475967341]}},{"type":"Feature","properties":{"id":23612,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5809334049683368,44.79758882598663]}},{"type":"Feature","properties":{"id":30632,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5809358583233416,44.7977036927822]}},{"type":"Feature","properties":{"id":20254,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.585610866426628,44.80766229960811]}},{"type":"Feature","properties":{"id":19944,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5948658704777255,44.79626871633933]}},{"type":"Feature","properties":{"id":21898,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5926451115140102,44.79696865908753]}},{"type":"Feature","properties":{"id":20510,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5924878194613906,44.79667374462788]}},{"type":"Feature","properties":{"id":20412,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.601584876390149,44.80579773715195]}},{"type":"Feature","properties":{"id":20249,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5846706106451018,44.799865821105186]}},{"type":"Feature","properties":{"id":19618,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5897684222230885,44.79628065133203]}},{"type":"Feature","properties":{"id":19619,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5884126126163992,44.79620020875445]}},{"type":"Feature","properties":{"id":20053,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5944407225173641,44.81033496976032]}},{"type":"Feature","properties":{"id":21900,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5984941854509571,44.79876959648253]}},{"type":"Feature","properties":{"id":20186,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5995584697456817,44.797928416799316]}},{"type":"Feature","properties":{"id":20513,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5959392521576963,44.79447186994839]}},{"type":"Feature","properties":{"id":25700,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5941555003119894,44.79425369005078]}},{"type":"Feature","properties":{"id":20033,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5956951221808845,44.80408803249884]}},{"type":"Feature","properties":{"id":19749,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5822565001424345,44.79625673810243]}},{"type":"Feature","properties":{"id":16630,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6209765883858974,44.80501529813661]}},{"type":"Feature","properties":{"id":16631,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6202864288590101,44.80518005017042]}},{"type":"Feature","properties":{"id":19893,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5951509690186139,44.80529017486023]}},{"type":"Feature","properties":{"id":20096,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5862735772825147,44.79490789896886]}},{"type":"Feature","properties":{"id":22360,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5842133684977429,44.80200895198547]}},{"type":"Feature","properties":{"id":19693,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5829773948842143,44.80285700859803]}},{"type":"Feature","properties":{"id":25686,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5923505719694316,44.79740711467132]}},{"type":"Feature","properties":{"id":19733,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5921843731680444,44.79734083928537]}},{"type":"Feature","properties":{"id":20145,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5938418315239782,44.80177681685403]}},{"type":"Feature","properties":{"id":20141,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5914934469368046,44.80787730359128]}},{"type":"Feature","properties":{"id":59021,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.591766336803742,44.8068580488834]}},{"type":"Feature","properties":{"id":29089,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5965703030351481,44.8006820962064]}},{"type":"Feature","properties":{"id":23328,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6039085937317981,44.795420660585705]}},{"type":"Feature","properties":{"id":30496,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5903439306842265,44.811647667559505]}},{"type":"Feature","properties":{"id":30495,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5902507396256396,44.81214867142865]}},{"type":"Feature","properties":{"id":30616,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6294033291781501,44.80882408599701]}},{"type":"Feature","properties":{"id":31147,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6290654939923932,44.808286074605]}},{"type":"Feature","properties":{"id":16591,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6336468350273577,44.807851273265534]}},{"type":"Feature","properties":{"id":27887,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6321219936157869,44.80681716620748]}},{"type":"Feature","properties":{"id":27555,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6053857356036779,44.80792308022486]}},{"type":"Feature","properties":{"id":23133,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6004552821986776,44.80621508908806]}},{"type":"Feature","properties":{"id":27599,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6001917895831032,44.80508794082779]}},{"type":"Feature","properties":{"id":49830,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6001113002571422,44.80457918076215]}},{"type":"Feature","properties":{"id":19747,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6005709443936075,44.81246494703294]}},{"type":"Feature","properties":{"id":20232,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6001605108446603,44.810093998251546]}},{"type":"Feature","properties":{"id":20396,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6033032501363998,44.80586050945838]}},{"type":"Feature","properties":{"id":20397,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6024013038858907,44.80610770975058]}},{"type":"Feature","properties":{"id":19847,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5972536510442011,44.81180591126048]}},{"type":"Feature","properties":{"id":28643,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5941901639134951,44.81028631546872]}},{"type":"Feature","properties":{"id":29243,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5886892546935539,44.80732974323805]}},{"type":"Feature","properties":{"id":20312,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5876967809948078,44.80906765093253]}},{"type":"Feature","properties":{"id":16601,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6324972230262332,44.80443615401674]}},{"type":"Feature","properties":{"id":19759,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5839721605433712,44.79625664083094]}},{"type":"Feature","properties":{"id":20215,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5867244760266841,44.8043076775135]}},{"type":"Feature","properties":{"id":24952,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5836397916982583,44.81212859390735]}},{"type":"Feature","properties":{"id":17285,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6145145899145501,44.80572097974112]}},{"type":"Feature","properties":{"id":15887,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6144286227959143,44.79572258881573]}},{"type":"Feature","properties":{"id":16518,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6229576027525034,44.794378110453]}},{"type":"Feature","properties":{"id":16519,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6212349465970253,44.796764252395086]}},{"type":"Feature","properties":{"id":16526,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6170348711673813,44.80045800961697]}},{"type":"Feature","properties":{"id":16531,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6108199774483072,44.80481444701006]}},{"type":"Feature","properties":{"id":16536,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6205284245130067,44.81087246378458]}},{"type":"Feature","properties":{"id":16547,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6337864428814863,44.80910835023672]}},{"type":"Feature","properties":{"id":22873,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6004152790420273,44.805991960079176]}},{"type":"Feature","properties":{"id":23255,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6006221089494935,44.80453445507072]}},{"type":"Feature","properties":{"id":19550,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.58038085195626,44.79839272485266]}},{"type":"Feature","properties":{"id":19895,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5912520546581699,44.81011634475008]}},{"type":"Feature","properties":{"id":19896,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5898639664009762,44.81006134052601]}},{"type":"Feature","properties":{"id":21901,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5969918950318113,44.798133216314305]}},{"type":"Feature","properties":{"id":19934,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5832376806298483,44.810574383277476]}},{"type":"Feature","properties":{"id":16600,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6054086379978214,44.795921806801715]}},{"type":"Feature","properties":{"id":16514,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6109243507247113,44.804921214813355]}},{"type":"Feature","properties":{"id":16513,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6117154585853717,44.80410741972833]}},{"type":"Feature","properties":{"id":19898,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5896315190587665,44.81053710171911]}},{"type":"Feature","properties":{"id":27598,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6004523068258636,44.8045365874173]}},{"type":"Feature","properties":{"id":35011,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6323132574139818,44.80535818369297]}},{"type":"Feature","properties":{"id":20269,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5928693700846391,44.799062920016524]}},{"type":"Feature","properties":{"id":25685,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5917724060901783,44.798699046797225]}},{"type":"Feature","properties":{"id":42110,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5901752386690532,44.80668821935534]}},{"type":"Feature","properties":{"id":38610,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.594965116161893,44.80104390037088]}},{"type":"Feature","properties":{"id":38858,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5937829356824031,44.80173931199198]}},{"type":"Feature","properties":{"id":20043,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5884806678820967,44.80460857465829]}},{"type":"Feature","properties":{"id":20479,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5878582517449966,44.804853216293985]}},{"type":"Feature","properties":{"id":20441,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5861338372861663,44.80013822103367]}},{"type":"Feature","properties":{"id":20439,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.586027412261367,44.80060982177523]}},{"type":"Feature","properties":{"id":20440,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5854018225157706,44.80007392124822]}},{"type":"Feature","properties":{"id":54607,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6271222134196999,44.80622321408799]}},{"type":"Feature","properties":{"id":54611,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6199400407258951,44.810830217920476]}},{"type":"Feature","properties":{"id":16951,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6257873812750893,44.80795235979245]}},{"type":"Feature","properties":{"id":29245,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5886221785661602,44.80724420989426]}},{"type":"Feature","properties":{"id":29246,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5889215836520356,44.807171255589246]}},{"type":"Feature","properties":{"id":53582,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6009433766419726,44.80649702704205]}},{"type":"Feature","properties":{"id":20398,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6018331508031505,44.80626163727018]}},{"type":"Feature","properties":{"id":53584,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6005427197009086,44.80666105414587]}},{"type":"Feature","properties":{"id":53583,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.600500201452968,44.806578093243665]}},{"type":"Feature","properties":{"id":49829,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6045282040629822,44.8057139575337]}},{"type":"Feature","properties":{"id":20405,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6038053565986792,44.806815962071745]}},{"type":"Feature","properties":{"id":48658,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5827289793055835,44.798831340566984]}},{"type":"Feature","properties":{"id":48661,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5827337220341308,44.79874885656027]}},{"type":"Feature","properties":{"id":48660,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5826554480804653,44.79883708007676]}},{"type":"Feature","properties":{"id":20536,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5952249709914197,44.80781373927588]}},{"type":"Feature","properties":{"id":628,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5949446075557351,44.80787746060429]}},{"type":"Feature","properties":{"id":20350,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6002739308007025,44.805937160069774]}},{"type":"Feature","properties":{"id":20063,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5818017654633052,44.79409946398881]}},{"type":"Feature","properties":{"id":27233,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6240391870529518,44.79383701591695]}},{"type":"Feature","properties":{"id":27232,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6243538295028445,44.79372240086953]}},{"type":"Feature","properties":{"id":27234,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.623379009221982,44.79408605511891]}},{"type":"Feature","properties":{"id":16752,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6196697256676994,44.79906661944379]}},{"type":"Feature","properties":{"id":28441,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6194581803946418,44.80085421141209]}},{"type":"Feature","properties":{"id":16753,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6062086005106154,44.804538531610724]}},{"type":"Feature","properties":{"id":15874,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6214998958983052,44.794007185475536]}},{"type":"Feature","properties":{"id":27481,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6207090517644245,44.796434535973084]}},{"type":"Feature","properties":{"id":30057,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5894924222691592,44.81158734105841]}},{"type":"Feature","properties":{"id":16017,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6080748822995544,44.807963565585]}},{"type":"Feature","properties":{"id":30100,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6077251719231692,44.80789565556416]}},{"type":"Feature","properties":{"id":27482,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6208367372807657,44.79666666959483]}},{"type":"Feature","properties":{"id":16521,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6209334497793274,44.79682060587063]}},{"type":"Feature","properties":{"id":16922,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6197940289716289,44.804594956016665]}},{"type":"Feature","properties":{"id":27339,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6206653246477516,44.804606589408365]}},{"type":"Feature","properties":{"id":25672,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6093296767989641,44.79621991546355]}},{"type":"Feature","properties":{"id":16269,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6282005990874134,44.807691547607696]}},{"type":"Feature","properties":{"id":15824,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6284258411300346,44.80741807490818]}},{"type":"Feature","properties":{"id":29865,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6251557220834865,44.79835525067678]}},{"type":"Feature","properties":{"id":31583,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6054698997467376,44.808677917346344]}},{"type":"Feature","properties":{"id":20163,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6003365168343558,44.808270294930296]}},{"type":"Feature","properties":{"id":16226,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.615993843363658,44.808079542423435]}},{"type":"Feature","properties":{"id":16227,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6156386765922829,44.808168934866266]}},{"type":"Feature","properties":{"id":28915,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6233650667962933,44.80716889130704]}},{"type":"Feature","properties":{"id":28442,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6184777365899734,44.80079802889875]}},{"type":"Feature","properties":{"id":16020,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6177472367798235,44.8092290114272]}},{"type":"Feature","properties":{"id":16225,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6186893706113094,44.80773942310523]}},{"type":"Feature","properties":{"id":16434,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6334066349679124,44.81109917839348]}},{"type":"Feature","properties":{"id":25319,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6309738476311294,44.807133985290996]}},{"type":"Feature","properties":{"id":16503,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6204684765805153,44.7973743793357]}},{"type":"Feature","properties":{"id":30132,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5908003747528613,44.81253101600426]}},{"type":"Feature","properties":{"id":22796,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6275920194000862,44.80652960157727]}},{"type":"Feature","properties":{"id":15823,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.628077623263275,44.80687588042583]}},{"type":"Feature","properties":{"id":16377,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6256155342448166,44.80460184989887]}},{"type":"Feature","properties":{"id":57284,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6256792607284879,44.804690975514546]}},{"type":"Feature","properties":{"id":16666,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6174973955855689,44.811732712827244]}},{"type":"Feature","properties":{"id":16003,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6311618754544944,44.800779946141475]}},{"type":"Feature","properties":{"id":19793,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.581043175686349,44.80386170890745]}},{"type":"Feature","properties":{"id":19794,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5801867371211297,44.8038034536805]}},{"type":"Feature","properties":{"id":19814,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5858764711911255,44.80673826182572]}},{"type":"Feature","properties":{"id":19813,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5860118123630705,44.80683708913506]}},{"type":"Feature","properties":{"id":16038,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6273931098724322,44.80459851259172]}},{"type":"Feature","properties":{"id":17230,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6313345077378727,44.801901565174525]}},{"type":"Feature","properties":{"id":16606,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6125250585888145,44.8055516828129]}},{"type":"Feature","properties":{"id":15830,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6288499444519569,44.80393154326636]}},{"type":"Feature","properties":{"id":15876,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6184503784224944,44.79483267624182]}},{"type":"Feature","properties":{"id":17170,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6311166921227062,44.80050654248247]}},{"type":"Feature","properties":{"id":17040,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6278458495754775,44.813336609117634]}},{"type":"Feature","properties":{"id":17140,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6167264185774021,44.812885880405375]}},{"type":"Feature","properties":{"id":17283,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6067595134788911,44.80015574212107]}},{"type":"Feature","properties":{"id":25611,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6061927458767559,44.79975627139223]}},{"type":"Feature","properties":{"id":16489,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6235468187345438,44.80153305782432]}},{"type":"Feature","properties":{"id":16346,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6213004097149313,44.79914595828795]}},{"type":"Feature","properties":{"id":16722,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6270886859262708,44.794153454899394]}},{"type":"Feature","properties":{"id":26548,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6293356239872048,44.7942267997652]}},{"type":"Feature","properties":{"id":25689,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5919747227009714,44.793750392727745]}},{"type":"Feature","properties":{"id":19998,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5871427200275997,44.802502850829214]}},{"type":"Feature","properties":{"id":19997,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5866414389109001,44.80354045736144]}},{"type":"Feature","properties":{"id":29935,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5912555154959257,44.80751520978357]}},{"type":"Feature","properties":{"id":29248,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5889127340169472,44.807307558385496]}},{"type":"Feature","properties":{"id":20544,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5921067490056824,44.81264047826045]}},{"type":"Feature","properties":{"id":17556,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6082477944066069,44.79542278223798]}},{"type":"Feature","properties":{"id":17557,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6083034349545852,44.79554163781109]}},{"type":"Feature","properties":{"id":24956,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5831128403084147,44.81142832487604]}},{"type":"Feature","properties":{"id":24955,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5831192966936468,44.81155864960264]}},{"type":"Feature","properties":{"id":16191,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6296198397404436,44.803868150264506]}},{"type":"Feature","properties":{"id":20182,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5798295503254133,44.79815136572929]}},{"type":"Feature","properties":{"id":17750,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6093768517601454,44.800910207684005]}},{"type":"Feature","properties":{"id":30634,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.581049012358213,44.797567980156245]}},{"type":"Feature","properties":{"id":17773,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6105819573232397,44.79443030040655]}},{"type":"Feature","properties":{"id":22891,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6017685441052617,44.806145044514714]}},{"type":"Feature","properties":{"id":19600,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5869876197288899,44.80872986951243]}},{"type":"Feature","properties":{"id":19627,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5866746519603945,44.8046721880755]}},{"type":"Feature","properties":{"id":19628,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5861198120682125,44.80449537688717]}},{"type":"Feature","properties":{"id":20009,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5886201223908932,44.795558312862916]}},{"type":"Feature","properties":{"id":20055,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5861596889364554,44.79540171578158]}},{"type":"Feature","properties":{"id":17441,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6206897558564304,44.81118442213069]}},{"type":"Feature","properties":{"id":25245,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.604094233275002,44.79673079546311]}},{"type":"Feature","properties":{"id":16632,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6201678190527815,44.80528814201962]}},{"type":"Feature","properties":{"id":19685,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5831887578305832,44.8130770372922]}},{"type":"Feature","properties":{"id":23182,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5822053501379916,44.81203081536906]}},{"type":"Feature","properties":{"id":19723,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5822195256664939,44.81197586969005]}},{"type":"Feature","properties":{"id":20414,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5824723589146111,44.812248511199655]}},{"type":"Feature","properties":{"id":19728,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.595003061518976,44.80107819332798]}},{"type":"Feature","properties":{"id":38609,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5960516029257379,44.800504460980235]}},{"type":"Feature","properties":{"id":19939,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6001156711618988,44.798157515156575]}},{"type":"Feature","properties":{"id":27556,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.605757491691602,44.80762330174275]}},{"type":"Feature","properties":{"id":25956,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6053373108555657,44.807834712668125]}},{"type":"Feature","properties":{"id":23353,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6000852811907536,44.8043813726086]}},{"type":"Feature","properties":{"id":23254,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6002816167230712,44.80438470667476]}},{"type":"Feature","properties":{"id":49828,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6053620107596795,44.80537088988191]}},{"type":"Feature","properties":{"id":20311,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5873844207319046,44.80931081429517]}},{"type":"Feature","properties":{"id":19772,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5870244283657843,44.797018707197054]}},{"type":"Feature","properties":{"id":20198,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5878802718810091,44.8104521851498]}},{"type":"Feature","properties":{"id":20211,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5887105096135855,44.80420566504319]}},{"type":"Feature","properties":{"id":36294,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6322121990324753,44.804561645228155]}},{"type":"Feature","properties":{"id":20415,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5841520718199863,44.81235053970521]}},{"type":"Feature","properties":{"id":24464,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6156559924187647,44.79421016985492]}},{"type":"Feature","properties":{"id":16775,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6231370346267664,44.79401025740016]}},{"type":"Feature","properties":{"id":16534,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6228581922887556,44.794223541097814]}},{"type":"Feature","properties":{"id":31418,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6219157960357039,44.794463185128066]}},{"type":"Feature","properties":{"id":19773,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5868890728028368,44.797380961659904]}},{"type":"Feature","properties":{"id":19940,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5997444328869818,44.79781866557593]}},{"type":"Feature","properties":{"id":16505,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6194418446698561,44.798961628216425]}},{"type":"Feature","properties":{"id":16512,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6132006267363936,44.80286043204193]}},{"type":"Feature","properties":{"id":16667,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6180171131666972,44.81246612657396]}},{"type":"Feature","properties":{"id":19582,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5839761420156613,44.795077165607054]}},{"type":"Feature","properties":{"id":20444,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5840797735570805,44.794989943369195]}},{"type":"Feature","properties":{"id":20387,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5910668377371494,44.803253624036394]}},{"type":"Feature","properties":{"id":59322,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5905249464257029,44.80314674222542]}},{"type":"Feature","properties":{"id":34720,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6290182849240853,44.80555840129723]}},{"type":"Feature","properties":{"id":38853,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5926887131867463,44.804341941868636]}},{"type":"Feature","properties":{"id":20474,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5912725273716545,44.80418600579809]}},{"type":"Feature","properties":{"id":54606,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6269556598485034,44.80614553903033]}},{"type":"Feature","properties":{"id":53581,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5999683281837823,44.80675796006154]}},{"type":"Feature","properties":{"id":53586,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6003802276684883,44.80660833529063]}},{"type":"Feature","properties":{"id":53585,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6004237858826246,44.806693377047004]}},{"type":"Feature","properties":{"id":629,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5914292510220244,44.809221191179155]}},{"type":"Feature","properties":{"id":13306,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5885482454810009,44.80883927887937]}},{"type":"Feature","properties":{"id":23429,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5872243072582464,44.79794565051813]}},{"type":"Feature","properties":{"id":23432,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5871286171694389,44.797930742521565]}},{"type":"Feature","properties":{"id":25669,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6095480015968218,44.796184880097506]}},{"type":"Feature","properties":{"id":25670,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.609403328369066,44.796153528874584]}},{"type":"Feature","properties":{"id":16229,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6103927881971604,44.80848330192842]}},{"type":"Feature","properties":{"id":16432,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6318455929708662,44.81126325695497]}},{"type":"Feature","properties":{"id":16439,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6096602097524809,44.80926099606958]}},{"type":"Feature","properties":{"id":22793,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6091806218940967,44.80948763867637]}},{"type":"Feature","properties":{"id":23169,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5913453901569167,44.81046886122681]}},{"type":"Feature","properties":{"id":16490,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6221211395213243,44.801523791125014]}},{"type":"Feature","properties":{"id":16005,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6285498687749147,44.80061567178153]}},{"type":"Feature","properties":{"id":19798,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5807791026423318,44.8020140742784]}},{"type":"Feature","properties":{"id":19611,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5809830269145462,44.80141257539398]}},{"type":"Feature","properties":{"id":19799,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5811691452983703,44.80095630755851]}},{"type":"Feature","properties":{"id":58724,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5859312438765092,44.80662709269295]}},{"type":"Feature","properties":{"id":17231,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6339034211751292,44.802374701785695]}},{"type":"Feature","properties":{"id":17161,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6312700013020841,44.80121295081171]}},{"type":"Feature","properties":{"id":17297,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.631872080810827,44.80354356705513]}},{"type":"Feature","properties":{"id":17303,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.633645900316175,44.804753042016685]}},{"type":"Feature","properties":{"id":16261,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6175045797927119,44.81063130724919]}},{"type":"Feature","properties":{"id":16294,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6157785186711434,44.80542352907227]}},{"type":"Feature","properties":{"id":17007,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6124529785310876,44.80122124830705]}},{"type":"Feature","properties":{"id":17288,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6237854723855056,44.80244520763538]}},{"type":"Feature","properties":{"id":17289,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.605885215623023,44.800376062741314]}},{"type":"Feature","properties":{"id":16509,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.615239654429878,44.802825724109816]}},{"type":"Feature","properties":{"id":16538,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6230681813424483,44.8102911840886]}},{"type":"Feature","properties":{"id":22795,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6090463583577566,44.80907535584115]}},{"type":"Feature","properties":{"id":19992,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5867477686237127,44.800852667230565]}},{"type":"Feature","properties":{"id":20127,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5825727753321275,44.79448928213151]}},{"type":"Feature","properties":{"id":30970,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6254496151827686,44.810692299541095]}},{"type":"Feature","properties":{"id":30971,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6254341233497007,44.81093691986639]}},{"type":"Feature","properties":{"id":15932,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.630562884029604,44.795967954910736]}},{"type":"Feature","properties":{"id":26549,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6310904512217805,44.79410961270501]}},{"type":"Feature","properties":{"id":23693,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6311241504282005,44.7940018771171]}},{"type":"Feature","properties":{"id":22371,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5890468881739451,44.804019571503474]}},{"type":"Feature","properties":{"id":20315,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5881797231688719,44.80891198002606]}},{"type":"Feature","properties":{"id":16015,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6108716764102907,44.79524851413376]}},{"type":"Feature","properties":{"id":32755,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6311606805048848,44.804346679159686]}},{"type":"Feature","properties":{"id":20041,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5889610944976797,44.80472886989087]}},{"type":"Feature","properties":{"id":20218,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5828373192713951,44.7965436374562]}},{"type":"Feature","properties":{"id":20220,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5821407023838101,44.80162375322326]}},{"type":"Feature","properties":{"id":23216,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6075668450194411,44.79821632599034]}},{"type":"Feature","properties":{"id":20356,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6074446916455576,44.798409464890945]}},{"type":"Feature","properties":{"id":59308,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5851729305762308,44.80191907417385]}},{"type":"Feature","properties":{"id":19763,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5853168094815572,44.808167198079275]}},{"type":"Feature","properties":{"id":31649,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6190857935197557,44.79605101324716]}},{"type":"Feature","properties":{"id":22956,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5998836905566615,44.80354620340311]}},{"type":"Feature","properties":{"id":20108,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5840087065161284,44.81364925808745]}},{"type":"Feature","properties":{"id":19732,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5919607284167003,44.81025674671239]}},{"type":"Feature","properties":{"id":19616,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6347527507738805,44.79694503264647]}},{"type":"Feature","properties":{"id":20035,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5992047248805338,44.802551201774975]}},{"type":"Feature","properties":{"id":20008,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5887778931031118,44.79492023813073]}},{"type":"Feature","properties":{"id":27340,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6192003451272676,44.805816641880824]}},{"type":"Feature","properties":{"id":27341,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6190762675168572,44.805843741373984]}},{"type":"Feature","properties":{"id":15960,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6128294430135697,44.797650377098066]}},{"type":"Feature","properties":{"id":27582,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6229018336977635,44.79433016103196]}},{"type":"Feature","properties":{"id":16545,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6318755916354046,44.80876490225784]}},{"type":"Feature","properties":{"id":16430,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6300172199596933,44.80892484828186]}},{"type":"Feature","properties":{"id":19855,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5845034664131551,44.7992165556342]}},{"type":"Feature","properties":{"id":19915,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5818780991626679,44.8088520567097]}},{"type":"Feature","properties":{"id":16507,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6171720137256175,44.800471934783396]}},{"type":"Feature","properties":{"id":35880,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.584790537238073,44.79517337702367]}},{"type":"Feature","properties":{"id":25407,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6005624050351719,44.804188356648226]}},{"type":"Feature","properties":{"id":19573,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5916468256867602,44.79864509009591]}},{"type":"Feature","properties":{"id":20268,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5879957097363121,44.802660342236095]}},{"type":"Feature","properties":{"id":16884,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6306234818854873,44.80621829611289]}},{"type":"Feature","properties":{"id":23431,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5873434046687883,44.79796261261956]}},{"type":"Feature","properties":{"id":16889,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6192339446481433,44.804759615665944]}},{"type":"Feature","properties":{"id":34733,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6306521263403831,44.80514015827631]}},{"type":"Feature","properties":{"id":19585,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5847781845475827,44.795721463465725]}},{"type":"Feature","properties":{"id":27895,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6306107064487226,44.810333015277955]}},{"type":"Feature","properties":{"id":23489,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6310324710411841,44.80977418478704]}},{"type":"Feature","properties":{"id":17793,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6117017660984965,44.80572268210356]}},{"type":"Feature","properties":{"id":17118,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6075898372026082,44.809273619724856]}},{"type":"Feature","properties":{"id":15882,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6214063507691692,44.793851257111]}},{"type":"Feature","properties":{"id":25409,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6313066635366836,44.801680487252156]}},{"type":"Feature","properties":{"id":17162,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6330550263178062,44.80018825982236]}},{"type":"Feature","properties":{"id":16253,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6267055904211111,44.801112215789686]}},{"type":"Feature","properties":{"id":23492,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6287238129443788,44.80891305861358]}},{"type":"Feature","properties":{"id":26058,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6282294451853828,44.79213080313704]}},{"type":"Feature","properties":{"id":30029,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6083205954746773,44.798666159103746]}},{"type":"Feature","properties":{"id":17126,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6324882849617394,44.79416964742149]}},{"type":"Feature","properties":{"id":16135,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6333199899073376,44.79415767051185]}},{"type":"Feature","properties":{"id":20197,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5874394502332281,44.81301107708922]}},{"type":"Feature","properties":{"id":20195,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5963748769008166,44.80593403532045]}},{"type":"Feature","properties":{"id":29241,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5918630512275317,44.806781595907665]}},{"type":"Feature","properties":{"id":19599,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5861563400219824,44.80864203725283]}},{"type":"Feature","properties":{"id":20416,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.585083395922537,44.812322723297065]}},{"type":"Feature","properties":{"id":17403,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6303931736083461,44.79455265789623]}},{"type":"Feature","properties":{"id":17751,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6057238322161185,44.8049954861119]}},{"type":"Feature","properties":{"id":22368,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5895402813859256,44.80334766444167]}},{"type":"Feature","properties":{"id":20040,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5898878302914718,44.80493116959223]}},{"type":"Feature","properties":{"id":20367,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5845266756419456,44.81081239400367]}},{"type":"Feature","properties":{"id":19866,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5821560683356397,44.80205430950675]}},{"type":"Feature","properties":{"id":27478,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6190323834630272,44.80003539102069]}},{"type":"Feature","properties":{"id":27664,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6308029509226473,44.79340748890225]}},{"type":"Feature","properties":{"id":27665,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6306669053178622,44.79197228945535]}},{"type":"Feature","properties":{"id":20181,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5878866023049307,44.80723804824538]}},{"type":"Feature","properties":{"id":38852,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5922567476898352,44.805410420472995]}},{"type":"Feature","properties":{"id":42109,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5908768346438454,44.805135111541]}},{"type":"Feature","properties":{"id":19614,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5975106500427024,44.81243610629011]}},{"type":"Feature","properties":{"id":19797,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5806009916716915,44.80272159659935]}},{"type":"Feature","properties":{"id":23479,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.596962525832824,44.7942880795142]}},{"type":"Feature","properties":{"id":16938,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6220677986690202,44.813720449606464]}},{"type":"Feature","properties":{"id":16134,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.633202368626908,44.794832825789584]}},{"type":"Feature","properties":{"id":20230,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.581399142937162,44.799271566811626]}},{"type":"Feature","properties":{"id":20134,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5795537033330288,44.79665100351513]}},{"type":"Feature","properties":{"id":30033,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5919798225307895,44.81388536468162]}},{"type":"Feature","properties":{"id":19649,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5794287913091821,44.80658262885887]}},{"type":"Feature","properties":{"id":19809,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5840053833237241,44.80295370653722]}},{"type":"Feature","properties":{"id":19684,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5821933875355502,44.81311505203595]}},{"type":"Feature","properties":{"id":19722,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5821412127605833,44.8124160415655]}},{"type":"Feature","properties":{"id":22876,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5981996355267528,44.79928031462285]}},{"type":"Feature","properties":{"id":30058,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5893594529373799,44.81248406737403]}},{"type":"Feature","properties":{"id":16589,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6332361872648015,44.80662438438843]}},{"type":"Feature","properties":{"id":16517,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6058526999066345,44.807680729014336]}},{"type":"Feature","properties":{"id":23323,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5983600071891754,44.808352657301484]}},{"type":"Feature","properties":{"id":23291,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.598175104191677,44.80825698384061]}},{"type":"Feature","properties":{"id":16723,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6271397607279103,44.79464557544812]}},{"type":"Feature","properties":{"id":19528,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.626651901013641,44.79515209207201]}},{"type":"Feature","properties":{"id":30143,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6324821773750492,44.79407471367852]}},{"type":"Feature","properties":{"id":16727,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6324424028235368,44.79358998032634]}},{"type":"Feature","properties":{"id":19762,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5840965601187471,44.796381356983915]}},{"type":"Feature","properties":{"id":19771,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5880899537441516,44.79708175177864]}},{"type":"Feature","properties":{"id":17395,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6196479004013254,44.80571168586368]}},{"type":"Feature","properties":{"id":17139,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6154697640153065,44.813301834604765]}},{"type":"Feature","properties":{"id":16712,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.633397283165561,44.805887755899924]}},{"type":"Feature","properties":{"id":16529,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6131457210272049,44.80282019760035]}},{"type":"Feature","properties":{"id":19862,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.581742359284271,44.803038507850836]}},{"type":"Feature","properties":{"id":16602,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6343271677684411,44.80376746507475]}},{"type":"Feature","properties":{"id":16336,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6186552030828344,44.813407648599856]}},{"type":"Feature","properties":{"id":20445,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.584230838390085,44.79425543008137]}},{"type":"Feature","properties":{"id":53587,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6002766793537899,44.806733069436376]}},{"type":"Feature","properties":{"id":53588,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6002329645957412,44.806650251454165]}},{"type":"Feature","properties":{"id":20135,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5799400704288935,44.796031422002244]}},{"type":"Feature","properties":{"id":16870,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6255499929281934,44.81358177457588]}},{"type":"Feature","properties":{"id":17210,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6081092980994777,44.79606018908337]}},{"type":"Feature","properties":{"id":15975,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6063096567689085,44.795842520704404]}},{"type":"Feature","properties":{"id":24401,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6191155935746175,44.80774793270232]}},{"type":"Feature","properties":{"id":28444,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6184440781769963,44.80100764276105]}},{"type":"Feature","properties":{"id":57261,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6276774713309989,44.806494623383934]}},{"type":"Feature","properties":{"id":19796,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5804100776007701,44.8032597179412]}},{"type":"Feature","properties":{"id":19812,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5861240457568794,44.80682526250225]}},{"type":"Feature","properties":{"id":15808,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6290203614854815,44.80660240666163]}},{"type":"Feature","properties":{"id":17388,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6346531266442413,44.81261582828942]}},{"type":"Feature","properties":{"id":17371,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6314036276194981,44.793369300565004]}},{"type":"Feature","properties":{"id":15880,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6232763658724012,44.79333649635493]}},{"type":"Feature","properties":{"id":16726,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6324854611337549,44.794114786306004]}},{"type":"Feature","properties":{"id":17643,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6066713039284501,44.79693366533655]}},{"type":"Feature","properties":{"id":20524,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5836897762684092,44.794335179095135]}},{"type":"Feature","properties":{"id":27615,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5974342271774864,44.806883431617564]}},{"type":"Feature","properties":{"id":19648,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5798826958981265,44.80791136727445]}},{"type":"Feature","properties":{"id":19838,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5974384797343806,44.80592283083548]}},{"type":"Feature","properties":{"id":17127,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6312288707516215,44.79381052774058]}},{"type":"Feature","properties":{"id":23684,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6335081160316466,44.79105006073519]}},{"type":"Feature","properties":{"id":17128,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6310763088773275,44.79393728305864]}},{"type":"Feature","properties":{"id":20455,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5822066482409058,44.80246105612574]}},{"type":"Feature","properties":{"id":20054,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5972166531379761,44.811713936264894]}},{"type":"Feature","properties":{"id":20049,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5869103158812776,44.814306111755855]}},{"type":"Feature","properties":{"id":16713,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6331285166762349,44.80531962325583]}},{"type":"Feature","properties":{"id":15873,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6232295293179418,44.79352932641312]}},{"type":"Feature","properties":{"id":15976,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6062165705893053,44.79614436735729]}},{"type":"Feature","properties":{"id":16572,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6069750399804364,44.7964194781173]}},{"type":"Feature","properties":{"id":19859,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5800742667089831,44.79882215617057]}},{"type":"Feature","properties":{"id":35397,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6319839823463206,44.80700867766565]}},{"type":"Feature","properties":{"id":20193,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5809830832725752,44.812082901277265]}},{"type":"Feature","properties":{"id":20194,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5809781861309301,44.81040916286215]}},{"type":"Feature","properties":{"id":59024,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5917228175241306,44.80668043065457]}},{"type":"Feature","properties":{"id":54608,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6243411479644546,44.807293675486406]}},{"type":"Feature","properties":{"id":16254,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6256255858329896,44.804118601845786]}},{"type":"Feature","properties":{"id":31678,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6319981444093928,44.810183684844965]}},{"type":"Feature","properties":{"id":31677,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.632822504502535,44.809975210079436]}},{"type":"Feature","properties":{"id":16019,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6184989583193068,44.81034843710847]}},{"type":"Feature","properties":{"id":19846,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6158251967616085,44.81114439730288]}},{"type":"Feature","properties":{"id":15931,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6327736574192151,44.79601022880757]}},{"type":"Feature","properties":{"id":17251,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.610887609474551,44.81260077766566]}},{"type":"Feature","properties":{"id":57281,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6256309069148038,44.80426916582181]}},{"type":"Feature","properties":{"id":26547,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6319064118916216,44.794038513165184]}},{"type":"Feature","properties":{"id":20521,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6018719681467807,44.80508861502246]}},{"type":"Feature","properties":{"id":20543,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5920974094795683,44.81304091711586]}},{"type":"Feature","properties":{"id":17122,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6302978682609254,44.79412203599371]}},{"type":"Feature","properties":{"id":20452,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5822225659064574,44.802790523505124]}},{"type":"Feature","properties":{"id":20443,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5853964467092139,44.7956602647751]}},{"type":"Feature","properties":{"id":17735,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6318210605368292,44.810014305949]}},{"type":"Feature","properties":{"id":25664,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.59683847161794,44.79421390194165]}},{"type":"Feature","properties":{"id":24402,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6193821098394551,44.807139587390644]}},{"type":"Feature","properties":{"id":19581,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5836461685000797,44.794846686020186]}},{"type":"Feature","properties":{"id":20099,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5883677434567133,44.811338707097136]}},{"type":"Feature","properties":{"id":59023,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5918490500224921,44.80672087229625]}},{"type":"Feature","properties":{"id":33320,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6309221672473588,44.79752646843733]}},{"type":"Feature","properties":{"id":33319,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6320032309721466,44.79746330061289]}},{"type":"Feature","properties":{"id":24281,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6225458868614242,44.796423242951676]}},{"type":"Feature","properties":{"id":25024,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6257186658929844,44.80445471683499]}},{"type":"Feature","properties":{"id":59311,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5852927989512563,44.80214642503167]}},{"type":"Feature","properties":{"id":19690,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5842133684977429,44.80200895198547]}},{"type":"Feature","properties":{"id":59321,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5907270103192183,44.804079438664374]}},{"type":"Feature","properties":{"id":59328,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5901538950581474,44.80396110844472]}},{"type":"Feature","properties":{"id":59325,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.590060846646444,44.80425782228568]}},{"type":"Feature","properties":{"id":59312,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5845809853481179,44.80199815396006]}},{"type":"Feature","properties":{"id":59326,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.590171096602116,44.80381403797354]}},{"type":"Feature","properties":{"id":59327,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5899055471763629,44.80376250960788]}},{"type":"Feature","properties":{"id":59324,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5899712909915953,44.80347098858278]}},{"type":"Feature","properties":{"id":59323,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5897418357629141,44.80415781513457]}},{"type":"Feature","properties":{"id":"as=129212","name":"Berteaux","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5878775393091816,44.81047320487493]}},{"type":"Feature","properties":{"id":"as=129213","name":"Berteaux","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5880181543569623,44.810460287421996]}},{"type":"Feature","properties":{"id":"as=129242","name":"A. Paré","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5860853898792252,44.808634154471086]}},{"type":"Feature","properties":{"id":"as=129224","name":"Cardinal","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.626032587655328,44.80521828645975]}},{"type":"Feature","properties":{"id":"as=129186","name":"Peixotto","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5936575716898786,44.80631475967341]}},{"type":"Feature","properties":{"id":"as=128764","name":"INRIA","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6002824056991044,44.80875498884317]}},{"type":"Feature","properties":{"id":"as=128738","name":"Les Harmonies","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5848766551679482,44.81088340802062]}},{"type":"Feature","properties":{"id":"as=126002","name":"Facultés Droit et Lettres","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6194440544979725,44.798863817364484]}},{"type":"Feature","properties":{"id":"as=126003","name":"Clinique Mutualiste","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6100281494112885,44.805710327171916]}},{"type":"Feature","properties":{"id":"as=126047","name":"Village 1","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6035977134475037,44.807921114835146]}},{"type":"Feature","properties":{"id":"as=126024","name":"Bénédigues","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5836878231762777,44.79916011024313]}},{"type":"Feature","properties":{"id":"as=126001","name":"Clinique Mutualiste","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6102919756124691,44.80512001392482]}},{"type":"Feature","properties":{"id":"as=128588","name":"Peydavant","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5851741241733962,44.80158764319367]}},{"type":"Feature","properties":{"id":"as=128589","name":"Peydavant","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5854061515207823,44.8019969743337]}},{"type":"Feature","properties":{"id":"as=128590","name":"Résidence Crespy","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5864736482133087,44.80588680315619]}},{"type":"Feature","properties":{"id":"as=128591","name":"Résidence Crespy","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5865689008012638,44.80581277243472]}},{"type":"Feature","properties":{"id":"as=124591","name":"Rond-Point","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6167260840569179,44.80520343908164]}},{"type":"Feature","properties":{"id":"as=124566","name":"Chemin de Suzon","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5823728634221069,44.811295159599865]}},{"type":"Feature","properties":{"id":"as=124587","name":"La Paillère","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6046553414757291,44.795582789032636]}},{"type":"Feature","properties":{"id":"as=124551","name":"Franklin","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5873847952942227,44.79908733010081]}},{"type":"Feature","properties":{"id":"as=124854","name":"Collège Gérard Philipe","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6242505867429745,44.7998889472887]}},{"type":"Feature","properties":{"id":"as=124715","name":"Mozart","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6161061910203061,44.812180504220024]}},{"type":"Feature","properties":{"id":"as=124799","name":"Curie","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6296508692524806,44.80679627089548]}},{"type":"Feature","properties":{"id":"as=124808","name":"Montaigne - Montesquieu","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6142608325506955,44.79636128142778]}},{"type":"Feature","properties":{"id":"as=124811","name":"CREPS","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5985415793187204,44.79895998147994]}},{"type":"Feature","properties":{"id":"as=124743","name":"Le Poujeau","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6287495026144481,44.80890503235491]}},{"type":"Feature","properties":{"id":"as=124815","name":"Le Chiquet","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6198124150619269,44.80396081435652]}},{"type":"Feature","properties":{"id":"as=124624","name":"Rond-Point","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6155903790794491,44.80546780660766]}},{"type":"Feature","properties":{"id":"as=124756","name":"Peixotto","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.59177833957402,44.80660004681237]}},{"type":"Feature","properties":{"id":"as=124830","name":"Ecole de Management","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6026178012516087,44.79654680953026]}},{"type":"Feature","properties":{"id":"as=125061","name":"Ecole de Management","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6024211081568865,44.796556538702916]}},{"type":"Feature","properties":{"id":"as=124883","name":"CREPS","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5986810940580379,44.79900107428764]}},{"type":"Feature","properties":{"id":"as=125356","name":"Jaubert","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6263950892679818,44.807761871107175]}},{"type":"Feature","properties":{"id":"as=125432","name":"Lyautey","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6314036276194981,44.793369300565004]}},{"type":"Feature","properties":{"id":"as=125296","name":"Bardanac","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6091022239964791,44.79611317928631]}},{"type":"Feature","properties":{"id":"as=125302","name":"Desbats","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.618345051263509,44.803812475306586]}},{"type":"Feature","properties":{"id":"as=125236","name":"Collège Victor Louis","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5908153296507723,44.79921382067324]}},{"type":"Feature","properties":{"id":"as=125304","name":"Montherlant","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5814783761385266,44.79643501556176]}},{"type":"Feature","properties":{"id":"as=125253","name":"Cardinal","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6256572364531846,44.80357776485027]}},{"type":"Feature","properties":{"id":"as=125389","name":"Mozart","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6167864017679299,44.81196240066467]}},{"type":"Feature","properties":{"id":"as=125323","name":"Bardanac","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6098558033544615,44.79649787728235]}},{"type":"Feature","properties":{"id":"as=125263","name":"Le Poujeau","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6290822743254396,44.809092819047784]}},{"type":"Feature","properties":{"id":"as=125337","name":"Sarget","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.60836880541367,44.808585631956106]}},{"type":"Feature","properties":{"id":"as=125538","name":"Lycée Kastler","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5966519084589246,44.80082806120818]}},{"type":"Feature","properties":{"id":"as=125539","name":"Lycée Victor Louis","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5932533999645394,44.80294156638243]}},{"type":"Feature","properties":{"id":"as=125540","name":"Talence Centre-Forum","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5912955110226233,44.81083616858027]}},{"type":"Feature","properties":{"id":"as=125550","name":"Lycée Kastler","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5979988960069387,44.80186392163605]}},{"type":"Feature","properties":{"id":"as=125623","name":"Village 2","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6129673496982034,44.80292981987449]}},{"type":"Feature","properties":{"id":"as=125624","name":"Ausone","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6167556010158722,44.80183102215729]}},{"type":"Feature","properties":{"id":"as=125560","name":"Avenue de l'Université","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5946487832190162,44.80128760236258]}},{"type":"Feature","properties":{"id":"as=125501","name":"Colonel Jacqui","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.633654882118616,44.811401236942395]}},{"type":"Feature","properties":{"id":"as=125502","name":"Nancel Pénard","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.632822504502535,44.809975210079436]}},{"type":"Feature","properties":{"id":"as=125661","name":"Ausone","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6171282843380691,44.800555391475335]}},{"type":"Feature","properties":{"id":"as=125525","name":"Lycée Victor Louis","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5933419432009441,44.80290609458723]}},{"type":"Feature","properties":{"id":"as=126826","name":"Unitec","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6213139958518566,44.7967215579503]}},{"type":"Feature","properties":{"id":"as=126957","name":"Pessac Centre","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6326781083125196,44.80469621477551]}},{"type":"Feature","properties":{"id":"as=126835","name":"Saige","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6292324178976736,44.79411329562805]}},{"type":"Feature","properties":{"id":"as=126798","name":"Peixotto","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5919754450763087,44.806776336560645]}},{"type":"Feature","properties":{"id":"as=126843","name":"Peixotto","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5915018630781435,44.80803675315485]}},{"type":"Feature","properties":{"id":"as=126949","name":"Pessac Centre (Trendel)","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6328797824686113,44.80591535507432]}},{"type":"Feature","properties":{"id":"as=126955","name":"Pessac Centre","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6325905772401907,44.804402042115]}},{"type":"Feature","properties":{"id":"as=126956","name":"Pessac Centre","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6315426422940877,44.80483886296448]}},{"type":"Feature","properties":{"id":"as=126725","name":"Collège Victor Louis","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.591749738721691,44.79856265778556]}},{"type":"Feature","properties":{"id":"as=126726","name":"Collège Victor Louis","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5925596857402758,44.79896524744904]}},{"type":"Feature","properties":{"id":"as=126727","name":"Lycée Hôtelier","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5924099536308922,44.79522431798344]}},{"type":"Feature","properties":{"id":"as=126612","name":"Pelletan","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6005709443936075,44.81246494703294]}},{"type":"Feature","properties":{"id":"as=126637","name":"Arts & Métiers","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6003524924280303,44.805815314116046]}},{"type":"Feature","properties":{"id":"as=126638","name":"Arts & Métiers","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6006119587252647,44.8046312546883]}},{"type":"Feature","properties":{"id":"as=126275","name":"Bénédigues","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.583594741220704,44.799262579054854]}},{"type":"Feature","properties":{"id":"as=126198","name":"Pessac Centre","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.630666524961471,44.80621107320266]}},{"type":"Feature","properties":{"id":"as=126199","name":"Avenue Jean Jaurès","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6244699455687088,44.80859043076008]}},{"type":"Feature","properties":{"id":"as=126200","name":"Les Echoppes","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6205187955250818,44.8108745794685]}},{"type":"Feature","properties":{"id":"as=126201","name":"Parc Haut Brion","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6131319346018702,44.81312550824983]}},{"type":"Feature","properties":{"id":"as=126208","name":"Fanning Lafontaine","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6137095978648442,44.80830933152997]}},{"type":"Feature","properties":{"id":"as=126209","name":"Corneille","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.622785430389558,44.80418577153616]}},{"type":"Feature","properties":{"id":"as=126237","name":"Phénix Haut Brion","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6159032985453854,44.80810233191559]}},{"type":"Feature","properties":{"id":"as=126238","name":"Fanning Lafontaine","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.613684708854579,44.808179422634716]}},{"type":"Feature","properties":{"id":"as=126161","name":"Cimetière","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6252858666250618,44.810838008755574]}},{"type":"Feature","properties":{"id":"as=126249","name":"Pessac Gare","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6314561092610305,44.80373152224987]}},{"type":"Feature","properties":{"id":"as=126172","name":"Avenue Jean Jaurès","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6233231538386813,44.8102328589191]}},{"type":"Feature","properties":{"id":"as=126174","name":"Pessac Centre","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.631467218957927,44.806079206126995]}},{"type":"Feature","properties":{"id":"as=129160","name":"STAPS","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6154316421681246,44.79378271545963]}},{"type":"Feature","properties":{"id":"as=129078","name":"Mairie de Talence","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5873770289998756,44.808771890909945]}},{"type":"Feature","properties":{"id":"as=129005","name":"Talence Centre-Forum","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5913689948605365,44.81288077969289]}},{"type":"Feature","properties":{"id":"as=129006","name":"Centre M. Pagnol","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5861690395503226,44.81189917006904]}},{"type":"Feature","properties":{"id":"as=129010","name":"Médiathèque","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5891428865667643,44.80706941649979]}},{"type":"Feature","properties":{"id":"as=125781","name":"Les Echoppes","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6207934155278639,44.8108114736739]}},{"type":"Feature","properties":{"id":"as=128440","name":"La Paillère","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6053275826400447,44.7956882415242]}},{"type":"Feature","properties":{"id":"as=128441","name":"Dourout","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5829533291412462,44.808775800980634]}},{"type":"Feature","properties":{"id":"as=128481","name":"Candau","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6093492987111485,44.80940792618887]}},{"type":"Feature","properties":{"id":"as=126515","name":"Facultés Droit et Lettres","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6197420186573377,44.79791674542534]}},{"type":"Feature","properties":{"id":"as=126520","name":"Nancel Pénard","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6326941613131767,44.808703809879916]}},{"type":"Feature","properties":{"id":"as=126353","name":"Enseirb","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6077533522424334,44.80609157500647]}},{"type":"Feature","properties":{"id":"as=126415","name":"Lafitte","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5849099847830717,44.799275276226325]}},{"type":"Feature","properties":{"id":"as=126423","name":"Résidence Coppélia","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5826322515009865,44.80474190899295]}},{"type":"Feature","properties":{"id":"as=126494","name":"Chemin de Suzon","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5822675146941628,44.81178114683718]}},{"type":"Feature","properties":{"id":"as=2847","name":"Doyen Brus","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6095170708821552,44.80091872951914]}},{"type":"Feature","properties":{"id":"as=2791","name":"Garage Unitec","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6225458868614242,44.796423242951676]}},{"type":"Feature","properties":{"id":"as=2793","name":"Garage Pessac","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6317753874490736,44.80474530328229]}},{"type":"Feature","properties":{"id":"as=2848","name":"Saige","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6278562848933282,44.79403090537901]}},{"type":"Feature","properties":{"id":"as=2846","name":"Béthanie","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5982942181184648,44.80592826231086]}},{"type":"Feature","properties":{"id":"as=128118","name":"Montaigne-Montesquieu","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6171929150616469,44.79703612275271]}},{"type":"Feature","properties":{"id":"as=127941","name":"Doyen Brus","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6096747182570297,44.80062564089148]}},{"type":"Feature","properties":{"id":"as=127943","name":"Francois Bordes","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6068476869041276,44.80355291536525]}},{"type":"Feature","properties":{"id":"as=127945","name":"Arts & Metiers","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6022917175528385,44.80588894695939]}},{"type":"Feature","properties":{"id":"as=127946","name":"Arts & Metiers","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6023964071705596,44.806109036414746]}},{"type":"Feature","properties":{"id":"as=127951","name":"Talence Centre-Forum","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5902987171722328,44.811890740754194]}},{"type":"Feature","properties":{"id":"as=4653","name":"Professeur Arnozan","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5887617020151555,44.80746699421062]}},{"type":"Feature","properties":{"id":"as=3903","name":"Deux Ponts","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6237185655562585,44.80218948838196]}},{"type":"Feature","properties":{"id":"as=3996","name":"Brivazac","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6167453060802395,44.80336708893274]}},{"type":"Feature","properties":{"id":"as=3835","name":"Pessac Gare","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.631872080810827,44.80354356705513]}},{"type":"Feature","properties":{"id":"as=3800","name":"Collège Gérard Philipe","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.623721398906139,44.80020115921167]}},{"type":"Feature","properties":{"id":"as=3979","name":"Les Echoppes","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6149722993800102,44.80301952321189]}},{"type":"Feature","properties":{"id":"as=4624","name":"Dourout","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5826167316320662,44.80836364546584]}},{"type":"Feature","properties":{"id":"as=3829","name":"Village 1","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6031165359859968,44.80796273513895]}},{"type":"Feature","properties":{"id":"as=4633","name":"Unitec","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6206846693570309,44.79717406062051]}},{"type":"Feature","properties":{"id":"as=4702","name":"Unitec","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6207581543563427,44.79717472074531]}},{"type":"Feature","properties":{"id":"as=3825","name":"Lycée Victor Louis","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.590157115142759,44.803076982358874]}},{"type":"Feature","properties":{"id":"as=1608","name":"Peixotto","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5921660507144769,44.80581282433813]}},{"type":"Feature","properties":{"id":"as=3811","name":"Rond-Point Crespy","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5862094348735556,44.806745356618016]}},{"type":"Feature","properties":{"id":"as=4025","name":"Rond-Point Crespy","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5875561706922359,44.8071642442764]}},{"type":"Feature","properties":{"id":"as=4723","name":"Phénix Haut Brion","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6182176013896765,44.80773911700815]}},{"type":"Feature","properties":{"id":"as=3961","name":"Cardinal","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6265227405338982,44.80412582527825]}},{"type":"Feature","properties":{"id":"as=3946","name":"Talence Place Wilson","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5911143430914114,44.79851592268685]}},{"type":"Feature","properties":{"id":"as=3852","name":"Forum","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5912749521066185,44.8099454334626]}},{"type":"Feature","properties":{"id":"as=4740","name":"Centre M. Pagnol","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5861746180764528,44.812040638802586]}},{"type":"Feature","properties":{"id":"as=2141","name":"Cardinal","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6252798683845749,44.80426933817362]}},{"type":"Feature","properties":{"id":"as=4007","name":"Chiquet Brion","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6189762294657988,44.80774515046019]}},{"type":"Feature","properties":{"id":"as=3949","name":"Lamartine","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.623954917132629,44.8065586919272]}},{"type":"Feature","properties":{"id":"as=4745","name":"Cardinal","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6277485516591668,44.80400827027071]}},{"type":"Feature","properties":{"id":"as=4667","name":"Arts & Métiers","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5999223500980054,44.80356146486022]}},{"type":"Feature","properties":{"id":"as=130301","name":"Forum (cours Gambetta)","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.59069381739304,44.81289461693631]}},{"type":"Feature","properties":{"name":"Avenue Roul","distance":119.83529412169624,"sectionId":"19986-649","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.598503457195701,44.805929589372],[-0.599594343530901,44.80593786015047],[-0.5997331001835146,44.80595319683834],[-0.5998917179816667,44.805980606374426],[-0.5999951036373583,44.806025258018686]]}},{"type":"Feature","properties":{"name":"Rue du Général André","distance":209.05681073602977,"sectionId":"19986-19987","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.598503457195701,44.805929589372],[-0.5984066689433065,44.80404866973753]]}},{"type":"Feature","properties":{"name":"Avenue Roul","distance":67.66794171046003,"sectionId":"19986-as=2846","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5982942181184648,44.80592826231086],[-0.598503457195701,44.805929589372]]}},{"type":"Feature","properties":{"name":"Avenue Roul","distance":119.83529412169624,"sectionId":"649-19986","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.598503457195701,44.805929589372],[-0.599594343530901,44.80593786015047],[-0.5997331001835146,44.80595319683834],[-0.5998917179816667,44.805980606374426],[-0.5999951036373583,44.806025258018686]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":11.84295632015308,"sectionId":"649-25438","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5999951036373583,44.806025258018686],[-0.5999857389047671,44.806035373400114],[-0.5999680339751972,44.806065931207954],[-0.5999579091474151,44.80609832099349],[-0.599956256747319,44.80612656908074]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":25.762290760336278,"sectionId":"649-20350","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6002739308007025,44.805937160069774],[-0.6002571906097627,44.805934537065355],[-0.600210663417118,44.80593312714963],[-0.6001646218698704,44.80593746711639],[-0.6001202025409176,44.805947520990586],[-0.6000790190830736,44.80596278728954],[-0.6000420649431202,44.805982964323555],[-0.6000106899797618,44.80600737879656],[-0.5999951036373583,44.806025258018686]]}},{"type":"Feature","properties":{"name":"Résidence Crespy I","distance":25.55869834308905,"sectionId":"20477-8849","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5889352992729378,44.80426162947189],[-0.5888401723316949,44.80448154821921]]}},{"type":"Feature","properties":{"name":"Résidence Crespy I","distance":18.830733503042435,"sectionId":"20477-20211","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5887105096135855,44.80420566504319],[-0.5889352992729378,44.80426162947189]]}},{"type":"Feature","properties":{"name":"Résidence Crespy I","distance":28.29673249588687,"sectionId":"20477-22371","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5890468881739451,44.804019571503474],[-0.5889352992729378,44.80426162947189]]}},{"type":"Feature","properties":{"name":"Résidence Crespy I","distance":25.55869834308905,"sectionId":"8849-20477","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5889352992729378,44.80426162947189],[-0.5888401723316949,44.80448154821921]]}},{"type":"Feature","properties":{"name":"Résidence Crespy I","distance":81.98339124553628,"sectionId":"8849-22371","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5890468881739451,44.804019571503474],[-0.5892255924368786,44.80407509786336],[-0.589012285757549,44.80452061776749],[-0.5888401723316949,44.80448154821921]]}},{"type":"Feature","properties":{"name":"Voie 1 Faculté des Sciences","distance":260.9113314814558,"sectionId":"565-20529","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5923014576779416,44.80911464724327],[-0.5924032108814535,44.80912296419148],[-0.5925715802135042,44.809132149793314],[-0.5927401461516187,44.80914042811659],[-0.5929927901926941,44.80915361730581],[-0.5931613226284861,44.80916135557597],[-0.5932457489801798,44.80916373320644],[-0.5933724647536849,44.80916243269566],[-0.5934984178918323,44.80915295867147],[-0.5936231057803754,44.80913739890081],[-0.5937460119922557,44.80911558953809],[-0.5938653489143757,44.809085244934074],[-0.593980162198748,44.80904729607213],[-0.5940895733518388,44.80900186080643],[-0.5941920612032893,44.80894889713399],[-0.594286390818953,44.80888889450593],[-0.5944338093874455,44.80878127231715],[-0.5946693176037725,44.80860897970359],[-0.5948467939806595,44.808480138548774],[-0.5950249402806838,44.80835190649283],[-0.5950842838442604,44.80830922367916],[-0.5951085953449483,44.80828512401],[-0.595118792724725,44.80826399273431]]}},{"type":"Feature","properties":{"name":"Voie 1 Faculté des Sciences","distance":25.963072522790537,"sectionId":"565-652","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5923014576779416,44.80911464724327],[-0.5923203593795362,44.80909306119912],[-0.5923314057953137,44.80906929102091],[-0.592334021490954,44.80904425570406],[-0.5923283073312876,44.809019573538976],[-0.5923143473697959,44.80899659310074],[-0.5922931097233672,44.80897663504195],[-0.5922658038850416,44.80896083222664],[-0.5922338863311691,44.80895021963794],[-0.5921994113864558,44.80894527288714],[-0.5921882974571633,44.80894562386988]]}},{"type":"Feature","properties":{"name":"Voie 1 Faculté des Sciences","distance":22.224052159305163,"sectionId":"565-614","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5920620861449233,44.809101217559316],[-0.5920833237562817,44.80912117566137],[-0.59211075591493,44.80913697453161],[-0.5921425472550291,44.80914759114289],[-0.5921770223162955,44.80915253791176],[-0.5922122586493441,44.80915142513561],[-0.5922459829311133,44.809144324608255],[-0.5922764550367651,44.80913174169464],[-0.5923014576779416,44.80911464724327]]}},{"type":"Feature","properties":{"name":"Voie 1 Faculté des Sciences","distance":260.9113314814558,"sectionId":"20529-565","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5923014576779416,44.80911464724327],[-0.5924032108814535,44.80912296419148],[-0.5925715802135042,44.809132149793314],[-0.5927401461516187,44.80914042811659],[-0.5929927901926941,44.80915361730581],[-0.5931613226284861,44.80916135557597],[-0.5932457489801798,44.80916373320644],[-0.5933724647536849,44.80916243269566],[-0.5934984178918323,44.80915295867147],[-0.5936231057803754,44.80913739890081],[-0.5937460119922557,44.80911558953809],[-0.5938653489143757,44.809085244934074],[-0.593980162198748,44.80904729607213],[-0.5940895733518388,44.80900186080643],[-0.5941920612032893,44.80894889713399],[-0.594286390818953,44.80888889450593],[-0.5944338093874455,44.80878127231715],[-0.5946693176037725,44.80860897970359],[-0.5948467939806595,44.808480138548774],[-0.5950249402806838,44.80835190649283],[-0.5950842838442604,44.80830922367916],[-0.5951085953449483,44.80828512401],[-0.595118792724725,44.80826399273431]]}},{"type":"Feature","properties":{"name":"Voie 1 Faculté des Sciences","distance":17.242969458689764,"sectionId":"20529-622","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.595118792724725,44.80826399273431],[-0.5951235605337198,44.80822681828497],[-0.5951234192899467,44.80810890524155]]}},{"type":"Feature","properties":{"name":"Place Henri Goulinat","distance":30.987764102898257,"sectionId":"37644-25322","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6312988395560757,44.806953711851584],[-0.6309171201956937,44.80701688540854]]}},{"type":"Feature","properties":{"name":"Place Henri Goulinat","distance":36.095629147592234,"sectionId":"37644-16492","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6317468675861465,44.80689859927188],[-0.6316195941969948,44.80690104150232],[-0.6312988395560757,44.806953711851584]]}},{"type":"Feature","properties":{"name":"Place Henri Goulinat","distance":30.987764102898257,"sectionId":"25322-37644","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6312988395560757,44.806953711851584],[-0.6309171201956937,44.80701688540854]]}},{"type":"Feature","properties":{"name":"Place Henri Goulinat","distance":7.652125252222003,"sectionId":"25322-16882","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6309171201956937,44.80701688540854],[-0.6308228069958516,44.80703232765483]]}},{"type":"Feature","properties":{"name":"Avenue de Genève","distance":117.23407186563449,"sectionId":"16751-16491","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6192614171451878,44.802438103692516],[-0.6193901306760591,44.8013866079945]]}},{"type":"Feature","properties":{"name":"Avenue Raymond Boivin","distance":80.27890151764852,"sectionId":"16751-16874","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6192614171451878,44.802438103692516],[-0.6182464372634308,44.80245301211074]]}},{"type":"Feature","properties":{"name":"Avenue Raymond Boivin","distance":119.7666555954162,"sectionId":"16751-16342","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6207756796871756,44.802417021304976],[-0.6192614171451878,44.802438103692516]]}},{"type":"Feature","properties":{"name":"Avenue de Genève","distance":117.23407186563449,"sectionId":"16491-16751","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6192614171451878,44.802438103692516],[-0.6193901306760591,44.8013866079945]]}},{"type":"Feature","properties":{"name":"Avenue des Deux Ponts","distance":121.62062200726356,"sectionId":"16491-16343","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6209176256124728,44.80151418988168],[-0.6193901306760591,44.8013866079945]]}},{"type":"Feature","properties":{"name":"Avenue de Genève","distance":59.37854361851572,"sectionId":"16491-28441","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6193901306760591,44.8013866079945],[-0.6194581803946418,44.80085421141209]]}},{"type":"Feature","properties":{"name":"Avenue de Genève","distance":19.382091563925975,"sectionId":"16648-27475","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6195375283914707,44.800241821394124],[-0.6195571001638541,44.800067877994806]]}},{"type":"Feature","properties":{"name":"Avenue de Fontaudin","distance":106.43194054374653,"sectionId":"16648-16647","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6208754813095524,44.80034561747293],[-0.6195375283914707,44.800241821394124]]}},{"type":"Feature","properties":{"name":"Avenue de Genève","distance":68.30803070278338,"sectionId":"16648-28441","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6194581803946418,44.80085421141209],[-0.6195375283914707,44.800241821394124]]}},{"type":"Feature","properties":{"name":"Avenue de Genève","distance":19.382091563925975,"sectionId":"27475-16648","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6195375283914707,44.800241821394124],[-0.6195571001638541,44.800067877994806]]}},{"type":"Feature","properties":{"name":"Avenue de Genève","distance":111.5676283436214,"sectionId":"27475-16752","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6195571001638541,44.800067877994806],[-0.6196697256676994,44.79906661944379]]}},{"type":"Feature","properties":{"name":"Allée des Cyclades","distance":41.65193375494198,"sectionId":"27475-27478","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6195571001638541,44.800067877994806],[-0.619423815369965,44.80005896769497],[-0.6191154289825405,44.80004013518206],[-0.6190323834630272,44.80003539102069]]}},{"type":"Feature","properties":{"name":"Place Henri Goulinat","distance":36.095629147592234,"sectionId":"16492-37644","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6317468675861465,44.80689859927188],[-0.6316195941969948,44.80690104150232],[-0.6312988395560757,44.806953711851584]]}},{"type":"Feature","properties":{"name":"Avenue Roger Cohé","distance":94.25903082057917,"sectionId":"16492-17247","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6317468675861465,44.80689859927188],[-0.6313355096094503,44.80614980310704],[-0.6313232630557205,44.80610605296365]]}},{"type":"Feature","properties":{"name":"Avenue Roger Cohé","distance":9.917762670243626,"sectionId":"16492-27886","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6318478280770993,44.80695050696602],[-0.6317965963954754,44.80693070283317],[-0.6317468675861465,44.80689859927188]]}},{"type":"Feature","properties":{"name":"Rue Dignac","distance":66.60132379399877,"sectionId":"16492-25319","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6309738476311294,44.807133985290996],[-0.6316353811792683,44.80694675051257],[-0.6317468675861465,44.80689859927188]]}},{"type":"Feature","properties":{"name":"Allée Jacques Brel","distance":19.980729149323082,"sectionId":"19473-16917","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6077811541581584,44.80684108265683],[-0.6077934054527061,44.80684880150884],[-0.6078034398176395,44.806857491505625],[-0.6078113891675294,44.806867238546964],[-0.6078169784182125,44.80687769102831],[-0.6078201963137756,44.80688866913973],[-0.6078208996819043,44.8068999071757],[-0.6078190716415861,44.80691113542341],[-0.607814810344942,44.80692190035544],[-0.6078081101632886,44.806932112066306],[-0.6077991955422586,44.80694131302301],[-0.607788319055796,44.80694949521394],[-0.6077757107766091,44.8069562910094],[-0.6077617383193701,44.80696150858398],[-0.6077467805511492,44.80696513591928],[-0.6077312050887919,44.80696698119019],[-0.607715901583938,44.806967106259115]]}},{"type":"Feature","properties":{"name":"Allée Jacques Brel","distance":28.760981980310124,"sectionId":"16917-19473","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.607715901583938,44.806967106259115],[-0.6076998428430483,44.80696527346084],[-0.6076848194250404,44.806961786331996],[-0.6076708313323107,44.80695664487297],[-0.6076581367674685,44.806949930977645],[-0.6076471258552513,44.80694181243824],[-0.6076381943417974,44.80693254695137],[-0.6076286563956004,44.806921679208564],[-0.6076263081823315,44.80690842143976],[-0.6076249290135118,44.80690053789966],[-0.6076254885736272,44.80688925980674],[-0.6076285964218933,44.8068782612202],[-0.6076341375206092,44.80686772595245],[-0.6076418817964175,44.80685802163282],[-0.6076518348755929,44.80684923816512],[-0.6076636403991216,44.806841747181615],[-0.6076769307508927,44.80683574050894],[-0.6076914533548683,44.806831226156575],[-0.6077067199378906,44.80682848986049],[-0.6077224779209154,44.80682753963061],[-0.6077382221511985,44.80682839149057],[-0.6077535737622443,44.806831057456606],[-0.6077681482628328,44.8068354596426],[-0.6077811541581584,44.80684108265683]]}},{"type":"Feature","properties":{"name":"Allée Jacques Brel","distance":103.5816072592466,"sectionId":"16917-30100","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6077251719231692,44.80789565556416],[-0.6077092098150831,44.807848868398786],[-0.6076857128228177,44.80705895729611],[-0.607715901583938,44.806967106259115]]}},{"type":"Feature","properties":{"name":"Rue des Orchidées","distance":28.543363717202936,"sectionId":"16627-16888","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6197644570798326,44.8049764093837],[-0.619434263251487,44.80508024381205]]}},{"type":"Feature","properties":{"name":"Rue des Flamboyants","distance":34.13205872061303,"sectionId":"16627-16628","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6197644570798326,44.8049764093837],[-0.619980510101008,44.80504781568014],[-0.6201737519763828,44.80505418675388]]}},{"type":"Feature","properties":{"name":"Rue du Jasmin","distance":42.43310141074823,"sectionId":"16627-16922","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6197940289716289,44.804594956016665],[-0.6197644570798326,44.8049764093837]]}},{"type":"Feature","properties":{"name":"Rue des Orchidées","distance":28.543363717202936,"sectionId":"16888-16627","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6197644570798326,44.8049764093837],[-0.619434263251487,44.80508024381205]]}},{"type":"Feature","properties":{"name":"Rue des Orchidées","distance":11.637394474434625,"sectionId":"16888-17199","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.619434263251487,44.80508024381205],[-0.6192984980148553,44.80512068753395]]}},{"type":"Feature","properties":{"name":"Allée des Hibiscus","distance":38.976481010108294,"sectionId":"16888-16889","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.619434263251487,44.80508024381205],[-0.6192339446481433,44.804759615665944]]}},{"type":"Feature","properties":{"name":"Rue des Orchidées","distance":11.637394474434625,"sectionId":"17199-16888","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.619434263251487,44.80508024381205],[-0.6192984980148553,44.80512068753395]]}},{"type":"Feature","properties":{"name":"Rue des Orchidées","distance":36.43736415491311,"sectionId":"17199-17074","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6192984980148553,44.80512068753395],[-0.6188697461705239,44.80524089870388]]}},{"type":"Feature","properties":{"name":"Place du Muguet","distance":71.22036250191067,"sectionId":"17199-17395","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6192984980148553,44.80512068753395],[-0.6196479004013254,44.80571168586368]]}},{"type":"Feature","properties":{"name":"Rue des Orchidées","distance":36.43736415491311,"sectionId":"17074-17199","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6192984980148553,44.80512068753395],[-0.6188697461705239,44.80524089870388]]}},{"type":"Feature","properties":{"name":"Rue Louis Armand","distance":102.76910849977696,"sectionId":"17074-17073","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6187065175775098,44.80437219367516],[-0.6185796463020825,44.804534146268935],[-0.6186917202843472,44.804934694390035],[-0.6188697461705239,44.80524089870388]]}},{"type":"Feature","properties":{"name":"Place du Muguet","distance":69.08550933829275,"sectionId":"17074-27340","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6192003451272676,44.805816641880824],[-0.6188697461705239,44.80524089870388]]}},{"type":"Feature","properties":{"name":"Avenue de Gradignan","distance":75.05035589716734,"sectionId":"16769-16770","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6252738215622851,44.8018510579183],[-0.6254105407253198,44.80210965413609],[-0.625439882089743,44.80218186678796],[-0.6255429995479178,44.80249765613825]]}},{"type":"Feature","properties":{"name":"Avenue de Gradignan","distance":92.90182191600985,"sectionId":"16769-16341","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6248167158546375,44.80108108882604],[-0.6250574579169583,44.80152311339261],[-0.6252738215622851,44.8018510579183]]}},{"type":"Feature","properties":{"name":"Avenue des Lacs","distance":122.25581021480515,"sectionId":"16769-16252","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6252738215622851,44.8018510579183],[-0.6268196929754306,44.80186600150498]]}},{"type":"Feature","properties":{"name":"Avenue de Gradignan","distance":75.05035589716734,"sectionId":"16770-16769","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6252738215622851,44.8018510579183],[-0.6254105407253198,44.80210965413609],[-0.625439882089743,44.80218186678796],[-0.6255429995479178,44.80249765613825]]}},{"type":"Feature","properties":{"name":"Avenue de Gradignan","distance":100.90596590242399,"sectionId":"16770-16652","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6255429995479178,44.80249765613825],[-0.6255939932486262,44.802731058936885],[-0.6256668640573011,44.80321572841437],[-0.6256676068307824,44.803400556478046]]}},{"type":"Feature","properties":{"name":"Avenue Raymond Boivin","distance":139.10239640167063,"sectionId":"16770-17288","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6255429995479178,44.80249765613825],[-0.6237854723855056,44.80244520763538]]}},{"type":"Feature","properties":{"name":"Avenue de Gradignan","distance":100.90596590242399,"sectionId":"16652-16770","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6255429995479178,44.80249765613825],[-0.6255939932486262,44.802731058936885],[-0.6256668640573011,44.80321572841437],[-0.6256676068307824,44.803400556478046]]}},{"type":"Feature","properties":{"name":"Avenue des Fougères","distance":152.40863794258877,"sectionId":"16652-16653","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6256676068307824,44.803400556478046],[-0.6237420017448931,44.80334184354475]]}},{"type":"Feature","properties":{"name":"Avenue de Gradignan","distance":19.69989504871931,"sectionId":"16652-as=125253","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6256676068307824,44.803400556478046],[-0.6256572364531846,44.80357776485027]]}},{"type":"Feature","properties":{"name":"Avenue de Gradignan","distance":17.02753237624014,"sectionId":"22272-57283","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6254961069676005,44.80434026530025],[-0.6254913089998229,44.8043617661527],[-0.6254913737934205,44.80438345516219],[-0.6254981249364217,44.80440393855727],[-0.6255105870394615,44.804423349318945],[-0.625521936792281,44.8044350780614],[-0.6255354689330679,44.80444556811825],[-0.6255592725920494,44.80445854161158],[-0.6255814707323305,44.80446636389337]]}},{"type":"Feature","properties":{"name":"Avenue de Gradignan","distance":14.074580431265884,"sectionId":"22272-57281","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6254961069676005,44.80434026530025],[-0.6255111828394053,44.804318929105925],[-0.6255265575605203,44.80430387726369],[-0.6255408110952814,44.80429388318724],[-0.6255568796378143,44.80428539862231],[-0.6255725350617136,44.804279270471646],[-0.6255900706352978,44.804274329765185],[-0.6256127082144118,44.80427048785866],[-0.6256309069148038,44.80426916582181]]}},{"type":"Feature","properties":{"name":"Avenue Marc Desbats","distance":"Unknown","sectionId":"22272-as=2141","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6252798683845749,44.80426933817362],[-0.6254961069676005,44.80434026530025]]}},{"type":"Feature","properties":{"name":"Avenue de Gradignan","distance":17.02753237624014,"sectionId":"57283-22272","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6254961069676005,44.80434026530025],[-0.6254913089998229,44.8043617661527],[-0.6254913737934205,44.80438345516219],[-0.6254981249364217,44.80440393855727],[-0.6255105870394615,44.804423349318945],[-0.625521936792281,44.8044350780614],[-0.6255354689330679,44.80444556811825],[-0.6255592725920494,44.80445854161158],[-0.6255814707323305,44.80446636389337]]}},{"type":"Feature","properties":{"name":"Avenue de Gradignan","distance":15.378629584953051,"sectionId":"57283-16377","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6255814707323305,44.80446636389337],[-0.6255949032852566,44.80448789323362],[-0.6256155342448166,44.80460184989887]]}},{"type":"Feature","properties":{"name":"Avenue de Gradignan","distance":11.364577307353548,"sectionId":"57283-25024","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6257186658929844,44.80445471683499],[-0.6256929405630863,44.804464628936145],[-0.6256731164123094,44.80447004616434],[-0.6256533803629942,44.8044725894132],[-0.6256292429478596,44.80447355026168],[-0.6256116815454894,44.80447219595927],[-0.6255972920101133,44.80446997489925],[-0.6255814707323305,44.80446636389337]]}},{"type":"Feature","properties":{"name":"Rue François Rabelais","distance":10.12408994947424,"sectionId":"25688-19946","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5924389591219411,44.796194159508005],[-0.5923109617560379,44.79619270781825]]}},{"type":"Feature","properties":{"name":"Piste Cyclable Thouars","distance":52.93970658050486,"sectionId":"25688-25687","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5924110577336282,44.796670224070986],[-0.5924120055885662,44.79652299995097],[-0.5924389591219411,44.796194159508005]]}},{"type":"Feature","properties":{"name":"Rue François Rabelais","distance":59.72927421111016,"sectionId":"25688-19945","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.593193462358844,44.79621797596893],[-0.5924389591219411,44.796194159508005]]}},{"type":"Feature","properties":{"name":"Piste Cyclable Thouars","distance":280.1525325079538,"sectionId":"25688-25689","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5924389591219411,44.796194159508005],[-0.5925582154445792,44.795084814159736],[-0.5925434084053987,44.79490809036547],[-0.5925170135340905,44.794780917490456],[-0.592470576961654,44.79465086454193],[-0.5923499605559438,44.794414515873356],[-0.5920778183532163,44.793876133815616],[-0.5920473615655151,44.79385025139916],[-0.5919747227009714,44.793750392727745]]}},{"type":"Feature","properties":{"name":"Rue François Rabelais","distance":10.12408994947424,"sectionId":"19946-25688","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5924389591219411,44.796194159508005],[-0.5923109617560379,44.79619270781825]]}},{"type":"Feature","properties":{"name":"Avenue de Thouars","distance":28.138449386981,"sectionId":"19946-19617","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5923109617560379,44.79619270781825],[-0.5922783509610803,44.796444976952124]]}},{"type":"Feature","properties":{"name":"Avenue de Thouars","distance":29.613185157517822,"sectionId":"19946-20376","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5923415956072579,44.79592698879076],[-0.5923109617560379,44.79619270781825]]}},{"type":"Feature","properties":{"name":"Avenue du Colonel René Fonck","distance":55.28638726673037,"sectionId":"16429-16426","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.629585442485553,44.809839194970834],[-0.6298388909331807,44.80976642717627],[-0.6299778274662602,44.809713978744675],[-0.6301179324754076,44.809637890875145],[-0.6301869250232973,44.809594070291]]}},{"type":"Feature","properties":{"name":"Avenue du Colonel René Fonck","distance":6.276445936488337,"sectionId":"16429-24368","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6295164631937994,44.809867159990326],[-0.629585442485553,44.809839194970834]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Roger Marcade","distance":87.98652237629899,"sectionId":"16429-16542","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.629585442485553,44.809839194970834],[-0.6293560511976012,44.809064046406846]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Roger Marcade","distance":156.0429454454069,"sectionId":"16429-27893","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6301628211966482,44.811140317985114],[-0.6298387235875248,44.81085293357542],[-0.6297863851179157,44.81078947312329],[-0.6297691243754254,44.8106902110446],[-0.6297218291258211,44.810290847235564],[-0.629585442485553,44.809839194970834]]}},{"type":"Feature","properties":{"name":"Avenue du Colonel René Fonck","distance":55.28638726673037,"sectionId":"16426-16429","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.629585442485553,44.809839194970834],[-0.6298388909331807,44.80976642717627],[-0.6299778274662602,44.809713978744675],[-0.6301179324754076,44.809637890875145],[-0.6301869250232973,44.809594070291]]}},{"type":"Feature","properties":{"name":"Impasse du Colonel René Fonck","distance":35.14298769661052,"sectionId":"16426-16427","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6303966248624713,44.809837360339436],[-0.6303509051251266,44.809661984916325],[-0.630309504474032,44.80962952480249],[-0.6301869250232973,44.809594070291]]}},{"type":"Feature","properties":{"name":"Avenue du Colonel René Fonck","distance":75.65701896293842,"sectionId":"16426-16430","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6301869250232973,44.809594070291],[-0.6301881949740376,44.80953988936505],[-0.6300172199596933,44.80892484828186]]}},{"type":"Feature","properties":{"name":"Avenue de la Mission Haut-Brion","distance":222.83515132752922,"sectionId":"31584-25589","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6058105533287731,44.80886602147036],[-0.6059454930276448,44.80937647603922],[-0.6060900218720519,44.80999364468744],[-0.6063400223491766,44.810836189241876]]}},{"type":"Feature","properties":{"name":"Avenue de la Mission Haut-Brion","distance":27.752800795998343,"sectionId":"31584-16230","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6058105533287731,44.80886602147036],[-0.6057286659423373,44.80862305200351]]}},{"type":"Feature","properties":{"name":"Avenue de Candau","distance":188.60194061186672,"sectionId":"31584-16016","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6081571627327063,44.80861901020956],[-0.6079841940339353,44.80861927204642],[-0.6075546169061771,44.80865830059767],[-0.6068208514468201,44.808679498308685],[-0.6061346070944351,44.80882313845703],[-0.6058105533287731,44.80886602147036]]}},{"type":"Feature","properties":{"name":"Avenue de la Mission Haut-Brion","distance":222.83515132752922,"sectionId":"25589-31584","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6058105533287731,44.80886602147036],[-0.6059454930276448,44.80937647603922],[-0.6060900218720519,44.80999364468744],[-0.6063400223491766,44.810836189241876]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":21.91821412430275,"sectionId":"19899-20137","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5912290658125761,44.81024498686175],[-0.5911816076208583,44.81038304934558],[-0.5911565152469914,44.810435278298364]]}},{"type":"Feature","properties":{"name":"Avenue Espeleta","distance":109.88083172844547,"sectionId":"19899-19897","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5898432957757949,44.81017036133909],[-0.5912290658125761,44.81024498686175]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":14.403602600293043,"sectionId":"19899-19895","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5912520546581699,44.81011634475008],[-0.5912290658125761,44.81024498686175]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":21.91821412430275,"sectionId":"20137-19899","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5912290658125761,44.81024498686175],[-0.5911816076208583,44.81038304934558],[-0.5911565152469914,44.810435278298364]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":9.441953539718094,"sectionId":"20137-23170","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.591273267525887,44.81043447493098],[-0.5912467317430934,44.81042900696891],[-0.5912083993093299,44.810427154382694],[-0.5911704477705335,44.81043141532778],[-0.5911565152469914,44.810435278298364]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":21.54450347922228,"sectionId":"20137-24224","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5911565152469914,44.810435278298364],[-0.5911347603798242,44.8104415501873],[-0.5911030828954811,44.81045714351977],[-0.5910771330750205,44.81047733036299],[-0.5910582441855303,44.810501167810585],[-0.5910470956051911,44.81052737327255],[-0.5910444930150597,44.810554660169785],[-0.5910504787063213,44.81058167593988],[-0.5910571820878934,44.810593805537806]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":6.481419048348021,"sectionId":"29050-24223","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5912464814650292,44.810668722841385],[-0.591261564462835,44.810667075587695],[-0.5912972463689521,44.810656850784255],[-0.5913207195900397,44.8106456601919]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":7.369678143463108,"sectionId":"29050-24225","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5911550088205666,44.81066296284028],[-0.5911852801766597,44.81066948395665],[-0.5912236127698668,44.81067133655116],[-0.5912464814650292,44.810668722841385]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":6.481419048348021,"sectionId":"24223-29050","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5912464814650292,44.810668722841385],[-0.591261564462835,44.810667075587695],[-0.5912972463689521,44.810656850784255],[-0.5913207195900397,44.8106456601919]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":10.23221354600111,"sectionId":"24223-20139","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5913207195900397,44.8106456601919],[-0.5913289295122336,44.8106413473032],[-0.5913548793182154,44.81062116040356],[-0.5913738944233753,44.81059731891887],[-0.5913855063098329,44.810568396335654]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":"Unknown","sectionId":"24223-as=125540","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5912955110226233,44.81083616858027],[-0.5913207195900397,44.8106456601919]]}},{"type":"Feature","properties":{"name":"Cours Gambetta","distance":8.617587452334327,"sectionId":"27350-30130","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5909511668127475,44.812623544396445],[-0.5909411493675063,44.812604943427615],[-0.5909192519016513,44.81258050182881],[-0.590891021962493,44.81256004356215]]}},{"type":"Feature","properties":{"name":"Cours Gambetta","distance":17.526123305856608,"sectionId":"27350-23469","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5908991722573637,44.81276805557285],[-0.5909034472362737,44.812765578495956],[-0.5909293900218038,44.81274322998895],[-0.590948162073535,44.81271750456253],[-0.5909589520926906,44.81268959889512],[-0.5909614539990063,44.81266069371542],[-0.5909553673102153,44.81263205965662],[-0.5909511668127475,44.812623544396445]]}},{"type":"Feature","properties":{"name":"Allée du 7eme Art","distance":373.2933102355968,"sectionId":"27350-28940","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5909511668127475,44.812623544396445],[-0.5910638012599737,44.81257485773017],[-0.5912388657746035,44.8125004184211],[-0.5913181665871189,44.81245701767912],[-0.5917119486618941,44.812198391093595],[-0.5917754354442839,44.812134770482885],[-0.5918484956615023,44.812094809335896],[-0.592091543614231,44.81197615372202],[-0.5922883144237633,44.811854094556566],[-0.5924320910993154,44.811736591267085],[-0.5925403396734101,44.81162570483094],[-0.5926239454592466,44.811566132554546],[-0.5927334378641754,44.8114975451563],[-0.5928350152651911,44.81140146238646],[-0.592902132312796,44.81130475640597],[-0.5929916653465276,44.81112915117395],[-0.5930532642854286,44.81102919626336],[-0.5931454559922102,44.81095106570616],[-0.5932376196923449,44.810898879568605],[-0.5933332085698515,44.81086307015932],[-0.5935603093493157,44.81080743181822],[-0.5936800687216522,44.81076959737419],[-0.5938280368006075,44.81070519819918],[-0.5939750321222723,44.810623173474006],[-0.5941450725904092,44.810500784290554],[-0.5943043354637455,44.81037197922775]]}},{"type":"Feature","properties":{"name":"Cours Gambetta","distance":8.617587452334327,"sectionId":"30130-27350","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5909511668127475,44.812623544396445],[-0.5909411493675063,44.812604943427615],[-0.5909192519016513,44.81258050182881],[-0.590891021962493,44.81256004356215]]}},{"type":"Feature","properties":{"name":"Cours Gambetta","distance":7.9504914545686685,"sectionId":"30130-30132","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.590891021962493,44.81256004356215],[-0.5908567345623567,44.81254392026931],[-0.5908188678605452,44.81253331486465],[-0.5908003747528613,44.81253101600426]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":194.2910124716901,"sectionId":"30130-as=125540","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.590891021962493,44.81256004356215],[-0.5911431977987415,44.8116209964151],[-0.5911505427980376,44.81151545879639],[-0.5911646091488846,44.81141421307799],[-0.5912376563349585,44.811148597543365],[-0.5912955110226233,44.81083616858027],[-0.5912955110226233,44.81083616858027]]}},{"type":"Feature","properties":{"name":"Avenue de Brivazac","distance":199.02901913711054,"sectionId":"16186-16183","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6167453060802395,44.80336708893274],[-0.6166797655074852,44.803447815757075],[-0.6166798438931331,44.80350150287981],[-0.6166915313790807,44.80356274816857],[-0.6172260327789955,44.80500699088302],[-0.61722735111803,44.80504009959485],[-0.617199029463869,44.805092888259615]]}},{"type":"Feature","properties":{"name":"Avenue Marc Desbats","distance":87.75874012876531,"sectionId":"16186-16872","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6167453060802395,44.80336708893274],[-0.6171779755265052,44.80349701217258],[-0.6177762813257962,44.80365923002183]]}},{"type":"Feature","properties":{"name":"Avenue Marc Desbats","distance":25.858874372526277,"sectionId":"16186-as=3996","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6167453060802395,44.80336708893274],[-0.6167453060802395,44.80336708893274]]}},{"type":"Feature","properties":{"name":"Avenue de Brivazac","distance":199.02901913711054,"sectionId":"16183-16186","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6167453060802395,44.80336708893274],[-0.6166797655074852,44.803447815757075],[-0.6166798438931331,44.80350150287981],[-0.6166915313790807,44.80356274816857],[-0.6172260327789955,44.80500699088302],[-0.61722735111803,44.80504009959485],[-0.617199029463869,44.805092888259615]]}},{"type":"Feature","properties":{"name":"Avenue de Brivazac","distance":305.5670167354741,"sectionId":"16183-16182","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6182176013896765,44.80773911700815],[-0.6172808617504135,44.80516892842583],[-0.617199029463869,44.805092888259615]]}},{"type":"Feature","properties":{"name":"Avenue du Rond Point","distance":39.36168912296518,"sectionId":"16183-as=124591","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.617199029463869,44.805092888259615],[-0.6167260840569179,44.80520343908164]]}},{"type":"Feature","properties":{"name":"Rue Chateaubriand","distance":13.079771331209944,"sectionId":"16375-57263","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6276472320417161,44.80639863800813],[-0.6276292716732798,44.80639292359291],[-0.6276144333966495,44.80638954856195],[-0.6275955226731811,44.80638762585235],[-0.627580310507428,44.80638763521816],[-0.6275641854810309,44.80639030507034],[-0.6275476549826021,44.806394431655576],[-0.6275307443033792,44.806401874677405],[-0.6275170694821108,44.80641102002122],[-0.6275035249587216,44.80642437225543]]}},{"type":"Feature","properties":{"name":"Avenue Louis Laugaa","distance":146.25108063773922,"sectionId":"16375-34720","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6290182849240853,44.80555840129723],[-0.6285684873881706,44.80572598444604],[-0.6284511748392223,44.80577103070341],[-0.6283504602057898,44.80581644832542],[-0.6282244937130259,44.8058787957062],[-0.6281343999061584,44.80593711544333],[-0.6279950443851617,44.80603338386267],[-0.6279020485950477,44.80612271271428],[-0.6276472320417161,44.80639863800813]]}},{"type":"Feature","properties":{"name":"Rue Chateaubriand","distance":11.927777421518083,"sectionId":"16375-57261","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6276774713309989,44.806494623383934],[-0.6276840654164638,44.80648388856143],[-0.6276878142604473,44.806475412319465],[-0.6276904398259062,44.806463691563344],[-0.6276902463456826,44.806451538755084],[-0.627687401165344,44.80644029034312],[-0.6276831877805137,44.80643121913035],[-0.6276725314982629,44.80641760560021],[-0.6276611944043453,44.806408075452836],[-0.6276472320417161,44.80639863800813]]}},{"type":"Feature","properties":{"name":"Rue Chateaubriand","distance":13.079771331209944,"sectionId":"57263-16375","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6276472320417161,44.80639863800813],[-0.6276292716732798,44.80639292359291],[-0.6276144333966495,44.80638954856195],[-0.6275955226731811,44.80638762585235],[-0.627580310507428,44.80638763521816],[-0.6275641854810309,44.80639030507034],[-0.6275476549826021,44.806394431655576],[-0.6275307443033792,44.806401874677405],[-0.6275170694821108,44.80641102002122],[-0.6275035249587216,44.80642437225543]]}},{"type":"Feature","properties":{"name":"Rue Chateaubriand","distance":37.78754038329178,"sectionId":"57263-54607","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6271222134196999,44.80622321408799],[-0.6272030595003117,44.80626800982233],[-0.6272974297225392,44.806329029437876],[-0.6273927257335697,44.80638700142655],[-0.6275035249587216,44.80642437225543]]}},{"type":"Feature","properties":{"name":"Rue Chateaubriand","distance":16.319015111931712,"sectionId":"57263-22796","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6275035249587216,44.80642437225543],[-0.6274975301480122,44.80643487320401],[-0.6274934084498641,44.806446035910135],[-0.6274918741446912,44.80645539389038],[-0.6274934651770765,44.80647099766352],[-0.6274972406471625,44.806481374391794],[-0.6275030802182302,44.80649118592944],[-0.627509315722027,44.806498447789295],[-0.62751662546439,44.806505155452946],[-0.6275241500267995,44.80651068779218],[-0.6275358685874478,44.80651717212261],[-0.6275479303243285,44.80652210000882],[-0.627563540838725,44.80652638192112],[-0.6275920194000862,44.80652960157727]]}},{"type":"Feature","properties":{"name":"Avenue Jean Jaurès","distance":7.782558902004227,"sectionId":"16460-40117","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6294283912792256,44.80648281815557],[-0.6295206167811596,44.806458345196894]]}},{"type":"Feature","properties":{"name":"Avenue Jean Jaurès","distance":34.890826003994604,"sectionId":"16460-15808","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6290203614854815,44.80660240666163],[-0.6294283912792256,44.80648281815557]]}},{"type":"Feature","properties":{"name":"Rue Pierre Curie","distance":39.007641473679726,"sectionId":"16460-as=124799","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6294283912792256,44.80648281815557],[-0.6296508692524806,44.80679627089548]]}},{"type":"Feature","properties":{"name":"Rue Rosa Bonheur","distance":88.56248278298641,"sectionId":"16461-16768","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.628875764665801,44.807471374277796],[-0.6298909344003979,44.80713449809973]]}},{"type":"Feature","properties":{"name":"Rue Rosa Bonheur","distance":74.16498899229559,"sectionId":"16461-16885","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6298909344003979,44.80713449809973],[-0.6307440648849332,44.806857015563125]]}},{"type":"Feature","properties":{"name":"Rue Pierre Curie","distance":84.27768886797054,"sectionId":"16461-16462","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6298909344003979,44.80713449809973],[-0.6303581801530276,44.807816474705625]]}},{"type":"Feature","properties":{"name":"Rue Pierre Curie","distance":39.007641473679726,"sectionId":"16461-as=124799","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6296508692524806,44.80679627089548],[-0.6298909344003979,44.80713449809973]]}},{"type":"Feature","properties":{"name":"Avenue des Arts","distance":12.239494155079484,"sectionId":"25671-15961","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6093915158581251,44.79630839606761],[-0.609407816146981,44.796312112613],[-0.6094157740806402,44.796313931943324],[-0.6094330193994758,44.79631455567107],[-0.6094402478803415,44.796316848567315],[-0.6094651222442096,44.79631605907007],[-0.6094812810763949,44.79631347428736],[-0.6094968335321709,44.79630928725581],[-0.6095114120679069,44.79630368980656],[-0.6095368093002356,44.79629306465444]]}},{"type":"Feature","properties":{"name":"Avenue de la Paillère","distance":11.621961918660615,"sectionId":"25671-25672","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6093296767989641,44.79621991546355],[-0.6093291561101378,44.79624191223031],[-0.6093375415583543,44.79626470732654],[-0.6093461692478424,44.79627722527712],[-0.6093582367014488,44.79628810264326],[-0.6093717405532725,44.79629767325817],[-0.6093915158581251,44.79630839606761]]}},{"type":"Feature","properties":{"name":"Avenue de Villemejan","distance":256.5698737182701,"sectionId":"25671-23216","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6093915158581251,44.79630839606761],[-0.6089633352782533,44.79677248997531],[-0.6086748268046032,44.79707693717378],[-0.6084836211205795,44.79728253800702],[-0.6084264316418591,44.797326961844696],[-0.6083631987544722,44.797375901382935],[-0.6077348722450214,44.798054701993905],[-0.6075668450194411,44.79821632599034]]}},{"type":"Feature","properties":{"name":"Avenue des Arts","distance":12.239494155079484,"sectionId":"15961-25671","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6093915158581251,44.79630839606761],[-0.609407816146981,44.796312112613],[-0.6094157740806402,44.796313931943324],[-0.6094330193994758,44.79631455567107],[-0.6094402478803415,44.796316848567315],[-0.6094651222442096,44.79631605907007],[-0.6094812810763949,44.79631347428736],[-0.6094968335321709,44.79630928725581],[-0.6095114120679069,44.79630368980656],[-0.6095368093002356,44.79629306465444]]}},{"type":"Feature","properties":{"name":"Avenue de la Paillère","distance":12.745380366165517,"sectionId":"15961-25669","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6095368093002356,44.79629306465444],[-0.6095466807126192,44.796278968639925],[-0.6095582185245817,44.79626319823893],[-0.6095648681782163,44.79624614166186],[-0.6095662902799633,44.79622844026168],[-0.6095644165390834,44.79621669886626],[-0.6095572807265902,44.796199719513616],[-0.6095480015968218,44.796184880097506]]}},{"type":"Feature","properties":{"name":"Avenue des Arts","distance":"Unknown","sectionId":"15961-as=125323","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6098558033544615,44.79649787728235],[-0.6095368093002356,44.79629306465444]]}},{"type":"Feature","properties":{"name":"Rue Auguste Renoir","distance":123.84805659274939,"sectionId":"15979-15980","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6050567334529893,44.796471117352944],[-0.6044920844667878,44.796098687245035],[-0.6044886120736285,44.79605528735255],[-0.6047473209493885,44.79584863480862],[-0.6047700509299112,44.79581557460453],[-0.6048339085700761,44.795610684071555]]}},{"type":"Feature","properties":{"name":"Rue Auguste Renoir","distance":91.31997892889466,"sectionId":"15979-15978","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6059079132524073,44.79656781491607],[-0.6056337756651824,44.79677658077793],[-0.6055341462595111,44.79678775689993],[-0.6050567334529893,44.796471117352944]]}},{"type":"Feature","properties":{"name":"Allée Eugène Delacroix","distance":69.565360288823,"sectionId":"15979-16600","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6050567334529893,44.796471117352944],[-0.6052886303193759,44.796303058213795],[-0.6054086379978214,44.795921806801715]]}},{"type":"Feature","properties":{"name":"Rue Auguste Renoir","distance":123.84805659274939,"sectionId":"15980-15979","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6050567334529893,44.796471117352944],[-0.6044920844667878,44.796098687245035],[-0.6044886120736285,44.79605528735255],[-0.6047473209493885,44.79584863480862],[-0.6047700509299112,44.79581557460453],[-0.6048339085700761,44.795610684071555]]}},{"type":"Feature","properties":{"name":"Avenue de la Paillère","distance":14.4582020421248,"sectionId":"15980-as=124587","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6048339085700761,44.795610684071555],[-0.6046553414757291,44.795582789032636]]}},{"type":"Feature","properties":{"name":"Avenue de la Paillère","distance":79.53685692033753,"sectionId":"15980-as=128440","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6053275826400447,44.7956882415242],[-0.6048339085700761,44.795610684071555]]}},{"type":"Feature","properties":{"name":"Rue du Clos du Haut-Carre","distance":78.2196126196692,"sectionId":"19802-19803","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5953333058379465,44.810684745640245],[-0.5953186101308662,44.810735205701064],[-0.5952979737254277,44.81081621119665],[-0.5952878598298705,44.81084274475754],[-0.5952745323810137,44.810868479065086],[-0.5952582383651411,44.81089331622957],[-0.5952388402650163,44.81091708043319],[-0.5952220354169286,44.81094184365469],[-0.5952107623447859,44.81096805351509],[-0.5952051137065719,44.81099516659442],[-0.5952051821639053,44.811022639472654],[-0.5952101706753147,44.81104986676603],[-0.5952544882123809,44.811267365576846],[-0.5952561817644154,44.81129451684607],[-0.595254869181587,44.81137085787207]]}},{"type":"Feature","properties":{"name":"Rue du Haut Carre","distance":33.044654092272836,"sectionId":"19802-19848","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5953333058379465,44.810684745640245],[-0.5956192017505934,44.81079876111444],[-0.5957016899524444,44.81082479978316]]}},{"type":"Feature","properties":{"name":"Rue du Haut Carre","distance":80.57365087120077,"sectionId":"19802-20053","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5944407225173641,44.81033496976032],[-0.5947431460640369,44.810446213011325],[-0.5953333058379465,44.810684745640245]]}},{"type":"Feature","properties":{"name":"Rue du Clos du Haut-Carre","distance":78.2196126196692,"sectionId":"19803-19802","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5953333058379465,44.810684745640245],[-0.5953186101308662,44.810735205701064],[-0.5952979737254277,44.81081621119665],[-0.5952878598298705,44.81084274475754],[-0.5952745323810137,44.810868479065086],[-0.5952582383651411,44.81089331622957],[-0.5952388402650163,44.81091708043319],[-0.5952220354169286,44.81094184365469],[-0.5952107623447859,44.81096805351509],[-0.5952051137065719,44.81099516659442],[-0.5952051821639053,44.811022639472654],[-0.5952101706753147,44.81104986676603],[-0.5952544882123809,44.811267365576846],[-0.5952561817644154,44.81129451684607],[-0.595254869181587,44.81137085787207]]}},{"type":"Feature","properties":{"name":"Rond-point Crespy","distance":18.32348562710419,"sectionId":"19816-58724","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5859312438765092,44.80662709269295],[-0.5859313826052069,44.80662698477916],[-0.5859627641181854,44.80661152830284],[-0.5859981865173716,44.80660143039401],[-0.5860358718281484,44.80659719751367],[-0.5860739352224983,44.806599042222686],[-0.5861104728531408,44.806606871409166],[-0.5861456236711587,44.80662154869525]]}},{"type":"Feature","properties":{"name":"Rue Peydavant","distance":86.66547231056929,"sectionId":"19816-as=128590","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5861456236711587,44.80662154869525],[-0.586211031012847,44.80655967750731],[-0.5864038006426242,44.80620662323543],[-0.5864346295520101,44.80611232650015],[-0.5864736482133087,44.80588680315619]]}},{"type":"Feature","properties":{"name":"Rond-point Crespy","distance":15.471541935866556,"sectionId":"19816-as=3811","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5861456236711587,44.80662154869525],[-0.5861717946848317,44.80663862858331],[-0.5861935059276961,44.80666095992945],[-0.5862076905591813,44.80668617698043],[-0.586213624511145,44.80671301440007],[-0.5862110459478397,44.806740111203695],[-0.5862094348735556,44.806745356618016]]}},{"type":"Feature","properties":{"name":"Rond-point Crespy","distance":11.476779735154537,"sectionId":"58723-19812","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5862094348735556,44.806745356618016],[-0.586200048323218,44.80676612222467],[-0.5861811951663501,44.80678973251775],[-0.586155438948151,44.80680977701848],[-0.5861240457568794,44.80682526250225]]}},{"type":"Feature","properties":{"name":"Rond-point Crespy","distance":0.596380329754069,"sectionId":"58723-as=3811","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5862094348735556,44.806745356618016],[-0.5862094348735556,44.806745356618016]]}},{"type":"Feature","properties":{"name":"Avenue Maréchal Leclerc","distance":116.68357482601732,"sectionId":"58723-as=4025","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5862094348735556,44.806745356618016],[-0.5863008390895252,44.80675851632417],[-0.5866327237521493,44.80683138086207],[-0.5870359638241108,44.80697301231156],[-0.5875561706922359,44.8071642442764],[-0.5875561706922359,44.8071642442764]]}},{"type":"Feature","properties":{"name":"Rue Paul Doumer","distance":45.74990410621882,"sectionId":"17232-17251","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6112758976534942,44.812906173888436],[-0.610887609474551,44.81260077766566]]}},{"type":"Feature","properties":{"name":"Rue du Parc Haut-Brion","distance":199.5260238404179,"sectionId":"17232-as=126201","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6112758976534942,44.812906173888436],[-0.6124513569495835,44.8124584335045],[-0.612483879645363,44.812452356036964],[-0.6125095873130819,44.81245667436025],[-0.6125343644315607,44.81246633712406],[-0.6125570029779188,44.812488319078504],[-0.6131319346018702,44.81312550824983]]}},{"type":"Feature","properties":{"name":"Rue du Parc Haut-Brion","distance":84.11355348902423,"sectionId":"16948-as=126201","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6131319346018702,44.81312550824983],[-0.6131783922998356,44.81317699595155]]}},{"type":"Feature","properties":{"name":"Rue André Pujol","distance":92.57940859568856,"sectionId":"17246-27888","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6324496511934334,44.80593829283401],[-0.6324844789986086,44.80605924437815],[-0.6325908846172884,44.80652085973066],[-0.6325879215274339,44.80659833652428],[-0.6325669597352549,44.80664521908078],[-0.6325405304841869,44.80668164633392],[-0.6324539626388954,44.80672359754805]]}},{"type":"Feature","properties":{"name":"Rue André Pujol","distance":65.5359256494749,"sectionId":"17246-35011","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6324496511934334,44.80593829283401],[-0.632434424831285,44.80579104134143],[-0.6324194213976093,44.805679455993634],[-0.6323806819730596,44.805534576928295],[-0.6323132574139818,44.80535818369297]]}},{"type":"Feature","properties":{"name":"Avenue Pasteur","distance":41.034681303756415,"sectionId":"17246-as=126949","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6328797824686113,44.80591535507432],[-0.6324496511934334,44.80593829283401]]}},{"type":"Feature","properties":{"name":"Avenue Pasteur","distance":79.42129283404606,"sectionId":"17246-as=126174","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6324496511934334,44.80593829283401],[-0.6322783750644018,44.805949257790886],[-0.6319962683258628,44.80598862481973],[-0.6315741973873511,44.806051918242034],[-0.631467218957927,44.806079206126995],[-0.631467218957927,44.806079206126995]]}},{"type":"Feature","properties":{"name":"Avenue Roger Cohé","distance":94.25903082057917,"sectionId":"17247-16492","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6317468675861465,44.80689859927188],[-0.6313355096094503,44.80614980310704],[-0.6313232630557205,44.80610605296365]]}},{"type":"Feature","properties":{"name":"Avenue Pasteur","distance":11.891286751816267,"sectionId":"17247-16402","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6313232630557205,44.80610605296365],[-0.6311754385788592,44.80612572631919]]}},{"type":"Feature","properties":{"name":"Avenue Pasteur","distance":"Unknown","sectionId":"17247-as=126174","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.631467218957927,44.806079206126995],[-0.6313232630557205,44.80610605296365]]}},{"type":"Feature","properties":{"name":"Rue de l'Amiral Prouhet","distance":37.92523481805721,"sectionId":"22264-22265","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6288534679758239,44.80246991038936],[-0.6293327530723806,44.80245758969772]]}},{"type":"Feature","properties":{"name":"Rue de l'Amiral Prouhet","distance":207.29058228833208,"sectionId":"22264-15841","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6270386649190198,44.803331257509726],[-0.6287231002914556,44.8030738482182],[-0.6287819529086899,44.80305323288457],[-0.628816560716313,44.803021984712565],[-0.6288258310307495,44.802995710832896],[-0.6288534679758239,44.80246991038936]]}},{"type":"Feature","properties":{"name":"Rue de l'Amiral Prouhet","distance":42.50463375230305,"sectionId":"22264-15842","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6288534679758239,44.80246991038936],[-0.6283159846498326,44.80246624911388]]}},{"type":"Feature","properties":{"name":"Rue de l'Amiral Prouhet","distance":37.92523481805721,"sectionId":"22265-22264","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6288534679758239,44.80246991038936],[-0.6293327530723806,44.80245758969772]]}},{"type":"Feature","properties":{"name":"Esplanade des Antilles","distance":51.84904710649565,"sectionId":"15878-15877","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6162816263743869,44.79540521177599],[-0.6168956162527585,44.795241569770326]]}},{"type":"Feature","properties":{"name":"Esplanade des Antilles","distance":19.310720034870663,"sectionId":"15878-15886","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6162000239246755,44.79524135064804],[-0.6162816263743869,44.79540521177599]]}},{"type":"Feature","properties":{"name":"Esplanade des Antilles","distance":166.38834338794933,"sectionId":"15878-15879","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6143089022443278,44.795925838115174],[-0.6162816263743869,44.79540521177599]]}},{"type":"Feature","properties":{"name":"Esplanade des Antilles","distance":51.84904710649565,"sectionId":"15877-15878","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6162816263743869,44.79540521177599],[-0.6168956162527585,44.795241569770326]]}},{"type":"Feature","properties":{"name":"Esplanade des Antilles","distance":18.963206451629926,"sectionId":"15877-15885","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6168116988168031,44.79508163835017],[-0.6168956162527585,44.795241569770326]]}},{"type":"Feature","properties":{"name":"Esplanade des Antilles","distance":131.08184263719258,"sectionId":"15877-15876","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6168956162527585,44.795241569770326],[-0.6184503784224944,44.79483267624182]]}},{"type":"Feature","properties":{"name":"Avenue Pierre Wiehn","distance":113.16340220517299,"sectionId":"16624-24283","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6311324422268266,44.79922387400509],[-0.631197549124675,44.79901009777785],[-0.6312081465817138,44.79895336681411],[-0.6312149688728318,44.79887486597169],[-0.6312129438674134,44.79882664559519],[-0.6312049291956946,44.79875564504234],[-0.6311809581239277,44.798672362038296],[-0.6311539946474614,44.79861187574718],[-0.6311424661557034,44.79858954266949],[-0.6311237850518203,44.79856212301061],[-0.6310558402779142,44.79847772165939],[-0.6309194649392065,44.79830722276473],[-0.6308977360020902,44.7982936832358],[-0.6308623117393518,44.79828166195963]]}},{"type":"Feature","properties":{"name":"Avenue Pierre Wiehn","distance":25.513186519073876,"sectionId":"16624-17421","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6310068594694284,44.79942967178872],[-0.6310581243917399,44.799395875030235],[-0.6311324422268266,44.79922387400509]]}},{"type":"Feature","properties":{"name":"Rue Fernand Monlun","distance":139.8126900019469,"sectionId":"16624-16094","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6328870155811008,44.79910027617863],[-0.6328130258522322,44.79912480038317],[-0.6311324422268266,44.79922387400509]]}},{"type":"Feature","properties":{"name":"Avenue Pierre Wiehn","distance":113.16340220517299,"sectionId":"24283-16624","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6311324422268266,44.79922387400509],[-0.631197549124675,44.79901009777785],[-0.6312081465817138,44.79895336681411],[-0.6312149688728318,44.79887486597169],[-0.6312129438674134,44.79882664559519],[-0.6312049291956946,44.79875564504234],[-0.6311809581239277,44.798672362038296],[-0.6311539946474614,44.79861187574718],[-0.6311424661557034,44.79858954266949],[-0.6311237850518203,44.79856212301061],[-0.6310558402779142,44.79847772165939],[-0.6309194649392065,44.79830722276473],[-0.6308977360020902,44.7982936832358],[-0.6308623117393518,44.79828166195963]]}},{"type":"Feature","properties":{"name":"Avenue Pierre Wiehn","distance":66.68044052500188,"sectionId":"24283-16089","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6308623117393518,44.79828166195963],[-0.6307665484608452,44.797685210289806]]}},{"type":"Feature","properties":{"name":"Avenue Pierre Wiehn","distance":9.648371741937538,"sectionId":"24283-15929","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6308623117393518,44.79828166195963],[-0.6308293046047101,44.7983019937443],[-0.6308179239110738,44.798328211198736],[-0.6308126080649018,44.79835630695447]]}},{"type":"Feature","properties":{"name":"Avenue Pierre Wiehn","distance":25.513186519073876,"sectionId":"17421-16624","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6310068594694284,44.79942967178872],[-0.6310581243917399,44.799395875030235],[-0.6311324422268266,44.79922387400509]]}},{"type":"Feature","properties":{"name":"Avenue Pierre Wiehn","distance":27.825808404776694,"sectionId":"17421-17298","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6310068594694284,44.79942967178872],[-0.6309711873600478,44.79967890203219]]}},{"type":"Feature","properties":{"name":"Avenue Pierre Wiehn","distance":121.71992100274726,"sectionId":"17421-15929","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6308126080649018,44.79835630695447],[-0.6308370291801229,44.798442728590366],[-0.6309016010460454,44.79909233469294],[-0.6309348584462041,44.79934918338002],[-0.63095750505447,44.79939737595474],[-0.6310068594694284,44.79942967178872]]}},{"type":"Feature","properties":{"name":"Avenue Pierre Wiehn","distance":27.825808404776694,"sectionId":"17298-17421","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6310068594694284,44.79942967178872],[-0.6309711873600478,44.79967890203219]]}},{"type":"Feature","properties":{"name":"Avenue Raymond Poincaré","distance":312.9066506720715,"sectionId":"17298-15930","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6309711873600478,44.79967890203219],[-0.6270247250366625,44.79947566576465]]}},{"type":"Feature","properties":{"name":"Avenue Pierre Wiehn","distance":92.76527351858567,"sectionId":"17298-17170","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6311166921227062,44.80050654248247],[-0.6309852322605088,44.79986573824809],[-0.6309706317758691,44.799784588297754],[-0.6309680186230336,44.799733053597684],[-0.6309711873600478,44.79967890203219]]}},{"type":"Feature","properties":{"name":"Rue du Pin Vert","distance":116.07514198528949,"sectionId":"16540-16428","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6268000100219724,44.80943708538574],[-0.6268778992087118,44.80961305766512],[-0.6271167540555563,44.81045664227241]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Nancel Pénard","distance":231.0220058386463,"sectionId":"16540-16539","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.624018432989894,44.81007380965053],[-0.6268000100219724,44.80943708538574]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Nancel Pénard","distance":153.53698558837024,"sectionId":"16540-16541","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6268000100219724,44.80943708538574],[-0.6283197798229173,44.80908035095809],[-0.6286497829100846,44.809017575311366]]}},{"type":"Feature","properties":{"name":"Rue du Pin Vert","distance":183.32000091745482,"sectionId":"16540-16951","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6257873812750893,44.80795235979245],[-0.6268000100219724,44.80943708538574]]}},{"type":"Feature","properties":{"name":"Avenue Jean Cordier","distance":175.90692936225122,"sectionId":"16540-30970","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6254496151827686,44.810692299541095],[-0.6266777308436225,44.80959944136287],[-0.6268000100219724,44.80943708538574]]}},{"type":"Feature","properties":{"name":"Rue du Pin Vert","distance":116.07514198528949,"sectionId":"16428-16540","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6268000100219724,44.80943708538574],[-0.6268778992087118,44.80961305766512],[-0.6271167540555563,44.81045664227241]]}},{"type":"Feature","properties":{"name":"Rue du Pin Vert","distance":147.95016643782583,"sectionId":"16428-16431","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6271167540555563,44.81045664227241],[-0.6274574680346562,44.81176640446349]]}},{"type":"Feature","properties":{"name":"Avenue du Colonel René Fonck","distance":201.07809904633865,"sectionId":"16428-24368","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6271167540555563,44.81045664227241],[-0.6286928870004799,44.81012441088032],[-0.6295164631937994,44.809867159990326]]}},{"type":"Feature","properties":{"name":"Rue du Pin Vert","distance":147.95016643782583,"sectionId":"16431-16428","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6271167540555563,44.81045664227241],[-0.6274574680346562,44.81176640446349]]}},{"type":"Feature","properties":{"name":"Avenue Colonel Robert Jacqui","distance":224.39002421432502,"sectionId":"16431-24367","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6274574680346562,44.81176640446349],[-0.6277362673801568,44.81171823690237],[-0.6292495941975884,44.81154772038825],[-0.6294347394499498,44.811517580596465],[-0.6295318646408904,44.81149241106393],[-0.6296135522985689,44.81145521238506],[-0.630105762234423,44.8111767311133]]}},{"type":"Feature","properties":{"name":"Rue du Pin Vert","distance":177.0871888978439,"sectionId":"16431-17040","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6274574680346562,44.81176640446349],[-0.6278458495754775,44.813336609117634]]}},{"type":"Feature","properties":{"name":"Esplanade Michel Montaigne","distance":"Unknown","sectionId":"27672-as=128118","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6171929150616469,44.79703612275271],[-0.6171929150616469,44.79703612275271]]}},{"type":"Feature","properties":{"name":"Avenue Léon Duguit","distance":193.72323680074578,"sectionId":"17043-15989","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6178180737614022,44.79822614617144],[-0.6155228591083164,44.798835583950826]]}},{"type":"Feature","properties":{"name":"Avenue Léon Duguit","distance":161.92766372085768,"sectionId":"17043-16523","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6197420186573377,44.79791674542534],[-0.6194786248644971,44.79783045100641],[-0.6193415050909358,44.79783292325726],[-0.6178180737614022,44.79822614617144]]}},{"type":"Feature","properties":{"name":"Esplanade Michel Montaigne","distance":"Unknown","sectionId":"17043-as=128118","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6171929150616469,44.79703612275271],[-0.6178180737614022,44.79822614617144]]}},{"type":"Feature","properties":{"name":"Rue Bengaline","distance":221.55682104739208,"sectionId":"16030-16031","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6198157907617171,44.80774853275552],[-0.6203579837622806,44.80579151082335]]}},{"type":"Feature","properties":{"name":"Avenue de Candau","distance":75.91587750981778,"sectionId":"16030-16224","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6207757593926647,44.80773671572647],[-0.6198157907617171,44.80774853275552]]}},{"type":"Feature","properties":{"name":"Avenue de Candau","distance":55.36448802283957,"sectionId":"16030-24401","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6198157907617171,44.80774853275552],[-0.6191155935746175,44.80774793270232]]}},{"type":"Feature","properties":{"name":"Rue Bengaline","distance":221.55682104739208,"sectionId":"16031-16030","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6198157907617171,44.80774853275552],[-0.6203579837622806,44.80579151082335]]}},{"type":"Feature","properties":{"name":"Avenue des Roses","distance":172.04781601700324,"sectionId":"16031-16390","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6225024468729391,44.80605356820456],[-0.6203579837622806,44.80579151082335]]}},{"type":"Feature","properties":{"name":"Avenue des Roses","distance":56.93956076179268,"sectionId":"16031-17395","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6203579837622806,44.80579151082335],[-0.6197821167735479,44.805715071577865],[-0.6196479004013254,44.80571168586368]]}},{"type":"Feature","properties":{"name":"Avenue Roger Cohé","distance":26.12007949530618,"sectionId":"16608-31144","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6322953326742453,44.807865072908555],[-0.6323687254836189,44.80800560234595],[-0.6323905696131303,44.80805102775719],[-0.6324014687974893,44.808087433957105]]}},{"type":"Feature","properties":{"name":"Rue Faust","distance":101.90428139214077,"sectionId":"16608-16591","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6324014687974893,44.808087433957105],[-0.6336468350273577,44.807851273265534]]}},{"type":"Feature","properties":{"name":"Avenue Roger Cohé","distance":72.26758823229832,"sectionId":"16608-as=126520","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6324014687974893,44.808087433957105],[-0.6326941613131767,44.808703809879916],[-0.6326941613131767,44.808703809879916]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Nancel Pénard","distance":71.96085736034365,"sectionId":"16546-16547","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6328764318135781,44.80911814029118],[-0.6337864428814863,44.80910835023672]]}},{"type":"Feature","properties":{"name":"Avenue Roger Cohé","distance":227.7540824059606,"sectionId":"16546-16434","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6328764318135781,44.80911814029118],[-0.6328727374500808,44.80925428511151],[-0.6329473572416371,44.810243456326134],[-0.6329810111493155,44.810428044560325],[-0.633028961347352,44.8105402891574],[-0.633114214193189,44.81066611608326],[-0.6332377179105999,44.81086071646261],[-0.6334066349679124,44.81109917839348]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Nancel Pénard","distance":89.8509525841441,"sectionId":"16546-16545","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6318755916354046,44.80876490225784],[-0.6322626407585338,44.80897892416717],[-0.6324363146384291,44.80903598643754],[-0.6328764318135781,44.80911814029118]]}},{"type":"Feature","properties":{"name":"Avenue Roger Cohé","distance":"Unknown","sectionId":"16546-as=126520","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6326941613131767,44.808703809879916],[-0.6328764318135781,44.80911814029118]]}},{"type":"Feature","properties":{"name":"Avenue Roger Cohé","distance":9.917762670243626,"sectionId":"27886-16492","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6318478280770993,44.80695050696602],[-0.6317965963954754,44.80693070283317],[-0.6317468675861465,44.80689859927188]]}},{"type":"Feature","properties":{"name":"Avenue Roger Cohé","distance":75.84629991210275,"sectionId":"27886-17129","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6318478280770993,44.80695050696602],[-0.6318344475459178,44.80697111302237],[-0.6318300204253717,44.806993234869886],[-0.6318324084723742,44.807027120272075],[-0.6318451084747093,44.80705797388971],[-0.6319203834717184,44.807210334545076],[-0.6321117556848382,44.80756041567953],[-0.6321402210686764,44.8075884236563]]}},{"type":"Feature","properties":{"name":"Rue Etienne Marcel","distance":27.13306703172629,"sectionId":"27886-27887","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6318478280770993,44.80695050696602],[-0.6318708487837335,44.806920224357256],[-0.6319028551906827,44.80689397884912],[-0.6319438869450177,44.8068723997569],[-0.6319909504692127,44.806852159469905],[-0.6321219936157869,44.80681716620748]]}},{"type":"Feature","properties":{"name":"Avenue Roger Cohé","distance":75.84629991210275,"sectionId":"17129-27886","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6318478280770993,44.80695050696602],[-0.6318344475459178,44.80697111302237],[-0.6318300204253717,44.806993234869886],[-0.6318324084723742,44.807027120272075],[-0.6318451084747093,44.80705797388971],[-0.6319203834717184,44.807210334545076],[-0.6321117556848382,44.80756041567953],[-0.6321402210686764,44.8075884236563]]}},{"type":"Feature","properties":{"name":"Avenue Roger Cohé","distance":33.104574154062476,"sectionId":"17129-31144","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6321402210686764,44.8075884236563],[-0.6321842848015413,44.807655120050576],[-0.6322250455002194,44.80773165097806],[-0.6322953326742453,44.807865072908555]]}},{"type":"Feature","properties":{"name":"Rue des Marguerites","distance":109.39344950645419,"sectionId":"17129-16590","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6334931477747833,44.807382520972965],[-0.6321402210686764,44.8075884236563]]}},{"type":"Feature","properties":{"name":"Cours Lamartine","distance":126.51072533236275,"sectionId":"16128-15831","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6276631170427468,44.80521949652113],[-0.6277925832853277,44.805231852482606],[-0.6281727174855826,44.80523008675701],[-0.6288757892038233,44.80517225416577],[-0.6292569572675963,44.805162794691796]]}},{"type":"Feature","properties":{"name":"Cours Lamartine","distance":113.26321748708958,"sectionId":"16128-16376","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6264257207198175,44.80572872752301],[-0.6264452093200988,44.80572089964615],[-0.6275234082952711,44.805253499889325],[-0.6276631170427468,44.80521949652113]]}},{"type":"Feature","properties":{"name":"Rue Bossuet","distance":72.20255039086244,"sectionId":"16128-16038","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6276631170427468,44.80521949652113],[-0.6273931098724322,44.80459851259172]]}},{"type":"Feature","properties":{"name":"Cours Lamartine","distance":126.51072533236275,"sectionId":"15831-16128","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6276631170427468,44.80521949652113],[-0.6277925832853277,44.805231852482606],[-0.6281727174855826,44.80523008675701],[-0.6288757892038233,44.80517225416577],[-0.6292569572675963,44.805162794691796]]}},{"type":"Feature","properties":{"name":"Cours Lamartine","distance":59.88677096893184,"sectionId":"15831-16190","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6292569572675963,44.805162794691796],[-0.6294068853773797,44.80514440789779],[-0.6295324341583451,44.80511463755945],[-0.6299514419578577,44.8049585728237]]}},{"type":"Feature","properties":{"name":"Rue Alfred de Musset","distance":140.57809099764344,"sectionId":"15831-15830","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6288499444519569,44.80393154326636],[-0.6292470081060891,44.80508717146898],[-0.6292569572675963,44.805162794691796]]}},{"type":"Feature","properties":{"name":"Cours Lamartine","distance":180.45581910485944,"sectionId":"17022-16376","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6242857966554964,44.80616683431997],[-0.624392730730364,44.806177029491856],[-0.6245481874042036,44.80616802192599],[-0.6255918904816619,44.80607557265362],[-0.6256963685750807,44.806042694812106],[-0.6264257207198175,44.80572872752301]]}},{"type":"Feature","properties":{"name":"Avenue de Gradignan","distance":91.17864248869049,"sectionId":"17022-16040","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6248421499497538,44.80544780398771],[-0.6242857966554964,44.80616683431997]]}},{"type":"Feature","properties":{"name":"Avenue de Gradignan","distance":50.78400965254912,"sectionId":"17022-as=3949","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6242857966554964,44.80616683431997],[-0.6239720212718814,44.80653986900685],[-0.623954917132629,44.8065586919272]]}},{"type":"Feature","properties":{"name":"Cours Lamartine","distance":113.26321748708958,"sectionId":"16376-16128","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6264257207198175,44.80572872752301],[-0.6264452093200988,44.80572089964615],[-0.6275234082952711,44.805253499889325],[-0.6276631170427468,44.80521949652113]]}},{"type":"Feature","properties":{"name":"Cours Lamartine","distance":180.45581910485944,"sectionId":"16376-17022","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6242857966554964,44.80616683431997],[-0.624392730730364,44.806177029491856],[-0.6245481874042036,44.80616802192599],[-0.6255918904816619,44.80607557265362],[-0.6256963685750807,44.806042694812106],[-0.6264257207198175,44.80572872752301]]}},{"type":"Feature","properties":{"name":"Rue Chateaubriand","distance":63.4453368256979,"sectionId":"16376-54606","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6264257207198175,44.80572872752301],[-0.6264898994294626,44.80581445866783],[-0.6265736345610354,44.80590495026556],[-0.6266235932582861,44.80595232858612],[-0.6266806804304974,44.80599557147015],[-0.6267695182097334,44.806053613885474],[-0.6269556598485034,44.80614553903033]]}},{"type":"Feature","properties":{"name":"Rue Chateaubriand","distance":13.899623907224552,"sectionId":"16376-as=129224","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.626032587655328,44.80521828645975],[-0.6264257207198175,44.80572872752301]]}},{"type":"Feature","properties":{"name":"Place du Cardinal","distance":87.38862507596312,"sectionId":"16251-57282","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6271324783500616,44.803995137202875],[-0.6270380147878877,44.803983960819586],[-0.6269731200970811,44.80396743227417],[-0.626866419482022,44.80396229516245],[-0.6260456600254464,44.80406568709261]]}},{"type":"Feature","properties":{"name":"Avenue du Cardinal","distance":74.11040159835807,"sectionId":"16251-15841","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6271324783500616,44.803995137202875],[-0.6270386649190198,44.803331257509726]]}},{"type":"Feature","properties":{"name":"Place du Cardinal","distance":6.236198105560703,"sectionId":"16251-16129","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.627149054686297,44.80405002871358],[-0.6271324783500616,44.803995137202875]]}},{"type":"Feature","properties":{"name":"Place du Cardinal","distance":87.38862507596312,"sectionId":"57282-16251","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6271324783500616,44.803995137202875],[-0.6270380147878877,44.803983960819586],[-0.6269731200970811,44.80396743227417],[-0.626866419482022,44.80396229516245],[-0.6260456600254464,44.80406568709261]]}},{"type":"Feature","properties":{"name":"Place du Cardinal","distance":33.73328729303415,"sectionId":"57282-16254","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6260456600254464,44.80406568709261],[-0.6256255858329896,44.804118601845786]]}},{"type":"Feature","properties":{"name":"Place du Cardinal","distance":40.30655702708203,"sectionId":"57282-57281","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6260456600254464,44.80406568709261],[-0.6258774818792617,44.804124254980074],[-0.625843488718329,44.80413950309265],[-0.625806609998064,44.80415991928146],[-0.6257720261608137,44.80418312606181],[-0.6257178324680197,44.80422772977319],[-0.6256920152543619,44.80424470067365],[-0.6256309069148038,44.80426916582181]]}},{"type":"Feature","properties":{"name":"Place Chambrelent","distance":27.5008358711396,"sectionId":"16291-16292","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6160451960339756,44.80552540298936],[-0.616069999748557,44.80551938959388],[-0.6161007793486125,44.805507781210345],[-0.6161284344207812,44.80549275891181],[-0.6161524880191527,44.80547478828108],[-0.6161722106322893,44.80545434292842],[-0.616186999033138,44.8054318924515],[-0.616196513849846,44.80540807822479],[-0.616200536358187,44.8053834477037],[-0.6161989853973469,44.80535872413398],[-0.6161900184432482,44.80532874127065]]}},{"type":"Feature","properties":{"name":"Avenue des Echoppes","distance":272.8165227219093,"sectionId":"16291-16021","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6160451960339756,44.80552540298936],[-0.6170217073769195,44.807881198466156]]}},{"type":"Feature","properties":{"name":"Place Chambrelent","distance":26.563748172572964,"sectionId":"16291-16294","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6157785186711434,44.80542352907227],[-0.6157824111233696,44.805433134314846],[-0.6157974823048867,44.805455536328],[-0.6158173545638234,44.805475803881514],[-0.6158415058467568,44.805493683320215],[-0.6158695121804675,44.80550846745477],[-0.6159003463623518,44.80551991868744],[-0.6159334750486757,44.80552760355621],[-0.6159678823114828,44.80553146427341],[-0.6160026728643501,44.80553134913436],[-0.6160451960339756,44.80552540298936]]}},{"type":"Feature","properties":{"name":"Place Chambrelent","distance":27.5008358711396,"sectionId":"16292-16291","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6160451960339756,44.80552540298936],[-0.616069999748557,44.80551938959388],[-0.6161007793486125,44.805507781210345],[-0.6161284344207812,44.80549275891181],[-0.6161524880191527,44.80547478828108],[-0.6161722106322893,44.80545434292842],[-0.616186999033138,44.8054318924515],[-0.616196513849846,44.80540807822479],[-0.616200536358187,44.8053834477037],[-0.6161989853973469,44.80535872413398],[-0.6161900184432482,44.80532874127065]]}},{"type":"Feature","properties":{"name":"Place Chambrelent","distance":26.90716823566718,"sectionId":"16292-16293","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6161900184432482,44.80532874127065],[-0.6161794303789566,44.80531124142981],[-0.6161618954250845,44.80528990871011],[-0.6161396857314758,44.80527070644408],[-0.6161136097680673,44.805254419674476],[-0.6160840576653555,44.80524121616066],[-0.6160519472549137,44.80523160721982],[-0.6160181738041459,44.80522574455226],[-0.6159833856512068,44.80522387779543],[-0.6159487193511826,44.80522597081409],[-0.615914663117892,44.80523173783854]]}},{"type":"Feature","properties":{"name":"Avenue du Rond Point","distance":39.36168912296518,"sectionId":"16292-as=124591","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6167260840569179,44.80520343908164],[-0.6161900184432482,44.80532874127065]]}},{"type":"Feature","properties":{"name":"Allée Miguel de Cervantes","distance":122.24059895474625,"sectionId":"31835-as=124808","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.61475110339749,44.79739329170675],[-0.6144349318392345,44.7968040173848],[-0.6144513877847124,44.79669719618234],[-0.6142608325506955,44.79636128142778]]}},{"type":"Feature","properties":{"name":"Avenue Jean Babin","distance":31.07118194722969,"sectionId":"15990-15879","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6143089022443278,44.795925838115174],[-0.6141607998750656,44.79618494001125]]}},{"type":"Feature","properties":{"name":"Avenue Jean Babin","distance":204.41777690072496,"sectionId":"15990-15960","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6141607998750656,44.79618494001125],[-0.6134275723343956,44.79739310400014],[-0.6133825259541782,44.797451557915835],[-0.6132884361869587,44.797530937927014],[-0.61320351519842,44.79757291229289],[-0.6131122312654099,44.79760824243035],[-0.6129888077446444,44.79763342325468],[-0.6128294430135697,44.797650377098066]]}},{"type":"Feature","properties":{"name":"Allée Miguel de Cervantes","distance":40.239246725839145,"sectionId":"15990-as=124808","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6142608325506955,44.79636128142778],[-0.6141607998750656,44.79618494001125]]}},{"type":"Feature","properties":{"name":"Rue de la Ramée","distance":88.74792181343699,"sectionId":"17059-17370","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6292460675686923,44.79350349109471],[-0.6303640321588959,44.79343483472454]]}},{"type":"Feature","properties":{"name":"Rue de la Ramée","distance":66.17748689982015,"sectionId":"17059-26709","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6284124019636882,44.793554507407194],[-0.6292460675686923,44.79350349109471]]}},{"type":"Feature","properties":{"name":"Rue de la Ramée","distance":88.74792181343699,"sectionId":"17370-17059","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6292460675686923,44.79350349109471],[-0.6303640321588959,44.79343483472454]]}},{"type":"Feature","properties":{"name":"Place du Théatre de Verdure","distance":160.05305428099138,"sectionId":"17370-23187","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6303640321588959,44.79343483472454],[-0.6302316808832789,44.792369582384545],[-0.6302505337432102,44.79224304303161],[-0.6302012372237766,44.79214525411156],[-0.630181560447226,44.792005531352444]]}},{"type":"Feature","properties":{"name":"Rue de la Ramée","distance":35.781469385964904,"sectionId":"17370-17372","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6303640321588959,44.79343483472454],[-0.6304017045255174,44.79375586260076]]}},{"type":"Feature","properties":{"name":"Rue de la Ramée","distance":34.846687565398106,"sectionId":"17370-27664","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6303640321588959,44.79343483472454],[-0.6308029509226473,44.79340748890225]]}},{"type":"Feature","properties":{"name":"Rue de la Ramée","distance":66.17748689982015,"sectionId":"26709-17059","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6284124019636882,44.793554507407194],[-0.6292460675686923,44.79350349109471]]}},{"type":"Feature","properties":{"name":"Rue de la Ramée","distance":45.730054349167304,"sectionId":"26709-25437","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.627836075908068,44.793587669035915],[-0.6284124019636882,44.793554507407194]]}},{"type":"Feature","properties":{"name":"Allée des Glycines","distance":158.79437446700734,"sectionId":"26709-26058","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6284124019636882,44.793554507407194],[-0.6282294451853828,44.79213080313704]]}},{"type":"Feature","properties":{"name":"Rue Léo Valentin","distance":28.894977038652918,"sectionId":"16435-17037","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6070114019224195,44.80985200795313],[-0.6067216609943213,44.810010552473784]]}},{"type":"Feature","properties":{"name":"Rue Léo Valentin","distance":69.81934642923306,"sectionId":"16435-17036","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6077160928261833,44.809473202346354],[-0.6070114019224195,44.80985200795313]]}},{"type":"Feature","properties":{"name":"Rue du Colonel Rozanoff","distance":62.63599041191104,"sectionId":"16435-16436","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6070114019224195,44.80985200795313],[-0.6068910981952097,44.80969493507652],[-0.6067962175351043,44.80952147165574],[-0.6067367308739857,44.809327157783876]]}},{"type":"Feature","properties":{"name":"Rue Léo Valentin","distance":28.894977038652918,"sectionId":"17037-16435","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6070114019224195,44.80985200795313],[-0.6067216609943213,44.810010552473784]]}},{"type":"Feature","properties":{"name":"Avenue Pey Berland","distance":15.456412544273274,"sectionId":"29759-17280","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6095170708821552,44.80091872951914],[-0.6095317575320273,44.80091484025157],[-0.6095570980646322,44.800905297959275],[-0.6095798648460617,44.80089304477661],[-0.6095995640297538,44.80087827654376],[-0.6096158449338255,44.800861454807595],[-0.6096279724225,44.80084296323347],[-0.60963791548459,44.800817874852086]]}},{"type":"Feature","properties":{"name":"Rue Robert Escarpit","distance":297.62452915871484,"sectionId":"29759-30942","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6095170708821552,44.80091872951914],[-0.609645861768104,44.80123173384342],[-0.6098627747233983,44.801652743087374],[-0.6100256344382521,44.80197025086304],[-0.6102145576305503,44.80231800974073],[-0.6102746480075385,44.802519869898916],[-0.6102833204074737,44.80270885886091],[-0.6102606287240187,44.80287587226174],[-0.6101937762554739,44.803418672063685],[-0.6101889075141375,44.80350458555031]]}},{"type":"Feature","properties":{"name":"Avenue Pey Berland","distance":1.0303369267916327,"sectionId":"29759-as=2847","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6095170708821552,44.80091872951914],[-0.6095170708821552,44.80091872951914]]}},{"type":"Feature","properties":{"name":"Avenue Pey Berland","distance":15.456412544273274,"sectionId":"17280-29759","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6095170708821552,44.80091872951914],[-0.6095317575320273,44.80091484025157],[-0.6095570980646322,44.800905297959275],[-0.6095798648460617,44.80089304477661],[-0.6095995640297538,44.80087827654376],[-0.6096158449338255,44.800861454807595],[-0.6096279724225,44.80084296323347],[-0.60963791548459,44.800817874852086]]}},{"type":"Feature","properties":{"name":"Avenue Pey Berland","distance":16.14959921660132,"sectionId":"17280-17749","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.60963791548459,44.800817874852086],[-0.6096391446131232,44.80080315232458],[-0.6096378667872699,44.80078274405728],[-0.6096320655610014,44.80076283968727],[-0.6096217634550005,44.80074379883161],[-0.6096073730735705,44.800726148890426],[-0.6095891807458483,44.800710421274296],[-0.6095588933797128,44.80069147420939]]}},{"type":"Feature","properties":{"name":"Avenue Pey Berland","distance":250.36012429637316,"sectionId":"17280-17007","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6124529785310876,44.80122124830705],[-0.6123028988161515,44.801027111820794],[-0.61214151397942,44.80090495024424],[-0.6119314358582492,44.800787127481435],[-0.6116782422348132,44.800694005068],[-0.611404100780211,44.80064821030148],[-0.6110793868824909,44.80065149438209],[-0.6099727350021602,44.800784006281695],[-0.60963791548459,44.800817874852086]]}},{"type":"Feature","properties":{"name":"Rue de Peybouquey","distance":70.2976867664331,"sectionId":"17119-36352","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6082347158446524,44.80920497076243],[-0.608323235867677,44.80983473148223]]}},{"type":"Feature","properties":{"name":"Rue de Peybouquey","distance":65.37169558099694,"sectionId":"17119-16016","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6081571627327063,44.80861901020956],[-0.6082347158446524,44.80920497076243]]}},{"type":"Feature","properties":{"name":"Place du Professeur Piéchaud","distance":50.68655859418028,"sectionId":"17119-17036","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6077160928261833,44.809473202346354],[-0.6082347158446524,44.80920497076243]]}},{"type":"Feature","properties":{"name":"Rue Marc Sangnier","distance":51.76872809811886,"sectionId":"17119-17118","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6082347158446524,44.80920497076243],[-0.6079744244836235,44.8092536744586],[-0.6075898372026082,44.809273619724856]]}},{"type":"Feature","properties":{"name":"Rue de Peybouquey","distance":70.2976867664331,"sectionId":"36352-17119","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6082347158446524,44.80920497076243],[-0.608323235867677,44.80983473148223]]}},{"type":"Feature","properties":{"name":"Rue de Peybouquey","distance":10.05528090169909,"sectionId":"36352-16440","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.608323235867677,44.80983473148223],[-0.6082974034579984,44.8099233740803]]}},{"type":"Feature","properties":{"name":"Rue du Commandant Lherminier","distance":79.44169384378566,"sectionId":"36352-22793","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6091806218940967,44.80948763867637],[-0.6087107356451487,44.80971568292245],[-0.608524361484987,44.80981113784823],[-0.6084380319378276,44.80983297405924],[-0.608323235867677,44.80983473148223]]}},{"type":"Feature","properties":{"name":"Rue de Peybouquey","distance":10.05528090169909,"sectionId":"16440-36352","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.608323235867677,44.80983473148223],[-0.6082974034579984,44.8099233740803]]}},{"type":"Feature","properties":{"name":"Rue de Peybouquey","distance":143.17741285173108,"sectionId":"16440-16284","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6082974034579984,44.8099233740803],[-0.6082220039483905,44.80995405184058],[-0.6075713543030989,44.810276376273286],[-0.6073338044080702,44.81047218280503],[-0.6071209203217991,44.81072648102644],[-0.6070065521135677,44.81079775978465]]}},{"type":"Feature","properties":{"name":"Rue du Professeur Esclangon","distance":242.236007409941,"sectionId":"16440-16439","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6082974034579984,44.8099233740803],[-0.6083296572291402,44.80994334021627],[-0.6083542670853637,44.809970575280886],[-0.6085033352425838,44.81021510544721],[-0.6085478765069215,44.810251437121984],[-0.6086281463910928,44.810274293978075],[-0.6087086123223199,44.81027804701107],[-0.6096690928376816,44.810170730948805],[-0.609762277969697,44.810129038191626],[-0.6098173368340993,44.810094861093866],[-0.609868930302305,44.810035660831055],[-0.6098806053932724,44.80997556539293],[-0.6096602097524809,44.80926099606958]]}},{"type":"Feature","properties":{"name":"Rue de Peybouquey","distance":143.17741285173108,"sectionId":"16284-16440","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6082974034579984,44.8099233740803],[-0.6082220039483905,44.80995405184058],[-0.6075713543030989,44.810276376273286],[-0.6073338044080702,44.81047218280503],[-0.6071209203217991,44.81072648102644],[-0.6070065521135677,44.81079775978465]]}},{"type":"Feature","properties":{"name":"Esplanade des Antilles","distance":18.963206451629926,"sectionId":"15885-15877","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6168116988168031,44.79508163835017],[-0.6168956162527585,44.795241569770326]]}},{"type":"Feature","properties":{"name":"Esplanade des Antilles","distance":130.86069869210408,"sectionId":"15885-15884","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6168116988168031,44.79508163835017],[-0.6183588167645683,44.79466389064747]]}},{"type":"Feature","properties":{"name":"Esplanade des Antilles","distance":51.52585191441833,"sectionId":"15885-15886","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6162000239246755,44.79524135064804],[-0.6168116988168031,44.79508163835017]]}},{"type":"Feature","properties":{"name":"Avenue Jean Lartaut","distance":161.4065690482161,"sectionId":"15885-16954","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6160580420874954,44.79373137093818],[-0.6165414159607582,44.79462615359431],[-0.6168116988168031,44.79508163835017]]}},{"type":"Feature","properties":{"name":"Esplanade des Antilles","distance":130.86069869210408,"sectionId":"15884-15885","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6168116988168031,44.79508163835017],[-0.6183588167645683,44.79466389064747]]}},{"type":"Feature","properties":{"name":"Esplanade des Antilles","distance":102.09282088760797,"sectionId":"15884-15883","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6183588167645683,44.79466389064747],[-0.6195693809825837,44.79434475553062]]}},{"type":"Feature","properties":{"name":"Esplanade des Antilles","distance":20.097295481467395,"sectionId":"15884-15876","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6183588167645683,44.79466389064747],[-0.6184503784224944,44.79483267624182]]}},{"type":"Feature","properties":{"name":"Esplanade des Antilles","distance":19.310720034870663,"sectionId":"15886-15878","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6162000239246755,44.79524135064804],[-0.6162816263743869,44.79540521177599]]}},{"type":"Feature","properties":{"name":"Esplanade des Antilles","distance":51.52585191441833,"sectionId":"15886-15885","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6162000239246755,44.79524135064804],[-0.6168116988168031,44.79508163835017]]}},{"type":"Feature","properties":{"name":"Esplanade des Antilles","distance":149.94565227312697,"sectionId":"15886-15887","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6144286227959143,44.79572258881573],[-0.6162000239246755,44.79524135064804]]}},{"type":"Feature","properties":{"name":"Avenue Camille Jullian","distance":122.35030655929091,"sectionId":"15886-24464","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6162000239246755,44.79524135064804],[-0.6156559924187647,44.79421016985492]]}},{"type":"Feature","properties":{"name":"Avenue Marc Desbats","distance":97.76427682426129,"sectionId":"16921-17072","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.618594700473303,44.80386687048051],[-0.6192476310239643,44.803967887880596],[-0.6194472370006355,44.80398297581156],[-0.6195972048874813,44.80398135618289],[-0.6197281520693905,44.8039730449495],[-0.6198124150619269,44.80396081435652]]}},{"type":"Feature","properties":{"name":"Rue du Jasmin","distance":"Unknown","sectionId":"16921-as=124815","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6198124150619269,44.80396081435652],[-0.6198124150619269,44.80396081435652]]}},{"type":"Feature","properties":{"name":"Avenue Marc Desbats","distance":242.97818208737084,"sectionId":"16921-as=126209","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6198124150619269,44.80396081435652],[-0.620246204442297,44.803864581263305],[-0.6203792673335272,44.80384160840961],[-0.620543049862054,44.803824233598675],[-0.6206963139697018,44.80382070591095],[-0.6208521062902216,44.80383124063021],[-0.621023654175631,44.80385892988657],[-0.6217801419272814,44.8040674385863],[-0.622785430389558,44.80418577153616],[-0.622785430389558,44.80418577153616]]}},{"type":"Feature","properties":{"name":"Avenue Pierre Corneille","distance":96.12281869498077,"sectionId":"16391-16653","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6234301620012386,44.80417829556763],[-0.6237420017448931,44.80334184354475]]}},{"type":"Feature","properties":{"name":"Avenue de Chiquet","distance":226.58752450479852,"sectionId":"16391-16390","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6225024468729391,44.80605356820456],[-0.6224613147631213,44.80599506275945],[-0.6224417892651352,44.805895782007745],[-0.6224407517219616,44.805808794384184],[-0.6224477000784474,44.805726056595354],[-0.6224749750294986,44.80563654574861],[-0.6226454477593392,44.80532285044612],[-0.6233837381286472,44.80430535103232],[-0.6234301620012386,44.80417829556763]]}},{"type":"Feature","properties":{"name":"Avenue Marc Desbats","distance":"Unknown","sectionId":"16391-as=126209","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.622785430389558,44.80418577153616],[-0.6234301620012386,44.80417829556763]]}},{"type":"Feature","properties":{"name":"Avenue Marc Desbats","distance":146.76883846933134,"sectionId":"16391-as=2141","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6234301620012386,44.80417829556763],[-0.624980290765997,44.804237624535524],[-0.6251384912586874,44.80424626573726],[-0.6252798683845749,44.80426933817362],[-0.6252798683845749,44.80426933817362]]}},{"type":"Feature","properties":{"name":"Avenue du Maréchal Juin","distance":5.5205971772193685,"sectionId":"25910-30140","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6278541662325295,44.793963642612205],[-0.6278533162913976,44.79391394341432]]}},{"type":"Feature","properties":{"name":"Avenue du Maréchal Juin","distance":7.4728868448321535,"sectionId":"25910-as=2848","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6278541662325295,44.793963642612205],[-0.6278562848933282,44.79403090537901]]}},{"type":"Feature","properties":{"name":"Avenue du Maréchal Juin","distance":5.5205971772193685,"sectionId":"30140-25910","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6278541662325295,44.793963642612205],[-0.6278533162913976,44.79391394341432]]}},{"type":"Feature","properties":{"name":"Rue de la Ramée","distance":36.265766462327065,"sectionId":"30140-25437","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.627836075908068,44.793587669035915],[-0.6278441251990456,44.79375379720857],[-0.6278533162913976,44.79391394341432]]}},{"type":"Feature","properties":{"name":"Avenue du Maréchal Lyautey","distance":50.57675627127995,"sectionId":"30099-26552","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6309071398690205,44.7941820380093],[-0.6310078893751916,44.79423899723361],[-0.6310697521341039,44.79424900309802],[-0.6312603473250071,44.79427615808597],[-0.6313290519388837,44.79427828818823],[-0.6313657294546688,44.7942580191304],[-0.6314170497640901,44.79416692679618]]}},{"type":"Feature","properties":{"name":"Rond-point de la Médaille Militaire","distance":41.302714366533486,"sectionId":"30099-26550","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6304296964116521,44.79432096689277],[-0.6304470149531787,44.794322756178836],[-0.6304773739582742,44.7943226877932],[-0.6305075121814364,44.79431911317031],[-0.6305362989393375,44.7943121584943],[-0.6309071398690205,44.7941820380093]]}},{"type":"Feature","properties":{"name":"Rond-point de la Médaille Militaire","distance":16.74557718950475,"sectionId":"30099-26549","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6309071398690205,44.7941820380093],[-0.6310172467659032,44.794148524309634],[-0.6310433213428046,44.794138683327134],[-0.6310669363967286,44.79412594809952],[-0.6310904512217805,44.79410961270501]]}},{"type":"Feature","properties":{"name":"Avenue du Maréchal Lyautey","distance":50.57675627127995,"sectionId":"26552-30099","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6309071398690205,44.7941820380093],[-0.6310078893751916,44.79423899723361],[-0.6310697521341039,44.79424900309802],[-0.6312603473250071,44.79427615808597],[-0.6313290519388837,44.79427828818823],[-0.6313657294546688,44.7942580191304],[-0.6314170497640901,44.79416692679618]]}},{"type":"Feature","properties":{"name":"Avenue du Maréchal Lyautey","distance":26.613009807414038,"sectionId":"26552-26549","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6310904512217805,44.79410961270501],[-0.631252066276045,44.79413463019979],[-0.6314170497640901,44.79416692679618]]}},{"type":"Feature","properties":{"name":"Avenue du Maréchal Lyautey","distance":84.75989291496792,"sectionId":"26552-17126","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6314170497640901,44.79416692679618],[-0.6317063869638696,44.794168947249176],[-0.6320306161316701,44.79417859070338],[-0.6324882849617394,44.79416964742149]]}},{"type":"Feature","properties":{"name":"Rue du Général André","distance":209.05681073602977,"sectionId":"19987-19986","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.598503457195701,44.805929589372],[-0.5984066689433065,44.80404866973753]]}},{"type":"Feature","properties":{"name":"Rue du Général André","distance":112.41173931887229,"sectionId":"19987-19730","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5984066689433065,44.80404866973753],[-0.5983820722771941,44.80357759664346],[-0.5979900250654584,44.80311454502185]]}},{"type":"Feature","properties":{"name":"Rue Jules Guesde","distance":93.57709122697675,"sectionId":"19987-19839","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5973690746633866,44.80445380231567],[-0.5984066689433065,44.80404866973753]]}},{"type":"Feature","properties":{"name":"Rue Jules Guesde","distance":130.9284931953083,"sectionId":"19987-22956","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5984066689433065,44.80404866973753],[-0.5997391280946534,44.803545193767775],[-0.5997742485059586,44.80353822685002],[-0.5998136485780937,44.80353697982322],[-0.5998485137892398,44.8035401101894],[-0.5998836905566615,44.80354620340311]]}},{"type":"Feature","properties":{"name":"Rue du Général Chanzy","distance":52.350074137502475,"sectionId":"19995-19996","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5859945919392777,44.80275327348517],[-0.5860531752910388,44.802720462658044],[-0.5860922950989269,44.80269688063008],[-0.5861217296874395,44.80264787986385],[-0.5862241014385443,44.80232760458696]]}},{"type":"Feature","properties":{"name":"Rue Peydavant","distance":102.21205816879394,"sectionId":"19995-19997","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5866414389109001,44.80354045736144],[-0.5865886070546378,44.803425467501455],[-0.5864069909231818,44.80313797836744],[-0.586373946364976,44.803103077728615],[-0.5859945919392777,44.80275327348517]]}},{"type":"Feature","properties":{"name":"Rue Peydavant","distance":96.51838968797838,"sectionId":"19995-as=128589","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5859945919392777,44.80275327348517],[-0.5857791225853631,44.80255170517815],[-0.5857474342805559,44.80251622112827],[-0.5857175619396152,44.80247941867424],[-0.585631840212864,44.8023319549606],[-0.5854061515207823,44.8019969743337]]}},{"type":"Feature","properties":{"name":"Rue du Général Chanzy","distance":52.350074137502475,"sectionId":"19996-19995","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5859945919392777,44.80275327348517],[-0.5860531752910388,44.802720462658044],[-0.5860922950989269,44.80269688063008],[-0.5861217296874395,44.80264787986385],[-0.5862241014385443,44.80232760458696]]}},{"type":"Feature","properties":{"name":"Rue de Tremeuge","distance":39.64622386485475,"sectionId":"19996-58725","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5862241014385443,44.80232760458696],[-0.5857400198724079,44.802234706479176]]}},{"type":"Feature","properties":{"name":"Rue de Tremeuge","distance":75.20454679017517,"sectionId":"19996-19998","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5871427200275997,44.802502850829214],[-0.5862241014385443,44.80232760458696]]}},{"type":"Feature","properties":{"name":"Rue du Général Chanzy","distance":168.97657599105867,"sectionId":"19996-19992","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5867477686237127,44.800852667230565],[-0.5862241014385443,44.80232760458696]]}},{"type":"Feature","properties":{"name":"Rue du Général Sarrail","distance":68.45118071458721,"sectionId":"20004-37097","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5892437059848279,44.799063900248946],[-0.5883960860467061,44.79893904008061]]}},{"type":"Feature","properties":{"name":"Rue du Maréchal Foch","distance":91.45311678617169,"sectionId":"20004-19575","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5892437059848279,44.799063900248946],[-0.5895145995675709,44.798263440100435]]}},{"type":"Feature","properties":{"name":"Rue du Général Sarrail","distance":55.27686022048643,"sectionId":"20004-20002","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.58992678783263,44.799169445830465],[-0.5892437059848279,44.799063900248946]]}},{"type":"Feature","properties":{"name":"Rue du Maréchal Foch","distance":137.2763505251308,"sectionId":"20004-20170","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5888327396472829,44.80026468961341],[-0.5892437059848279,44.799063900248946]]}},{"type":"Feature","properties":{"name":"Rue du Général Sarrail","distance":68.45118071458721,"sectionId":"37097-20004","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5892437059848279,44.799063900248946],[-0.5883960860467061,44.79893904008061]]}},{"type":"Feature","properties":{"name":"Rue du Général Sarrail","distance":43.20223509254898,"sectionId":"37097-19947","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5883960860467061,44.79893904008061],[-0.5880565579603034,44.798887055557884],[-0.587860065877693,44.79886460859568]]}},{"type":"Feature","properties":{"name":"Rue du Général Margueritte","distance":135.90582525114897,"sectionId":"37097-19999","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5880356658461944,44.80012688090375],[-0.5880231571514054,44.80010682695326],[-0.588015116049456,44.80008537090995],[-0.5880124057429235,44.80006825077964],[-0.588013315841325,44.80004831397582],[-0.5883960860467061,44.79893904008061]]}},{"type":"Feature","properties":{"name":"Allée Serpentine","distance":310.1701651328947,"sectionId":"24279-24276","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6275361969122202,44.79722248075931],[-0.6273012065458757,44.79771850090848],[-0.6270944091415902,44.798047326511444],[-0.6269131893382579,44.79829606218226],[-0.6267074536947084,44.79849098854267],[-0.6263481581518827,44.798742879546126],[-0.625708373280292,44.799153971622026],[-0.6254359480854346,44.79930255649085],[-0.6252628069394983,44.79941635645798]]}},{"type":"Feature","properties":{"name":"Allée du Lartigon","distance":250.92355401999794,"sectionId":"24279-24278","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6306944067410274,44.79700575772121],[-0.6275361969122202,44.79722248075931]]}},{"type":"Feature","properties":{"name":"Allée Serpentine","distance":390.01731907776434,"sectionId":"24279-26548","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6293356239872048,44.7942267997652],[-0.6293462538206912,44.79433537202754],[-0.6293285258844772,44.794355215794624],[-0.6291488154746742,44.794440675501676],[-0.6289672565968061,44.79453898581649],[-0.628513743393875,44.79481100745702],[-0.6280734353191624,44.795192418121346],[-0.6277411178412703,44.79557506630393],[-0.6274711102434121,44.79596482426899],[-0.6274607879048836,44.79611847626145],[-0.6274827948689493,44.79627118709094],[-0.6275300466143741,44.79645714434769],[-0.6275454519386845,44.79659943585607],[-0.6275492906190561,44.79681929818507],[-0.6275501744942098,44.79698817721839],[-0.6275361969122202,44.79722248075931]]}},{"type":"Feature","properties":{"name":"Allée Serpentine","distance":310.1701651328947,"sectionId":"24276-24279","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6275361969122202,44.79722248075931],[-0.6273012065458757,44.79771850090848],[-0.6270944091415902,44.798047326511444],[-0.6269131893382579,44.79829606218226],[-0.6267074536947084,44.79849098854267],[-0.6263481581518827,44.798742879546126],[-0.625708373280292,44.799153971622026],[-0.6254359480854346,44.79930255649085],[-0.6252628069394983,44.79941635645798]]}},{"type":"Feature","properties":{"name":"Avenue Raymond Poincaré","distance":96.79854940376126,"sectionId":"24276-15937","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6252628069394983,44.79941635645798],[-0.6243497290246917,44.79999677088432]]}},{"type":"Feature","properties":{"name":"Avenue Raymond Poincaré","distance":139.70081354493462,"sectionId":"24276-15930","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6270247250366625,44.79947566576465],[-0.6254249678062518,44.79940560197039],[-0.6253323561851043,44.79940567155491],[-0.6252628069394983,44.79941635645798]]}},{"type":"Feature","properties":{"name":"Allée du Parc","distance":123.96479618047614,"sectionId":"24276-29865","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6251557220834865,44.79835525067678],[-0.6252235443623254,44.79853442725268],[-0.6253424211924866,44.79879512357346],[-0.6253570080443737,44.79883393507788],[-0.6253441336001597,44.79894911215404],[-0.6253006823439052,44.79913940284026],[-0.6252653167943789,44.799186653058726],[-0.6251934642305719,44.79927137007889],[-0.6251940218304239,44.799306394869575],[-0.6252216428839411,44.799351276935035],[-0.6252628069394983,44.79941635645798]]}},{"type":"Feature","properties":{"name":"Rue Camille Pelletan","distance":29.809434719346754,"sectionId":"19741-23469","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5911660667008316,44.8129569095402],[-0.591061768215042,44.81287534498284],[-0.5909861552343875,44.81283170009456],[-0.5908991722573637,44.81276805557285]]}},{"type":"Feature","properties":{"name":"Rue Camille Pelletan","distance":121.93017871115823,"sectionId":"19741-30033","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5911660667008316,44.8129569095402],[-0.5912935129941872,44.81307891065408],[-0.5914545851507416,44.813240927366664],[-0.5916959773634577,44.813485535309894],[-0.5917562264759109,44.813560833208086],[-0.5918219889374632,44.813653522968245],[-0.591936730460309,44.81381123670087],[-0.5919798225307895,44.81388536468162]]}},{"type":"Feature","properties":{"name":"Parking Eglise Notre Dame","distance":18.382092718490775,"sectionId":"19741-as=129005","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5911660667008316,44.8129569095402],[-0.5912914430355238,44.81289538911248],[-0.5913689948605365,44.81288077969289],[-0.5913689948605365,44.81288077969289]]}},{"type":"Feature","properties":{"name":"Parking Eglise Notre Dame","distance":28.212075997293212,"sectionId":"20542-20544","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5921025824436333,44.81289446071338],[-0.5921067490056824,44.81264047826045]]}},{"type":"Feature","properties":{"name":"Parking Eglise Notre Dame","distance":16.272237569613658,"sectionId":"20542-20543","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5921025824436333,44.81289446071338],[-0.5920974094795683,44.81304091711586]]}},{"type":"Feature","properties":{"name":"Parking Eglise Notre Dame","distance":"Unknown","sectionId":"20542-as=129005","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5913689948605365,44.81288077969289],[-0.5921025824436333,44.81289446071338]]}},{"type":"Feature","properties":{"name":"Impasse des Acacias","distance":12.096437637505472,"sectionId":"19552-19553","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.581117210519938,44.79888183393539],[-0.5811369777359245,44.79890472277522],[-0.5811497561818502,44.798933236572225],[-0.5811524997704511,44.79896314733159],[-0.5811476582560566,44.79898500943584]]}},{"type":"Feature","properties":{"name":"Impasse Primevères","distance":56.5240965161306,"sectionId":"19552-20308","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.581117210519938,44.79888183393539],[-0.5811542306378672,44.7988545445758],[-0.5813370818998064,44.79869411663818],[-0.5813616910905933,44.798674784880426],[-0.5813901576516096,44.79865848449798],[-0.5814225430180948,44.79864620445074],[-0.5815242089175237,44.79861678908058],[-0.5815915360821149,44.79860079621852],[-0.5816715327550772,44.79859323230218]]}},{"type":"Feature","properties":{"name":"Impasse des Acacias","distance":41.22823239556642,"sectionId":"19552-19551","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5807320014946282,44.79863200587201],[-0.581086460953338,44.79885730911431],[-0.581117210519938,44.79888183393539]]}},{"type":"Feature","properties":{"name":"Impasse des Acacias","distance":12.096437637505472,"sectionId":"19553-19552","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.581117210519938,44.79888183393539],[-0.5811369777359245,44.79890472277522],[-0.5811497561818502,44.798933236572225],[-0.5811524997704511,44.79896314733159],[-0.5811476582560566,44.79898500943584]]}},{"type":"Feature","properties":{"name":"Impasse des Acacias","distance":36.30525584771499,"sectionId":"19553-19554","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5811476582560566,44.79898500943584],[-0.5811458600226866,44.79899272299039],[-0.5811303789384671,44.7990205051733],[-0.5811081752372063,44.799045976754684],[-0.5810804613885764,44.79906828881808],[-0.581047582708136,44.79908688999771],[-0.5810113237821022,44.799101994341925],[-0.5808605655680199,44.79915583565918],[-0.5808249881772474,44.7991717292149],[-0.5808042810274717,44.79918463227966]]}},{"type":"Feature","properties":{"name":"Passage du Muguet","distance":39.03082572646891,"sectionId":"19553-20230","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5811476582560566,44.79898500943584],[-0.5812039803335847,44.798997558877595],[-0.5812381930856463,44.79902080355666],[-0.5812579836811633,44.79905017751328],[-0.581399142937162,44.799271566811626]]}},{"type":"Feature","properties":{"name":"Rue Robespierre","distance":42.627157119830365,"sectionId":"26647-20334","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5814737141394966,44.8081419763692],[-0.580958284944962,44.80802947790924]]}},{"type":"Feature","properties":{"name":"Rue Robespierre","distance":85.26112900003378,"sectionId":"26647-20102","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5825067803575857,44.808361672208974],[-0.582223347048623,44.80830700119719],[-0.5814737141394966,44.8081419763692]]}},{"type":"Feature","properties":{"name":"Rue Robespierre","distance":42.627157119830365,"sectionId":"20334-26647","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5814737141394966,44.8081419763692],[-0.580958284944962,44.80802947790924]]}},{"type":"Feature","properties":{"name":"Rue René Vache","distance":386.12691499394555,"sectionId":"20334-19954","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.580958284944962,44.80802947790924],[-0.5828735045100534,44.80483162648224]]}},{"type":"Feature","properties":{"name":"Rue Robespierre","distance":87.31619990921129,"sectionId":"20334-19648","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.580958284944962,44.80802947790924],[-0.5803759554584518,44.80790331877033],[-0.5802005205473478,44.80789028403128],[-0.5800638644317188,44.807898548845024],[-0.5798826958981265,44.80791136727445]]}},{"type":"Feature","properties":{"name":"Rue Ronsard","distance":260.7192480588784,"sectionId":"20328-19941","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6004554726115798,44.79519916794754],[-0.6001321486882959,44.79540452289199],[-0.5997934074083904,44.79563856069324],[-0.5996686147130225,44.79577556272885],[-0.5991991647159907,44.79643090777138],[-0.598876699509152,44.79680828903164],[-0.5986010282207422,44.79711248291793]]}},{"type":"Feature","properties":{"name":"Rue Rémi Belleau","distance":212.81310713888283,"sectionId":"20328-20162","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.602782077306796,44.79565498770984],[-0.6009368419951288,44.79497610594576],[-0.6008332212950126,44.79496587468037],[-0.6007391107869555,44.794988402491136],[-0.6004554726115798,44.79519916794754]]}},{"type":"Feature","properties":{"name":"Rue Ronsard","distance":186.69250154172965,"sectionId":"20328-20161","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6004554726115798,44.79519916794754],[-0.6025536281227533,44.79596940673287]]}},{"type":"Feature","properties":{"name":"Rue Ronsard","distance":260.7192480588784,"sectionId":"19941-20328","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6004554726115798,44.79519916794754],[-0.6001321486882959,44.79540452289199],[-0.5997934074083904,44.79563856069324],[-0.5996686147130225,44.79577556272885],[-0.5991991647159907,44.79643090777138],[-0.598876699509152,44.79680828903164],[-0.5986010282207422,44.79711248291793]]}},{"type":"Feature","properties":{"name":"Rue François Rabelais","distance":67.51413792972048,"sectionId":"19941-19917","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5986010282207422,44.79711248291793],[-0.5983648820431158,44.79700807279177],[-0.5980172370582716,44.796870616446455],[-0.5978580732608683,44.79681376542394]]}},{"type":"Feature","properties":{"name":"Rue François Rabelais","distance":120.21309939369743,"sectionId":"19941-19940","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5997444328869818,44.79781866557593],[-0.5996610459952546,44.79774554564548],[-0.599608677210136,44.79770720661802],[-0.5994247121537286,44.79757132962293],[-0.599229855218601,44.797443363996436],[-0.5990245244891643,44.797323927028145],[-0.5988108216087672,44.79721223149468],[-0.5986010282207422,44.79711248291793]]}},{"type":"Feature","properties":{"name":"Résidence Parc de Suzon","distance":78.6995984745878,"sectionId":"25911-24950","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5826588270171792,44.81231056002393],[-0.5836514704914351,44.81236324867341]]}},{"type":"Feature","properties":{"name":"Rue Bourges","distance":16.913065469476905,"sectionId":"25911-20414","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5824723589146111,44.812248511199655],[-0.582490067994727,44.81226263676386],[-0.5825124379612426,44.81228048904096],[-0.582546648003199,44.81229337427308],[-0.5825820775227311,44.81230144677011],[-0.5826588270171792,44.81231056002393]]}},{"type":"Feature","properties":{"name":"Résidence Parc de Suzon","distance":78.6995984745878,"sectionId":"24950-25911","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5826588270171792,44.81231056002393],[-0.5836514704914351,44.81236324867341]]}},{"type":"Feature","properties":{"name":"Résidence Parc de Suzon","distance":26.07975780285104,"sectionId":"24950-24952","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5836514704914351,44.81236324867341],[-0.5836397916982583,44.81212859390735]]}},{"type":"Feature","properties":{"name":"Résidence Parc de Suzon","distance":39.60436362370245,"sectionId":"24950-20415","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5836514704914351,44.81236324867341],[-0.5841520718199863,44.81235053970521]]}},{"type":"Feature","properties":{"name":"Résidence Verlaine 1","distance":80.92023405152455,"sectionId":"27580-20438","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5850304000323213,44.80045316333416],[-0.5859920373070406,44.80070218999017]]}},{"type":"Feature","properties":{"name":"Résidence Verlaine 1","distance":80.92023405152455,"sectionId":"20438-27580","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5850304000323213,44.80045316333416],[-0.5859920373070406,44.80070218999017]]}},{"type":"Feature","properties":{"name":"Résidence Verlaine 1","distance":4.123784031126229,"sectionId":"20438-19993","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5859920373070406,44.80070218999017],[-0.58600702822517,44.8007377500221]]}},{"type":"Feature","properties":{"name":"Résidence Verlaine 1","distance":10.634046986594107,"sectionId":"20438-20439","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.586027412261367,44.80060982177523],[-0.5859920373070406,44.80070218999017]]}},{"type":"Feature","properties":{"name":"Avenue de Saige","distance":48.73456430505327,"sectionId":"16092-24278","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.630737406271222,44.797443454373465],[-0.6306944067410274,44.79700575772121]]}},{"type":"Feature","properties":{"name":"Avenue de Saige","distance":26.950995345364845,"sectionId":"16092-16089","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6307665484608452,44.797685210289806],[-0.630737406271222,44.797443454373465]]}},{"type":"Feature","properties":{"name":"Avenue Bitaly","distance":114.32232707573853,"sectionId":"16092-16091","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6321758318754092,44.79734121927321],[-0.630737406271222,44.797443454373465]]}},{"type":"Feature","properties":{"name":"Allée du Lartigon","distance":250.92355401999794,"sectionId":"24278-24279","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6306944067410274,44.79700575772121],[-0.6275361969122202,44.79722248075931]]}},{"type":"Feature","properties":{"name":"Avenue de Saige","distance":48.73456430505327,"sectionId":"24278-16092","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.630737406271222,44.797443454373465],[-0.6306944067410274,44.79700575772121]]}},{"type":"Feature","properties":{"name":"Avenue de Saige","distance":115.7390503043501,"sectionId":"24278-15932","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6306944067410274,44.79700575772121],[-0.630562884029604,44.795967954910736]]}},{"type":"Feature","properties":{"name":"Avenue de la Mission Haut Brion","distance":68.5865190088052,"sectionId":"30945-16230","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6056351334495721,44.808011833433156],[-0.6056463152119752,44.808348388088305],[-0.6057286659423373,44.80862305200351]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":23.036102566929706,"sectionId":"30945-27555","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6053857356036779,44.80792308022486],[-0.6054001766340339,44.807937486119535],[-0.6054326700956663,44.807961318969674],[-0.6054700997347832,44.80798112179187],[-0.6055114214751282,44.807996387180324],[-0.6055557287739428,44.808006783535625],[-0.6056017362113596,44.80801199127104],[-0.6056351334495721,44.808011833433156]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":50.079469714173804,"sectionId":"30945-16517","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6056351334495721,44.808011833433156],[-0.6056484221922663,44.80801186260178],[-0.6056943918746774,44.808006351660836],[-0.6057385254918778,44.80799576419383],[-0.6057798183241224,44.80798022213372],[-0.605816903650209,44.80796012914219],[-0.6058490630866555,44.80793613857532],[-0.605875440713265,44.80790872798282],[-0.605895197485296,44.80787864463115],[-0.6059080051522441,44.80784670967325],[-0.6059134091792239,44.80781374826475],[-0.6059113338997423,44.807780573551135],[-0.6059018355706497,44.80774808457477],[-0.6058850911107415,44.80771708647018],[-0.6058526999066345,44.807680729014336]]}},{"type":"Feature","properties":{"name":"Avenue de la Mission Haut-Brion","distance":27.752800795998343,"sectionId":"16230-31584","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6058105533287731,44.80886602147036],[-0.6057286659423373,44.80862305200351]]}},{"type":"Feature","properties":{"name":"Avenue de la Mission Haut Brion","distance":68.5865190088052,"sectionId":"16230-30945","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6056351334495721,44.808011833433156],[-0.6056463152119752,44.808348388088305],[-0.6057286659423373,44.80862305200351]]}},{"type":"Feature","properties":{"name":"Résidence Crespy I","distance":15.482297615560688,"sectionId":"20210-20476","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5890841607714429,44.8035065501129],[-0.5892726378677615,44.80354429207371]]}},{"type":"Feature","properties":{"name":"Rue de Megret","distance":68.27216480380936,"sectionId":"20210-20209","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5890841607714429,44.8035065501129],[-0.5893277101316055,44.80291684525887]]}},{"type":"Feature","properties":{"name":"Rue de Megret","distance":83.08311282915437,"sectionId":"20210-20211","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5887105096135855,44.80420566504319],[-0.5890841607714429,44.8035065501129]]}},{"type":"Feature","properties":{"name":"Résidence Crespy I","distance":15.482297615560688,"sectionId":"20476-20210","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5890841607714429,44.8035065501129],[-0.5892726378677615,44.80354429207371]]}},{"type":"Feature","properties":{"name":"Résidence Crespy I","distance":28.522819316840636,"sectionId":"20476-22367","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5892726378677615,44.80354429207371],[-0.5891628548496484,44.80378890572265]]}},{"type":"Feature","properties":{"name":"Résidence Crespy I","distance":37.497923017054035,"sectionId":"20476-22368","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5895402813859256,44.80334766444167],[-0.589372434552278,44.80333845840935],[-0.5892726378677615,44.80354429207371]]}},{"type":"Feature","properties":{"name":"Résidence Crespy I","distance":18.109372184580913,"sectionId":"20388-22370","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5900930684965086,44.803064835654624],[-0.5900259725883658,44.80322072338686]]}},{"type":"Feature","properties":{"name":"Rue de Tremeuge","distance":62.714328059835836,"sectionId":"20388-20209","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5900930684965086,44.803064835654624],[-0.5893277101316055,44.80291684525887]]}},{"type":"Feature","properties":{"name":"Rue de Tremeuge","distance":30.101086637502526,"sectionId":"20388-as=3825","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.590157115142759,44.803076982358874],[-0.5900930684965086,44.803064835654624]]}},{"type":"Feature","properties":{"name":"Résidence Crespy I","distance":18.109372184580913,"sectionId":"22370-20388","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5900930684965086,44.803064835654624],[-0.5900259725883658,44.80322072338686]]}},{"type":"Feature","properties":{"name":"Résidence Crespy I","distance":38.7450374023205,"sectionId":"22370-22369","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5900259725883658,44.80322072338686],[-0.5897358420657041,44.803165922689146],[-0.5896731806453948,44.803293474578275]]}},{"type":"Feature","properties":{"name":"Esplanade du 8 Mai 1945","distance":39.37195656287962,"sectionId":"20485-20482","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.587919333101578,44.80914837087973],[-0.5879675058130456,44.80912739370993],[-0.5880277677468514,44.80911360204873],[-0.5881119945963691,44.80910058578673],[-0.5881813991590213,44.809077137138075],[-0.58825704862797,44.80903610566122],[-0.5883272668548667,44.808966779621706]]}},{"type":"Feature","properties":{"name":"Esplanade du 8 Mai 1945","distance":37.89450352153846,"sectionId":"20485-13289","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.587919333101578,44.80914837087973],[-0.58832341738245,44.80933182236562]]}},{"type":"Feature","properties":{"name":"Esplanade du 8 Mai 1945","distance":19.74912817954634,"sectionId":"20485-20312","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5876967809948078,44.80906765093253],[-0.587919333101578,44.80914837087973]]}},{"type":"Feature","properties":{"name":"Esplanade du 8 Mai 1945","distance":39.37195656287962,"sectionId":"20482-20485","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.587919333101578,44.80914837087973],[-0.5879675058130456,44.80912739370993],[-0.5880277677468514,44.80911360204873],[-0.5881119945963691,44.80910058578673],[-0.5881813991590213,44.809077137138075],[-0.58825704862797,44.80903610566122],[-0.5883272668548667,44.808966779621706]]}},{"type":"Feature","properties":{"name":"Esplanade du 8 Mai 1945","distance":45.72182228237763,"sectionId":"20482-13307","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5884433216987119,44.8093329041959],[-0.5884496275106204,44.80905408229004],[-0.588440489708443,44.809021130382774],[-0.5884180327850829,44.80899985888062],[-0.5883272668548667,44.808966779621706]]}},{"type":"Feature","properties":{"name":"Esplanade du 8 Mai 1945","distance":13.158386226861902,"sectionId":"20482-20315","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5883272668548667,44.808966779621706],[-0.5881797231688719,44.80891198002606]]}},{"type":"Feature","properties":{"name":"Rue Lamartine","distance":115.22060213046018,"sectionId":"20118-20119","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5861690395503226,44.81189917006904],[-0.5861560852156734,44.811444846293305],[-0.5861018004954792,44.81086318887048]]}},{"type":"Feature","properties":{"name":"Résidence les Harmonies","distance":"Unknown","sectionId":"20118-as=129006","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5861690395503226,44.81189917006904],[-0.5861690395503226,44.81189917006904]]}},{"type":"Feature","properties":{"name":"Rue Lamartine","distance":30.566795377472573,"sectionId":"20118-as=4740","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5861746180764528,44.812040638802586],[-0.5861690395503226,44.81189917006904]]}},{"type":"Feature","properties":{"name":"Résidence les Harmonies","distance":113.63618525657287,"sectionId":"20501-20366","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5849977758770828,44.81191870329469],[-0.5849811595799879,44.81157016079619],[-0.5849510853904242,44.811444724121614],[-0.5849649862050694,44.81122466710213],[-0.5849296460572688,44.81107966851421],[-0.5849697393399184,44.81090229542672]]}},{"type":"Feature","properties":{"name":"Résidence les Harmonies","distance":320.44842118736705,"sectionId":"20501-20367","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5849977758770828,44.81191870329469],[-0.5848672651510415,44.812093070520305],[-0.5839582489704639,44.81213360458728],[-0.5838699504622034,44.81207918473009],[-0.5838432510798445,44.81184923701481],[-0.5837501989804931,44.8117610961888],[-0.5835592499224659,44.81173891628214],[-0.5835362690043505,44.811271576651585],[-0.5836686558235081,44.811229121345086],[-0.5840751607237636,44.81129072138431],[-0.5841564041322677,44.811282576505334],[-0.5842346781187469,44.81124092470989],[-0.5843666952442133,44.81101345268009],[-0.5844569755138566,44.81094917224136],[-0.5845266756419456,44.81081239400367]]}},{"type":"Feature","properties":{"name":"Résidence les Harmonies","distance":"Unknown","sectionId":"20501-as=129006","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5861690395503226,44.81189917006904],[-0.5849977758770828,44.81191870329469]]}},{"type":"Feature","properties":{"name":"Résidence les Harmonies","distance":113.63618525657287,"sectionId":"20366-20501","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5849977758770828,44.81191870329469],[-0.5849811595799879,44.81157016079619],[-0.5849510853904242,44.811444724121614],[-0.5849649862050694,44.81122466710213],[-0.5849296460572688,44.81107966851421],[-0.5849697393399184,44.81090229542672]]}},{"type":"Feature","properties":{"name":"Rue de Suzon","distance":11.244264938831117,"sectionId":"20366-20286","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5851117818471763,44.81090727732481],[-0.5849697393399184,44.81090229542672]]}},{"type":"Feature","properties":{"name":"Rue de Suzon","distance":28.773503461670344,"sectionId":"20366-as=128738","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5848766551679482,44.81088340802062],[-0.5849697393399184,44.81090229542672]]}},{"type":"Feature","properties":{"name":"Passage Inférieur du Centre","distance":146.96144875125873,"sectionId":"24285-17302","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6315243641467698,44.80392518549436],[-0.6315705860256372,44.80400811833426],[-0.631639502590326,44.804105820957325],[-0.6317636074982431,44.80426608128143],[-0.6320456722632278,44.80478649787301],[-0.6322151558794488,44.80515079027539]]}},{"type":"Feature","properties":{"name":"Avenue Roger Chaumet","distance":19.027359440890386,"sectionId":"24285-23042","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6315243641467698,44.80392518549436],[-0.6315340391954343,44.80387388904114],[-0.6316085245585873,44.80376674305387]]}},{"type":"Feature","properties":{"name":"Avenue Roger Chaumet","distance":54.94334749047144,"sectionId":"24285-32755","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6311606805048848,44.804346679159686],[-0.6315243641467698,44.80392518549436]]}},{"type":"Feature","properties":{"name":"Passage Inférieur du Centre","distance":146.96144875125873,"sectionId":"17302-24285","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6315243641467698,44.80392518549436],[-0.6315705860256372,44.80400811833426],[-0.631639502590326,44.804105820957325],[-0.6317636074982431,44.80426608128143],[-0.6320456722632278,44.80478649787301],[-0.6322151558794488,44.80515079027539]]}},{"type":"Feature","properties":{"name":"Rue des Poilus","distance":26.558624127725103,"sectionId":"17302-28691","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6322151558794488,44.80515079027539],[-0.6318972150442006,44.80522787563589]]}},{"type":"Feature","properties":{"name":"Rue André Pujol","distance":24.342444688083525,"sectionId":"17302-35011","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6323132574139818,44.80535818369297],[-0.6323063410732528,44.80535083751426],[-0.6322151558794488,44.80515079027539]]}},{"type":"Feature","properties":{"name":"Résidence Pacaris","distance":63.94829431122402,"sectionId":"20222-25679","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5817347652098784,44.80154978936739],[-0.5819966268097939,44.80132705822135],[-0.5820486414210113,44.80131911430711],[-0.5823120971842611,44.801480439965296]]}},{"type":"Feature","properties":{"name":"Rue Michel Montaigne","distance":21.397484173043456,"sectionId":"20222-20221","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.581996432624606,44.80159884038343],[-0.5817347652098784,44.80154978936739]]}},{"type":"Feature","properties":{"name":"Rue Michel Montaigne","distance":34.83106584832478,"sectionId":"20222-20223","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5817347652098784,44.80154978936739],[-0.5813093901470782,44.80146841891647]]}},{"type":"Feature","properties":{"name":"Résidence Pacaris","distance":63.94829431122402,"sectionId":"25679-20222","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5817347652098784,44.80154978936739],[-0.5819966268097939,44.80132705822135],[-0.5820486414210113,44.80131911430711],[-0.5823120971842611,44.801480439965296]]}},{"type":"Feature","properties":{"name":"Rue du Professeur Jeanneney","distance":193.9029175452635,"sectionId":"25679-20124","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5823120971842611,44.801480439965296],[-0.5834060449157008,44.80059704873425],[-0.5834441836997187,44.80057350681739],[-0.5834936025775972,44.800562491143026],[-0.5835423164432371,44.80056455949858],[-0.5835794510121128,44.80058185615917],[-0.5838946256883838,44.80088108504668],[-0.5839187422932206,44.800933203016335]]}},{"type":"Feature","properties":{"name":"Rue du Professeur Jeanneney","distance":20.906589058547613,"sectionId":"25679-20220","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5821407023838101,44.80162375322326],[-0.5823120971842611,44.801480439965296]]}},{"type":"Feature","properties":{"name":"Rue Michel Montaigne","distance":21.397484173043456,"sectionId":"20221-20222","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.581996432624606,44.80159884038343],[-0.5817347652098784,44.80154978936739]]}},{"type":"Feature","properties":{"name":"Résidence Pacaris","distance":103.8667638138317,"sectionId":"20221-20223","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.581996432624606,44.80159884038343],[-0.5819514807793132,44.801655295946674],[-0.5816992778520566,44.801854301558414],[-0.5816513165908256,44.80188472811434],[-0.581610994422657,44.801875188131],[-0.5812774436243036,44.80167517105108],[-0.5812554181841285,44.80164649802068],[-0.581272358004822,44.80154849641453],[-0.5813093901470782,44.80146841891647]]}},{"type":"Feature","properties":{"name":"Rue Michel Montaigne","distance":11.739405561386475,"sectionId":"20221-20220","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5821407023838101,44.80162375322326],[-0.581996432624606,44.80159884038343]]}},{"type":"Feature","properties":{"name":"Rue Michel Montaigne","distance":34.83106584832478,"sectionId":"20223-20222","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5817347652098784,44.80154978936739],[-0.5813093901470782,44.80146841891647]]}},{"type":"Feature","properties":{"name":"Résidence Pacaris","distance":103.8667638138317,"sectionId":"20223-20221","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.581996432624606,44.80159884038343],[-0.5819514807793132,44.801655295946674],[-0.5816992778520566,44.801854301558414],[-0.5816513165908256,44.80188472811434],[-0.581610994422657,44.801875188131],[-0.5812774436243036,44.80167517105108],[-0.5812554181841285,44.80164649802068],[-0.581272358004822,44.80154849641453],[-0.5813093901470782,44.80146841891647]]}},{"type":"Feature","properties":{"name":"Rue Michel Montaigne","distance":26.543259259799758,"sectionId":"20223-19611","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5813093901470782,44.80146841891647],[-0.5809830269145462,44.80141257539398]]}},{"type":"Feature","properties":{"name":"Place du Théatre de Verdure","distance":160.05305428099138,"sectionId":"23187-17370","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6303640321588959,44.79343483472454],[-0.6302316808832789,44.792369582384545],[-0.6302505337432102,44.79224304303161],[-0.6302012372237766,44.79214525411156],[-0.630181560447226,44.792005531352444]]}},{"type":"Feature","properties":{"name":"Rue Antoine Carles","distance":91.36493760256137,"sectionId":"19630-19631","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5836002037568148,44.80364523865101],[-0.5826711868171895,44.80315617672418]]}},{"type":"Feature","properties":{"name":"Rue Antoine Carles","distance":112.23208725050941,"sectionId":"19630-19629","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5848800257630388,44.80408206975226],[-0.5836002037568148,44.80364523865101]]}},{"type":"Feature","properties":{"name":"Rue Lafontaine","distance":143.75826992032788,"sectionId":"19630-19954","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5836002037568148,44.80364523865101],[-0.5828735045100534,44.80483162648224]]}},{"type":"Feature","properties":{"name":"Rue Lafontaine","distance":83.2400584945686,"sectionId":"19630-19809","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5840053833237241,44.80295370653722],[-0.5836404782601111,44.80356442762278],[-0.5836002037568148,44.80364523865101]]}},{"type":"Feature","properties":{"name":"Rue Antoine Carles","distance":91.36493760256137,"sectionId":"19631-19630","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5836002037568148,44.80364523865101],[-0.5826711868171895,44.80315617672418]]}},{"type":"Feature","properties":{"name":"Rue Blumerel","distance":21.47668825485639,"sectionId":"19631-19694","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5826711868171895,44.80315617672418],[-0.5825067725348939,44.803310080280106]]}},{"type":"Feature","properties":{"name":"Rue Blumerel","distance":41.115485243672175,"sectionId":"19631-19693","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5829773948842143,44.80285700859803],[-0.5826711868171895,44.80315617672418]]}},{"type":"Feature","properties":{"name":"Rue du Relais","distance":58.27184646420666,"sectionId":"17553-17552","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6067089864241451,44.79436691118033],[-0.6069622169139407,44.794299424675565],[-0.6069871808747022,44.79426368070168],[-0.6068891777483558,44.79407428213781],[-0.6068156243160784,44.79400067523964]]}},{"type":"Feature","properties":{"name":"Rue du Relais","distance":133.6124393368543,"sectionId":"17553-17554","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6067089864241451,44.79436691118033],[-0.6061315950818825,44.79452485079389],[-0.6061092063287035,44.79456132364093],[-0.6063805818624042,44.79507717995475],[-0.6064285442523097,44.79511178212509],[-0.6065960838034486,44.79514268204756]]}},{"type":"Feature","properties":{"name":"Rue du Relais","distance":41.54364184020248,"sectionId":"17552-17553","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6068156243160784,44.79400067523964],[-0.6067089864241451,44.79436691118033]]}},{"type":"Feature","properties":{"name":"Avenue Georges Clémenceau","distance":202.33637231840436,"sectionId":"20038-19894","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5923260252980941,44.80541946553582],[-0.5925213926379727,44.80542343703885],[-0.5925915620587203,44.80540626707868],[-0.5945591266873305,44.804573269848255]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":123.03146999493745,"sectionId":"20038-19586","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5923260252980941,44.80541946553582],[-0.5923897774172039,44.80526679765398],[-0.5927545423625904,44.80435463593653]]}},{"type":"Feature","properties":{"name":"Avenue Georges Lasserre","distance":5.5693567052878095,"sectionId":"20038-38852","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5923260252980941,44.80541946553582],[-0.5922567476898352,44.805410420472995]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":"Unknown","sectionId":"20038-as=1608","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5921660507144769,44.80581282433813],[-0.5923260252980941,44.80541946553582]]}},{"type":"Feature","properties":{"name":"Avenue Georges Clémenceau","distance":202.33637231840436,"sectionId":"19894-20038","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5923260252980941,44.80541946553582],[-0.5925213926379727,44.80542343703885],[-0.5925915620587203,44.80540626707868],[-0.5945591266873305,44.804573269848255]]}},{"type":"Feature","properties":{"name":"Avenue Georges Clémenceau","distance":104.75651454178886,"sectionId":"19894-20033","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5945591266873305,44.804573269848255],[-0.5956951221808845,44.80408803249884]]}},{"type":"Feature","properties":{"name":"Rue Ernest Renan","distance":92.36202940615266,"sectionId":"19894-19893","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5951509690186139,44.80529017486023],[-0.5945591266873305,44.804573269848255]]}},{"type":"Feature","properties":{"name":"Rue du Général André","distance":112.41173931887229,"sectionId":"19730-19987","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5984066689433065,44.80404866973753],[-0.5983820722771941,44.80357759664346],[-0.5979900250654584,44.80311454502185]]}},{"type":"Feature","properties":{"name":"Avenue Georges Clémenceau","distance":107.29410036316126,"sectionId":"19730-20034","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5979900250654584,44.80311454502185],[-0.5990658311729893,44.80265108440509],[-0.5991426121969289,44.802606135801256]]}},{"type":"Feature","properties":{"name":"Avenue de Breuil","distance":93.5186894888945,"sectionId":"19730-19588","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5971281849445176,44.80254005614149],[-0.5977955031681217,44.80299827663063],[-0.597913280144674,44.80308102995233],[-0.5979900250654584,44.80311454502185]]}},{"type":"Feature","properties":{"name":"Avenue Georges Clémenceau","distance":211.2417855172708,"sectionId":"19730-20033","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5956951221808845,44.80408803249884],[-0.5979900250654584,44.80311454502185]]}},{"type":"Feature","properties":{"name":"Avenue Georges Clémenceau","distance":107.29410036316126,"sectionId":"20034-19730","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5979900250654584,44.80311454502185],[-0.5990658311729893,44.80265108440509],[-0.5991426121969289,44.802606135801256]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":212.17177820072675,"sectionId":"20034-23249","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5991426121969289,44.802606135801256],[-0.5995421972143224,44.802855449810416],[-0.5998764053370857,44.8030911574618],[-0.5999606482400087,44.80319001391978],[-0.6000794837444764,44.80339299164127],[-0.6004314517284105,44.80409530318383],[-0.6004092627113612,44.80421004994941]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":7.832902734413397,"sectionId":"20034-20035","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5992047248805338,44.802551201774975],[-0.5991426121969289,44.802606135801256]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":"Unknown","sectionId":"20034-as=125550","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5979988960069387,44.80186392163605],[-0.5991426121969289,44.802606135801256]]}},{"type":"Feature","properties":{"name":"Rue du Haut Carre","distance":33.044654092272836,"sectionId":"19848-19802","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5953333058379465,44.810684745640245],[-0.5956192017505934,44.81079876111444],[-0.5957016899524444,44.81082479978316]]}},{"type":"Feature","properties":{"name":"Rue Doyen Henri Vizioz","distance":132.5850124180962,"sectionId":"19848-19844","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5958535522035362,44.81201358750806],[-0.5957016899524444,44.81082479978316]]}},{"type":"Feature","properties":{"name":"Rue du Haut Carre","distance":176.1877883999633,"sectionId":"19848-20054","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5957016899524444,44.81082479978316],[-0.5958060278811761,44.81085014770082],[-0.5959376042354896,44.81087598569019],[-0.5968088279811378,44.81102716396431],[-0.5968638291658955,44.81104263051395],[-0.5969074745628412,44.81106268998081],[-0.5969620455177489,44.8111057352392],[-0.5969860945557242,44.811140286994984],[-0.597010833216417,44.811202111843194],[-0.5972166531379761,44.811713936264894]]}},{"type":"Feature","properties":{"name":"Impasse des Mésanges","distance":10.224174442617148,"sectionId":"20216-20217","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5829114531768446,44.796488604084416],[-0.5828224141858932,44.796421866246604]]}},{"type":"Feature","properties":{"name":"Impasse des Mésanges","distance":77.92740838087543,"sectionId":"20216-19672","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5836766845477668,44.79691508101888],[-0.5834433321419371,44.79684496396522],[-0.5833646630283282,44.796808707691135],[-0.5829114531768446,44.796488604084416]]}},{"type":"Feature","properties":{"name":"Impasse des Mésanges","distance":8.469857553105458,"sectionId":"20216-20218","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5829114531768446,44.796488604084416],[-0.5828373192713951,44.7965436374562]]}},{"type":"Feature","properties":{"name":"Impasse des Mésanges","distance":10.224174442617148,"sectionId":"20217-20216","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5829114531768446,44.796488604084416],[-0.5828224141858932,44.796421866246604]]}},{"type":"Feature","properties":{"name":"Impasse des Mésanges","distance":77.92740838087543,"sectionId":"19672-20216","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5836766845477668,44.79691508101888],[-0.5834433321419371,44.79684496396522],[-0.5833646630283282,44.796808707691135],[-0.5829114531768446,44.796488604084416]]}},{"type":"Feature","properties":{"name":"Chemin Bénédigues","distance":108.96475987555287,"sectionId":"19672-19671","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5836766845477668,44.79691508101888],[-0.5837427845097533,44.796753193138706],[-0.5837611277281213,44.79672874344472],[-0.5837972155731294,44.79670481553668],[-0.5838394896553647,44.796694925573334],[-0.5838847328635979,44.79669413035713],[-0.5847198183399579,44.79681752619857],[-0.5847798261838104,44.796818156943374],[-0.5848285086423236,44.796809595995924]]}},{"type":"Feature","properties":{"name":"Chemin Bénédigues","distance":217.14507437927628,"sectionId":"19672-48661","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5827337220341308,44.79874885656027],[-0.5827853745039706,44.79868219042253],[-0.583268278318656,44.79778003242338],[-0.5835407616371732,44.797264467046844],[-0.5836766845477668,44.79691508101888]]}},{"type":"Feature","properties":{"name":"Rue Michel Montaigne","distance":94.53889942267887,"sectionId":"19691-20123","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5839626726056485,44.80214458791417],[-0.5838073745205168,44.80200336910829],[-0.5837484089939643,44.80196667218367],[-0.5836775655209633,44.80193836676357],[-0.5835883601740453,44.80191388279703],[-0.582923523265462,44.8017866446877]]}},{"type":"Feature","properties":{"name":"Rue Blumerel","distance":19.360497918579878,"sectionId":"19691-19692","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5839626726056485,44.80214458791417],[-0.5838428615218176,44.80220988906455],[-0.583779240354156,44.80225909656631]]}},{"type":"Feature","properties":{"name":"Rue Blumerel","distance":24.899261815325442,"sectionId":"19691-22360","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5842133684977429,44.80200895198547],[-0.5839626726056485,44.80214458791417]]}},{"type":"Feature","properties":{"name":"Rue Michel Montaigne","distance":94.53889942267887,"sectionId":"20123-19691","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5839626726056485,44.80214458791417],[-0.5838073745205168,44.80200336910829],[-0.5837484089939643,44.80196667218367],[-0.5836775655209633,44.80193836676357],[-0.5835883601740453,44.80191388279703],[-0.582923523265462,44.8017866446877]]}},{"type":"Feature","properties":{"name":"Rue Michel Montaigne","distance":40.23778882475889,"sectionId":"20123-19867","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.582923523265462,44.8017866446877],[-0.5824356880312024,44.80168364462371]]}},{"type":"Feature","properties":{"name":"Rue Léon Blum","distance":123.7044902845429,"sectionId":"20123-20124","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.582923523265462,44.8017866446877],[-0.5838852843041873,44.80099947645523],[-0.5839187422932206,44.800933203016335]]}},{"type":"Feature","properties":{"name":"Rue Michel Montaigne","distance":40.23778882475889,"sectionId":"19867-20123","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.582923523265462,44.8017866446877],[-0.5824356880312024,44.80168364462371]]}},{"type":"Feature","properties":{"name":"Rue Michel Montaigne","distance":24.256966734887612,"sectionId":"19867-20220","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5824356880312024,44.80168364462371],[-0.5821407023838101,44.80162375322326]]}},{"type":"Feature","properties":{"name":"Rue Edouard Herriot","distance":46.73253979545938,"sectionId":"19867-19866","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5821560683356397,44.80205430950675],[-0.5824356880312024,44.80168364462371]]}},{"type":"Feature","properties":{"name":"Avenue Marly","distance":157.09818581991158,"sectionId":"20148-20188","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5981196130069676,44.79920231276052],[-0.5980014255585253,44.799118942266496],[-0.5964093157695478,44.798490890947136]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":182.41654101047672,"sectionId":"20148-29094","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5981196130069676,44.79920231276052],[-0.597256936689572,44.79972064159159],[-0.5967529805243248,44.800022591958026],[-0.5966733187427891,44.80008015155433],[-0.5966113719988965,44.80013165584795],[-0.5965555336345896,44.80019386689131],[-0.59644967915179,44.800320356824194]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":10.728894389010321,"sectionId":"20148-22876","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5981196130069676,44.79920231276052],[-0.5981996355267528,44.79928031462285]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":2.3123826473800824,"sectionId":"20148-as=124811","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5985415793187204,44.79895998147994],[-0.5981196130069676,44.79920231276052]]}},{"type":"Feature","properties":{"name":"Avenue Marly","distance":157.09818581991158,"sectionId":"20188-20148","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5981196130069676,44.79920231276052],[-0.5980014255585253,44.799118942266496],[-0.5964093157695478,44.798490890947136]]}},{"type":"Feature","properties":{"name":"Avenue Marly","distance":93.29853605163953,"sectionId":"20188-20189","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5964093157695478,44.798490890947136],[-0.595370898235511,44.79809223046674]]}},{"type":"Feature","properties":{"name":"Allée des Peupliers","distance":323.94857654334925,"sectionId":"20188-20280","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5964093157695478,44.798490890947136],[-0.5934654355815312,44.80036847519943],[-0.5933378311746387,44.800416106713314]]}},{"type":"Feature","properties":{"name":"Avenue Marly","distance":93.29853605163953,"sectionId":"20189-20188","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5964093157695478,44.798490890947136],[-0.595370898235511,44.79809223046674]]}},{"type":"Feature","properties":{"name":"Place du 1er Mai","distance":11.7179343426471,"sectionId":"20189-20307","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.595370898235511,44.79809223046674],[-0.5953040466994333,44.79806506719086],[-0.5952728247133372,44.79805740633734],[-0.5952346629585121,44.798058162349264]]}},{"type":"Feature","properties":{"name":"Place du 1er Mai","distance":39.11589238959954,"sectionId":"20189-20126","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5950341181897741,44.7983501527892],[-0.595370898235511,44.79809223046674]]}},{"type":"Feature","properties":{"name":"Rue Montesquieu","distance":144.90614079470686,"sectionId":"19808-20228","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5855319951303288,44.80322276786811],[-0.5854588170026435,44.80317120592257],[-0.5853775015213957,44.80310476672781],[-0.5852609005493866,44.80300196579246],[-0.5851539687440491,44.80289390546677],[-0.5850293573638515,44.80274163172824],[-0.5849728585554742,44.802663239901385],[-0.5849224302725724,44.80258276499253],[-0.5848810808779509,44.80249975185944],[-0.5848662743403445,44.80245697934697],[-0.5848564855151995,44.802413508187605],[-0.5848526095385463,44.80236949033107],[-0.5848554432137658,44.80232553123434],[-0.5848641193352211,44.80228192847666],[-0.5848780232605109,44.80223897167391],[-0.5848965403459194,44.802196950441534],[-0.5849194292064982,44.802156052550295],[-0.5849821415010599,44.80208259314067]]}},{"type":"Feature","properties":{"name":"Rue Montesquieu","distance":97.53379317098036,"sectionId":"19808-19997","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5866414389109001,44.80354045736144],[-0.5864800984443781,44.80355040946131],[-0.586420303209506,44.80355941143457],[-0.5863615593812236,44.803546670521854],[-0.5858053346292776,44.80335350694344],[-0.5856979684373356,44.80330968904041],[-0.5855953349727717,44.80326058718053],[-0.5855319951303288,44.80322276786811]]}},{"type":"Feature","properties":{"name":"Rue Condorcet","distance":133.4710029330703,"sectionId":"19808-19809","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5855319951303288,44.80322276786811],[-0.5855008242930735,44.80324239743687],[-0.5854334023476077,44.803285419965626],[-0.5854024122569524,44.80329981906845],[-0.5853685241823788,44.803310345922064],[-0.5853324343180979,44.80331598767871],[-0.585221360409289,44.803324443518036],[-0.5851842444408011,44.803325793651375],[-0.5851471317467515,44.80332516187252],[-0.5851102525296307,44.80332218059734],[-0.5850738593605325,44.80331684186658],[-0.585038331092779,44.803309133738566],[-0.5849699810954359,44.80328840740146],[-0.5841008354229333,44.802985019746664],[-0.5840053833237241,44.80295370653722]]}},{"type":"Feature","properties":{"name":"Rue Montesquieu","distance":144.90614079470686,"sectionId":"20228-19808","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5855319951303288,44.80322276786811],[-0.5854588170026435,44.80317120592257],[-0.5853775015213957,44.80310476672781],[-0.5852609005493866,44.80300196579246],[-0.5851539687440491,44.80289390546677],[-0.5850293573638515,44.80274163172824],[-0.5849728585554742,44.802663239901385],[-0.5849224302725724,44.80258276499253],[-0.5848810808779509,44.80249975185944],[-0.5848662743403445,44.80245697934697],[-0.5848564855151995,44.802413508187605],[-0.5848526095385463,44.80236949033107],[-0.5848554432137658,44.80232553123434],[-0.5848641193352211,44.80228192847666],[-0.5848780232605109,44.80223897167391],[-0.5848965403459194,44.802196950441534],[-0.5849194292064982,44.802156052550295],[-0.5849821415010599,44.80208259314067]]}},{"type":"Feature","properties":{"name":"Rue Montesquieu","distance":23.647978505696972,"sectionId":"20228-59308","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5849821415010599,44.80208259314067],[-0.5850189161934375,44.80204472854534],[-0.5850568615214399,44.80200993198804],[-0.585098889213611,44.80197770918335],[-0.5851729305762308,44.80191907417385]]}},{"type":"Feature","properties":{"name":"Place Peydavant","distance":25.568717288314957,"sectionId":"20228-59311","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5849821415010599,44.80208259314067],[-0.5852927989512563,44.80214642503167]]}},{"type":"Feature","properties":{"name":"Place Peydavant","distance":33.07993998255419,"sectionId":"20228-59312","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5849821415010599,44.80208259314067],[-0.5845809853481179,44.80199815396006]]}},{"type":"Feature","properties":{"name":"Rue Peydavant","distance":16.39716539878528,"sectionId":"22361-22362","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5851729305762308,44.80191907417385],[-0.5851807333266363,44.80192450335854],[-0.5852132537747067,44.80193879211583],[-0.5852493646199031,44.801947742944144],[-0.5852872643857296,44.80195087213809],[-0.5853253114250806,44.8019482314481],[-0.585361605939593,44.80193979068075],[-0.5853664302049465,44.80193801712926]]}},{"type":"Feature","properties":{"name":"Rue Peydavant","distance":15.665824151134887,"sectionId":"22361-22360","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5851201875665865,44.80179119926634],[-0.5851151390953323,44.80180360951636],[-0.5851126547813236,44.801830802419424],[-0.5851184993276105,44.801857642697826],[-0.5851322212241612,44.801882973521195],[-0.5851533689567878,44.801905638057626],[-0.5851729305762308,44.80191907417385]]}},{"type":"Feature","properties":{"name":"Rue Peydavant","distance":16.39716539878528,"sectionId":"22362-22361","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5851729305762308,44.80191907417385],[-0.5851807333266363,44.80192450335854],[-0.5852132537747067,44.80193879211583],[-0.5852493646199031,44.801947742944144],[-0.5852872643857296,44.80195087213809],[-0.5853253114250806,44.8019482314481],[-0.585361605939593,44.80193979068075],[-0.5853664302049465,44.80193801712926]]}},{"type":"Feature","properties":{"name":"Rue Peydavant","distance":14.53759556150542,"sectionId":"22362-23614","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5853664302049465,44.80193801712926],[-0.5853945342375834,44.80192605111729],[-0.585422482635424,44.80190751403869],[-0.585444249840796,44.80188520821931],[-0.5854586289761966,44.80186007252648],[-0.5854651696709479,44.801834416894806]]}},{"type":"Feature","properties":{"name":"Rue Peydavant","distance":41.265760812466624,"sectionId":"22362-as=128589","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5854061515207823,44.8019969743337],[-0.5853664302049465,44.80193801712926]]}},{"type":"Feature","properties":{"name":"Rue Peydavant","distance":14.53759556150542,"sectionId":"23614-22362","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5853664302049465,44.80193801712926],[-0.5853945342375834,44.80192605111729],[-0.585422482635424,44.80190751403869],[-0.585444249840796,44.80188520821931],[-0.5854586289761966,44.80186007252648],[-0.5854651696709479,44.801834416894806]]}},{"type":"Feature","properties":{"name":"Rue Peydavant","distance":27.888699318517524,"sectionId":"23614-22359","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5854651696709479,44.801834416894806],[-0.5854634989586976,44.80180614021261],[-0.5854536412724859,44.80177987686994],[-0.5854361979764507,44.80175574437894],[-0.5854117412939939,44.801734805677114],[-0.5853816067110019,44.80171818972313],[-0.5853470961562035,44.801706486041276],[-0.5853098959873745,44.80170036212053],[-0.5852716701885647,44.8017001258312],[-0.5852343129381321,44.801705717460564],[-0.5852274849938373,44.80170782441463]]}},{"type":"Feature","properties":{"name":"Rue Peydavant","distance":55.11625823256437,"sectionId":"23614-58725","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5857400198724079,44.802234706479176],[-0.5857026307136758,44.802227169701524],[-0.5856791696139334,44.80221198506938],[-0.5856704225483048,44.80218696917707],[-0.5856630460078622,44.80214405157162],[-0.5856592534212801,44.802093748004225],[-0.585649515288388,44.80201705910807],[-0.585628353359424,44.80194890472344],[-0.5855878060285796,44.801874196645564],[-0.5855655326411606,44.801854820823344],[-0.5855310142731254,44.801844206832044],[-0.5854651696709479,44.801834416894806]]}},{"type":"Feature","properties":{"name":"Rue Peydavant","distance":27.888699318517524,"sectionId":"22359-23614","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5854651696709479,44.801834416894806],[-0.5854634989586976,44.80180614021261],[-0.5854536412724859,44.80177987686994],[-0.5854361979764507,44.80175574437894],[-0.5854117412939939,44.801734805677114],[-0.5853816067110019,44.80171818972313],[-0.5853470961562035,44.801706486041276],[-0.5853098959873745,44.80170036212053],[-0.5852716701885647,44.8017001258312],[-0.5852343129381321,44.801705717460564],[-0.5852274849938373,44.80170782441463]]}},{"type":"Feature","properties":{"name":"Rue Peydavant","distance":13.0665165449725,"sectionId":"22359-22360","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5852274849938373,44.80170782441463],[-0.5851994546724691,44.8017169054496],[-0.585168829747565,44.80173309463922],[-0.5851439143747236,44.80175360792707],[-0.5851256628779079,44.80177751441675],[-0.5851201875665865,44.80179119926634]]}},{"type":"Feature","properties":{"name":"Rue Peydavant","distance":13.99979854709641,"sectionId":"22359-as=128588","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5852274849938373,44.80170782441463],[-0.5851741241733962,44.80158764319367]]}},{"type":"Feature","properties":{"name":"Rue Aldona","distance":120.75252618727315,"sectionId":"19574-19575","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5910056690595032,44.7984976041222],[-0.5895145995675709,44.798263440100435]]}},{"type":"Feature","properties":{"name":"Place du Président Wilson","distance":81.76784419738173,"sectionId":"19574-as=125236","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5910056690595032,44.7984976041222],[-0.59081552314347,44.79905238759902],[-0.5908214358577824,44.799110754220074],[-0.5908372662186695,44.79916178130587],[-0.5908153296507723,44.79921382067324],[-0.5908153296507723,44.79921382067324]]}},{"type":"Feature","properties":{"name":"Rue Aldona","distance":34.769906967460734,"sectionId":"19574-as=3946","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5911143430914114,44.79851592268685],[-0.5910056690595032,44.7984976041222]]}},{"type":"Feature","properties":{"name":"Rue du Maréchal Foch","distance":91.45311678617169,"sectionId":"19575-20004","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5892437059848279,44.799063900248946],[-0.5895145995675709,44.798263440100435]]}},{"type":"Feature","properties":{"name":"Rue Aldona","distance":120.75252618727315,"sectionId":"19575-19574","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5910056690595032,44.7984976041222],[-0.5895145995675709,44.798263440100435]]}},{"type":"Feature","properties":{"name":"Rue Aldona","distance":140.77576037334674,"sectionId":"19575-19576","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5895145995675709,44.798263440100435],[-0.5877750460731076,44.79799448753065]]}},{"type":"Feature","properties":{"name":"Rue Aldona","distance":19.2513511147218,"sectionId":"19577-19578","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5874940924930621,44.79876580341441],[-0.5874301042376504,44.79893303199433]]}},{"type":"Feature","properties":{"name":"Rue du Général Sarrail","distance":31.850876666798957,"sectionId":"19577-19947","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.587860065877693,44.79886460859568],[-0.5878226089338402,44.7988299376929],[-0.5877730627359907,44.798814475270966],[-0.5874940924930621,44.79876580341441]]}},{"type":"Feature","properties":{"name":"Rue Aldona","distance":88.50573412695198,"sectionId":"19577-19576","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5877750460731076,44.79799448753065],[-0.5874940924930621,44.79876580341441]]}},{"type":"Feature","properties":{"name":"Rue Aldona","distance":19.2513511147218,"sectionId":"19578-19577","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5874940924930621,44.79876580341441],[-0.5874301042376504,44.79893303199433]]}},{"type":"Feature","properties":{"name":"Rue Aldona","distance":192.48757160697352,"sectionId":"19578-19579","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5874301042376504,44.79893303199433],[-0.587333371843338,44.79895833349873],[-0.5872897108986389,44.79896628666916],[-0.5871901509034066,44.79897257988817],[-0.5871011491301221,44.798969621901605],[-0.5850808771295336,44.798833524260765],[-0.5850419113984853,44.798837635202695],[-0.585015235590998,44.79884406116928]]}},{"type":"Feature","properties":{"name":"Rue du Général Sarrail","distance":35.067752919998384,"sectionId":"19578-19947","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.587860065877693,44.79886460859568],[-0.5877814769738232,44.798864295342476],[-0.5876659685007506,44.798880640791104],[-0.5874301042376504,44.79893303199433]]}},{"type":"Feature","properties":{"name":"Rue du Général Chanzy","distance":17.508726536717763,"sectionId":"19578-as=124551","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5874301042376504,44.79893303199433],[-0.5873847952942227,44.79908733010081],[-0.5873847952942227,44.79908733010081]]}},{"type":"Feature","properties":{"name":"Rue Gabriel Faure","distance":140.80266508827623,"sectionId":"19964-19965","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6058602084364522,44.79786435749591],[-0.6071072432096107,44.79876914928914]]}},{"type":"Feature","properties":{"name":"Rue Jules Massenet","distance":78.15584817147173,"sectionId":"19964-19823","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6058602084364522,44.79786435749591],[-0.6051360946018491,44.79834322327829]]}},{"type":"Feature","properties":{"name":"Rue Gabriel Faure","distance":168.79774964062716,"sectionId":"19964-26871","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6042882382750667,44.79684094366318],[-0.6051643027973448,44.79734565370451],[-0.6058602084364522,44.79786435749591]]}},{"type":"Feature","properties":{"name":"Rue Gabriel Faure","distance":140.80266508827623,"sectionId":"19965-19964","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6058602084364522,44.79786435749591],[-0.6071072432096107,44.79876914928914]]}},{"type":"Feature","properties":{"name":"Avenue de Villemejan","distance":82.05688903338846,"sectionId":"19965-19824","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6071072432096107,44.79876914928914],[-0.6065470639244804,44.79939101050488]]}},{"type":"Feature","properties":{"name":"Avenue de Villemejan","distance":48.043998598457335,"sectionId":"19965-20356","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6074446916455576,44.798409464890945],[-0.6071072432096107,44.79876914928914]]}},{"type":"Feature","properties":{"name":"Rue Camille Pelletan","distance":193.04406140243836,"sectionId":"19746-19615","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5977875452259982,44.8131112532041],[-0.5980670834990757,44.813033949301065],[-0.598307278978279,44.81296500568366],[-0.5990303093113795,44.8127284572901],[-0.5992043566156884,44.81268448541703],[-0.5999910045164841,44.81255888102683],[-0.6000842403541052,44.812542147747884]]}},{"type":"Feature","properties":{"name":"Rue du Haut Carre","distance":78.11963270747486,"sectionId":"19746-19614","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5975106500427024,44.81243610629011],[-0.5977875452259982,44.8131112532041]]}},{"type":"Feature","properties":{"name":"Rue Camille Pelletan","distance":193.04406140243836,"sectionId":"19615-19746","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5977875452259982,44.8131112532041],[-0.5980670834990757,44.813033949301065],[-0.598307278978279,44.81296500568366],[-0.5990303093113795,44.8127284572901],[-0.5992043566156884,44.81268448541703],[-0.5999910045164841,44.81255888102683],[-0.6000842403541052,44.812542147747884]]}},{"type":"Feature","properties":{"name":"Rue André Gide","distance":232.3892498165161,"sectionId":"19615-19614","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6000842403541052,44.812542147747884],[-0.6000637616945013,44.81250198855945],[-0.6000136438664618,44.812445201319136],[-0.5999308361509307,44.81237359410098],[-0.5995044106604542,44.81213936191611],[-0.5994367858293375,44.81210618948996],[-0.5993565927707848,44.81207845931682],[-0.5992699220337789,44.81206048277275],[-0.5991837117250365,44.81205393204763],[-0.5990300202554011,44.812055011327324],[-0.5989753179126946,44.81206259738529],[-0.5989134276417752,44.812078698397514],[-0.598180141040079,44.81229881543261],[-0.5975106500427024,44.81243610629011]]}},{"type":"Feature","properties":{"name":"Rue Camille Pelletan","distance":39.53393653615774,"sectionId":"19615-as=126612","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6000842403541052,44.812542147747884],[-0.6003481849213284,44.81248677115931],[-0.6005709443936075,44.81246494703294]]}},{"type":"Feature","properties":{"name":"Rue Frédéric Sevene","distance":28.42099854014257,"sectionId":"19795-19710","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5810666445856678,44.80424561790561],[-0.5808928090668181,44.804286673179625],[-0.5807488871936071,44.804359125680534]]}},{"type":"Feature","properties":{"name":"Rue Frédéric Sevene","distance":23.66391637342175,"sectionId":"19795-19696","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5813624680708289,44.80427602942861],[-0.5812007891825703,44.804254095760825],[-0.5810666445856678,44.80424561790561]]}},{"type":"Feature","properties":{"name":"Rue Clément Thomas","distance":42.807483831646564,"sectionId":"19795-19793","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5810666445856678,44.80424561790561],[-0.5810664585556685,44.804120410507124],[-0.5810698140814963,44.80399518168156],[-0.5810581950693176,44.80391609564227],[-0.581043175686349,44.80386170890745]]}},{"type":"Feature","properties":{"name":"Rue Frédéric Sevene","distance":28.42099854014257,"sectionId":"19710-19795","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5810666445856678,44.80424561790561],[-0.5808928090668181,44.804286673179625],[-0.5807488871936071,44.804359125680534]]}},{"type":"Feature","properties":{"name":"Rue Frédéric Sevene","distance":275.1984784947636,"sectionId":"19710-19649","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5807488871936071,44.804359125680534],[-0.5806433604767209,44.80442433380759],[-0.5805798037661352,44.804492994910674],[-0.5805073940907326,44.80465543920559],[-0.5804569191870467,44.80483286711872],[-0.5800845142245711,44.80596132892959],[-0.5800319463776891,44.806060271437744],[-0.5799391335305457,44.80617948777433],[-0.5798561249134772,44.80625893979868],[-0.5794287913091821,44.80658262885887]]}},{"type":"Feature","properties":{"name":"Rue Jules Guesde","distance":94.10488977383619,"sectionId":"20104-19839","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5963189105283733,44.80485238606977],[-0.5973690746633866,44.80445380231567]]}},{"type":"Feature","properties":{"name":"Rue Matteoti","distance":98.18699938622947,"sectionId":"20104-20033","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5963189105283733,44.80485238606977],[-0.5956951221808845,44.80408803249884]]}},{"type":"Feature","properties":{"name":"Rue Jules Guesde","distance":104.37244417936219,"sectionId":"20104-19893","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5951509690186139,44.80529017486023],[-0.5963189105283733,44.80485238606977]]}},{"type":"Feature","properties":{"name":"Rue Matteoti","distance":120.22192836325372,"sectionId":"20104-20195","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5963748769008166,44.80593403532045],[-0.5963189105283733,44.80485238606977]]}},{"type":"Feature","properties":{"name":"Rue Jules Guesde","distance":93.57709122697675,"sectionId":"19839-19987","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5973690746633866,44.80445380231567],[-0.5984066689433065,44.80404866973753]]}},{"type":"Feature","properties":{"name":"Rue Jules Guesde","distance":94.10488977383619,"sectionId":"19839-20104","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5963189105283733,44.80485238606977],[-0.5973690746633866,44.80445380231567]]}},{"type":"Feature","properties":{"name":"Rue du Docteur Dupeux","distance":163.2595424852332,"sectionId":"19839-19838","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5974384797343806,44.80592283083548],[-0.5973690746633866,44.80445380231567]]}},{"type":"Feature","properties":{"name":"Rue Jules Massenet","distance":78.15584817147173,"sectionId":"19823-19964","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6058602084364522,44.79786435749591],[-0.6051360946018491,44.79834322327829]]}},{"type":"Feature","properties":{"name":"Rue Debussy","distance":161.2293576473608,"sectionId":"19823-19824","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6051360946018491,44.79834322327829],[-0.6065470639244804,44.79939101050488]]}},{"type":"Feature","properties":{"name":"Rue Debussy","distance":222.28425612596598,"sectionId":"19823-25046","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.604111969837402,44.79685463755314],[-0.6037216585126362,44.797204726582656],[-0.6037028575219571,44.79722577112107],[-0.6036934902817037,44.7972479580397],[-0.6036983070576454,44.79726834425349],[-0.6037165704416053,44.797293348995304],[-0.6051360946018491,44.79834322327829]]}},{"type":"Feature","properties":{"name":"Rue Jules Valles","distance":159.36115414431168,"sectionId":"20107-19686","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.586804278974005,44.813557993963954],[-0.5847905382966339,44.81362056946996]]}},{"type":"Feature","properties":{"name":"Rue Lamartine","distance":95.37480538901114,"sectionId":"20107-20073","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.586804278974005,44.813557993963954],[-0.5867538962503042,44.81347031161888],[-0.5866759275563211,44.81336232983947],[-0.586411832963497,44.813016905663964],[-0.5863411349325663,44.81292202654684],[-0.5863038493318639,44.81286176635362],[-0.5862677591195563,44.81279020825787]]}},{"type":"Feature","properties":{"name":"Rue Lamartine","distance":83.81537874627423,"sectionId":"20107-20049","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.586804278974005,44.813557993963954],[-0.5868288775389746,44.81361162768098],[-0.5868430232988615,44.813653880363304],[-0.5868851074284233,44.813860371809284],[-0.5869103158812776,44.814306111755855]]}},{"type":"Feature","properties":{"name":"Rue Jules Valles","distance":159.36115414431168,"sectionId":"19686-20107","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.586804278974005,44.813557993963954],[-0.5847905382966339,44.81362056946996]]}},{"type":"Feature","properties":{"name":"Rue Blanqui","distance":185.41995622201074,"sectionId":"19686-19685","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5831887578305832,44.8130770372922],[-0.5846415793250371,44.81303036486458],[-0.5846955641225412,44.81304172552366],[-0.5847264277124679,44.813061832026165],[-0.5847480533528729,44.813086013059646],[-0.5847567315086715,44.81312177221375],[-0.5847905382966339,44.81362056946996]]}},{"type":"Feature","properties":{"name":"Rue Jules Valles","distance":61.89488237618031,"sectionId":"19686-20108","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5847905382966339,44.81362056946996],[-0.5840087065161284,44.81364925808745]]}},{"type":"Feature","properties":{"name":"Rue Lafitte","distance":31.730044789921187,"sectionId":"19854-19579","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5849219860206252,44.799108507861185],[-0.5849374947614797,44.79893470176171],[-0.5849475093637726,44.798900425269274],[-0.5849626735640122,44.7988757152751],[-0.5849845874674969,44.798857818885494],[-0.585015235590998,44.79884406116928]]}},{"type":"Feature","properties":{"name":"Cité Duprat Et Durand","distance":39.149759389254605,"sectionId":"19854-19855","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5849219860206252,44.799108507861185],[-0.584624345277576,44.79910545838478],[-0.5845034664131551,44.7992165556342]]}},{"type":"Feature","properties":{"name":"Rue Lafitte","distance":54.775026959426775,"sectionId":"19854-as=126415","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5849099847830717,44.799275276226325],[-0.5849219860206252,44.799108507861185]]}},{"type":"Feature","properties":{"name":"Rue Aldona","distance":192.48757160697352,"sectionId":"19579-19578","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5874301042376504,44.79893303199433],[-0.587333371843338,44.79895833349873],[-0.5872897108986389,44.79896628666916],[-0.5871901509034066,44.79897257988817],[-0.5871011491301221,44.798969621901605],[-0.5850808771295336,44.798833524260765],[-0.5850419113984853,44.798837635202695],[-0.585015235590998,44.79884406116928]]}},{"type":"Feature","properties":{"name":"Rue Lafitte","distance":31.730044789921187,"sectionId":"19579-19854","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5849219860206252,44.799108507861185],[-0.5849374947614797,44.79893470176171],[-0.5849475093637726,44.798900425269274],[-0.5849626735640122,44.7988757152751],[-0.5849845874674969,44.798857818885494],[-0.585015235590998,44.79884406116928]]}},{"type":"Feature","properties":{"name":"Rue Lafitte","distance":220.72344604592155,"sectionId":"19579-19670","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5856717428526199,44.79693579087962],[-0.5856117122030445,44.79704668255914],[-0.585448166292606,44.79736469286718],[-0.5851507788091184,44.79797797637938],[-0.5851168591768824,44.79807543313699],[-0.584984869444343,44.79865278398458],[-0.5849744606561111,44.79869292822052],[-0.584977520995132,44.798744178335795],[-0.585015235590998,44.79884406116928]]}},{"type":"Feature","properties":{"name":"Rue Lafitte","distance":17.585635035565264,"sectionId":"19620-19950","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5859913165365825,44.79604678625102],[-0.5860323705535917,44.79589118155161]]}},{"type":"Feature","properties":{"name":"Rue Lafitte","distance":101.94622116171514,"sectionId":"19620-19670","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5856717428526199,44.79693579087962],[-0.5857694496967596,44.79669633556681],[-0.5859913165365825,44.79604678625102]]}},{"type":"Feature","properties":{"name":"Rue André Messager","distance":192.2477239860676,"sectionId":"19620-19619","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5884126126163992,44.79620020875445],[-0.5859913165365825,44.79604678625102]]}},{"type":"Feature","properties":{"name":"Rue Lafitte","distance":17.585635035565264,"sectionId":"19950-19620","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5859913165365825,44.79604678625102],[-0.5860323705535917,44.79589118155161]]}},{"type":"Feature","properties":{"name":"Rue Lafitte","distance":55.290502118394535,"sectionId":"19950-20055","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5860323705535917,44.79589118155161],[-0.5861596889364554,44.79540171578158]]}},{"type":"Feature","properties":{"name":"Rue Frédéric Chopin","distance":100.96471484810158,"sectionId":"19950-19585","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5847781845475827,44.795721463465725],[-0.5860323705535917,44.79589118155161]]}},{"type":"Feature","properties":{"name":"Rue Lafitte","distance":78.74147129765956,"sectionId":"20111-20112","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5863172883442309,44.79475842595066],[-0.5863975534160996,44.79446646168854],[-0.5864790128978815,44.79424048965854],[-0.5865401267186039,44.79406776702903]]}},{"type":"Feature","properties":{"name":"Rue Lafitte","distance":16.958359101791018,"sectionId":"20111-20096","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5862735772825147,44.79490789896886],[-0.5863172883442309,44.79475842595066]]}},{"type":"Feature","properties":{"name":"Rue Maurice Ravel","distance":195.43237543994056,"sectionId":"20111-20008","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5863172883442309,44.79475842595066],[-0.5887778931031118,44.79492023813073]]}},{"type":"Feature","properties":{"name":"Rue Lafitte","distance":78.74147129765956,"sectionId":"20112-20111","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5863172883442309,44.79475842595066],[-0.5863975534160996,44.79446646168854],[-0.5864790128978815,44.79424048965854],[-0.5865401267186039,44.79406776702903]]}},{"type":"Feature","properties":{"name":"Avenue des Fougères","distance":152.40863794258877,"sectionId":"16653-16652","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6256676068307824,44.803400556478046],[-0.6237420017448931,44.80334184354475]]}},{"type":"Feature","properties":{"name":"Avenue Pierre Corneille","distance":96.12281869498077,"sectionId":"16653-16391","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6234301620012386,44.80417829556763],[-0.6237420017448931,44.80334184354475]]}},{"type":"Feature","properties":{"name":"Avenue Pierre Corneille","distance":99.65012386027917,"sectionId":"16653-17288","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6237420017448931,44.80334184354475],[-0.6237854723855056,44.80244520763538]]}},{"type":"Feature","properties":{"name":"Allée des Peupliers","distance":323.94857654334925,"sectionId":"20280-20188","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5964093157695478,44.798490890947136],[-0.5934654355815312,44.80036847519943],[-0.5933378311746387,44.800416106713314]]}},{"type":"Feature","properties":{"name":"Avenue de Thouars","distance":98.5466430460188,"sectionId":"20280-20125","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5933858786547904,44.799536648197865],[-0.5934177642341696,44.79962599311371],[-0.5934280812983581,44.79969611136094],[-0.5934215705793868,44.79982306263804],[-0.5933327965604626,44.800272404632096],[-0.5933378311746387,44.800416106713314]]}},{"type":"Feature","properties":{"name":"Avenue de Thouars","distance":152.71870044750227,"sectionId":"20280-38858","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5937829356824031,44.80173931199198],[-0.5936578669771625,44.80161048284419],[-0.5936113475162896,44.80143863472075],[-0.5936014720252016,44.8012578816845],[-0.5933378311746387,44.800416106713314]]}},{"type":"Feature","properties":{"name":"Rue Blaise Pascal","distance":69.20486053611826,"sectionId":"19680-19679","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5841417671664542,44.80780318649656],[-0.5838043431839468,44.80837808926339]]}},{"type":"Feature","properties":{"name":"Rue Blaise Pascal","distance":60.30626493578607,"sectionId":"19680-19681","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5844384020875807,44.80730298439016],[-0.5841417671664542,44.80780318649656]]}},{"type":"Feature","properties":{"name":"Rue Chambrelant","distance":101.32596230019917,"sectionId":"19680-19763","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5853168094815572,44.808167198079275],[-0.5841417671664542,44.80780318649656]]}},{"type":"Feature","properties":{"name":"Rue Blaise Pascal","distance":69.20486053611826,"sectionId":"19679-19680","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5841417671664542,44.80780318649656],[-0.5838043431839468,44.80837808926339]]}},{"type":"Feature","properties":{"name":"Rue Robespierre","distance":103.40587477480041,"sectionId":"19679-19598","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5850959289495298,44.808524217323345],[-0.5838043431839468,44.80837808926339]]}},{"type":"Feature","properties":{"name":"Rue Robespierre","distance":61.11285102080789,"sectionId":"19679-19843","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5838043431839468,44.80837808926339],[-0.5830314995900483,44.808371088178305]]}},{"type":"Feature","properties":{"name":"Rue Blaise Pascal","distance":78.34864303421818,"sectionId":"19683-19682","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5850986212444692,44.80621552009868],[-0.5847038209642228,44.80686249834282]]}},{"type":"Feature","properties":{"name":"Rue Frédéric Sevene","distance":12.153081714270742,"sectionId":"19683-19951","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5850986212444692,44.80621552009868],[-0.5849876235953666,44.80613983686355]]}},{"type":"Feature","properties":{"name":"Rue Frédéric Sevene","distance":80.33783118491654,"sectionId":"19683-58724","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5850986212444692,44.80621552009868],[-0.5856885106011497,44.80648770921924],[-0.5858690067682033,44.80658001760952],[-0.5859312438765092,44.80662709269295]]}},{"type":"Feature","properties":{"name":"Rue Blaise Pascal","distance":78.34864303421818,"sectionId":"19682-19683","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5850986212444692,44.80621552009868],[-0.5847038209642228,44.80686249834282]]}},{"type":"Feature","properties":{"name":"Rue Blaise Pascal","distance":53.236705476991645,"sectionId":"19682-19681","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5847038209642228,44.80686249834282],[-0.5844384020875807,44.80730298439016]]}},{"type":"Feature","properties":{"name":"Rue Descartes","distance":93.78791039016886,"sectionId":"19682-19814","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5858764711911255,44.80673826182572],[-0.5857051846189175,44.806765685612355],[-0.5847038209642228,44.80686249834282]]}},{"type":"Feature","properties":{"name":"Rue Blumerel","distance":21.47668825485639,"sectionId":"19694-19631","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5826711868171895,44.80315617672418],[-0.5825067725348939,44.803310080280106]]}},{"type":"Feature","properties":{"name":"Rue Blumerel","distance":22.115759947683085,"sectionId":"19694-19695","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5825067725348939,44.803310080280106],[-0.5823466062177725,44.80347330833263]]}},{"type":"Feature","properties":{"name":"Rue Edouard Herriot","distance":67.55513392639045,"sectionId":"19694-19862","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5825067725348939,44.803310080280106],[-0.581742359284271,44.803038507850836]]}},{"type":"Feature","properties":{"name":"Rue Blumerel","distance":22.115759947683085,"sectionId":"19695-19694","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5825067725348939,44.803310080280106],[-0.5823466062177725,44.80347330833263]]}},{"type":"Feature","properties":{"name":"Rue Blumerel","distance":119.66046496976986,"sectionId":"19695-19696","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5823466062177725,44.80347330833263],[-0.5819241425744195,44.803882972506976],[-0.5818033658076843,44.80399595484546],[-0.581659112406581,44.80408544440446],[-0.5814155341873469,44.80420553622495],[-0.5813624680708289,44.80427602942861]]}},{"type":"Feature","properties":{"name":"Résidence Coppelia","distance":164.28730534107416,"sectionId":"19695-19955","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5824016378533508,44.8046561473278],[-0.5829089660054215,44.80374908018679],[-0.582903258633229,44.80370611090439],[-0.5823466062177725,44.80347330833263]]}},{"type":"Feature","properties":{"name":"Rue Frédéric Sevene","distance":23.66391637342175,"sectionId":"19696-19795","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5813624680708289,44.80427602942861],[-0.5812007891825703,44.804254095760825],[-0.5810666445856678,44.80424561790561]]}},{"type":"Feature","properties":{"name":"Rue Blumerel","distance":119.66046496976986,"sectionId":"19696-19695","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5823466062177725,44.80347330833263],[-0.5819241425744195,44.803882972506976],[-0.5818033658076843,44.80399595484546],[-0.581659112406581,44.80408544440446],[-0.5814155341873469,44.80420553622495],[-0.5813624680708289,44.80427602942861]]}},{"type":"Feature","properties":{"name":"Rue Frédéric Sevene","distance":92.39003763058274,"sectionId":"19696-19955","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5824016378533508,44.8046561473278],[-0.58174436688198,44.80442101575134],[-0.5813624680708289,44.80427602942861]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":32.0308191194287,"sectionId":"29092-29090","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5960955461028271,44.80064098746413],[-0.5961152525674497,44.80066279483778],[-0.5961601688831016,44.800695245524565],[-0.5962136134296593,44.80072040011352],[-0.5962732347035993,44.80073707179627],[-0.5963364622886191,44.80074462118647],[-0.596400358148639,44.800742600687954],[-0.5964472687166597,44.8007340007718]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":102.58901642789557,"sectionId":"29092-19728","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.595003061518976,44.80107819332798],[-0.5956578561455381,44.800701218459],[-0.595774021083448,44.80066088231499],[-0.5958302538970383,44.800647573885925],[-0.5958978737692194,44.800638319427264],[-0.5959739481210525,44.80063681493237],[-0.5960955461028271,44.80064098746413]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":15.887916153459132,"sectionId":"29092-38609","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5960516029257379,44.800504460980235],[-0.5960487952745205,44.80053652895545],[-0.5960583143303593,44.800581629428855],[-0.5960807164692279,44.80062434073841],[-0.5960955461028271,44.80064098746413]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":32.0308191194287,"sectionId":"29090-29092","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5960955461028271,44.80064098746413],[-0.5961152525674497,44.80066279483778],[-0.5961601688831016,44.800695245524565],[-0.5962136134296593,44.80072040011352],[-0.5962732347035993,44.80073707179627],[-0.5963364622886191,44.80074462118647],[-0.596400358148639,44.800742600687954],[-0.5964472687166597,44.8007340007718]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":11.415174101239872,"sectionId":"29090-29089","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5964472687166597,44.8007340007718],[-0.5964623967240166,44.800731090165144],[-0.5965197072826585,44.80071072089456],[-0.5965703030351481,44.8006820962064]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":176.35619959982787,"sectionId":"29090-as=125550","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5964472687166597,44.8007340007718],[-0.5965582160638913,44.8008513827091],[-0.5967604728489094,44.80105731044049],[-0.5979988960069387,44.80186392163605],[-0.5979988960069387,44.80186392163605]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":217.9115167842337,"sectionId":"22866-27462","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6021125593266066,44.796799076337216],[-0.601778041738363,44.79705010191015],[-0.6015717121996816,44.79718815701013],[-0.6014062180306077,44.79728726403015],[-0.6002719999343514,44.79794600713293],[-0.600032246774405,44.798081784266614]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":10.69023832591823,"sectionId":"22866-19939","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6001156711618988,44.798157515156575],[-0.600032246774405,44.798081784266614]]}},{"type":"Feature","properties":{"name":"Rue François Rabelais","distance":37.109170779093816,"sectionId":"22866-19940","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.600032246774405,44.798081784266614],[-0.5998714173251674,44.79791932188868],[-0.5997815792081415,44.7978502797926],[-0.5997444328869818,44.79781866557593]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":153.0098586553278,"sectionId":"22866-as=124811","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.600032246774405,44.798081784266614],[-0.5998593535718492,44.79818202390513],[-0.5985643386194901,44.79894691092332],[-0.5985415793187204,44.79895998147994]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":214.1658436689485,"sectionId":"25955-20352","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6032483547232231,44.80789937519473],[-0.6024832081017839,44.80785361709681],[-0.6021693836075397,44.80784346760613],[-0.6016872423585642,44.80781684711325],[-0.6014591912984921,44.80777596401466],[-0.6012361508389614,44.807685646738456],[-0.6010954559109337,44.80759884765725],[-0.6009506036750458,44.80747587681038],[-0.6008390553247239,44.80732491684311]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":7.8432090801473855,"sectionId":"25955-20354","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6032483547232231,44.80789937519473],[-0.6032398452665743,44.80796972897076]]}},{"type":"Feature","properties":{"name":"Avenue Prévost","distance":99.02586638296772,"sectionId":"25955-20407","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6032483547232231,44.80789937519473],[-0.6032584369381895,44.807807622033835],[-0.6032463633667129,44.80769747323436],[-0.6031835001439588,44.80757443006975],[-0.6029063912671518,44.80705235166629]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":16.888184647908474,"sectionId":"25955-as=126047","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6035977134475037,44.807921114835146],[-0.6032483547232231,44.80789937519473]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":214.1658436689485,"sectionId":"20352-25955","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6032483547232231,44.80789937519473],[-0.6024832081017839,44.80785361709681],[-0.6021693836075397,44.80784346760613],[-0.6016872423585642,44.80781684711325],[-0.6014591912984921,44.80777596401466],[-0.6012361508389614,44.807685646738456],[-0.6010954559109337,44.80759884765725],[-0.6009506036750458,44.80747587681038],[-0.6008390553247239,44.80732491684311]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":8.801537498063256,"sectionId":"20352-26731","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6007358852897697,44.80735466712789],[-0.6008390553247239,44.80732491684311]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":77.45553631889318,"sectionId":"20352-53584","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6008390553247239,44.80732491684311],[-0.6007290629329844,44.80702464095927],[-0.6005427197009086,44.80666105414587]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":7.8432090801473855,"sectionId":"20354-25955","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6032483547232231,44.80789937519473],[-0.6032398452665743,44.80796972897076]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":170.94111504385845,"sectionId":"20354-27555","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6032398452665743,44.80796972897076],[-0.6040862033879802,44.80802308816946],[-0.6044102554291122,44.80802678270622],[-0.6046669698534264,44.80801603512214],[-0.6049138040245279,44.80799298852568],[-0.6053857356036779,44.80792308022486]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":"Unknown","sectionId":"20354-as=3829","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6031165359859968,44.80796273513895],[-0.6032398452665743,44.80796972897076]]}},{"type":"Feature","properties":{"name":"Rue de la Vieille Tour","distance":37.12079386981832,"sectionId":"20392-25654","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6004399085619743,44.807585639041214],[-0.6006124035503495,44.80752315662399],[-0.6007627289438932,44.8075149747893],[-0.6008795044312589,44.807547040725375]]}},{"type":"Feature","properties":{"name":"Rue de la Vieille Tour","distance":34.725279131029644,"sectionId":"20392-26731","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6004399085619743,44.807585639041214],[-0.6007358852897697,44.80735466712789]]}},{"type":"Feature","properties":{"name":"Rue de la Vieille Tour","distance":77.3856778038674,"sectionId":"20392-20163","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6003365168343558,44.808270294930296],[-0.6003523363859251,44.80782866074097],[-0.6003733332435589,44.80768062133278],[-0.6004399085619743,44.807585639041214]]}},{"type":"Feature","properties":{"name":"Rue de la Vieille Tour","distance":37.12079386981832,"sectionId":"25654-20392","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6004399085619743,44.807585639041214],[-0.6006124035503495,44.80752315662399],[-0.6007627289438932,44.8075149747893],[-0.6008795044312589,44.807547040725375]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":24.197450655317496,"sectionId":"25654-26731","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6007358852897697,44.80735466712789],[-0.6008795044312589,44.807547040725375]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":188.93204001304417,"sectionId":"25654-as=3829","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6008795044312589,44.807547040725375],[-0.601083801841782,44.8076999287757],[-0.6013702754122733,44.80781715441462],[-0.6016425013496721,44.80787240336805],[-0.602132299432441,44.807904096450656],[-0.6024593348230423,44.80792112432897],[-0.6031165359859968,44.80796273513895],[-0.6031165359859968,44.80796273513895]]}},{"type":"Feature","properties":{"name":"Rue du 19 Mars 1962","distance":195.77943075051135,"sectionId":"19942-20307","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5957169283102807,44.79632937035617],[-0.5954041624021152,44.79748951947677],[-0.5952346629585121,44.798058162349264]]}},{"type":"Feature","properties":{"name":"Rue François Rabelais","distance":178.3356177960784,"sectionId":"19942-19917","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5978580732608683,44.79681376542394],[-0.5975387306824177,44.7967081121789],[-0.5972938299217984,44.796635685873376],[-0.5970455231811215,44.796569492389416],[-0.5967940685367388,44.79650961362468],[-0.5965398559308785,44.796456217386655],[-0.5962829133280477,44.79640975318296],[-0.5958938856143271,44.796351070038696],[-0.5957169283102807,44.79632937035617]]}},{"type":"Feature","properties":{"name":"Rue François Rabelais","distance":67.67579822769204,"sectionId":"19942-19944","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5957169283102807,44.79632937035617],[-0.5953694502999431,44.79629585589488],[-0.5949731293696177,44.79627235214532],[-0.5948658704777255,44.79626871633933]]}},{"type":"Feature","properties":{"name":"Place du 1er Mai","distance":11.7179343426471,"sectionId":"20307-20189","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.595370898235511,44.79809223046674],[-0.5953040466994333,44.79806506719086],[-0.5952728247133372,44.79805740633734],[-0.5952346629585121,44.798058162349264]]}},{"type":"Feature","properties":{"name":"Rue du 19 Mars 1962","distance":195.77943075051135,"sectionId":"20307-19942","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5957169283102807,44.79632937035617],[-0.5954041624021152,44.79748951947677],[-0.5952346629585121,44.798058162349264]]}},{"type":"Feature","properties":{"name":"Place du 1er Mai","distance":36.26727521839676,"sectionId":"20307-19735","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5952346629585121,44.798058162349264],[-0.5952131881691041,44.79806478666288],[-0.5951699318819951,44.798091377143336],[-0.594898196507284,44.7982785100566]]}},{"type":"Feature","properties":{"name":"Cours Gambetta","distance":90.23533846747159,"sectionId":"19976-as=130301","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5898720404281652,44.81345825178031],[-0.5901832032794003,44.813250522037926],[-0.5905276978511486,44.81301516516125],[-0.59069381739304,44.81289461693631],[-0.59069381739304,44.81289461693631]]}},{"type":"Feature","properties":{"name":"Cours Gambetta","distance":11.142916487084115,"sectionId":"19740-23469","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5907714977003081,44.812804875596846],[-0.5907958574139518,44.81280383641524],[-0.5908352676488767,44.81279655689838],[-0.5908716670376737,44.81278360717028],[-0.5908991722573637,44.81276805557285]]}},{"type":"Feature","properties":{"name":"Cours Gambetta","distance":6.641031311050199,"sectionId":"19740-30131","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5906896860220451,44.81279376557689],[-0.5907151533216196,44.81280034840929],[-0.5907553140878655,44.812805116199584],[-0.5907714977003081,44.812804875596846]]}},{"type":"Feature","properties":{"name":"Cours Gambetta","distance":"Unknown","sectionId":"19740-as=130301","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.59069381739304,44.81289461693631],[-0.5907714977003081,44.812804875596846]]}},{"type":"Feature","properties":{"name":"Cours Gambetta","distance":108.77284583573972,"sectionId":"30133-30127","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5897857054238459,44.81339890989978],[-0.5894912002426408,44.813595753457896],[-0.5889939979524347,44.81393150166272],[-0.5887850089633541,44.81407096556667]]}},{"type":"Feature","properties":{"name":"Cours Gambetta","distance":98.00376878953959,"sectionId":"30133-26434","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.590615027273328,44.81275324319808],[-0.5905485095692103,44.81285965756235],[-0.5904563026006492,44.81293967799133],[-0.5899485281572142,44.813288375888696],[-0.5897857054238459,44.81339890989978]]}},{"type":"Feature","properties":{"name":"Avenue Raymond Poincare","distance":196.98113228021333,"sectionId":"30133-20197","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5897857054238459,44.81339890989978],[-0.5895381796612378,44.81321214406544],[-0.5894544608780478,44.813172447314024],[-0.5893577190473525,44.81314919598265],[-0.5874394502332281,44.81301107708922]]}},{"type":"Feature","properties":{"name":"Cours Gambetta","distance":108.77284583573972,"sectionId":"30127-30133","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5897857054238459,44.81339890989978],[-0.5894912002426408,44.813595753457896],[-0.5889939979524347,44.81393150166272],[-0.5887850089633541,44.81407096556667]]}},{"type":"Feature","properties":{"name":"Rue Jacques Juillac","distance":159.2184857514275,"sectionId":"30127-20071","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5873405205806616,44.81311328679103],[-0.587507771417311,44.81325682730876],[-0.5882334710459839,44.81387964457536],[-0.5882836764128162,44.81390751766863],[-0.5886514671698074,44.81402581361711],[-0.5887850089633541,44.81407096556667]]}},{"type":"Feature","properties":{"name":"Cours Gambetta","distance":17.526123305856608,"sectionId":"23469-27350","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5908991722573637,44.81276805557285],[-0.5909034472362737,44.812765578495956],[-0.5909293900218038,44.81274322998895],[-0.590948162073535,44.81271750456253],[-0.5909589520926906,44.81268959889512],[-0.5909614539990063,44.81266069371542],[-0.5909553673102153,44.81263205965662],[-0.5909511668127475,44.812623544396445]]}},{"type":"Feature","properties":{"name":"Rue Camille Pelletan","distance":29.809434719346754,"sectionId":"23469-19741","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5911660667008316,44.8129569095402],[-0.591061768215042,44.81287534498284],[-0.5909861552343875,44.81283170009456],[-0.5908991722573637,44.81276805557285]]}},{"type":"Feature","properties":{"name":"Cours Gambetta","distance":11.142916487084115,"sectionId":"23469-19740","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5907714977003081,44.812804875596846],[-0.5907958574139518,44.81280383641524],[-0.5908352676488767,44.81279655689838],[-0.5908716670376737,44.81278360717028],[-0.5908991722573637,44.81276805557285]]}},{"type":"Feature","properties":{"name":"Cours Gambetta","distance":98.00376878953959,"sectionId":"26434-30133","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.590615027273328,44.81275324319808],[-0.5905485095692103,44.81285965756235],[-0.5904563026006492,44.81293967799133],[-0.5899485281572142,44.813288375888696],[-0.5897857054238459,44.81339890989978]]}},{"type":"Feature","properties":{"name":"Cours Gambetta","distance":7.489570944938807,"sectionId":"26434-30131","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.590615027273328,44.81275324319808],[-0.5906433891114764,44.812773787451505],[-0.5906772864777297,44.81278974295795],[-0.5906896860220451,44.81279376557689]]}},{"type":"Feature","properties":{"name":"Cours Gambetta","distance":16.29751644388974,"sectionId":"26434-19873","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.590587153787817,44.81261458620894],[-0.5905859859703673,44.812616154461374],[-0.590575069480945,44.81264406408083],[-0.5905726936862072,44.81267296526501],[-0.5905786538849247,44.812701603330616],[-0.5905929979854905,44.812728715618526],[-0.590615027273328,44.81275324319808]]}},{"type":"Feature","properties":{"name":"Cours Gambetta","distance":6.641031311050199,"sectionId":"30131-19740","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5906896860220451,44.81279376557689],[-0.5907151533216196,44.81280034840929],[-0.5907553140878655,44.812805116199584],[-0.5907714977003081,44.812804875596846]]}},{"type":"Feature","properties":{"name":"Cours Gambetta","distance":7.489570944938807,"sectionId":"30131-26434","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.590615027273328,44.81275324319808],[-0.5906433891114764,44.812773787451505],[-0.5906772864777297,44.81278974295795],[-0.5906896860220451,44.81279376557689]]}},{"type":"Feature","properties":{"name":"Avenue de Villemejan","distance":82.05688903338846,"sectionId":"19824-19965","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6071072432096107,44.79876914928914],[-0.6065470639244804,44.79939101050488]]}},{"type":"Feature","properties":{"name":"Rue Debussy","distance":161.2293576473608,"sectionId":"19824-19823","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6051360946018491,44.79834322327829],[-0.6065470639244804,44.79939101050488]]}},{"type":"Feature","properties":{"name":"Avenue de Villemejan","distance":49.305730885501376,"sectionId":"19824-25611","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6065470639244804,44.79939101050488],[-0.6061927458767559,44.79975627139223]]}},{"type":"Feature","properties":{"name":"Rue Doyen Henri Vizioz","distance":132.5850124180962,"sectionId":"19844-19848","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5958535522035362,44.81201358750806],[-0.5957016899524444,44.81082479978316]]}},{"type":"Feature","properties":{"name":"Impasse Doyen Henri Vizioz","distance":106.08871455711692,"sectionId":"19844-19845","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5958535522035362,44.81201358750806],[-0.5956737382215742,44.812028009427486],[-0.5954147285449465,44.81212600812668],[-0.5950539714450978,44.81219560304909],[-0.5949821653898325,44.81223129282504],[-0.594871339916261,44.81231704014313],[-0.5946333376497162,44.81235014458704]]}},{"type":"Feature","properties":{"name":"Rue Doyen Henri Vizioz","distance":113.38223176111663,"sectionId":"19844-19847","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5972536510442011,44.81180591126048],[-0.5964206283636074,44.811967014130445],[-0.5958535522035362,44.81201358750806]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":10.23221354600111,"sectionId":"20139-24223","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5913207195900397,44.8106456601919],[-0.5913289295122336,44.8106413473032],[-0.5913548793182154,44.81062116040356],[-0.5913738944233753,44.81059731891887],[-0.5913855063098329,44.810568396335654]]}},{"type":"Feature","properties":{"name":"Rue Pierre Noailles","distance":50.96059064843227,"sectionId":"20139-19731","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5913855063098329,44.810568396335654],[-0.5915059958476927,44.81057882506527],[-0.5915647133387504,44.810576790969876],[-0.5920218479019826,44.81051866672442]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":11.854013157901797,"sectionId":"20139-23169","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5913855063098329,44.810568396335654],[-0.5913875190001728,44.81054383050787],[-0.591381533154683,44.81051681475529],[-0.5913672956651731,44.81049141075643],[-0.5913453901569167,44.81046886122681]]}},{"type":"Feature","properties":{"name":"Rue Pierre Noailles","distance":50.96059064843227,"sectionId":"19731-20139","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5913855063098329,44.810568396335654],[-0.5915059958476927,44.81057882506527],[-0.5915647133387504,44.810576790969876],[-0.5920218479019826,44.81051866672442]]}},{"type":"Feature","properties":{"name":"Rue Pierre Noailles","distance":174.55092266160443,"sectionId":"19731-28643","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5920218479019826,44.81051866672442],[-0.5922877783847363,44.810485045889244],[-0.5933586256701098,44.81029439020979],[-0.5934688957326942,44.810278925819105],[-0.5941901639134951,44.81028631546872]]}},{"type":"Feature","properties":{"name":"Impasse des Briques","distance":29.4904440559289,"sectionId":"19731-19732","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5920218479019826,44.81051866672442],[-0.5919607284167003,44.81025674671239]]}},{"type":"Feature","properties":{"name":"Rue Pierre Noailles","distance":370.4538778128619,"sectionId":"28642-23370","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5944228342264861,44.81006231609056],[-0.5945533708938209,44.80972858078369],[-0.5945808512477164,44.809674113537696],[-0.594616591539749,44.809616142302644],[-0.5946769974785924,44.80953568178889],[-0.5947496424228284,44.80945870798201],[-0.5948284216877263,44.80939081871319],[-0.5950739627061115,44.80920487609095],[-0.5952680107222161,44.80906172799206],[-0.5953507532251736,44.809014792273146],[-0.5954219513776814,44.80898362543968],[-0.5957266658883242,44.80887607405456],[-0.5959649222885526,44.80879251279228],[-0.5961333278654951,44.80873737329461],[-0.5964048988148536,44.80866654039342],[-0.5965845512959245,44.808633475068696],[-0.596769838742345,44.808609599819775],[-0.5968754036219301,44.80859788406469],[-0.5973931236108091,44.808551784473686],[-0.5978712484691127,44.808503872132526],[-0.5979044299964055,44.80849822837738],[-0.5979413498683702,44.80848760192193],[-0.5979952493613764,44.808461124374034],[-0.5980889229424843,44.8084150118628]]}},{"type":"Feature","properties":{"name":"Rue Pierre Noailles","distance":34.564865465432916,"sectionId":"28642-20053","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5944407225173641,44.81033496976032],[-0.5944521996892678,44.81032217576111],[-0.5945133408600697,44.81018043632527],[-0.5945170158935137,44.810164285583184],[-0.5945170002760433,44.81014780105634],[-0.5945132069583248,44.81013161606993],[-0.594505658371524,44.81011609024261],[-0.5944946351421221,44.81010166511787],[-0.5944804179016955,44.810088782235205],[-0.594463402358993,44.810077699335835],[-0.5944439898304671,44.81006876406697],[-0.5944228342264861,44.81006231609056]]}},{"type":"Feature","properties":{"name":"Rue Pierre Noailles","distance":35.927295496249066,"sectionId":"28642-28643","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5944228342264861,44.81006231609056],[-0.5944004351257461,44.8100582495383],[-0.5943774464355764,44.810056904073946],[-0.594354505244212,44.81005834964841],[-0.5943321111292474,44.810062480393896],[-0.5943110162640742,44.81006918245979],[-0.5942918409173845,44.81007825608442],[-0.5942749471610891,44.81008941958086],[-0.5942608289715072,44.810102477178496],[-0.5942499635055617,44.81011696338905],[-0.5942427072317411,44.81013250662338],[-0.5941909183568125,44.810257825699686],[-0.5941890479904948,44.81027247809178],[-0.5941901639134951,44.81028631546872]]}},{"type":"Feature","properties":{"name":"Rue Pierre Noailles","distance":370.4538778128619,"sectionId":"23370-28642","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5944228342264861,44.81006231609056],[-0.5945533708938209,44.80972858078369],[-0.5945808512477164,44.809674113537696],[-0.594616591539749,44.809616142302644],[-0.5946769974785924,44.80953568178889],[-0.5947496424228284,44.80945870798201],[-0.5948284216877263,44.80939081871319],[-0.5950739627061115,44.80920487609095],[-0.5952680107222161,44.80906172799206],[-0.5953507532251736,44.809014792273146],[-0.5954219513776814,44.80898362543968],[-0.5957266658883242,44.80887607405456],[-0.5959649222885526,44.80879251279228],[-0.5961333278654951,44.80873737329461],[-0.5964048988148536,44.80866654039342],[-0.5965845512959245,44.808633475068696],[-0.596769838742345,44.808609599819775],[-0.5968754036219301,44.80859788406469],[-0.5973931236108091,44.808551784473686],[-0.5978712484691127,44.808503872132526],[-0.5979044299964055,44.80849822837738],[-0.5979413498683702,44.80848760192193],[-0.5979952493613764,44.808461124374034],[-0.5980889229424843,44.8084150118628]]}},{"type":"Feature","properties":{"name":"Rue Pierre Noailles","distance":30.495438773482356,"sectionId":"23370-23323","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5980889229424843,44.8084150118628],[-0.5981067637449384,44.808431202812514],[-0.5981344554242116,44.80844708214756],[-0.5981666375957528,44.80845786490175],[-0.5982014916404421,44.80846279785972],[-0.5982371063146863,44.80846167123372],[-0.5982712083317555,44.80845455693476],[-0.598301920119451,44.808441784608036],[-0.5983275240803287,44.8084242193312],[-0.5983464289124987,44.80840272218954],[-0.5983574558761621,44.80837868171107],[-0.5983600071891754,44.808352657301484]]}},{"type":"Feature","properties":{"name":"Rue Pierre Noailles","distance":21.944456829621195,"sectionId":"23370-23291","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.598175104191677,44.80825698384061],[-0.5981543865269713,44.80826160283149],[-0.5981236748031078,44.80827437511933],[-0.5980980708468993,44.80829194035003],[-0.5980791659571215,44.80831343745036],[-0.5980680125969882,44.808337481898235],[-0.5980652899651232,44.80836279105752],[-0.5980711496447659,44.80838773865554],[-0.5980852548808018,44.80841098410915],[-0.5980889229424843,44.8084150118628]]}},{"type":"Feature","properties":{"name":"Rue Pierre Romain","distance":166.633519989351,"sectionId":"19953-19629","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5839926048931097,44.805442794196125],[-0.5848800257630388,44.80408206975226]]}},{"type":"Feature","properties":{"name":"Rue Frédéric Sevene","distance":111.81209162300735,"sectionId":"19953-19954","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5839926048931097,44.805442794196125],[-0.583502280394917,44.805131337274695],[-0.583204235694667,44.80498182319573],[-0.5828735045100534,44.80483162648224]]}},{"type":"Feature","properties":{"name":"Rue Frédéric Sevene","distance":22.17655495400244,"sectionId":"19953-19952","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5841858371471785,44.80558750187525],[-0.5839926048931097,44.805442794196125]]}},{"type":"Feature","properties":{"name":"Rue Antoine Carles","distance":112.23208725050941,"sectionId":"19629-19630","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5848800257630388,44.80408206975226],[-0.5836002037568148,44.80364523865101]]}},{"type":"Feature","properties":{"name":"Rue Pierre Romain","distance":166.633519989351,"sectionId":"19629-19953","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5839926048931097,44.805442794196125],[-0.5848800257630388,44.80408206975226]]}},{"type":"Feature","properties":{"name":"Rue Antoine Carles","distance":108.25164188039562,"sectionId":"19629-19628","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5861198120682125,44.80449537688717],[-0.5848800257630388,44.80408206975226]]}},{"type":"Feature","properties":{"name":"Place du 1er Mai","distance":36.26727521839676,"sectionId":"19735-20307","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5952346629585121,44.798058162349264],[-0.5952131881691041,44.79806478666288],[-0.5951699318819951,44.798091377143336],[-0.594898196507284,44.7982785100566]]}},{"type":"Feature","properties":{"name":"Place du 1er Mai","distance":13.374035733199824,"sectionId":"19735-20126","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.594898196507284,44.7982785100566],[-0.5950341181897741,44.7983501527892]]}},{"type":"Feature","properties":{"name":"Rue Calixte Camelle","distance":60.553892533250384,"sectionId":"19735-19734","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.594898196507284,44.7982785100566],[-0.5942055605025433,44.79804610025062]]}},{"type":"Feature","properties":{"name":"Place du 1er Mai","distance":39.11589238959954,"sectionId":"20126-20189","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5950341181897741,44.7983501527892],[-0.595370898235511,44.79809223046674]]}},{"type":"Feature","properties":{"name":"Place du 1er Mai","distance":13.374035733199824,"sectionId":"20126-19735","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.594898196507284,44.7982785100566],[-0.5950341181897741,44.7983501527892]]}},{"type":"Feature","properties":{"name":"Rue Léon Bourgeois","distance":186.32581944229105,"sectionId":"20126-20125","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5933858786547904,44.799536648197865],[-0.5935226534972625,44.79949611353793],[-0.5950341181897741,44.7983501527892]]}},{"type":"Feature","properties":{"name":"Impasse Primevères","distance":56.5240965161306,"sectionId":"20308-19552","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.581117210519938,44.79888183393539],[-0.5811542306378672,44.7988545445758],[-0.5813370818998064,44.79869411663818],[-0.5813616910905933,44.798674784880426],[-0.5813901576516096,44.79865848449798],[-0.5814225430180948,44.79864620445074],[-0.5815242089175237,44.79861678908058],[-0.5815915360821149,44.79860079621852],[-0.5816715327550772,44.79859323230218]]}},{"type":"Feature","properties":{"name":"Rue du Professeur Arnozan","distance":19.088194020032883,"sectionId":"20316-13285","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5881968501730691,44.80882730336783],[-0.5881915726533976,44.80880350809471],[-0.5881709789856449,44.80876947624122],[-0.5881395344612194,44.808740020517845],[-0.5880991079476455,44.80871670343523],[-0.5880525730551078,44.80870096572785]]}},{"type":"Feature","properties":{"name":"Rue du Professeur Arnozan","distance":12.392216717418354,"sectionId":"20316-20314","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5880525730551078,44.80870096572785],[-0.5880009960901588,44.8086936745718],[-0.5879490890951463,44.80869531189805],[-0.5878989934571109,44.80870572007875]]}},{"type":"Feature","properties":{"name":"Rue du Professeur Arnozan","distance":148.19059833554357,"sectionId":"20316-as=4653","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5880525730551078,44.80870096572785],[-0.5881691368308702,44.80848577673915],[-0.5883137467476924,44.80818448546386],[-0.5887617020151555,44.80746699421062],[-0.5887617020151555,44.80746699421062]]}},{"type":"Feature","properties":{"name":"Rond-point de la Légion d'Honneur","distance":11.564228064257836,"sectionId":"29242-29243","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5886892546935539,44.80732974323805],[-0.5887206567832344,44.80734226475539],[-0.5887557979583218,44.80734980387392],[-0.5887924808823762,44.80735161918249],[-0.5888287887820327,44.80734741083005]]}},{"type":"Feature","properties":{"name":"Rond-point de la Légion d'Honneur","distance":8.111059623261639,"sectionId":"29242-29248","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5889127340169472,44.807307558385496],[-0.5888930665239506,44.807322952362355],[-0.5888628608630143,44.80733777801807],[-0.5888287887820327,44.80734741083005]]}},{"type":"Feature","properties":{"name":"Rue du Professeur Arnozan","distance":"Unknown","sectionId":"29242-as=4653","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5887617020151555,44.80746699421062],[-0.5888287887820327,44.80734741083005]]}},{"type":"Feature","properties":{"name":"Rue César Franck","distance":58.340055647312724,"sectionId":"19761-19748","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5833254041750363,44.79571293010645],[-0.5832555378090325,44.795753146017745],[-0.5832271725725099,44.79575476042887],[-0.5832006890042392,44.79575000982645],[-0.5831794974524254,44.79574491231279],[-0.5831548151005556,44.79573046620842],[-0.5827995422326325,44.79544303896483]]}},{"type":"Feature","properties":{"name":"Rue Léo Delibes","distance":84.82911708757146,"sectionId":"19761-19583","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.584141209074514,44.795217084931785],[-0.5833254041750363,44.79571293010645]]}},{"type":"Feature","properties":{"name":"Rue César Franck","distance":79.14133929284861,"sectionId":"19761-19759","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5839721605433712,44.79625664083094],[-0.5833254041750363,44.79571293010645]]}},{"type":"Feature","properties":{"name":"Rue César Franck","distance":58.340055647312724,"sectionId":"19748-19761","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5833254041750363,44.79571293010645],[-0.5832555378090325,44.795753146017745],[-0.5832271725725099,44.79575476042887],[-0.5832006890042392,44.79575000982645],[-0.5831794974524254,44.79574491231279],[-0.5831548151005556,44.79573046620842],[-0.5827995422326325,44.79544303896483]]}},{"type":"Feature","properties":{"name":"Rue Camille Saint-Saëns","distance":100.89612736212217,"sectionId":"19748-19749","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5827995422326325,44.79544303896483],[-0.5827263613068654,44.79559686185562],[-0.5826967176719626,44.795645088623786],[-0.58266853671454,44.795680207463164],[-0.5823519493253732,44.79602960833392],[-0.5822565001424345,44.79625673810243]]}},{"type":"Feature","properties":{"name":"Rue Camille Saint-Saëns","distance":94.93605559858712,"sectionId":"19748-19581","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5836461685000797,44.794846686020186],[-0.583580832285504,44.79489666840283],[-0.5828446280968299,44.7953684722123],[-0.5827995422326325,44.79544303896483]]}},{"type":"Feature","properties":{"name":"Rue Fernand Monlun","distance":139.8126900019469,"sectionId":"16094-16624","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6328870155811008,44.79910027617863],[-0.6328130258522322,44.79912480038317],[-0.6311324422268266,44.79922387400509]]}},{"type":"Feature","properties":{"name":"Rue Blaise Pascal","distance":117.42304664005545,"sectionId":"16094-52048","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6328870155811008,44.79910027617863],[-0.6327586572354493,44.79892258670855],[-0.6326526022515895,44.79875949899196],[-0.6326010835463975,44.79863061276353],[-0.6324753154092333,44.79809439571101]]}},{"type":"Feature","properties":{"name":"Rue Maurice Berteaux","distance":114.0762975116398,"sectionId":"20160-20098","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5876207778322377,44.81232353005264],[-0.5876833796143399,44.811924385372386],[-0.587769795632363,44.81130198763022]]}},{"type":"Feature","properties":{"name":"Avenue Maréchal de Lattre de Tassigny","distance":113.48390393231695,"sectionId":"20160-20116","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5876207778322377,44.81232353005264],[-0.5861854658165723,44.812315730242524]]}},{"type":"Feature","properties":{"name":"Rue Maurice Berteaux","distance":77.70074186718841,"sectionId":"20160-20197","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5874394502332281,44.81301107708922],[-0.5876207778322377,44.81232353005264]]}},{"type":"Feature","properties":{"name":"Avenue Maréchal de Lattre de Tassigny","distance":138.62597467458676,"sectionId":"20160-30058","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5893594529373799,44.81248406737403],[-0.5884670082335232,44.81239448681385],[-0.5876207778322377,44.81232353005264]]}},{"type":"Feature","properties":{"name":"Rue Maurice Berteaux","distance":114.0762975116398,"sectionId":"20098-20160","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5876207778322377,44.81232353005264],[-0.5876833796143399,44.811924385372386],[-0.587769795632363,44.81130198763022]]}},{"type":"Feature","properties":{"name":"Passage Joguet","distance":47.4522032486924,"sectionId":"20098-20099","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.587769795632363,44.81130198763022],[-0.5883677434567133,44.811338707097136]]}},{"type":"Feature","properties":{"name":"Rue Maurice Berteaux","distance":92.4473378481852,"sectionId":"20098-as=129212","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.587769795632363,44.81130198763022],[-0.5878775393091816,44.81047320487493]]}},{"type":"Feature","properties":{"name":"Rue de Megret","distance":224.11774507414395,"sectionId":"19988-20003","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5899764767772134,44.80123120461399],[-0.5901976242756848,44.800820476484965],[-0.5902259155593931,44.80074652692611],[-0.5905132997828084,44.79979447630037],[-0.5907424423278052,44.799292871840485]]}},{"type":"Feature","properties":{"name":"Rue de Megret","distance":194.1286109378141,"sectionId":"19988-20209","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5893277101316055,44.80291684525887],[-0.5899764767772134,44.80123120461399]]}},{"type":"Feature","properties":{"name":"Rue du Général Bordas","distance":58.876155035781174,"sectionId":"19988-19989","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5899764767772134,44.80123120461399],[-0.5892428261966974,44.801140946932136]]}},{"type":"Feature","properties":{"name":"Rue de Megret","distance":224.11774507414395,"sectionId":"20003-19988","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5899764767772134,44.80123120461399],[-0.5901976242756848,44.800820476484965],[-0.5902259155593931,44.80074652692611],[-0.5905132997828084,44.79979447630037],[-0.5907424423278052,44.799292871840485]]}},{"type":"Feature","properties":{"name":"Rue du Général Sarrail","distance":65.9441429701129,"sectionId":"20003-20002","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5907424423278052,44.799292871840485],[-0.58992678783263,44.799169445830465]]}},{"type":"Feature","properties":{"name":"Rue de Megret","distance":101.48913969585259,"sectionId":"20003-19573","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5907424423278052,44.799292871840485],[-0.5908689969751137,44.799204018804296],[-0.5909787378990278,44.799131641028026],[-0.5913554988771722,44.7988510293862],[-0.5915140667730234,44.79873179787754],[-0.5916468256867602,44.79864509009591]]}},{"type":"Feature","properties":{"name":"Place du Président Wilson","distance":"Unknown","sectionId":"20003-as=125236","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5908153296507723,44.79921382067324],[-0.5907424423278052,44.799292871840485]]}},{"type":"Feature","properties":{"name":"Rue Rosa Bonheur","distance":88.56248278298641,"sectionId":"16768-16461","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.628875764665801,44.807471374277796],[-0.6298909344003979,44.80713449809973]]}},{"type":"Feature","properties":{"name":"Rue Goya","distance":83.07449695351706,"sectionId":"16768-16673","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6293441143335687,44.80814088793653],[-0.628875764665801,44.807471374277796]]}},{"type":"Feature","properties":{"name":"Rue Goya","distance":48.43891732758662,"sectionId":"16768-15824","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.628875764665801,44.807471374277796],[-0.6287778736268587,44.80733351621315],[-0.6287634251334943,44.80732109518429],[-0.6287384554084998,44.807314414841954],[-0.6287066572146164,44.80731786156016],[-0.6284258411300346,44.80741807490818]]}},{"type":"Feature","properties":{"name":"Avenue de Fontaudin","distance":106.43194054374653,"sectionId":"16647-16648","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6208754813095524,44.80034561747293],[-0.6195375283914707,44.800241821394124]]}},{"type":"Feature","properties":{"name":"Place de la Rotonde","distance":28.136359962719002,"sectionId":"16647-16344","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6208754813095524,44.80034561747293],[-0.6208742299291716,44.80036799801875],[-0.620878737879494,44.80039343820603],[-0.620888882990496,44.80041797825118],[-0.6209043731932952,44.800440996866186],[-0.6209249220636534,44.800461962668486],[-0.620943311439065,44.8004787632976],[-0.6209787873644508,44.8004956504983],[-0.62101065266104,44.80050742780505],[-0.6210446856568697,44.800515442662274],[-0.6210805999159307,44.80051916368715]]}},{"type":"Feature","properties":{"name":"Place de la Rotonde","distance":28.410448661685233,"sectionId":"16647-16345","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6211277020072631,44.80020345272752],[-0.6210962280620484,44.80020193251621],[-0.6210604341508559,44.800204153181646],[-0.6210256519866348,44.80021039538001],[-0.6209926279117554,44.800220455181694],[-0.6209623664605869,44.80023421052297],[-0.6209356026851959,44.800251277668224],[-0.6209129397183759,44.80027118699994],[-0.620895101322692,44.800293374976256],[-0.6208825643659315,44.80031737599955],[-0.6208754813095524,44.80034561747293]]}},{"type":"Feature","properties":{"name":"Place de la Rotonde","distance":28.136359962719002,"sectionId":"16344-16647","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6208754813095524,44.80034561747293],[-0.6208742299291716,44.80036799801875],[-0.620878737879494,44.80039343820603],[-0.620888882990496,44.80041797825118],[-0.6209043731932952,44.800440996866186],[-0.6209249220636534,44.800461962668486],[-0.620943311439065,44.8004787632976],[-0.6209787873644508,44.8004956504983],[-0.62101065266104,44.80050742780505],[-0.6210446856568697,44.800515442662274],[-0.6210805999159307,44.80051916368715]]}},{"type":"Feature","properties":{"name":"Avenue des Chasseurs","distance":111.2681609996746,"sectionId":"16344-16343","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6209176256124728,44.80151418988168],[-0.6210805999159307,44.80051916368715]]}},{"type":"Feature","properties":{"name":"Place de la Rotonde","distance":28.463255794478805,"sectionId":"16344-15940","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6210805999159307,44.80051916368715],[-0.6211161620229523,44.80051929257274],[-0.6211515793432013,44.80051510204961],[-0.6211856060690247,44.80050690203565],[-0.6212173695687816,44.80049490048195],[-0.6212460028625871,44.80047939524836],[-0.6212707821850113,44.800460949882556],[-0.6212910874606636,44.800439764297394],[-0.6213063381484791,44.80041666773398],[-0.6213161780207516,44.80039203187052],[-0.621319849440657,44.80036588083269]]}},{"type":"Feature","properties":{"name":"Avenue Pierre Wiehn","distance":66.68044052500188,"sectionId":"16089-24283","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6308623117393518,44.79828166195963],[-0.6307665484608452,44.797685210289806]]}},{"type":"Feature","properties":{"name":"Avenue de Saige","distance":26.950995345364845,"sectionId":"16089-16092","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6307665484608452,44.797685210289806],[-0.630737406271222,44.797443454373465]]}},{"type":"Feature","properties":{"name":"Avenue Bitaly","distance":112.8602716968615,"sectionId":"16089-16090","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6307665484608452,44.797685210289806],[-0.6321897311485453,44.79761003666069]]}},{"type":"Feature","properties":{"name":"Avenue Jean Lartaut","distance":161.4065690482161,"sectionId":"16954-15885","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6160580420874954,44.79373137093818],[-0.6165414159607582,44.79462615359431],[-0.6168116988168031,44.79508163835017]]}},{"type":"Feature","properties":{"name":"Avenue Jean Babin","distance":42.38814214611264,"sectionId":"16954-24465","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6160580420874954,44.79373137093818],[-0.6158412493795113,44.793883834861006],[-0.6156768201359397,44.79399961355941]]}},{"type":"Feature","properties":{"name":"Avenue Jean Babin","distance":42.38814214611264,"sectionId":"24465-16954","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6160580420874954,44.79373137093818],[-0.6158412493795113,44.793883834861006],[-0.6156768201359397,44.79399961355941]]}},{"type":"Feature","properties":{"name":"Avenue Jean Babin","distance":12.087600165086242,"sectionId":"24465-24466","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6156768201359397,44.79399961355941],[-0.6156526050200689,44.79398669082804],[-0.6156264329505059,44.79397887497639],[-0.6155989374492497,44.793974164029656],[-0.6155706291935013,44.79397263183339],[-0.6155333858256525,44.793975887879235]]}},{"type":"Feature","properties":{"name":"Avenue Jean Babin","distance":27.792591854207622,"sectionId":"24465-24464","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6156559924187647,44.79421016985492],[-0.6156887196234317,44.79419138287469],[-0.6157081737097578,44.7941768014107],[-0.6157242040577976,44.79416007672136],[-0.6157362188332708,44.79414185820801],[-0.6157439824322011,44.794122423615256],[-0.6157472818027955,44.79410241030045],[-0.6157460188800044,44.79408227179733],[-0.6157402274963963,44.794062547532015],[-0.6157300621073226,44.794043683007935],[-0.6157158147032175,44.79402629952435],[-0.6156978866188042,44.79401074465114],[-0.6156768201359397,44.79399961355941]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":32.84075856688422,"sectionId":"16525-15986","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6172610122507112,44.800198493889766],[-0.6172314681172758,44.80018538057009],[-0.6171994866039048,44.80017576793086],[-0.6171658479108231,44.800169991488595],[-0.617131189042176,44.80016812106552],[-0.6170966520956501,44.800170210419054],[-0.6170629947050957,44.800176235454266],[-0.6170312157736493,44.80018598423407],[-0.6170019353839317,44.80019925687478],[-0.6169761411589644,44.800215661633864],[-0.6169543212736119,44.80023491273792],[-0.6169370676121894,44.800256360782846],[-0.6169246743947955,44.80027864516549]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":10.847278905713996,"sectionId":"16525-16506","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6173385760408895,44.8002771919352],[-0.6173264381199073,44.800255147256394],[-0.6173090305525012,44.800233810685334],[-0.6172869599803396,44.80021478442294],[-0.6172610122507112,44.800198493889766]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":218.5911599528599,"sectionId":"16525-16524","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6193705422846755,44.79893633192673],[-0.6192666141752466,44.799022155831324],[-0.6191949743718183,44.79908217916486],[-0.6191225174967163,44.79913322010869],[-0.6177134374746924,44.79998024457636],[-0.617381254762092,44.80015683440266],[-0.6172610122507112,44.800198493889766]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":32.84075856688422,"sectionId":"15986-16525","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6172610122507112,44.800198493889766],[-0.6172314681172758,44.80018538057009],[-0.6171994866039048,44.80017576793086],[-0.6171658479108231,44.800169991488595],[-0.617131189042176,44.80016812106552],[-0.6170966520956501,44.800170210419054],[-0.6170629947050957,44.800176235454266],[-0.6170312157736493,44.80018598423407],[-0.6170019353839317,44.80019925687478],[-0.6169761411589644,44.800215661633864],[-0.6169543212736119,44.80023491273792],[-0.6169370676121894,44.800256360782846],[-0.6169246743947955,44.80027864516549]]}},{"type":"Feature","properties":{"name":"Allée Ausone","distance":107.75691917727505,"sectionId":"15986-15987","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6169246743947955,44.80027864516549],[-0.6168689808707637,44.800250058303284],[-0.61676208790433,44.800224180649046],[-0.6166974923740572,44.800200921468296],[-0.6166373703695116,44.800170313330554],[-0.6165143987043628,44.80008981579835],[-0.6160350696250945,44.79971986121379],[-0.6159351826868764,44.79963016129116]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":23.55848653085408,"sectionId":"15986-16526","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6169246743947955,44.80027864516549],[-0.6169181496341023,44.800303715660036],[-0.6169169114561555,44.80032834777615],[-0.6169212349803718,44.800352893097326],[-0.6169309431724723,44.800376546503315],[-0.6169460078373359,44.800398858473734],[-0.6169658787591578,44.800419125838864],[-0.6169898907244851,44.80043682925261],[-0.6170177629827337,44.800451527224496],[-0.6170348711673813,44.80045800961697]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":12.125424048530629,"sectionId":"16508-16527","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6153385571934318,44.80267772650684],[-0.6153364654040295,44.802644372137614],[-0.6153268250556507,44.802611708134364],[-0.6153100657452605,44.80258053158951],[-0.615303508186988,44.80257281271715]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":18.703529675161523,"sectionId":"16508-16509","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.615239654429878,44.802825724109816],[-0.6152738974569812,44.802800763587854],[-0.6153002569799403,44.80277317098744],[-0.6153202539984124,44.80274298804989],[-0.6153330440311194,44.80271087220388],[-0.6153385571934318,44.80267772650684]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":149.60143332969923,"sectionId":"16508-as=125624","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6153385571934318,44.80267772650684],[-0.6154575479359946,44.80263214540256],[-0.6156542235918762,44.80256832999024],[-0.6159017594379852,44.80247821444909],[-0.6160638040894652,44.80240090582401],[-0.6161682410152266,44.80234722875872],[-0.6162824796343164,44.802274322454544],[-0.6163707939225889,44.80220971725499],[-0.6164873226050801,44.8021208832577],[-0.6165456603077095,44.802064527845275],[-0.616637048825239,44.80197027735285],[-0.6167556010158722,44.80183102215729]]}},{"type":"Feature","properties":{"name":"Rue du Sable","distance":166.98875271527916,"sectionId":"27338-16185","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6164543226763436,44.803260855030295],[-0.6168285557962804,44.80209841143373],[-0.6168791979063539,44.80194158747085],[-0.6168391325300605,44.80186566024569],[-0.6167556010158722,44.80183102215729]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":18.08662029773066,"sectionId":"27338-as=125624","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6167556010158722,44.80183102215729],[-0.6167556010158722,44.80183102215729]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":145.4806585010489,"sectionId":"27338-as=125661","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6167556010158722,44.80183102215729],[-0.6168169825126848,44.80174655389446],[-0.6168934612424188,44.801582061939314],[-0.6169483635547244,44.801428615680656],[-0.6170028382115869,44.80118365836639],[-0.6170516024396403,44.80089609305333],[-0.6171022081499608,44.80062981886935],[-0.6171282843380691,44.800555391475335],[-0.6171282843380691,44.800555391475335]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":10.847278905713996,"sectionId":"16506-16525","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6173385760408895,44.8002771919352],[-0.6173264381199073,44.800255147256394],[-0.6173090305525012,44.800233810685334],[-0.6172869599803396,44.80021478442294],[-0.6172610122507112,44.800198493889766]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":45.33855682528829,"sectionId":"16506-28446","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6173385760408895,44.8002771919352],[-0.6174583932696283,44.80017834298948],[-0.6177700580488659,44.80001150404143]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":28.558403131101812,"sectionId":"16506-16507","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6171720137256175,44.800471934783396],[-0.617184694104715,44.80047036039925],[-0.617217475548208,44.80046247144449],[-0.6172481259448459,44.80045086676043],[-0.6172757839339125,44.80043593407935],[-0.6172997144347655,44.80041805711452],[-0.6173193142778841,44.80039770547182],[-0.6173339803037736,44.800375348753285],[-0.6173434938134287,44.800351534416315],[-0.6173475267618401,44.80032708364803],[-0.617345975445065,44.80030236007947],[-0.6173385760408895,44.8002771919352]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":45.33855682528829,"sectionId":"28446-16506","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6173385760408895,44.8002771919352],[-0.6174583932696283,44.80017834298948],[-0.6177700580488659,44.80001150404143]]}},{"type":"Feature","properties":{"name":"Rue Graham Bell","distance":69.79400391986347,"sectionId":"28446-30956","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6183521141724402,44.80048385125475],[-0.6177700580488659,44.80001150404143]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":176.49113033809124,"sectionId":"28446-16505","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6177700580488659,44.80001150404143],[-0.6193161410168009,44.79906940487892],[-0.6194418446698561,44.798961628216425]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":22.788350895792625,"sectionId":"16515-30017","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.610457696199699,44.805133490765726],[-0.610494982551119,44.80515302623778],[-0.6105361716787757,44.80516820391094],[-0.6105802195094183,44.80517851642828],[-0.6106259725743102,44.80518373015118],[-0.6106723980547848,44.80518351753583],[-0.6107277124972792,44.80517572599702]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":19.54625937637842,"sectionId":"16515-16532","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6103603574437853,44.80497740406887],[-0.6103658722406546,44.80502100931274],[-0.6103789898494902,44.805052662443366],[-0.6103989517907268,44.805082476822214],[-0.6104254491939214,44.80510956142019],[-0.610457696199699,44.805133490765726]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":"Unknown","sectionId":"16515-as=126001","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6102919756124691,44.80512001392482],[-0.610457696199699,44.805133490765726]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":22.788350895792625,"sectionId":"30017-16515","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.610457696199699,44.805133490765726],[-0.610494982551119,44.80515302623778],[-0.6105361716787757,44.80516820391094],[-0.6105802195094183,44.80517851642828],[-0.6106259725743102,44.80518373015118],[-0.6106723980547848,44.80518351753583],[-0.6107277124972792,44.80517572599702]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":35.87534262659825,"sectionId":"30017-16514","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6107277124972792,44.80517572599702],[-0.6107621223100063,44.80516751707603],[-0.6108030385396361,44.805152075120866],[-0.6108399996450758,44.80513207439936],[-0.6108722704371572,44.80510789858727],[-0.610897931726438,44.80508123011038],[-0.610917236087017,44.80505206095512],[-0.6109306041913777,44.8050190265257],[-0.6109359769232754,44.804985615346844],[-0.6109336575526042,44.80495262854044],[-0.6109244770091288,44.804921210804665],[-0.6109243507247113,44.804921214813355]]}},{"type":"Feature","properties":{"name":"Accès Maison de Retraite Mutualiste","distance":97.09281480881747,"sectionId":"30017-as=126003","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6107277124972792,44.80517572599702],[-0.6108150033848274,44.80530672801345],[-0.6108135071079033,44.805371725311815],[-0.610790529885136,44.8054048846083],[-0.610758030528832,44.80543753544147],[-0.6107024923740417,44.80546398125446],[-0.6100281494112885,44.805710327171916]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Nancel Pénard","distance":231.0220058386463,"sectionId":"16539-16540","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.624018432989894,44.81007380965053],[-0.6268000100219724,44.80943708538574]]}},{"type":"Feature","properties":{"name":"Avenue Hector Domecq","distance":157.79532484530753,"sectionId":"16539-16869","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.624018432989894,44.81007380965053],[-0.6246231752046867,44.811427684732095]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Nancel Pénard","distance":21.17503637001509,"sectionId":"16539-as=126172","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6233231538386813,44.8102328589191],[-0.624018432989894,44.81007380965053]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Nancel Pénard","distance":153.53698558837024,"sectionId":"16541-16540","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6268000100219724,44.80943708538574],[-0.6283197798229173,44.80908035095809],[-0.6286497829100846,44.809017575311366]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Nancel Pénard","distance":13.749656186770721,"sectionId":"16541-23492","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6287238129443788,44.80891305861358],[-0.6287074745382106,44.80892087662859],[-0.6286897093991939,44.80893216333948],[-0.6286747208997054,44.808945343310945],[-0.6286629915694278,44.80896004081721],[-0.628654625064914,44.808975892215436],[-0.6286499776270127,44.80899252580751],[-0.6286491472518573,44.80900948804858],[-0.6286497829100846,44.809017575311366]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Nancel Pénard","distance":39.58350928841526,"sectionId":"16541-as=125263","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6286497829100846,44.809017575311366],[-0.6286521056448674,44.80902632942319],[-0.6286588245100269,44.809042600414614],[-0.6286691492622496,44.80905785553454],[-0.6286826783866089,44.80907174725648],[-0.6286992629531496,44.80908391999414],[-0.6287183751534566,44.80909403025061],[-0.6287394984983771,44.809101914333915],[-0.6287620995157397,44.809107138841654],[-0.6287856786949662,44.80910980979316],[-0.6288094669567306,44.80910977155664],[-0.6290822743254396,44.809092819047784]]}},{"type":"Feature","properties":{"name":"Avenue du Colonel René Fonck","distance":6.276445936488337,"sectionId":"24368-16429","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6295164631937994,44.809867159990326],[-0.629585442485553,44.809839194970834]]}},{"type":"Feature","properties":{"name":"Avenue du Colonel René Fonck","distance":201.07809904633865,"sectionId":"24368-16428","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6271167540555563,44.81045664227241],[-0.6286928870004799,44.81012441088032],[-0.6295164631937994,44.809867159990326]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Roger Marcade","distance":156.71270830644895,"sectionId":"24368-24367","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6295164631937994,44.809867159990326],[-0.6296444746802012,44.81032448459668],[-0.629701263834446,44.810717870193166],[-0.6297100870767479,44.81076353139339],[-0.6297303675670795,44.81081026833573],[-0.6297581496549187,44.81084550542065],[-0.6298015615988709,44.81089582824699],[-0.630105762234423,44.8111767311133]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Roger Marcade","distance":92.90421494127733,"sectionId":"24368-24369","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.629184852615813,44.80908644455927],[-0.6292500974961024,44.80912580138969],[-0.6292830461420539,44.8091466404735],[-0.6293066470193782,44.80916372403659],[-0.6293225348865245,44.809184927299725],[-0.6293406392288704,44.80923128330798],[-0.6295164631937994,44.809867159990326]]}},{"type":"Feature","properties":{"name":"Avenue Colonel Robert Jacqui","distance":224.39002421432502,"sectionId":"24367-16431","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6274574680346562,44.81176640446349],[-0.6277362673801568,44.81171823690237],[-0.6292495941975884,44.81154772038825],[-0.6294347394499498,44.811517580596465],[-0.6295318646408904,44.81149241106393],[-0.6296135522985689,44.81145521238506],[-0.630105762234423,44.8111767311133]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Roger Marcade","distance":156.71270830644895,"sectionId":"24367-24368","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6295164631937994,44.809867159990326],[-0.6296444746802012,44.81032448459668],[-0.629701263834446,44.810717870193166],[-0.6297100870767479,44.81076353139339],[-0.6297303675670795,44.81081026833573],[-0.6297581496549187,44.81084550542065],[-0.6298015615988709,44.81089582824699],[-0.630105762234423,44.8111767311133]]}},{"type":"Feature","properties":{"name":"Avenue Colonel Robert Jacqui","distance":6.058881201658697,"sectionId":"24367-27893","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6301628211966482,44.811140317985114],[-0.630105762234423,44.8111767311133]]}},{"type":"Feature","properties":{"name":"Avenue Colonel Robert Jacqui","distance":150.85633094260237,"sectionId":"24367-16432","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.630105762234423,44.8111767311133],[-0.6302392559181363,44.81128696741555],[-0.6303439092502123,44.8113773146495],[-0.630389883473615,44.81139998984562],[-0.6304396422063093,44.811414436693155],[-0.6304983166058676,44.81142175259234],[-0.6305429279038695,44.8114207791762],[-0.6314140812463336,44.81133198471517],[-0.6317246189851098,44.811299549583595],[-0.6318455929708662,44.81126325695497]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Roger Marcade","distance":92.90421494127733,"sectionId":"24369-24368","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.629184852615813,44.80908644455927],[-0.6292500974961024,44.80912580138969],[-0.6292830461420539,44.8091466404735],[-0.6293066470193782,44.80916372403659],[-0.6293225348865245,44.809184927299725],[-0.6293406392288704,44.80923128330798],[-0.6295164631937994,44.809867159990326]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Nancel Pénard","distance":13.960999402863148,"sectionId":"24369-16542","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.629184852615813,44.80908644455927],[-0.6292866856569652,44.80908184416916],[-0.6293100458423282,44.80907902688786],[-0.6293323634785113,44.809073720518974],[-0.6293560511976012,44.809064046406846]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Nancel Pénard","distance":21.652331272528006,"sectionId":"24369-as=125263","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6290822743254396,44.809092819047784],[-0.629184852615813,44.80908644455927]]}},{"type":"Feature","properties":{"name":"Place Chambrelent","distance":26.90716823566718,"sectionId":"16293-16292","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6161900184432482,44.80532874127065],[-0.6161794303789566,44.80531124142981],[-0.6161618954250845,44.80528990871011],[-0.6161396857314758,44.80527070644408],[-0.6161136097680673,44.805254419674476],[-0.6160840576653555,44.80524121616066],[-0.6160519472549137,44.80523160721982],[-0.6160181738041459,44.80522574455226],[-0.6159833856512068,44.80522387779543],[-0.6159487193511826,44.80522597081409],[-0.615914663117892,44.80523173783854]]}},{"type":"Feature","properties":{"name":"Place Chambrelent","distance":26.410343565176614,"sectionId":"16293-16294","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.615914663117892,44.80523173783854],[-0.6158830300495386,44.805241841893476],[-0.6158536261824958,44.80525520814961],[-0.6158277087252438,44.805271706556645],[-0.6158057602588184,44.805290961444776],[-0.615788510297553,44.805312499206494],[-0.6157762982267275,44.80533567847554],[-0.6157694690720027,44.80535994778347],[-0.6157682415733241,44.80538475968095],[-0.615772570626146,44.80540939493484],[-0.6157785186711434,44.80542352907227]]}},{"type":"Feature","properties":{"name":"Avenue des Echoppes","distance":256.7650562877589,"sectionId":"16293-as=3979","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.615914663117892,44.80523173783854],[-0.6149722993800102,44.80301952321189],[-0.6149722993800102,44.80301952321189]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":24.667902145537262,"sectionId":"16510-16511","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6147790223180165,44.802748120007365],[-0.614795752078701,44.802774793403024],[-0.6148225199575824,44.802802138670415],[-0.6148551519737177,44.8028261446386],[-0.6148928397129124,44.80284602625028],[-0.614934424102314,44.80286146000727],[-0.6149789817149987,44.80287184467361],[-0.6150150402426817,44.802875833309585]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":19.180002768736834,"sectionId":"16510-16509","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6150150402426817,44.802875833309585],[-0.6150252384660432,44.80287704057554],[-0.6150720465516963,44.802876904026824],[-0.6151183957190242,44.802871467139155],[-0.6151627649602274,44.80286068817538],[-0.615204172218471,44.802845048769846],[-0.615239654429878,44.802825724109816]]}},{"type":"Feature","properties":{"name":"Avenue des Echoppes","distance":"Unknown","sectionId":"16510-as=3979","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6149722993800102,44.80301952321189],[-0.6150150402426817,44.802875833309585]]}},{"type":"Feature","properties":{"name":"Rue Edouard Herriot","distance":35.965439730296815,"sectionId":"19864-19865","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5818440451069568,44.802451306972245],[-0.5820663909934288,44.80216883506007]]}},{"type":"Feature","properties":{"name":"Rue Edouard Herriot","distance":61.92707946900748,"sectionId":"19864-19863","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5814665934575787,44.80293981469017],[-0.5818440451069568,44.802451306972245]]}},{"type":"Feature","properties":{"name":"Résidence Clément Thomas","distance":97.41550465537406,"sectionId":"19864-19798","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5807791026423318,44.8020140742784],[-0.5808780202711453,44.80204420000512],[-0.5811193211162401,44.802168661960984],[-0.5818440451069568,44.802451306972245]]}},{"type":"Feature","properties":{"name":"Rue Edouard Herriot","distance":35.965439730296815,"sectionId":"19865-19864","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5818440451069568,44.802451306972245],[-0.5820663909934288,44.80216883506007]]}},{"type":"Feature","properties":{"name":"Rue Edouard Herriot","distance":14.563698852094948,"sectionId":"19865-19866","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5820663909934288,44.80216883506007],[-0.5821560683356397,44.80205430950675]]}},{"type":"Feature","properties":{"name":"Avenue Espeleta","distance":109.88083172844547,"sectionId":"19897-19899","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5898432957757949,44.81017036133909],[-0.5912290658125761,44.81024498686175]]}},{"type":"Feature","properties":{"name":"Avenue Espeleta","distance":12.21888636264409,"sectionId":"19897-19896","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5898639664009762,44.81006134052601],[-0.5898432957757949,44.81017036133909]]}},{"type":"Feature","properties":{"name":"Avenue Espeleta","distance":49.22156636001229,"sectionId":"19897-19898","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5898432957757949,44.81017036133909],[-0.5897865465220927,44.81016944982386],[-0.5897660433831342,44.810175501783306],[-0.5897471870710399,44.810185645531945],[-0.5897178156650436,44.810205759870755],[-0.5896953532557284,44.8102311511603],[-0.5896856406540187,44.810260103692954],[-0.5896643451299463,44.810466792888754],[-0.5896315190587665,44.81053710171911]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":4.026949688746721,"sectionId":"16522-16502","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6209525813577348,44.796990254580784],[-0.6209883616111087,44.797016050297394]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":20.025482488512736,"sectionId":"16522-16521","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6209334497793274,44.79682060587063],[-0.6209266966304785,44.79682991932871],[-0.6209144884189325,44.79685309917056],[-0.6209076624294481,44.79687736881087],[-0.620906437322436,44.79690218078706],[-0.6209107622858779,44.796926725966905],[-0.6209206034504718,44.79695046492537],[-0.6209356744107941,44.79697286627953],[-0.6209525813577348,44.796990254580784]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":29.423142854320123,"sectionId":"16522-as=4633","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6209525813577348,44.796990254580784],[-0.6206846693570309,44.79717406062051]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":4.026949688746721,"sectionId":"16502-16522","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6209525813577348,44.796990254580784],[-0.6209883616111087,44.797016050297394]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":21.124767328130645,"sectionId":"16502-16501","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6209883616111087,44.797016050297394],[-0.6210075664953562,44.79702570832341],[-0.6210385234299463,44.79703715415457],[-0.6210715216635927,44.79704484155538],[-0.621105797944393,44.79704870474341],[-0.6211405890182478,44.79704867793801],[-0.6211749940740346,44.79704451957051],[-0.6212078992917575,44.79703662544278],[-0.6212388052444724,44.79702510154128]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":31.884455643552787,"sectionId":"16502-as=4702","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6207581543563427,44.79717472074531],[-0.6209883616111087,44.797016050297394]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":5.953931195125156,"sectionId":"16516-16418","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6079458835492219,44.80595719005264],[-0.6078964088953601,44.80591678083899]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":208.86201113338512,"sectionId":"16516-as=126001","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6079458835492219,44.80595719005264],[-0.6082688621229223,44.805782183011985],[-0.6086387028655863,44.80560992209255],[-0.6090136710331437,44.80546704437491],[-0.6094089157991988,44.805352979001576],[-0.6102919756124691,44.80512001392482],[-0.6102919756124691,44.80512001392482]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":"Unknown","sectionId":"16516-as=126353","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6077533522424334,44.80609157500647],[-0.6079458835492219,44.80595719005264]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":5.953931195125156,"sectionId":"16418-16516","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6079458835492219,44.80595719005264],[-0.6078964088953601,44.80591678083899]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":223.05849514408268,"sectionId":"16418-16532","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6103603574437853,44.80497740406887],[-0.6102416731476096,44.80505630049977],[-0.6093609804982133,44.805292703326025],[-0.6089328820933197,44.80542366556679],[-0.6085024915423672,44.805586768337015],[-0.6081042800352606,44.80578893545684],[-0.6078964088953601,44.80591678083899]]}},{"type":"Feature","properties":{"name":"Avenue de Collegno","distance":67.0682544578046,"sectionId":"16418-16419","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6078964088953601,44.80591678083899],[-0.6078302525593452,44.805872666855656],[-0.6077219503111821,44.80583043016253],[-0.6076431280068599,44.80581644514331],[-0.6075600175791895,44.8058208828806],[-0.6071178372245689,44.805933187131934]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":254.33122971889415,"sectionId":"16418-27556","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6078964088953601,44.80591678083899],[-0.6077716800222357,44.805996226583915],[-0.6073527494165163,44.80631426392598],[-0.6068867313727507,44.80665640353449],[-0.6065554926701945,44.8069139137733],[-0.6063456560278409,44.8070913638738],[-0.605757491691602,44.80762330174275]]}},{"type":"Feature","properties":{"name":"Rue de Suzon","distance":28.91294652696163,"sectionId":"19933-24951","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5823728634221069,44.811295159599865],[-0.5823498690403354,44.81140163939471],[-0.5823237210808098,44.81155307906197]]}},{"type":"Feature","properties":{"name":"Rue Francisco Ferrer","distance":58.38365143851038,"sectionId":"19933-24949","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5831112470882293,44.81130090973327],[-0.5823728634221069,44.811295159599865]]}},{"type":"Feature","properties":{"name":"Rue de Suzon","distance":20.74240674914018,"sectionId":"19933-as=124566","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5823728634221069,44.811295159599865],[-0.5823728634221069,44.811295159599865]]}},{"type":"Feature","properties":{"name":"Rue de Suzon","distance":28.91294652696163,"sectionId":"24951-19933","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5823728634221069,44.811295159599865],[-0.5823498690403354,44.81140163939471],[-0.5823237210808098,44.81155307906197]]}},{"type":"Feature","properties":{"name":"Résidence Parc de Suzon","distance":62.90478234979809,"sectionId":"24951-24955","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5831192966936468,44.81155864960264],[-0.5823237210808098,44.81155307906197]]}},{"type":"Feature","properties":{"name":"Rue de Suzon","distance":25.718627158907925,"sectionId":"24951-as=126494","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5823237210808098,44.81155307906197],[-0.5822675146941628,44.81178114683718]]}},{"type":"Feature","properties":{"name":"Rue de Suzon","distance":38.40011991995052,"sectionId":"27869-20296","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5891885489291463,44.810515857685246],[-0.5887035242411404,44.810498010601194]]}},{"type":"Feature","properties":{"name":"Place Joliot Curie","distance":30.05220576778218,"sectionId":"27869-27870","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5891885489291463,44.810515857685246],[-0.5892150208258056,44.810245948030406]]}},{"type":"Feature","properties":{"name":"Rue de Suzon","distance":35.1032210184355,"sectionId":"27869-19898","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5896315190587665,44.81053710171911],[-0.5891885489291463,44.810515857685246]]}},{"type":"Feature","properties":{"name":"Rue de Suzon","distance":38.40011991995052,"sectionId":"20296-27869","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5891885489291463,44.810515857685246],[-0.5887035242411404,44.810498010601194]]}},{"type":"Feature","properties":{"name":"Rue Pierre Curie","distance":178.7880040760648,"sectionId":"20296-25389","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5887035242411404,44.810498010601194],[-0.5885869552620311,44.811032269844475],[-0.5885868525057598,44.811089565096644],[-0.5886814800999837,44.81154437538894],[-0.5886991732985334,44.81157651688587],[-0.5887240558786314,44.811600144042565],[-0.5887597569719424,44.81161460187101],[-0.5888038793038597,44.811622037871665],[-0.589314061184245,44.81162305646567],[-0.5893995354674162,44.81164017740682]]}},{"type":"Feature","properties":{"name":"Rue de Suzon","distance":54.49078689022828,"sectionId":"20296-as=129213","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5887035242411404,44.810498010601194],[-0.5885996266639701,44.81047966877779],[-0.5880578329857499,44.81046261899177],[-0.5880181543569623,44.810460287421996]]}},{"type":"Feature","properties":{"name":"Impasse Suzon","distance":71.31702029296795,"sectionId":"19841-19914","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.582596396707485,44.81053449802052],[-0.5824877823165049,44.810489094626234],[-0.5822935844466851,44.81045935813457],[-0.5819808875274844,44.810424705063134],[-0.5817200878902408,44.8104187744898]]}},{"type":"Feature","properties":{"name":"Rue Dourout","distance":181.56232779130826,"sectionId":"19841-19842","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.582926096946988,44.80891678917791],[-0.582596396707485,44.81053449802052]]}},{"type":"Feature","properties":{"name":"Rue de Suzon","distance":51.202442341393656,"sectionId":"19841-19934","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.582596396707485,44.81053449802052],[-0.5827608332558103,44.81052517520639],[-0.5828788700545551,44.81052875399449],[-0.5832376806298483,44.810574383277476]]}},{"type":"Feature","properties":{"name":"Rue de Suzon","distance":86.89080199938766,"sectionId":"19841-as=124566","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.582596396707485,44.81053449802052],[-0.5825102298295658,44.81067719844516],[-0.5824756769460262,44.81075854925551],[-0.5824512659663289,44.81083408567679],[-0.5824004241989866,44.8111094444553],[-0.5823728634221069,44.811295159599865]]}},{"type":"Feature","properties":{"name":"Impasse Suzon","distance":71.31702029296795,"sectionId":"19914-19841","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.582596396707485,44.81053449802052],[-0.5824877823165049,44.810489094626234],[-0.5822935844466851,44.81045935813457],[-0.5819808875274844,44.810424705063134],[-0.5817200878902408,44.8104187744898]]}},{"type":"Feature","properties":{"name":"Impasse de la Fauvette","distance":174.465416311103,"sectionId":"19914-19915","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5817200878902408,44.8104187744898],[-0.5818780991626679,44.8088520567097]]}},{"type":"Feature","properties":{"name":"Impasse Suzon","distance":58.719482047683194,"sectionId":"19914-20194","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5817200878902408,44.8104187744898],[-0.5812918061196057,44.810424061772686],[-0.5809781861309301,44.81040916286215]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":212.17177820072675,"sectionId":"23249-20034","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5991426121969289,44.802606135801256],[-0.5995421972143224,44.802855449810416],[-0.5998764053370857,44.8030911574618],[-0.5999606482400087,44.80319001391978],[-0.6000794837444764,44.80339299164127],[-0.6004314517284105,44.80409530318383],[-0.6004092627113612,44.80421004994941]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":23.174906110573147,"sectionId":"23249-23254","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6004092627113612,44.80421004994941],[-0.6004031871109291,44.804212043923265],[-0.6003664081634719,44.804230954406414],[-0.6003349725257094,44.80425438002206],[-0.600309954985261,44.804281295846266],[-0.6002921946162614,44.80431095466363],[-0.6002820197436155,44.80434253534246],[-0.6002799831918216,44.80437475923374],[-0.6002816167230712,44.80438470667476]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":12.567220593090708,"sectionId":"23249-25407","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6005624050351719,44.804188356648226],[-0.6005329387669479,44.80418658697797],[-0.6004878190628526,44.80418945662009],[-0.6004440689953974,44.80419804816299],[-0.6004092627113612,44.80421004994941]]}},{"type":"Feature","properties":{"name":"Rue de Suzon","distance":11.244264938831117,"sectionId":"20286-20366","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5851117818471763,44.81090727732481],[-0.5849697393399184,44.81090229542672]]}},{"type":"Feature","properties":{"name":"Rue Peydavant","distance":267.3441256494578,"sectionId":"20286-19598","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5851117818471763,44.81090727732481],[-0.5851579712044871,44.81038235731549],[-0.5851517060606226,44.81025517937484],[-0.5850621839157236,44.80935907642656],[-0.5849621448807082,44.808981544439824],[-0.5849714183548708,44.80880307072202],[-0.5850959289495298,44.808524217323345]]}},{"type":"Feature","properties":{"name":"Rue de Suzon","distance":78.76111770494428,"sectionId":"20286-20119","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5861018004954792,44.81086318887048],[-0.5859845926135046,44.81088922412883],[-0.5854254764783853,44.81090702889927],[-0.5851117818471763,44.81090727732481]]}},{"type":"Feature","properties":{"name":"Avenue de Thouars","distance":28.138449386981,"sectionId":"19617-19946","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5923109617560379,44.79619270781825],[-0.5922783509610803,44.796444976952124]]}},{"type":"Feature","properties":{"name":"Avenue de Thouars","distance":24.215925485178396,"sectionId":"19617-20375","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5922783509610803,44.796444976952124],[-0.5922619312697354,44.79666268358289]]}},{"type":"Feature","properties":{"name":"Rue André Messager","distance":199.36381948263733,"sectionId":"19617-19618","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5922783509610803,44.796444976952124],[-0.5921876898744992,44.79643360775383],[-0.5909773960995183,44.796359769140246],[-0.5897684222230885,44.79628065133203]]}},{"type":"Feature","properties":{"name":"Résidence les Ombrages","distance":279.89166138132606,"sectionId":"20377-20430","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5898589085239744,44.79578531672493],[-0.5899479844179094,44.79503572498155],[-0.5913537011187363,44.79501395070779],[-0.5924129675978201,44.79487752946063]]}},{"type":"Feature","properties":{"name":"Avenue de Thouars","distance":38.571951460659655,"sectionId":"20377-as=126727","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5924129675978201,44.79487752946063],[-0.5924227244326273,44.794971176905655],[-0.592417404659201,44.7951477257731],[-0.5924099536308922,44.79522431798344]]}},{"type":"Feature","properties":{"name":"Avenue de Thouars","distance":29.613185157517822,"sectionId":"20376-19946","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5923415956072579,44.79592698879076],[-0.5923109617560379,44.79619270781825]]}},{"type":"Feature","properties":{"name":"Résidence les Ombrages","distance":196.97663317934845,"sectionId":"20376-20430","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5923415956072579,44.79592698879076],[-0.5898589085239744,44.79578531672493]]}},{"type":"Feature","properties":{"name":"Avenue de Thouars","distance":8.527629133649059,"sectionId":"20376-as=126727","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5924099536308922,44.79522431798344],[-0.5923415956072579,44.79592698879076]]}},{"type":"Feature","properties":{"name":"Rue de Tremeuge","distance":39.64622386485475,"sectionId":"58725-19996","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5862241014385443,44.80232760458696],[-0.5857400198724079,44.802234706479176]]}},{"type":"Feature","properties":{"name":"Rue Peydavant","distance":55.11625823256437,"sectionId":"58725-23614","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5857400198724079,44.802234706479176],[-0.5857026307136758,44.802227169701524],[-0.5856791696139334,44.80221198506938],[-0.5856704225483048,44.80218696917707],[-0.5856630460078622,44.80214405157162],[-0.5856592534212801,44.802093748004225],[-0.585649515288388,44.80201705910807],[-0.585628353359424,44.80194890472344],[-0.5855878060285796,44.801874196645564],[-0.5855655326411606,44.801854820823344],[-0.5855310142731254,44.801844206832044],[-0.5854651696709479,44.801834416894806]]}},{"type":"Feature","properties":{"name":"Place Joliot Curie","distance":30.05220576778218,"sectionId":"27870-27869","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5891885489291463,44.810515857685246],[-0.5892150208258056,44.810245948030406]]}},{"type":"Feature","properties":{"name":"Place Joliot Curie","distance":48.762148583803224,"sectionId":"27870-36388","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5892150208258056,44.810245948030406],[-0.5885996140983818,44.81021726093555]]}},{"type":"Feature","properties":{"name":"Place Joliot Curie","distance":48.762148583803224,"sectionId":"36388-27870","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5892150208258056,44.810245948030406],[-0.5885996140983818,44.81021726093555]]}},{"type":"Feature","properties":{"name":"Passage Mairie","distance":45.02761964670162,"sectionId":"36388-20159","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5885996140983818,44.81021726093555],[-0.5884971601343006,44.8102119353497],[-0.5884732557712753,44.81018368313062],[-0.5885014872928597,44.809885072212275]]}},{"type":"Feature","properties":{"name":"Avenue Jean Jaurès","distance":7.782558902004227,"sectionId":"40117-16460","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6294283912792256,44.80648281815557],[-0.6295206167811596,44.806458345196894]]}},{"type":"Feature","properties":{"name":"Rue Nelson Mandela","distance":71.20058454181411,"sectionId":"40117-34718","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6295206167811596,44.806458345196894],[-0.6292068035750316,44.805857500152804]]}},{"type":"Feature","properties":{"name":"Avenue Jean Jaurès","distance":91.3700678712367,"sectionId":"40117-16884","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6295206167811596,44.806458345196894],[-0.6300846702457197,44.806308641964954],[-0.6306234818854873,44.80621829611289]]}},{"type":"Feature","properties":{"name":"Rue Nelson Mandela","distance":71.20058454181411,"sectionId":"34718-40117","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6295206167811596,44.806458345196894],[-0.6292068035750316,44.805857500152804]]}},{"type":"Feature","properties":{"name":"Rue Nelson Mandela","distance":36.41247207116926,"sectionId":"34718-34720","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6292068035750316,44.805857500152804],[-0.6290182849240853,44.80555840129723]]}},{"type":"Feature","properties":{"name":"Rue Adrien Ducourt","distance":108.57421027281528,"sectionId":"34718-15808","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6292068035750316,44.805857500152804],[-0.6288126939101333,44.80598105799353],[-0.628784496817115,44.80598943456038],[-0.6287643105293776,44.80600043822628],[-0.628760187260216,44.80601534352154],[-0.6287655184404249,44.80602967693025],[-0.6289597013617284,44.80649110669704],[-0.6290203614854815,44.80660240666163]]}},{"type":"Feature","properties":{"name":"Rue de Tremeuge","distance":5.73627468068637,"sectionId":"20143-38854","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5930434137916174,44.803644041633945],[-0.5929742433737365,44.803628480598185]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":82.16585293993857,"sectionId":"20143-19586","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5927545423625904,44.80435463593653],[-0.5930434137916174,44.803644041633945]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":85.2966918405012,"sectionId":"20143-as=125525","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5930434137916174,44.803644041633945],[-0.5933419432009441,44.80290609458723]]}},{"type":"Feature","properties":{"name":"Avenue du Lycée","distance":5.598152763025811,"sectionId":"20144-38856","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5934361361385686,44.80267325106588],[-0.5933681929699226,44.802659092840265]]}},{"type":"Feature","properties":{"name":"Avenue du Lycée","distance":70.65291936758318,"sectionId":"20144-19781","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5934361361385686,44.80267325106588],[-0.5941101284050473,44.803090834537365]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":105.07652712491878,"sectionId":"20144-20145","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5934361361385686,44.80267325106588],[-0.5936100667772646,44.80223202842981],[-0.593751791100703,44.801885148170584],[-0.5937916863746345,44.80182488375475],[-0.5938418315239782,44.80177681685403]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":85.2966918405012,"sectionId":"20144-as=125525","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5933419432009441,44.80290609458723],[-0.5934361361385686,44.80267325106588]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":6.232710299119708,"sectionId":"38841-59022","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5915715782126126,44.806807000539166],[-0.5915753813942688,44.806819162196575],[-0.5915882405594408,44.806838645159615],[-0.5916084990576307,44.806855428560446]]}},{"type":"Feature","properties":{"name":"Avenue Maréchal Leclerc","distance":111.98156296721476,"sectionId":"38841-42110","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5915715782126126,44.806807000539166],[-0.5915090177488784,44.80680708866843],[-0.5913368025222011,44.80679496035687],[-0.5908938621177842,44.8067209348852],[-0.5905757280150876,44.80668206352678],[-0.5903967975998345,44.806669785464045],[-0.5901752386690532,44.80668821935534]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":20.073356934828386,"sectionId":"38841-59024","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5917228175241306,44.80668043065457],[-0.5917093553724799,44.80668234980004],[-0.5916813407291034,44.80669151141458],[-0.5916256576879978,44.806721440014826],[-0.5916010487437976,44.80673593325577],[-0.5915833878840339,44.806753594050186],[-0.5915727415861389,44.80677438339978],[-0.5915698063875107,44.806796070418244],[-0.5915715782126126,44.806807000539166]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":6.232710299119708,"sectionId":"59022-38841","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5915715782126126,44.806807000539166],[-0.5915753813942688,44.806819162196575],[-0.5915882405594408,44.806838645159615],[-0.5916084990576307,44.806855428560446]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":13.587766855754914,"sectionId":"59022-59021","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.591766336803742,44.8068580488834],[-0.5917530461618853,44.80686457610261],[-0.5917244589228257,44.80687409658636],[-0.5916958079380658,44.80687768181939],[-0.5916634127232887,44.80687586530662],[-0.5916341990419611,44.8068684202106],[-0.5916084990576307,44.806855428560446]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":346.50498247484956,"sectionId":"59022-as=3852","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5916084990576307,44.806855428560446],[-0.5916465437470868,44.80692239687728],[-0.591541951911806,44.807203670542116],[-0.591434871456327,44.80749162052985],[-0.5914020637957571,44.807645435404126],[-0.5913832404552399,44.80773530094656],[-0.5913609287638117,44.80797634404888],[-0.5913598799122404,44.80823166939641],[-0.5913142621860418,44.8089740336309],[-0.59129860866703,44.809352421551786],[-0.5912978182357062,44.809603775083744],[-0.5912922195264352,44.80981654518834],[-0.5912749521066185,44.8099454334626]]}},{"type":"Feature","properties":{"name":"Avenue du Lycée","distance":5.598152763025811,"sectionId":"38856-20144","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5934361361385686,44.80267325106588],[-0.5933681929699226,44.802659092840265]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":107.7608464765911,"sectionId":"38856-38858","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5937829356824031,44.80173931199198],[-0.5937256983954406,44.8017974219153],[-0.5936815058843903,44.801867911286266],[-0.5933681929699226,44.802659092840265]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":32.661571759293246,"sectionId":"38856-as=125539","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5933681929699226,44.802659092840265],[-0.5932533999645394,44.80294156638243]]}},{"type":"Feature","properties":{"name":"Rue de Tremeuge","distance":5.73627468068637,"sectionId":"38854-20143","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5930434137916174,44.803644041633945],[-0.5929742433737365,44.803628480598185]]}},{"type":"Feature","properties":{"name":"Rue de Tremeuge","distance":69.96181050955994,"sectionId":"38854-20385","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5929742433737365,44.803628480598185],[-0.5926428126483259,44.803556705180576],[-0.5921218055751118,44.80346029306825]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":82.39900020453348,"sectionId":"38854-38853","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5929742433737365,44.803628480598185],[-0.5926887131867463,44.804341941868636]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":32.661571759293246,"sectionId":"38854-as=125539","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5932533999645394,44.80294156638243],[-0.5929742433737365,44.803628480598185]]}},{"type":"Feature","properties":{"name":"Rue du Général Sarrail","distance":43.20223509254898,"sectionId":"19947-37097","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5883960860467061,44.79893904008061],[-0.5880565579603034,44.798887055557884],[-0.587860065877693,44.79886460859568]]}},{"type":"Feature","properties":{"name":"Rue du Général Sarrail","distance":31.850876666798957,"sectionId":"19947-19577","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.587860065877693,44.79886460859568],[-0.5878226089338402,44.7988299376929],[-0.5877730627359907,44.798814475270966],[-0.5874940924930621,44.79876580341441]]}},{"type":"Feature","properties":{"name":"Rue du Général Sarrail","distance":35.067752919998384,"sectionId":"19947-19578","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.587860065877693,44.79886460859568],[-0.5877814769738232,44.798864295342476],[-0.5876659685007506,44.798880640791104],[-0.5874301042376504,44.79893303199433]]}},{"type":"Feature","properties":{"name":"Rue Blaise Pascal","distance":117.42304664005545,"sectionId":"52048-16094","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6328870155811008,44.79910027617863],[-0.6327586572354493,44.79892258670855],[-0.6326526022515895,44.79875949899196],[-0.6326010835463975,44.79863061276353],[-0.6324753154092333,44.79809439571101]]}},{"type":"Feature","properties":{"name":"Rue Blaise Pascal","distance":60.40197414646137,"sectionId":"52048-16090","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6324753154092333,44.79809439571101],[-0.6324122003337981,44.79782561889528],[-0.6323443220543825,44.79772220840872],[-0.6321897311485453,44.79761003666069]]}},{"type":"Feature","properties":{"name":"Avenue Bitaly","distance":112.8602716968615,"sectionId":"16090-16089","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6307665484608452,44.797685210289806],[-0.6321897311485453,44.79761003666069]]}},{"type":"Feature","properties":{"name":"Rue Blaise Pascal","distance":60.40197414646137,"sectionId":"16090-52048","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6324753154092333,44.79809439571101],[-0.6324122003337981,44.79782561889528],[-0.6323443220543825,44.79772220840872],[-0.6321897311485453,44.79761003666069]]}},{"type":"Feature","properties":{"name":"Avenue Bougnard","distance":29.878268162370116,"sectionId":"16090-16091","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6321897311485453,44.79761003666069],[-0.6321758318754092,44.79734121927321]]}},{"type":"Feature","properties":{"name":"Rue du Pont de Chiquet","distance":56.48652027005442,"sectionId":"54609-16223","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6242393931306023,44.80716894678864],[-0.624213976538619,44.80713779162566],[-0.6241864102516906,44.80712200451378],[-0.6241642196396385,44.80710919903593],[-0.623740383983217,44.806959471475096],[-0.6236435928320284,44.806901298311644]]}},{"type":"Feature","properties":{"name":"Rue du Pont de Chiquet","distance":16.02069916425035,"sectionId":"54609-54608","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6243411479644546,44.807293675486406],[-0.6242393931306023,44.80716894678864]]}},{"type":"Feature","properties":{"name":"Rue du Pont de Chiquet","distance":56.48652027005442,"sectionId":"16223-54609","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6242393931306023,44.80716894678864],[-0.624213976538619,44.80713779162566],[-0.6241864102516906,44.80712200451378],[-0.6241642196396385,44.80710919903593],[-0.623740383983217,44.806959471475096],[-0.6236435928320284,44.806901298311644]]}},{"type":"Feature","properties":{"name":"Avenue de Chiquet","distance":112.9101494377724,"sectionId":"16223-16389","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6236435928320284,44.806901298311644],[-0.6226363449300576,44.80618073546984]]}},{"type":"Feature","properties":{"name":"Avenue de Candau","distance":36.99214773307388,"sectionId":"16223-28915","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6236435928320284,44.806901298311644],[-0.6233650667962933,44.80716889130704]]}},{"type":"Feature","properties":{"name":"Avenue de Gradignan","distance":2.4900009049792162,"sectionId":"16223-as=3949","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.623954917132629,44.8065586919272],[-0.6236435928320284,44.806901298311644]]}},{"type":"Feature","properties":{"name":"Rue François Mitterrand","distance":311.63503728402594,"sectionId":"42838-42839","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6012665955153395,44.80519957824972],[-0.6036159512370042,44.80457764572556],[-0.6036623771838412,44.80455518553956],[-0.6037022191099721,44.804528609979336],[-0.6037277736859025,44.80449816312676],[-0.6037433263291937,44.80446560094496],[-0.6039291014783689,44.803988312301755],[-0.603936893684687,44.80394698772371],[-0.6039275725233191,44.80389908888381],[-0.6037883598926465,44.803629468683006]]}},{"type":"Feature","properties":{"name":"Avenue des Arts Et Metiers","distance":93.51943339536162,"sectionId":"42838-25408","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6012665955153395,44.80519957824972],[-0.6009801384404047,44.80465094733964],[-0.600955876153085,44.80460892631881],[-0.6009256674504355,44.80457096710187],[-0.6008591839170515,44.804523526585875],[-0.6007471674791848,44.80446221351912]]}},{"type":"Feature","properties":{"name":"Avenue des Arts Et Metiers","distance":71.04550221136599,"sectionId":"42838-20412","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.601584876390149,44.80579773715195],[-0.6012665955153395,44.80519957824972]]}},{"type":"Feature","properties":{"name":"Rue François Mitterrand","distance":311.63503728402594,"sectionId":"42839-42838","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6012665955153395,44.80519957824972],[-0.6036159512370042,44.80457764572556],[-0.6036623771838412,44.80455518553956],[-0.6037022191099721,44.804528609979336],[-0.6037277736859025,44.80449816312676],[-0.6037433263291937,44.80446560094496],[-0.6039291014783689,44.803988312301755],[-0.603936893684687,44.80394698772371],[-0.6039275725233191,44.80389908888381],[-0.6037883598926465,44.803629468683006]]}},{"type":"Feature","properties":{"name":"Voie 1 Faculté des Sciences","distance":17.242969458689764,"sectionId":"622-20529","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.595118792724725,44.80826399273431],[-0.5951235605337198,44.80822681828497],[-0.5951234192899467,44.80810890524155]]}},{"type":"Feature","properties":{"name":"Voie 2 Faculté des Sciences","distance":15.669131496058071,"sectionId":"622-633","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5951234192899467,44.80810890524155],[-0.5951433313396866,44.808109627117844],[-0.5951857012991568,44.80810522513437],[-0.5952260705730569,44.808095121116175],[-0.5952629404614367,44.80807963268061],[-0.5952946971936125,44.80805926125106],[-0.5952993982979592,44.80805550937134]]}},{"type":"Feature","properties":{"name":"Voie 2 Faculté des Sciences","distance":35.19358169795944,"sectionId":"622-628","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5949446075557351,44.80787746060429],[-0.5949285051511253,44.80790130079415],[-0.5949179451639134,44.807930821150336],[-0.5949156670563552,44.80796125082529],[-0.5949217242441157,44.80799141706321],[-0.5949359175539288,44.808020155090176],[-0.5949577952313793,44.808046308114015],[-0.5949862908718381,44.80806900901435],[-0.595020585044227,44.80808729278083],[-0.59505911177112,44.80810039816389],[-0.5951005800815373,44.80810791555126],[-0.5951234192899467,44.80810890524155]]}},{"type":"Feature","properties":{"name":"Voie 2 Faculté des Sciences","distance":15.669131496058071,"sectionId":"633-622","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5951234192899467,44.80810890524155],[-0.5951433313396866,44.808109627117844],[-0.5951857012991568,44.80810522513437],[-0.5952260705730569,44.808095121116175],[-0.5952629404614367,44.80807963268061],[-0.5952946971936125,44.80805926125106],[-0.5952993982979592,44.80805550937134]]}},{"type":"Feature","properties":{"name":"Voie 1 Faculté des Sciences","distance":203.53882103166345,"sectionId":"633-20530","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5952993982979592,44.80805550937134],[-0.5957916772073627,44.80794446111475],[-0.5977172695857862,44.80742792452227]]}},{"type":"Feature","properties":{"name":"Voie 2 Faculté des Sciences","distance":31.822360829268952,"sectionId":"633-20536","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5952249709914197,44.80781373927588],[-0.5952468358245578,44.80782142581367],[-0.5952810036401661,44.8078397134943],[-0.5953096255987316,44.80786241032181],[-0.5953313770930191,44.807888567267035],[-0.5953456968748769,44.80791730125153],[-0.5953517542823621,44.80794746746573],[-0.5953494764025928,44.80797789714909],[-0.5953387903257614,44.808007421536274],[-0.5953203808931142,44.80803484791099],[-0.5952993982979592,44.80805550937134]]}},{"type":"Feature","properties":{"name":"Voie 1 Faculté des Sciences","distance":25.963072522790537,"sectionId":"652-565","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5923014576779416,44.80911464724327],[-0.5923203593795362,44.80909306119912],[-0.5923314057953137,44.80906929102091],[-0.592334021490954,44.80904425570406],[-0.5923283073312876,44.809019573538976],[-0.5923143473697959,44.80899659310074],[-0.5922931097233672,44.80897663504195],[-0.5922658038850416,44.80896083222664],[-0.5922338863311691,44.80895021963794],[-0.5921994113864558,44.80894527288714],[-0.5921882974571633,44.80894562386988]]}},{"type":"Feature","properties":{"name":"Voie 1 Faculté des Sciences","distance":12.139000482225049,"sectionId":"652-20528","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5921882974571633,44.80894562386988],[-0.5921641751785341,44.80894638565836],[-0.5921304510027753,44.80895348616225],[-0.592100105254654,44.80896606504779],[-0.5920747461435735,44.80898353104136],[-0.592062101007606,44.808997893070945]]}},{"type":"Feature","properties":{"name":"Voie 2 Faculté des Sciences","distance":261.43073921896337,"sectionId":"652-628","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5949446075557351,44.80787746060429],[-0.5947690839190122,44.80788336826787],[-0.5946998469257447,44.80789726706777],[-0.5942009134097537,44.808027438064606],[-0.594128240817669,44.808043066544016],[-0.5940534947521084,44.80805182417166],[-0.5938268212963905,44.80806745393388],[-0.5936005684499777,44.8080857724138],[-0.5935257071650636,44.8080947134956],[-0.5934147029657073,44.80811254340357],[-0.5933056935821438,44.80813598535228],[-0.5932335930355493,44.808152676161235],[-0.5931651963783955,44.808176006072415],[-0.5931021453999266,44.80820592322821],[-0.59304674698904,44.80824289526063],[-0.592968411543013,44.80830167098518],[-0.5924582036963829,44.80870180563772],[-0.5922283428118189,44.80888157207494],[-0.5922101006321526,44.80890358768679],[-0.5921882974571633,44.80894562386988]]}},{"type":"Feature","properties":{"name":"Voie 1 Faculté des Sciences","distance":12.139000482225049,"sectionId":"20528-652","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5921882974571633,44.80894562386988],[-0.5921641751785341,44.80894638565836],[-0.5921304510027753,44.80895348616225],[-0.592100105254654,44.80896606504779],[-0.5920747461435735,44.80898353104136],[-0.592062101007606,44.808997893070945]]}},{"type":"Feature","properties":{"name":"Voie 2 Faculté des Sciences","distance":52.86655070899751,"sectionId":"20528-20140","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.592062101007606,44.808997893070945],[-0.591431092111132,44.809155283153466]]}},{"type":"Feature","properties":{"name":"Voie 1 Faculté des Sciences","distance":12.027001004109959,"sectionId":"20528-614","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.592062101007606,44.808997893070945],[-0.5920560745649794,44.80900474944799],[-0.5920450280480412,44.809028519599096],[-0.5920424066246759,44.809053465004695],[-0.5920481262695825,44.80907823708883],[-0.5920620861449233,44.809101217559316]]}},{"type":"Feature","properties":{"name":"Esplanade du 8 Mai 1945","distance":100.53409632829933,"sectionId":"13302-20309","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.588214814102791,44.809443166299296],[-0.5880106565638757,44.80968237757569],[-0.5879808132003606,44.80970304683394],[-0.5879394087743228,44.80971282052969],[-0.5878922305646256,44.80971115578071],[-0.5878528898809628,44.809701226527025],[-0.587258968721268,44.80943205713267]]}},{"type":"Feature","properties":{"name":"Esplanade du 8 Mai 1945","distance":15.05596798998533,"sectionId":"13302-13289","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.58832341738245,44.80933182236562],[-0.588214814102791,44.809443166299296]]}},{"type":"Feature","properties":{"name":"Esplanade du 8 Mai 1945","distance":15.180066243493455,"sectionId":"13302-36338","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.588214814102791,44.809443166299296],[-0.588373883302409,44.8094493184656],[-0.5884052365925718,44.809442744302494]]}},{"type":"Feature","properties":{"name":"Esplanade du 8 Mai 1945","distance":100.53409632829933,"sectionId":"20309-13302","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.588214814102791,44.809443166299296],[-0.5880106565638757,44.80968237757569],[-0.5879808132003606,44.80970304683394],[-0.5879394087743228,44.80971282052969],[-0.5878922305646256,44.80971115578071],[-0.5878528898809628,44.809701226527025],[-0.587258968721268,44.80943205713267]]}},{"type":"Feature","properties":{"name":"Rue du Professeur Arnozan","distance":119.82673773968105,"sectionId":"20309-20120","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.587258968721268,44.80943205713267],[-0.5869946792994337,44.809725860605276],[-0.5869553984093602,44.80975349323368],[-0.5862566885838594,44.810043427025995],[-0.586101036755573,44.81007391743919]]}},{"type":"Feature","properties":{"name":"Rue du Professeur Arnozan","distance":16.72542092871129,"sectionId":"20309-20311","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5873844207319046,44.80931081429517],[-0.587258968721268,44.80943205713267]]}},{"type":"Feature","properties":{"name":"Rue du Professeur Arnozan","distance":19.088194020032883,"sectionId":"13285-20316","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5881968501730691,44.80882730336783],[-0.5881915726533976,44.80880350809471],[-0.5881709789856449,44.80876947624122],[-0.5881395344612194,44.808740020517845],[-0.5880991079476455,44.80871670343523],[-0.5880525730551078,44.80870096572785]]}},{"type":"Feature","properties":{"name":"Esplanade du 8 Mai 1945","distance":27.816039719353128,"sectionId":"13285-13306","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5885482454810009,44.80883927887937],[-0.5881968501730691,44.80882730336783]]}},{"type":"Feature","properties":{"name":"Rue du Professeur Arnozan","distance":9.652703947999425,"sectionId":"13285-20315","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5881797231688719,44.80891198002606],[-0.5881961450309104,44.80887696067266],[-0.5882001763737262,44.808840080136335],[-0.5881968501730691,44.80882730336783]]}},{"type":"Feature","properties":{"name":"Esplanade du 8 Mai 1945","distance":37.89450352153846,"sectionId":"13289-20485","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.587919333101578,44.80914837087973],[-0.58832341738245,44.80933182236562]]}},{"type":"Feature","properties":{"name":"Esplanade du 8 Mai 1945","distance":15.05596798998533,"sectionId":"13289-13302","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.58832341738245,44.80933182236562],[-0.588214814102791,44.809443166299296]]}},{"type":"Feature","properties":{"name":"Esplanade du 8 Mai 1945","distance":9.481303952045053,"sectionId":"13289-13307","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.58832341738245,44.80933182236562],[-0.5884433216987119,44.8093329041959]]}},{"type":"Feature","properties":{"name":"Rue Jean Grousset","distance":54.80371072492183,"sectionId":"20136-20061","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5806814180138815,44.79511636493524],[-0.5812455094831308,44.79524426406048],[-0.5813456481642605,44.795235165102824]]}},{"type":"Feature","properties":{"name":"Chemin de Leysotte","distance":117.44808001109698,"sectionId":"20136-20135","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5806814180138815,44.79511636493524],[-0.5806043656541814,44.795242563083505],[-0.5799400704288935,44.796031422002244]]}},{"type":"Feature","properties":{"name":"Rue Jean Grousset","distance":54.80371072492183,"sectionId":"20061-20136","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5806814180138815,44.79511636493524],[-0.5812455094831308,44.79524426406048],[-0.5813456481642605,44.795235165102824]]}},{"type":"Feature","properties":{"name":"Rue Henry de Montherlant","distance":87.72326062047789,"sectionId":"20061-20060","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5816756531470041,44.795922453916624],[-0.5815380589027282,44.79588868285579],[-0.5814732549235175,44.79584748460213],[-0.5814372947108952,44.795800153210344],[-0.581356943586693,44.79549847817847],[-0.5813518493489928,44.79537369545283],[-0.5813456481642605,44.795235165102824]]}},{"type":"Feature","properties":{"name":"Rue Henry de Montherlant","distance":135.42848338400242,"sectionId":"20061-20063","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5813456481642605,44.795235165102824],[-0.5814020732661829,44.79509871614635],[-0.5814178892816545,44.79459772472216],[-0.5814796208099137,44.794428589117054],[-0.5818017654633052,44.79409946398881]]}},{"type":"Feature","properties":{"name":"Rue Léon Jouhaux","distance":131.01751669840388,"sectionId":"20061-20127","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5813456481642605,44.795235165102824],[-0.5814070565054914,44.79515449987575],[-0.5814590044536805,44.79513538803406],[-0.5815268367652134,44.7951337021418],[-0.5816037171448818,44.79510659847528],[-0.5823002342521046,44.79475135758907],[-0.5823949811105213,44.79467585719096],[-0.5825727753321275,44.79448928213151]]}},{"type":"Feature","properties":{"name":"Avenue Pasteur","distance":14.464139378926067,"sectionId":"37643-16402","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6309973778869389,44.806155553294545],[-0.6311754385788592,44.80612572631919]]}},{"type":"Feature","properties":{"name":"Avenue Pasteur","distance":3.4967746394475165,"sectionId":"37643-as=126198","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.630666524961471,44.80621107320266],[-0.6309973778869389,44.806155553294545]]}},{"type":"Feature","properties":{"name":"Avenue Pasteur","distance":11.891286751816267,"sectionId":"16402-17247","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6313232630557205,44.80610605296365],[-0.6311754385788592,44.80612572631919]]}},{"type":"Feature","properties":{"name":"Avenue Pasteur","distance":14.464139378926067,"sectionId":"16402-37643","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6309973778869389,44.806155553294545],[-0.6311754385788592,44.80612572631919]]}},{"type":"Feature","properties":{"name":"Place de la Cinquième République","distance":75.36571962102067,"sectionId":"16402-16403","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6311754385788592,44.80612572631919],[-0.6309416636166261,44.80546791955571]]}},{"type":"Feature","properties":{"name":"Avenue des Deux Ponts","distance":121.62062200726356,"sectionId":"16343-16491","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6209176256124728,44.80151418988168],[-0.6193901306760591,44.8013866079945]]}},{"type":"Feature","properties":{"name":"Avenue des Chasseurs","distance":111.2681609996746,"sectionId":"16343-16344","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6209176256124728,44.80151418988168],[-0.6210805999159307,44.80051916368715]]}},{"type":"Feature","properties":{"name":"Avenue des Chasseurs","distance":100.90526481201479,"sectionId":"16343-16342","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6207756796871756,44.802417021304976],[-0.6209176256124728,44.80151418988168]]}},{"type":"Feature","properties":{"name":"Avenue des Deux Ponts","distance":95.17811794039058,"sectionId":"16343-16490","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6221211395213243,44.801523791125014],[-0.6209176256124728,44.80151418988168]]}},{"type":"Feature","properties":{"name":"Avenue Raymond Boivin","distance":80.27890151764852,"sectionId":"16874-16751","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6192614171451878,44.802438103692516],[-0.6182464372634308,44.80245301211074]]}},{"type":"Feature","properties":{"name":"Rue Henri Dunant","distance":104.13169871482474,"sectionId":"16874-19488","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6182464372634308,44.80245301211074],[-0.6181932316981493,44.80232903850005],[-0.6181629346302326,44.80228378958777],[-0.6181110438310794,44.802255352533635],[-0.6180417737508069,44.80224233207226],[-0.6179611440555854,44.80224588792956],[-0.6178877662049538,44.80226822062627],[-0.6175403009299302,44.80250997641841],[-0.6173187328141713,44.802632780677655]]}},{"type":"Feature","properties":{"name":"Rue Henri Dunant","distance":64.07968833196372,"sectionId":"16874-16873","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6181716384499761,44.802999044575934],[-0.6183351803731513,44.802723862034924],[-0.6182464372634308,44.80245301211074]]}},{"type":"Feature","properties":{"name":"Rue Henri Dunant","distance":104.13169871482474,"sectionId":"19488-16874","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6182464372634308,44.80245301211074],[-0.6181932316981493,44.80232903850005],[-0.6181629346302326,44.80228378958777],[-0.6181110438310794,44.802255352533635],[-0.6180417737508069,44.80224233207226],[-0.6179611440555854,44.80224588792956],[-0.6178877662049538,44.80226822062627],[-0.6175403009299302,44.80250997641841],[-0.6173187328141713,44.802632780677655]]}},{"type":"Feature","properties":{"name":"Rue Herman Lemoine","distance":47.95397740063769,"sectionId":"16493-16674","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6308833205895168,44.80716534165337],[-0.631075393174946,44.807574857356464]]}},{"type":"Feature","properties":{"name":"Rue Herman Lemoine","distance":15.529575151178136,"sectionId":"16493-16882","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6308228069958516,44.80703232765483],[-0.6308833205895168,44.80716534165337]]}},{"type":"Feature","properties":{"name":"Rue Dignac","distance":7.960356984402109,"sectionId":"16493-25319","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6309738476311294,44.807133985290996],[-0.6308833205895168,44.80716534165337]]}},{"type":"Feature","properties":{"name":"Rue Herman Lemoine","distance":47.95397740063769,"sectionId":"16674-16493","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6308833205895168,44.80716534165337],[-0.631075393174946,44.807574857356464]]}},{"type":"Feature","properties":{"name":"Rue Herman Lemoine","distance":45.06841198165513,"sectionId":"16674-31145","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6311664048647538,44.8079710236816],[-0.6311640363388192,44.80790128425703],[-0.6311673870528454,44.8078158678148],[-0.6311613664021591,44.807774531331326],[-0.6311429926012534,44.807719896454806],[-0.631075393174946,44.807574857356464]]}},{"type":"Feature","properties":{"name":"Avenue François Coppée","distance":62.73938609802648,"sectionId":"16674-16462","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.631075393174946,44.807574857356464],[-0.6303581801530276,44.807816474705625]]}},{"type":"Feature","properties":{"name":"Rue Herman Lemoine","distance":45.87272395931224,"sectionId":"16463-16544","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6306339972617606,44.808185392863834],[-0.6306906246377165,44.808272768398595],[-0.6308268009744906,44.80857434652392]]}},{"type":"Feature","properties":{"name":"Rue Herman Lemoine","distance":48.982403324387576,"sectionId":"16463-31145","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6311664048647538,44.8079710236816],[-0.6310948359874182,44.80803015138066],[-0.6309440649781628,44.80807946585717],[-0.6306339972617606,44.808185392863834]]}},{"type":"Feature","properties":{"name":"Rue Pierre Curie","distance":46.4184713757076,"sectionId":"16463-16462","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6306339972617606,44.808185392863834],[-0.6303581801530276,44.807816474705625]]}},{"type":"Feature","properties":{"name":"Rue Herman Lemoine","distance":45.87272395931224,"sectionId":"16544-16463","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6306339972617606,44.808185392863834],[-0.6306906246377165,44.808272768398595],[-0.6308268009744906,44.80857434652392]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Nancel Pénard","distance":93.53742304840249,"sectionId":"16544-16545","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6308268009744906,44.80857434652392],[-0.6310360631124109,44.80852343532635],[-0.6311894296243841,44.80850124324869],[-0.6312670798827145,44.808500475910186],[-0.6313472792120202,44.808506023097124],[-0.6314882678486665,44.808546473775664],[-0.6316046141759817,44.8085995120527],[-0.6318755916354046,44.80876490225784]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Nancel Pénard","distance":75.15745114866311,"sectionId":"16544-16430","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6300172199596933,44.80892484828186],[-0.6302240382772087,44.80886122472536],[-0.6304729864693318,44.808749232320224],[-0.6308268009744906,44.80857434652392]]}},{"type":"Feature","properties":{"name":"Rue Herman Lemoine","distance":45.06841198165513,"sectionId":"31145-16674","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6311664048647538,44.8079710236816],[-0.6311640363388192,44.80790128425703],[-0.6311673870528454,44.8078158678148],[-0.6311613664021591,44.807774531331326],[-0.6311429926012534,44.807719896454806],[-0.631075393174946,44.807574857356464]]}},{"type":"Feature","properties":{"name":"Rue Herman Lemoine","distance":48.982403324387576,"sectionId":"31145-16463","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6311664048647538,44.8079710236816],[-0.6310948359874182,44.80803015138066],[-0.6309440649781628,44.80807946585717],[-0.6306339972617606,44.808185392863834]]}},{"type":"Feature","properties":{"name":"Rue Jean Monnet","distance":92.13778080806037,"sectionId":"31145-31144","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6311664048647538,44.8079710236816],[-0.6312183966845824,44.80798882200619],[-0.6312693929276687,44.80800286856623],[-0.6313261832264202,44.80801447802858],[-0.631400662567728,44.80801561348974],[-0.6322953326742453,44.807865072908555]]}},{"type":"Feature","properties":{"name":"Allée Georges Brassens","distance":28.670124027500286,"sectionId":"19516-16759","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6081304002606294,44.8076860611186],[-0.6081203400511479,44.80767493972986],[-0.6081173224089411,44.80761864363496],[-0.6081256461982065,44.807600002705456],[-0.6081467923460471,44.80759617902009],[-0.6083023348352704,44.80759250600897],[-0.6083608681400925,44.807601729324546]]}},{"type":"Feature","properties":{"name":"Allée Georges Brassens","distance":21.96868558910659,"sectionId":"16759-19516","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6083608681400925,44.807601729324546],[-0.608304246659037,44.80764730577728],[-0.6082279955581746,44.80768656852333],[-0.6081579717035079,44.807689870813746],[-0.6081304002606294,44.8076860611186]]}},{"type":"Feature","properties":{"name":"Allée Georges Brassens","distance":12.87948698978308,"sectionId":"16759-16758","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6084853871706092,44.80752697399567],[-0.6083608681400925,44.807601729324546]]}},{"type":"Feature","properties":{"name":"Avenue Marc Desbats","distance":97.76427682426129,"sectionId":"17072-16921","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.618594700473303,44.80386687048051],[-0.6192476310239643,44.803967887880596],[-0.6194472370006355,44.80398297581156],[-0.6195972048874813,44.80398135618289],[-0.6197281520693905,44.8039730449495],[-0.6198124150619269,44.80396081435652]]}},{"type":"Feature","properties":{"name":"Rue Louis Armand","distance":58.004230014208154,"sectionId":"17072-17073","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.618594700473303,44.80386687048051],[-0.618595492450848,44.80392584986956],[-0.618735329903082,44.80433127996516],[-0.6187065175775098,44.80437219367516]]}},{"type":"Feature","properties":{"name":"Avenue Marc Desbats","distance":"Unknown","sectionId":"17072-as=125302","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.618345051263509,44.803812475306586],[-0.618594700473303,44.80386687048051]]}},{"type":"Feature","properties":{"name":"Rue Louis Armand","distance":102.76910849977696,"sectionId":"17073-17074","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6187065175775098,44.80437219367516],[-0.6185796463020825,44.804534146268935],[-0.6186917202843472,44.804934694390035],[-0.6188697461705239,44.80524089870388]]}},{"type":"Feature","properties":{"name":"Rue Louis Armand","distance":58.004230014208154,"sectionId":"17073-17072","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.618594700473303,44.80386687048051],[-0.618595492450848,44.80392584986956],[-0.618735329903082,44.80433127996516],[-0.6187065175775098,44.80437219367516]]}},{"type":"Feature","properties":{"name":"Rue Henri Dunant","distance":64.07968833196372,"sectionId":"16873-16874","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6181716384499761,44.802999044575934],[-0.6183351803731513,44.802723862034924],[-0.6182464372634308,44.80245301211074]]}},{"type":"Feature","properties":{"name":"Rue Louis Braille","distance":99.6724197801635,"sectionId":"16873-19424","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6181716384499761,44.802999044575934],[-0.6190864475974243,44.80327892452546],[-0.6191427807609999,44.80330352639809],[-0.6191935018189553,44.803440280460485]]}},{"type":"Feature","properties":{"name":"Rue Henri Dunant","distance":79.71428747170923,"sectionId":"16873-16872","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6177762813257962,44.80365923002183],[-0.6181716384499761,44.802999044575934]]}},{"type":"Feature","properties":{"name":"Rue Louis Braille","distance":99.6724197801635,"sectionId":"19424-16873","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6181716384499761,44.802999044575934],[-0.6190864475974243,44.80327892452546],[-0.6191427807609999,44.80330352639809],[-0.6191935018189553,44.803440280460485]]}},{"type":"Feature","properties":{"name":"Avenue Léon Duguit","distance":193.72323680074578,"sectionId":"15989-17043","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6178180737614022,44.79822614617144],[-0.6155228591083164,44.798835583950826]]}},{"type":"Feature","properties":{"name":"Avenue Léon Duguit","distance":210.9659655517416,"sectionId":"15989-17010","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6155228591083164,44.798835583950826],[-0.6153042674900776,44.79887253079592],[-0.6144839948647209,44.799098138127405],[-0.6130188090616121,44.79948701121046]]}},{"type":"Feature","properties":{"name":"Allée Ausone","distance":94.08681913081276,"sectionId":"15989-15987","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6159351826868764,44.79963016129116],[-0.6156499588352282,44.79908485727348],[-0.6155228591083164,44.798835583950826]]}},{"type":"Feature","properties":{"name":"Allée Ausone","distance":144.7824658632035,"sectionId":"15989-31834","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6155228591083164,44.798835583950826],[-0.6152654804808804,44.798364973747326],[-0.6150089132604547,44.79789109428041],[-0.6148726813755127,44.797617157607036]]}},{"type":"Feature","properties":{"name":"Avenue Léon Duguit","distance":210.9659655517416,"sectionId":"17010-15989","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6155228591083164,44.798835583950826],[-0.6153042674900776,44.79887253079592],[-0.6144839948647209,44.799098138127405],[-0.6130188090616121,44.79948701121046]]}},{"type":"Feature","properties":{"name":"Allée de la Boétie","distance":97.6365141675942,"sectionId":"17010-17008","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6134612050310447,44.800307666080954],[-0.6131061225000746,44.799654764639726],[-0.6130188090616121,44.79948701121046]]}},{"type":"Feature","properties":{"name":"Avenue Léon Duguit","distance":382.0752658794313,"sectionId":"17010-as=127941","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6130188090616121,44.79948701121046],[-0.6121891942954869,44.79974956201924],[-0.6120769482267334,44.799787628886115],[-0.6120152747744724,44.79979481247025],[-0.6119466999963092,44.79978473909176],[-0.6119155669364443,44.79976239634537],[-0.6116085694985325,44.79923245844444],[-0.6115908033336732,44.79921545644587],[-0.6115625504020434,44.79920878668436],[-0.6115382273318947,44.79920829793205],[-0.6115097414434093,44.799214067013764],[-0.6114853060383519,44.79922592319244],[-0.6103173890921755,44.80012933307853],[-0.6098102949794868,44.80054386642339],[-0.6096747182570297,44.80062564089148],[-0.6096747182570297,44.80062564089148]]}},{"type":"Feature","properties":{"name":"Rue du 11 Novembre","distance":303.9973648772718,"sectionId":"17197-16937","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6208364325521509,44.811430275159225],[-0.6206044790784373,44.81189789414409],[-0.6205962854832917,44.81193265686024],[-0.6205937352908419,44.811972644954544],[-0.6206014743999353,44.812005188967795],[-0.6217658448298949,44.81397031605175]]}},{"type":"Feature","properties":{"name":"Avenue du Vallon","distance":29.667723555590786,"sectionId":"17197-17441","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6206897558564304,44.81118442213069],[-0.6208364325521509,44.811430275159225]]}},{"type":"Feature","properties":{"name":"Avenue du Vallon","distance":272.3664997583884,"sectionId":"17197-16938","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6208364325521509,44.811430275159225],[-0.6220677986690202,44.813720449606464]]}},{"type":"Feature","properties":{"name":"Rue du 11 Novembre","distance":303.9973648772718,"sectionId":"16937-17197","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6208364325521509,44.811430275159225],[-0.6206044790784373,44.81189789414409],[-0.6205962854832917,44.81193265686024],[-0.6205937352908419,44.811972644954544],[-0.6206014743999353,44.812005188967795],[-0.6217658448298949,44.81397031605175]]}},{"type":"Feature","properties":{"name":"Avenue de la Paillère","distance":4.627334777082879,"sectionId":"17208-17209","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6086453402267731,44.796098491349674],[-0.6085877055614487,44.79609131192823]]}},{"type":"Feature","properties":{"name":"Rue Léo Ferré","distance":308.4738521789393,"sectionId":"17208-17562","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6096161550702309,44.794183685429104],[-0.6095831599544377,44.79425076358718],[-0.6098307675918202,44.79474619754953],[-0.6098041661993026,44.794780012345896],[-0.6090098538580561,44.79499124498106],[-0.6089914340021404,44.79502642141042],[-0.6094181761785373,44.79587335001899],[-0.6093804401984299,44.79590715775977],[-0.6086453402267731,44.796098491349674]]}},{"type":"Feature","properties":{"name":"Avenue de la Paillère","distance":55.80816127901788,"sectionId":"17208-25672","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6086453402267731,44.796098491349674],[-0.6089309237750757,44.79614960414153],[-0.6092201768736885,44.796194654296194],[-0.6093296767989641,44.79621991546355]]}},{"type":"Feature","properties":{"name":"Avenue de la Paillère","distance":"Unknown","sectionId":"17208-as=125296","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6091022239964791,44.79611317928631],[-0.6086453402267731,44.796098491349674]]}},{"type":"Feature","properties":{"name":"Avenue de la Paillère","distance":4.627334777082879,"sectionId":"17209-17208","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6086453402267731,44.796098491349674],[-0.6085877055614487,44.79609131192823]]}},{"type":"Feature","properties":{"name":"Rue du Relais","distance":65.06113505633907,"sectionId":"17209-17557","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6085877055614487,44.79609131192823],[-0.6083034349545852,44.79554163781109]]}},{"type":"Feature","properties":{"name":"Avenue de la Paillère","distance":37.993026986657206,"sectionId":"17209-17210","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6085877055614487,44.79609131192823],[-0.6081092980994777,44.79606018908337]]}},{"type":"Feature","properties":{"name":"Avenue Raymond Poincaré","distance":96.79854940376126,"sectionId":"15937-24276","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6252628069394983,44.79941635645798],[-0.6243497290246917,44.79999677088432]]}},{"type":"Feature","properties":{"name":"Avenue de Gradignan","distance":10.377375010671063,"sectionId":"15937-16166","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6243497290246917,44.79999677088432],[-0.6243970870013743,44.80008390397228]]}},{"type":"Feature","properties":{"name":"Avenue de Gradignan","distance":"Unknown","sectionId":"15937-as=124854","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6242505867429745,44.7998889472887],[-0.6243497290246917,44.79999677088432]]}},{"type":"Feature","properties":{"name":"Avenue de l'Armistice","distance":54.62908165645241,"sectionId":"15937-as=3800","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6243497290246917,44.79999677088432],[-0.623721398906139,44.80020115921167]]}},{"type":"Feature","properties":{"name":"Avenue de Gradignan","distance":10.377375010671063,"sectionId":"16166-15937","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6243497290246917,44.79999677088432],[-0.6243970870013743,44.80008390397228]]}},{"type":"Feature","properties":{"name":"Avenue Brémontier","distance":332.7031008982868,"sectionId":"16166-16165","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6243970870013743,44.80008390397228],[-0.6286027052433694,44.800164557580324]]}},{"type":"Feature","properties":{"name":"Avenue de Gradignan","distance":115.63172018024912,"sectionId":"16166-16341","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6243970870013743,44.80008390397228],[-0.6245693022808264,44.80051478083818],[-0.6248167158546375,44.80108108882604]]}},{"type":"Feature","properties":{"name":"Rue François Rabelais","distance":67.51413792972048,"sectionId":"19917-19941","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5986010282207422,44.79711248291793],[-0.5983648820431158,44.79700807279177],[-0.5980172370582716,44.796870616446455],[-0.5978580732608683,44.79681376542394]]}},{"type":"Feature","properties":{"name":"Rue François Rabelais","distance":178.3356177960784,"sectionId":"19917-19942","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5978580732608683,44.79681376542394],[-0.5975387306824177,44.7967081121789],[-0.5972938299217984,44.796635685873376],[-0.5970455231811215,44.796569492389416],[-0.5967940685367388,44.79650961362468],[-0.5965398559308785,44.796456217386655],[-0.5962829133280477,44.79640975318296],[-0.5958938856143271,44.796351070038696],[-0.5957169283102807,44.79632937035617]]}},{"type":"Feature","properties":{"name":"Rue Fenelon","distance":20.130458704350282,"sectionId":"19917-19918","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5978580732608683,44.79681376542394],[-0.5977397996493297,44.7969742505215]]}},{"type":"Feature","properties":{"name":"Rue René Vache","distance":386.12691499394555,"sectionId":"19954-20334","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.580958284944962,44.80802947790924],[-0.5828735045100534,44.80483162648224]]}},{"type":"Feature","properties":{"name":"Rue Lafontaine","distance":143.75826992032788,"sectionId":"19954-19630","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5836002037568148,44.80364523865101],[-0.5828735045100534,44.80483162648224]]}},{"type":"Feature","properties":{"name":"Rue Frédéric Sevene","distance":111.81209162300735,"sectionId":"19954-19953","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5839926048931097,44.805442794196125],[-0.583502280394917,44.805131337274695],[-0.583204235694667,44.80498182319573],[-0.5828735045100534,44.80483162648224]]}},{"type":"Feature","properties":{"name":"Rue Frédéric Sevene","distance":21.52273066632323,"sectionId":"19954-as=126423","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5828735045100534,44.80483162648224],[-0.5826322515009865,44.80474190899295]]}},{"type":"Feature","properties":{"name":"Résidence Coppelia","distance":164.28730534107416,"sectionId":"19955-19695","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5824016378533508,44.8046561473278],[-0.5829089660054215,44.80374908018679],[-0.582903258633229,44.80370611090439],[-0.5823466062177725,44.80347330833263]]}},{"type":"Feature","properties":{"name":"Rue Frédéric Sevene","distance":92.39003763058274,"sectionId":"19955-19696","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5824016378533508,44.8046561473278],[-0.58174436688198,44.80442101575134],[-0.5813624680708289,44.80427602942861]]}},{"type":"Feature","properties":{"name":"Rue Frédéric Sevene","distance":21.52273066632323,"sectionId":"19955-as=126423","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5826322515009865,44.80474190899295],[-0.5824016378533508,44.8046561473278]]}},{"type":"Feature","properties":{"name":"Avenue de Brivazac","distance":305.5670167354741,"sectionId":"16182-16183","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6182176013896765,44.80773911700815],[-0.6172808617504135,44.80516892842583],[-0.617199029463869,44.805092888259615]]}},{"type":"Feature","properties":{"name":"Avenue de Candau","distance":96.16146476277353,"sectionId":"16182-16021","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6182176013896765,44.80773911700815],[-0.6180447855913631,44.80774380343511],[-0.6178696202248375,44.807755410659645],[-0.6177372086172762,44.807766738795095],[-0.6176193463973825,44.807780036280654],[-0.6174045816680589,44.80780992796342],[-0.6171814706695877,44.8078499938077],[-0.6170217073769195,44.807881198466156]]}},{"type":"Feature","properties":{"name":"Avenue de Candau","distance":37.302716990741175,"sectionId":"16182-as=4723","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6182176013896765,44.80773911700815],[-0.6182176013896765,44.80773911700815]]}},{"type":"Feature","properties":{"name":"Avenue des Echoppes","distance":272.8165227219093,"sectionId":"16021-16291","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6160451960339756,44.80552540298936],[-0.6170217073769195,44.807881198466156]]}},{"type":"Feature","properties":{"name":"Avenue de Candau","distance":96.16146476277353,"sectionId":"16021-16182","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6182176013896765,44.80773911700815],[-0.6180447855913631,44.80774380343511],[-0.6178696202248375,44.807755410659645],[-0.6177372086172762,44.807766738795095],[-0.6176193463973825,44.807780036280654],[-0.6174045816680589,44.80780992796342],[-0.6171814706695877,44.8078499938077],[-0.6170217073769195,44.807881198466156]]}},{"type":"Feature","properties":{"name":"Avenue de Candau","distance":84.20559208615786,"sectionId":"16021-16226","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6170217073769195,44.807881198466156],[-0.615993843363658,44.808079542423435]]}},{"type":"Feature","properties":{"name":"Rue du Bas-Brion","distance":161.1626786524148,"sectionId":"16021-16020","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6170217073769195,44.807881198466156],[-0.6170590958455054,44.807989010215174],[-0.6173561572583983,44.808381244432795],[-0.6176221330863448,44.808862838302616],[-0.6177472367798235,44.8092290114272]]}},{"type":"Feature","properties":{"name":"Avenue de Candau","distance":188.60194061186672,"sectionId":"16016-31584","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6081571627327063,44.80861901020956],[-0.6079841940339353,44.80861927204642],[-0.6075546169061771,44.80865830059767],[-0.6068208514468201,44.808679498308685],[-0.6061346070944351,44.80882313845703],[-0.6058105533287731,44.80886602147036]]}},{"type":"Feature","properties":{"name":"Rue de Peybouquey","distance":65.37169558099694,"sectionId":"16016-17119","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6081571627327063,44.80861901020956],[-0.6082347158446524,44.80920497076243]]}},{"type":"Feature","properties":{"name":"Allée du Baron Sarget","distance":73.38275921964834,"sectionId":"16016-16017","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6081571627327063,44.80861901020956],[-0.608112945028603,44.808422050582635],[-0.6081246474862915,44.808226920418235],[-0.6081205669977053,44.80817588284182],[-0.6080748822995544,44.807963565585]]}},{"type":"Feature","properties":{"name":"Avenue de Candau","distance":"Unknown","sectionId":"16016-as=125337","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.60836880541367,44.808585631956106],[-0.6081571627327063,44.80861901020956]]}},{"type":"Feature","properties":{"name":"Avenue Pierre Wiehn","distance":9.648371741937538,"sectionId":"15929-24283","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6308623117393518,44.79828166195963],[-0.6308293046047101,44.7983019937443],[-0.6308179239110738,44.798328211198736],[-0.6308126080649018,44.79835630695447]]}},{"type":"Feature","properties":{"name":"Avenue Pierre Wiehn","distance":121.71992100274726,"sectionId":"15929-17421","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6308126080649018,44.79835630695447],[-0.6308370291801229,44.798442728590366],[-0.6309016010460454,44.79909233469294],[-0.6309348584462041,44.79934918338002],[-0.63095750505447,44.79939737595474],[-0.6310068594694284,44.79942967178872]]}},{"type":"Feature","properties":{"name":"Avenue Aristide Briand","distance":397.74237620293707,"sectionId":"15929-15930","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6308126080649018,44.79835630695447],[-0.6271881635251993,44.798497818255925],[-0.6271351822596878,44.79853653249432],[-0.6270247250366625,44.79947566576465]]}},{"type":"Feature","properties":{"name":"Avenue Raymond Poincaré","distance":312.9066506720715,"sectionId":"15930-17298","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6309711873600478,44.79967890203219],[-0.6270247250366625,44.79947566576465]]}},{"type":"Feature","properties":{"name":"Avenue Raymond Poincaré","distance":139.70081354493462,"sectionId":"15930-24276","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6270247250366625,44.79947566576465],[-0.6254249678062518,44.79940560197039],[-0.6253323561851043,44.79940567155491],[-0.6252628069394983,44.79941635645798]]}},{"type":"Feature","properties":{"name":"Avenue Aristide Briand","distance":397.74237620293707,"sectionId":"15930-15929","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6308126080649018,44.79835630695447],[-0.6271881635251993,44.798497818255925],[-0.6271351822596878,44.79853653249432],[-0.6270247250366625,44.79947566576465]]}},{"type":"Feature","properties":{"name":"Avenue de l'Armistice","distance":84.77909728852619,"sectionId":"15938-15939","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6232012006720995,44.8003703697135],[-0.6230746515274989,44.80038007653527],[-0.6221299012503636,44.80037440640367]]}},{"type":"Feature","properties":{"name":"Avenue Pierre Corneille","distance":132.0022350083232,"sectionId":"15938-16489","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6235468187345438,44.80153305782432],[-0.6232012006720995,44.8003703697135]]}},{"type":"Feature","properties":{"name":"Avenue Pierre Corneille","distance":221.75083542600248,"sectionId":"15938-16346","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6232012006720995,44.8003703697135],[-0.6224215481183756,44.79934951528238],[-0.6223351685152967,44.7992937122823],[-0.6213004097149313,44.79914595828795]]}},{"type":"Feature","properties":{"name":"Avenue de l'Armistice","distance":54.62908165645241,"sectionId":"15938-as=3800","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.623721398906139,44.80020115921167],[-0.6232012006720995,44.8003703697135]]}},{"type":"Feature","properties":{"name":"Avenue de l'Armistice","distance":84.77909728852619,"sectionId":"15939-15938","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6232012006720995,44.8003703697135],[-0.6230746515274989,44.80038007653527],[-0.6221299012503636,44.80037440640367]]}},{"type":"Feature","properties":{"name":"Avenue de l'Armistice","distance":64.06603607451225,"sectionId":"15939-15940","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6221299012503636,44.80037440640367],[-0.621319849440657,44.80036588083269]]}},{"type":"Feature","properties":{"name":"Avenue de la Source","distance":127.66600414386548,"sectionId":"15939-16490","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6221211395213243,44.801523791125014],[-0.6221299012503636,44.80037440640367]]}},{"type":"Feature","properties":{"name":"Place de la Rotonde","distance":28.463255794478805,"sectionId":"15940-16344","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6210805999159307,44.80051916368715],[-0.6211161620229523,44.80051929257274],[-0.6211515793432013,44.80051510204961],[-0.6211856060690247,44.80050690203565],[-0.6212173695687816,44.80049490048195],[-0.6212460028625871,44.80047939524836],[-0.6212707821850113,44.800460949882556],[-0.6212910874606636,44.800439764297394],[-0.6213063381484791,44.80041666773398],[-0.6213161780207516,44.80039203187052],[-0.621319849440657,44.80036588083269]]}},{"type":"Feature","properties":{"name":"Avenue de l'Armistice","distance":64.06603607451225,"sectionId":"15940-15939","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6221299012503636,44.80037440640367],[-0.621319849440657,44.80036588083269]]}},{"type":"Feature","properties":{"name":"Place de la Rotonde","distance":25.83447993838288,"sectionId":"15940-16345","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.621319849440657,44.80036588083269],[-0.6213186695944687,44.800341055352014],[-0.6213114060205586,44.800316063253675],[-0.6212985166110381,44.80029215112416],[-0.6212804253703502,44.8002700261308],[-0.6212575506546714,44.80025030553417],[-0.6212305520699511,44.80023341874604],[-0.6212000948648919,44.80021988508263],[-0.6211669536217501,44.80020995012894],[-0.6211277020072631,44.80020345272752]]}},{"type":"Feature","properties":{"name":"Avenue de Chiquet","distance":112.9101494377724,"sectionId":"16389-16223","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6236435928320284,44.806901298311644],[-0.6226363449300576,44.80618073546984]]}},{"type":"Feature","properties":{"name":"Allée des Roses du Haut-Brion","distance":119.50022669089049,"sectionId":"16389-17520","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6226363449300576,44.80618073546984],[-0.6219867823531581,44.806820565912034],[-0.6219414548120491,44.80699334807181],[-0.6219974203338794,44.807096603254664]]}},{"type":"Feature","properties":{"name":"Avenue de Chiquet","distance":17.712598543394254,"sectionId":"16389-16390","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6226363449300576,44.80618073546984],[-0.6225543114140023,44.806113713653644],[-0.6225024468729391,44.80605356820456]]}},{"type":"Feature","properties":{"name":"Place de la Cinquième République","distance":77.12861246331981,"sectionId":"16309-16405","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6307163518160297,44.8053924150303],[-0.6309416133724075,44.80606804888352]]}},{"type":"Feature","properties":{"name":"Rue du Chanoine Dufraisse","distance":75.1769054187043,"sectionId":"16309-15809","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6307163518160297,44.8053924150303],[-0.6300931266018449,44.80559094399586],[-0.6298412361821026,44.80565600613529]]}},{"type":"Feature","properties":{"name":"Place de la Cinquième République","distance":28.60681224036727,"sectionId":"16309-34733","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6307163518160297,44.8053924150303],[-0.6307088981800342,44.80529617307907],[-0.6306521263403831,44.80514015827631]]}},{"type":"Feature","properties":{"name":"Place de la Cinquième République","distance":77.12861246331981,"sectionId":"16405-16309","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6307163518160297,44.8053924150303],[-0.6309416133724075,44.80606804888352]]}},{"type":"Feature","properties":{"name":"Rue du Colonel Picot","distance":143.1142699469469,"sectionId":"16424-16425","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6124134883332674,44.8052897517341],[-0.614133694372727,44.80488918499556]]}},{"type":"Feature","properties":{"name":"Avenue Fanning Lafontaine","distance":101.35234787484588,"sectionId":"16424-16607","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6124134883332674,44.8052897517341],[-0.6120315589483181,44.804418707609955]]}},{"type":"Feature","properties":{"name":"Avenue Fanning Lafontaine","distance":30.401300092346553,"sectionId":"16424-16606","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6125250585888145,44.8055516828129],[-0.6124134883332674,44.8052897517341]]}},{"type":"Feature","properties":{"name":"Rue du Colonel Picot","distance":143.1142699469469,"sectionId":"16425-16424","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6124134883332674,44.8052897517341],[-0.614133694372727,44.80488918499556]]}},{"type":"Feature","properties":{"name":"Avenue Phenix Haut-Brion","distance":101.77018548342245,"sectionId":"16425-16926","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6137206908151805,44.804021385254835],[-0.614133694372727,44.80488918499556]]}},{"type":"Feature","properties":{"name":"Avenue Phenix Haut-Brion","distance":97.1741193072366,"sectionId":"16425-17285","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.614133694372727,44.80488918499556],[-0.6145145899145501,44.80572097974112]]}},{"type":"Feature","properties":{"name":"Impasse du Colonel René Fonck","distance":35.14298769661052,"sectionId":"16427-16426","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6303966248624713,44.809837360339436],[-0.6303509051251266,44.809661984916325],[-0.630309504474032,44.80962952480249],[-0.6301869250232973,44.809594070291]]}},{"type":"Feature","properties":{"name":"Impasse du Colonel René Fonck","distance":32.43746354000328,"sectionId":"16427-23488","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6300299939272938,44.80975663521422],[-0.6300665539802885,44.80979060116377],[-0.6301670803130618,44.80983756968866],[-0.6302326330233528,44.809841603305614],[-0.6303966248624713,44.809837360339436]]}},{"type":"Feature","properties":{"name":"Impasse du Colonel René Fonck","distance":50.7617195876681,"sectionId":"16427-23489","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6310324710411841,44.80977418478704],[-0.6303966248624713,44.809837360339436]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":9.441953539718094,"sectionId":"23170-20137","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.591273267525887,44.81043447493098],[-0.5912467317430934,44.81042900696891],[-0.5912083993093299,44.810427154382694],[-0.5911704477705335,44.81043141532778],[-0.5911565152469914,44.810435278298364]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":6.9384110597453885,"sectionId":"23170-23169","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5913453901569167,44.81046886122681],[-0.591317031740075,44.81045038894703],[-0.5912835394086535,44.81043685308885],[-0.591273267525887,44.81043447493098]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":7.369678143463108,"sectionId":"24225-29050","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5911550088205666,44.81066296284028],[-0.5911852801766597,44.81066948395665],[-0.5912236127698668,44.81067133655116],[-0.5912464814650292,44.810668722841385]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":212.3790640873105,"sectionId":"24225-30129","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5911550088205666,44.81066296284028],[-0.5911565033885516,44.81075804214991],[-0.5911321498354094,44.81101509401335],[-0.5910434441448559,44.811405156485975],[-0.5909977016778092,44.81150578068215],[-0.5909497422039967,44.81160332197381],[-0.590722824530259,44.812456263784824],[-0.5906903391271844,44.81254016451701]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":11.253052213409786,"sectionId":"24225-24224","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5910571820878934,44.810593805537806],[-0.591064842376468,44.810607075991314],[-0.5910866215297996,44.8106296295616],[-0.5911149799611192,44.810648101897804],[-0.5911484667740644,44.81066154790002],[-0.5911550088205666,44.81066296284028]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":212.3790640873105,"sectionId":"30129-24225","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5911550088205666,44.81066296284028],[-0.5911565033885516,44.81075804214991],[-0.5911321498354094,44.81101509401335],[-0.5910434441448559,44.811405156485975],[-0.5909977016778092,44.81150578068215],[-0.5909497422039967,44.81160332197381],[-0.590722824530259,44.812456263784824],[-0.5906903391271844,44.81254016451701]]}},{"type":"Feature","properties":{"name":"Cours Gambetta","distance":11.921017637102194,"sectionId":"30129-19873","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5906903391271844,44.81254016451701],[-0.590662354809472,44.81255005603101],[-0.5906305746531598,44.812568084639544],[-0.5906046318310939,44.812590433078],[-0.590587153787817,44.81261458620894]]}},{"type":"Feature","properties":{"name":"Cours Gambetta","distance":8.909603367247186,"sectionId":"30129-30132","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5908003747528613,44.81253101600426],[-0.5907787072792661,44.812528547097024],[-0.5907381641463062,44.81252982687515],[-0.5906987540808859,44.81253710635883],[-0.5906903391271844,44.81254016451701]]}},{"type":"Feature","properties":{"name":"Cours Gambetta","distance":16.29751644388974,"sectionId":"19873-26434","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.590587153787817,44.81261458620894],[-0.5905859859703673,44.812616154461374],[-0.590575069480945,44.81264406408083],[-0.5905726936862072,44.81267296526501],[-0.5905786538849247,44.812701603330616],[-0.5905929979854905,44.812728715618526],[-0.590615027273328,44.81275324319808]]}},{"type":"Feature","properties":{"name":"Cours Gambetta","distance":11.921017637102194,"sectionId":"19873-30129","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5906903391271844,44.81254016451701],[-0.590662354809472,44.81255005603101],[-0.5906305746531598,44.812568084639544],[-0.5906046318310939,44.812590433078],[-0.590587153787817,44.81261458620894]]}},{"type":"Feature","properties":{"name":"Avenue Maréchal de Lattre de Tassigny","distance":98.32039208555712,"sectionId":"19873-30058","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.590587153787817,44.81261458620894],[-0.5905358480089682,44.812607647851706],[-0.5904893317149522,44.8125922707685],[-0.5893594529373799,44.81248406737403]]}},{"type":"Feature","properties":{"name":"Avenue du Lycée","distance":70.65291936758318,"sectionId":"19781-20144","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5934361361385686,44.80267325106588],[-0.5941101284050473,44.803090834537365]]}},{"type":"Feature","properties":{"name":"Avenue du Lycée","distance":73.34260047161413,"sectionId":"19781-19587","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5941101284050473,44.803090834537365],[-0.594810758112071,44.80352351693588]]}},{"type":"Feature","properties":{"name":"Avenue du Château","distance":209.94882477705596,"sectionId":"19781-19729","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5941101284050473,44.803090834537365],[-0.5958868153279412,44.801686235444606]]}},{"type":"Feature","properties":{"name":"Avenue du Lycée","distance":73.34260047161413,"sectionId":"19587-19781","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5941101284050473,44.803090834537365],[-0.594810758112071,44.80352351693588]]}},{"type":"Feature","properties":{"name":"Rue Alfred Charlionnet","distance":213.34049248778138,"sectionId":"19587-19588","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.594810758112071,44.80352351693588],[-0.5971281849445176,44.80254005614149]]}},{"type":"Feature","properties":{"name":"Rue Alfred Charlionnet","distance":187.33765532312296,"sectionId":"19587-19586","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5927545423625904,44.80435463593653],[-0.5928818422751819,44.80432836445688],[-0.5929500293409798,44.80430783372962],[-0.5930876841834949,44.80425484085722],[-0.594810758112071,44.80352351693588]]}},{"type":"Feature","properties":{"name":"Avenue du Lycée","distance":93.98384606426458,"sectionId":"19587-20033","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.594810758112071,44.80352351693588],[-0.595640292336261,44.80404274296636],[-0.5956951221808845,44.80408803249884]]}},{"type":"Feature","properties":{"name":"Avenue Brémontier","distance":332.7031008982868,"sectionId":"16165-16166","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6243970870013743,44.80008390397228],[-0.6286027052433694,44.800164557580324]]}},{"type":"Feature","properties":{"name":"Avenue Brémontier","distance":148.12859010669334,"sectionId":"16165-16004","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6286027052433694,44.800164557580324],[-0.6297496433576556,44.80021038452647],[-0.6297867719500068,44.800217307080665],[-0.6298109667242544,44.80023383098723],[-0.6298237272753545,44.80025162066945],[-0.6298294413672663,44.80027404936201],[-0.6297793136039866,44.800651479411094],[-0.6297668851998197,44.80069322459682]]}},{"type":"Feature","properties":{"name":"Rue de Chenevière","distance":50.27994616459696,"sectionId":"16165-16005","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6285498687749147,44.80061567178153],[-0.6286027052433694,44.800164557580324]]}},{"type":"Feature","properties":{"name":"Avenue Brémontier","distance":148.12859010669334,"sectionId":"16004-16165","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6286027052433694,44.800164557580324],[-0.6297496433576556,44.80021038452647],[-0.6297867719500068,44.800217307080665],[-0.6298109667242544,44.80023383098723],[-0.6298237272753545,44.80025162066945],[-0.6298294413672663,44.80027404936201],[-0.6297793136039866,44.800651479411094],[-0.6297668851998197,44.80069322459682]]}},{"type":"Feature","properties":{"name":"Avenue des Charmilles","distance":152.47507343966606,"sectionId":"16004-16340","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6297668851998197,44.80069322459682],[-0.6296945247448813,44.80117775324009],[-0.6296479257059912,44.80120932846217],[-0.628473035099161,44.801135835085994]]}},{"type":"Feature","properties":{"name":"Avenue Azam","distance":110.73508136917181,"sectionId":"16004-16003","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6311618754544944,44.800779946141475],[-0.6297668851998197,44.80069322459682]]}},{"type":"Feature","properties":{"name":"Avenue Azam","distance":96.62610137949541,"sectionId":"16004-16005","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6297668851998197,44.80069322459682],[-0.6285498687749147,44.80061567178153]]}},{"type":"Feature","properties":{"name":"Rue de Chenevière","distance":83.24429084600834,"sectionId":"16384-16340","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6283827483430332,44.801882537913045],[-0.628473035099161,44.801135835085994]]}},{"type":"Feature","properties":{"name":"Rue de Chenevière","distance":65.04837749224372,"sectionId":"16384-15842","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6283159846498326,44.80246624911388],[-0.6283827483430332,44.801882537913045]]}},{"type":"Feature","properties":{"name":"Avenue des Lacs","distance":123.61702796181545,"sectionId":"16384-16252","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6268196929754306,44.80186600150498],[-0.6283827483430332,44.801882537913045]]}},{"type":"Feature","properties":{"name":"Rue Razon","distance":233.60264035323357,"sectionId":"16384-17230","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6313345077378727,44.801901565174525],[-0.6294073278673378,44.80192776872536],[-0.6283827483430332,44.801882537913045]]}},{"type":"Feature","properties":{"name":"Avenue des Charmilles","distance":152.47507343966606,"sectionId":"16340-16004","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6297668851998197,44.80069322459682],[-0.6296945247448813,44.80117775324009],[-0.6296479257059912,44.80120932846217],[-0.628473035099161,44.801135835085994]]}},{"type":"Feature","properties":{"name":"Rue de Chenevière","distance":83.24429084600834,"sectionId":"16340-16384","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6283827483430332,44.801882537913045],[-0.628473035099161,44.801135835085994]]}},{"type":"Feature","properties":{"name":"Rue de Chenevière","distance":58.09403963222864,"sectionId":"16340-16005","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.628473035099161,44.801135835085994],[-0.6285498687749147,44.80061567178153]]}},{"type":"Feature","properties":{"name":"Avenue des Charmilles","distance":139.7925755067286,"sectionId":"16340-16253","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.628473035099161,44.801135835085994],[-0.6267055904211111,44.801112215789686]]}},{"type":"Feature","properties":{"name":"Avenue Bitaly","distance":114.32232707573853,"sectionId":"16091-16092","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6321758318754092,44.79734121927321],[-0.630737406271222,44.797443454373465]]}},{"type":"Feature","properties":{"name":"Avenue Bougnard","distance":29.878268162370116,"sectionId":"16091-16090","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6321897311485453,44.79761003666069],[-0.6321758318754092,44.79734121927321]]}},{"type":"Feature","properties":{"name":"Avenue Bougnard","distance":17.498671611925715,"sectionId":"16091-16133","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6321758318754092,44.79734121927321],[-0.6321856700625847,44.797264423666846],[-0.6322105865270966,44.79718597537696]]}},{"type":"Feature","properties":{"name":"Avenue Bougnard","distance":17.498671611925715,"sectionId":"16133-16091","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6321758318754092,44.79734121927321],[-0.6321856700625847,44.797264423666846],[-0.6322105865270966,44.79718597537696]]}},{"type":"Feature","properties":{"name":"Rue Ernest Renan","distance":204.30024517962903,"sectionId":"16133-19616","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6322105865270966,44.79718597537696],[-0.6344272758899904,44.797052365539315],[-0.6347527507738805,44.79694503264647]]}},{"type":"Feature","properties":{"name":"Avenue Bougnard","distance":138.07569673176107,"sectionId":"16133-15931","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6322105865270966,44.79718597537696],[-0.6322505699848869,44.79705749959577],[-0.6327736574192151,44.79601022880757]]}},{"type":"Feature","properties":{"name":"Avenue Jean Jaurès","distance":109.41513673232136,"sectionId":"16260-16018","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6180778051564332,44.81154192413539],[-0.6193323930943462,44.811126185161505]]}},{"type":"Feature","properties":{"name":"Avenue Jean Jaurès","distance":50.546300747539654,"sectionId":"16260-16666","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6174973955855689,44.811732712827244],[-0.6180778051564332,44.81154192413539]]}},{"type":"Feature","properties":{"name":"Rue de Carles","distance":110.83360288201442,"sectionId":"16260-16261","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6180778051564332,44.81154192413539],[-0.6175045797927119,44.81063130724919]]}},{"type":"Feature","properties":{"name":"Avenue Jean Jaurès","distance":109.41513673232136,"sectionId":"16018-16260","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6180778051564332,44.81154192413539],[-0.6193323930943462,44.811126185161505]]}},{"type":"Feature","properties":{"name":"Avenue Jean Jaurès","distance":49.650179300890606,"sectionId":"16018-16555","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6193323930943462,44.811126185161505],[-0.6194675806402434,44.811102515753376],[-0.619752120584885,44.81097040770494],[-0.6198349122372658,44.81088219392614]]}},{"type":"Feature","properties":{"name":"Rue du Bas-Brion","distance":108.65142573083772,"sectionId":"16018-16019","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6193323930943462,44.811126185161505],[-0.6192838733498268,44.81108304764549],[-0.6184989583193068,44.81034843710847]]}},{"type":"Feature","properties":{"name":"Avenue Jean Jaurès","distance":50.802153622331815,"sectionId":"16555-16018","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6198349122372658,44.81088219392614],[-0.6197183112795247,44.810891489590595],[-0.6193681410392823,44.811054602582765],[-0.6193323930943462,44.811126185161505]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Nancel Pénard","distance":9.350711604620717,"sectionId":"16555-54610","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.619935245200211,44.810926762624696],[-0.6198349122372658,44.81088219392614]]}},{"type":"Feature","properties":{"name":"Avenue Jean Jaurès","distance":10.120170894261477,"sectionId":"16555-54611","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6198349122372658,44.81088219392614],[-0.6199400407258951,44.810830217920476]]}},{"type":"Feature","properties":{"name":"Rue Auguste Renoir","distance":35.80042559648845,"sectionId":"15981-15982","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6060638161924718,44.79663106410612],[-0.6060509589422991,44.796716780202075],[-0.6060755109616408,44.79676140340056],[-0.6062731049713567,44.796886388278814]]}},{"type":"Feature","properties":{"name":"Rue Auguste Renoir","distance":27.50777331129066,"sectionId":"15981-15977","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6061403033668107,44.796389468898305],[-0.6060638161924718,44.79663106410612]]}},{"type":"Feature","properties":{"name":"Rue Auguste Renoir","distance":14.190630511192367,"sectionId":"15981-15978","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6060638161924718,44.79663106410612],[-0.6059079132524073,44.79656781491607]]}},{"type":"Feature","properties":{"name":"Rue Auguste Renoir","distance":35.80042559648845,"sectionId":"15982-15981","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6060638161924718,44.79663106410612],[-0.6060509589422991,44.796716780202075],[-0.6060755109616408,44.79676140340056],[-0.6062731049713567,44.796886388278814]]}},{"type":"Feature","properties":{"name":"Rue Vincent Van Gogh","distance":61.39809185215909,"sectionId":"15982-17642","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6062731049713567,44.796886388278814],[-0.6062384746510979,44.796935500567905],[-0.6060646683392302,44.79706947001512],[-0.6060515855655876,44.79710303532343],[-0.6062054888302197,44.797205083374266],[-0.6062420038829148,44.7972346436974],[-0.6062516361617374,44.79727334410128],[-0.6062007210507739,44.797310901675424]]}},{"type":"Feature","properties":{"name":"Rue Edgar Degas","distance":59.32593569894702,"sectionId":"15982-17643","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6062731049713567,44.796886388278814],[-0.6064614523655365,44.79674421021824],[-0.6065516739068227,44.7967383762709],[-0.6067464333318602,44.796872638699845],[-0.6066713039284501,44.79693366533655]]}},{"type":"Feature","properties":{"name":"Allée Ausone","distance":107.75691917727505,"sectionId":"15987-15986","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6169246743947955,44.80027864516549],[-0.6168689808707637,44.800250058303284],[-0.61676208790433,44.800224180649046],[-0.6166974923740572,44.800200921468296],[-0.6166373703695116,44.800170313330554],[-0.6165143987043628,44.80008981579835],[-0.6160350696250945,44.79971986121379],[-0.6159351826868764,44.79963016129116]]}},{"type":"Feature","properties":{"name":"Allée Ausone","distance":94.08681913081276,"sectionId":"15987-15989","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6159351826868764,44.79963016129116],[-0.6156499588352282,44.79908485727348],[-0.6155228591083164,44.798835583950826]]}},{"type":"Feature","properties":{"name":"Allée Paul Pascal","distance":209.6187008023678,"sectionId":"15987-17008","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6159351826868764,44.79963016129116],[-0.6148548850088098,44.7999222318196],[-0.6134612050310447,44.800307666080954]]}},{"type":"Feature","properties":{"name":"Avenue de Candau","distance":147.39882076256475,"sectionId":"28916-16224","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6226144229930793,44.807611869660086],[-0.6224730517517213,44.807657810509525],[-0.622329571596123,44.80769435957245],[-0.6221842790811792,44.80771213871639],[-0.6207757593926647,44.80773671572647]]}},{"type":"Feature","properties":{"name":"Rue Frédéric Dard","distance":113.66526321734865,"sectionId":"28916-28915","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6233650667962933,44.80716889130704],[-0.6231515378650831,44.80702912734922],[-0.6231264615499323,44.807020737608084],[-0.6229645715312013,44.80702003888148],[-0.6229354966902789,44.8070265501599],[-0.622907280715257,44.8070467267688],[-0.6227481715748605,44.807221151580805],[-0.6225726617115123,44.80748699272951],[-0.6225691755040994,44.80750602129511],[-0.6225737605166194,44.80752461263547],[-0.6226144229930793,44.807611869660086]]}},{"type":"Feature","properties":{"name":"Avenue de Candau","distance":75.91587750981778,"sectionId":"16224-16030","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6207757593926647,44.80773671572647],[-0.6198157907617171,44.80774853275552]]}},{"type":"Feature","properties":{"name":"Avenue de Candau","distance":147.39882076256475,"sectionId":"16224-28916","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6226144229930793,44.807611869660086],[-0.6224730517517213,44.807657810509525],[-0.622329571596123,44.80769435957245],[-0.6221842790811792,44.80771213871639],[-0.6207757593926647,44.80773671572647]]}},{"type":"Feature","properties":{"name":"Allée Georges Simenon","distance":69.60603756604718,"sectionId":"16224-29726","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6207757593926647,44.80773671572647],[-0.6208438246939155,44.80756726410974],[-0.6208753055605339,44.807510410245456],[-0.6211193583536668,44.80726995538044],[-0.6210701817858093,44.80721431798189],[-0.6210431820372987,44.807195449262856]]}},{"type":"Feature","properties":{"name":"Avenue du Château","distance":209.94882477705596,"sectionId":"19729-19781","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5941101284050473,44.803090834537365],[-0.5958868153279412,44.801686235444606]]}},{"type":"Feature","properties":{"name":"Avenue de Breuil","distance":136.49188960199973,"sectionId":"19729-19588","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5958868153279412,44.801686235444606],[-0.5971281849445176,44.80254005614149]]}},{"type":"Feature","properties":{"name":"Avenue de Breuil","distance":97.18652527801913,"sectionId":"19729-19728","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.595003061518976,44.80107819332798],[-0.5958868153279412,44.801686235444606]]}},{"type":"Feature","properties":{"name":"Avenue du Parc des Sports","distance":87.99523567294459,"sectionId":"17023-17229","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6309737197054233,44.80456056167586],[-0.6309691985118024,44.80450485396512],[-0.6307358512522636,44.8037873977151]]}},{"type":"Feature","properties":{"name":"Cours Lamartine","distance":92.13422333086193,"sectionId":"17023-16190","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6299514419578577,44.8049585728237],[-0.6309737197054233,44.80456056167586]]}},{"type":"Feature","properties":{"name":"Avenue du Parc des Sports","distance":87.99523567294459,"sectionId":"17229-17023","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6309737197054233,44.80456056167586],[-0.6309691985118024,44.80450485396512],[-0.6307358512522636,44.8037873977151]]}},{"type":"Feature","properties":{"name":"Boulevard Saint Martin","distance":88.70358947005236,"sectionId":"17229-16191","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6296198397404436,44.803868150264506],[-0.6307358512522636,44.8037873977151]]}},{"type":"Feature","properties":{"name":"Boulevard Saint Martin","distance":57.2918303465836,"sectionId":"17229-as=126249","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6307358512522636,44.8037873977151],[-0.6314561092610305,44.80373152224987],[-0.6314561092610305,44.80373152224987]]}},{"type":"Feature","properties":{"name":"Avenue de Candau","distance":268.5383370203862,"sectionId":"16228-16229","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6137095978648442,44.80830933152997],[-0.6114962642955332,44.80822504568887],[-0.6112784149081802,44.808223944986764],[-0.6110810559583879,44.80826309100258],[-0.6107818220617072,44.80833645919468],[-0.6105426687780775,44.80842152201208],[-0.6103927881971604,44.80848330192842]]}},{"type":"Feature","properties":{"name":"Avenue de Candau","distance":73.28731638063891,"sectionId":"16228-as=126208","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6137095978648442,44.80830933152997],[-0.6137095978648442,44.80830933152997]]}},{"type":"Feature","properties":{"name":"Avenue Fanning Lafontaine","distance":14.642688064771098,"sectionId":"16228-as=126238","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6137095978648442,44.80830933152997],[-0.6137000929088473,44.80821423555608],[-0.613684708854579,44.808179422634716]]}},{"type":"Feature","properties":{"name":"Avenue du Rond Point","distance":144.53866301540458,"sectionId":"16605-17285","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6145145899145501,44.80572097974112],[-0.6127699290240495,44.80610926622104]]}},{"type":"Feature","properties":{"name":"Avenue Fanning Lafontaine","distance":64.88786460678034,"sectionId":"16605-16606","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6127699290240495,44.80610926622104],[-0.6125250585888145,44.8055516828129]]}},{"type":"Feature","properties":{"name":"Avenue Fanning Lafontaine","distance":4.053538230475189,"sectionId":"16605-as=126238","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.613684708854579,44.808179422634716],[-0.6127699290240495,44.80610926622104]]}},{"type":"Feature","properties":{"name":"Esplanade des Antilles","distance":166.38834338794933,"sectionId":"15879-15878","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6143089022443278,44.795925838115174],[-0.6162816263743869,44.79540521177599]]}},{"type":"Feature","properties":{"name":"Avenue Jean Babin","distance":31.07118194722969,"sectionId":"15879-15990","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6143089022443278,44.795925838115174],[-0.6141607998750656,44.79618494001125]]}},{"type":"Feature","properties":{"name":"Avenue Jean Babin","distance":24.48044129490206,"sectionId":"15879-15887","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6144286227959143,44.79572258881573],[-0.6143089022443278,44.795925838115174]]}},{"type":"Feature","properties":{"name":"Avenue Roger Cohé","distance":26.12007949530618,"sectionId":"31144-16608","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6322953326742453,44.807865072908555],[-0.6323687254836189,44.80800560234595],[-0.6323905696131303,44.80805102775719],[-0.6324014687974893,44.808087433957105]]}},{"type":"Feature","properties":{"name":"Avenue Roger Cohé","distance":33.104574154062476,"sectionId":"31144-17129","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6321402210686764,44.8075884236563],[-0.6321842848015413,44.807655120050576],[-0.6322250455002194,44.80773165097806],[-0.6322953326742453,44.807865072908555]]}},{"type":"Feature","properties":{"name":"Rue Jean Monnet","distance":92.13778080806037,"sectionId":"31144-31145","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6311664048647538,44.8079710236816],[-0.6312183966845824,44.80798882200619],[-0.6312693929276687,44.80800286856623],[-0.6313261832264202,44.80801447802858],[-0.631400662567728,44.80801561348974],[-0.6322953326742453,44.807865072908555]]}},{"type":"Feature","properties":{"name":"Cours Lamartine","distance":59.88677096893184,"sectionId":"16190-15831","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6292569572675963,44.805162794691796],[-0.6294068853773797,44.80514440789779],[-0.6295324341583451,44.80511463755945],[-0.6299514419578577,44.8049585728237]]}},{"type":"Feature","properties":{"name":"Cours Lamartine","distance":92.13422333086193,"sectionId":"16190-17023","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6299514419578577,44.8049585728237],[-0.6309737197054233,44.80456056167586]]}},{"type":"Feature","properties":{"name":"Rue Byron","distance":123.92089171967304,"sectionId":"16190-16191","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6299514419578577,44.8049585728237],[-0.6296198397404436,44.803868150264506]]}},{"type":"Feature","properties":{"name":"Avenue du Poujeau","distance":103.74220452629243,"sectionId":"16268-16671","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6281220146836525,44.80859624319518],[-0.6279863039801784,44.80854913404517],[-0.627804781448351,44.80844367027255],[-0.6270343374935502,44.80807700681343]]}},{"type":"Feature","properties":{"name":"Rue Causserouge","distance":101.66984948552138,"sectionId":"16268-16269","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6282005990874134,44.807691547607696],[-0.6270343374935502,44.80807700681343]]}},{"type":"Feature","properties":{"name":"Avenue du Poujeau","distance":61.481581297743915,"sectionId":"16268-as=125356","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6270343374935502,44.80807700681343],[-0.6263950892679818,44.807761871107175]]}},{"type":"Feature","properties":{"name":"Avenue Jean Jaurès","distance":14.803451962816148,"sectionId":"16953-16952","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6261384776787635,44.80778442185393],[-0.6262970044470864,44.80771351675207]]}},{"type":"Feature","properties":{"name":"Avenue Jean Jaurès","distance":168.82569129498253,"sectionId":"16953-15823","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6262970044470864,44.80771351675207],[-0.627816776758649,44.806980587079366],[-0.628077623263275,44.80687588042583]]}},{"type":"Feature","properties":{"name":"Avenue du Poujeau","distance":61.481581297743915,"sectionId":"16953-as=125356","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6263950892679818,44.807761871107175],[-0.6262970044470864,44.80771351675207]]}},{"type":"Feature","properties":{"name":"Avenue du Poujeau","distance":103.74220452629243,"sectionId":"16671-16268","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6281220146836525,44.80859624319518],[-0.6279863039801784,44.80854913404517],[-0.627804781448351,44.80844367027255],[-0.6270343374935502,44.80807700681343]]}},{"type":"Feature","properties":{"name":"Avenue François Coppée","distance":51.518570834476904,"sectionId":"16671-16672","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6281220146836525,44.80859624319518],[-0.6282293320247212,44.80850588921426],[-0.6286706524024379,44.80836209049072]]}},{"type":"Feature","properties":{"name":"Avenue du Poujeau","distance":59.295558081842785,"sectionId":"16671-23492","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6287238129443788,44.80891305861358],[-0.6286311977843426,44.808848990854706],[-0.6282559941049614,44.80866007291163],[-0.6281220146836525,44.80859624319518]]}},{"type":"Feature","properties":{"name":"Rue de l'Amiral Prouhet","distance":207.29058228833208,"sectionId":"15841-22264","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6270386649190198,44.803331257509726],[-0.6287231002914556,44.8030738482182],[-0.6287819529086899,44.80305323288457],[-0.628816560716313,44.803021984712565],[-0.6288258310307495,44.802995710832896],[-0.6288534679758239,44.80246991038936]]}},{"type":"Feature","properties":{"name":"Avenue du Cardinal","distance":74.11040159835807,"sectionId":"15841-16251","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6271324783500616,44.803995137202875],[-0.6270386649190198,44.803331257509726]]}},{"type":"Feature","properties":{"name":"Avenue du Cardinal","distance":95.2018574424749,"sectionId":"15841-15843","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6270386649190198,44.803331257509726],[-0.6270127358337537,44.80327993744292],[-0.6269061112833607,44.802572156871925],[-0.6269081382588043,44.80248142592167]]}},{"type":"Feature","properties":{"name":"Avenue du Cardinal","distance":95.2018574424749,"sectionId":"15843-15841","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6270386649190198,44.803331257509726],[-0.6270127358337537,44.80327993744292],[-0.6269061112833607,44.802572156871925],[-0.6269081382588043,44.80248142592167]]}},{"type":"Feature","properties":{"name":"Rue de l'Amiral Prouhet","distance":111.34133191188806,"sectionId":"15843-15842","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6283159846498326,44.80246624911388],[-0.6269081382588043,44.80248142592167]]}},{"type":"Feature","properties":{"name":"Avenue du Cardinal","distance":68.79016653528711,"sectionId":"15843-16252","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6269081382588043,44.80248142592167],[-0.626912201111341,44.802431328490826],[-0.6268196929754306,44.80186600150498]]}},{"type":"Feature","properties":{"name":"Avenue Denis Diderot","distance":79.455096536405,"sectionId":"31837-15955","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6195687979613381,44.7969955702812],[-0.619632270141256,44.79706949042175],[-0.62000703560565,44.79721079353747],[-0.6204169498377229,44.79735773276919]]}},{"type":"Feature","properties":{"name":"Avenue Denis Diderot","distance":79.455096536405,"sectionId":"15955-31837","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6195687979613381,44.7969955702812],[-0.619632270141256,44.79706949042175],[-0.62000703560565,44.79721079353747],[-0.6204169498377229,44.79735773276919]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":4.47481640967712,"sectionId":"15955-16503","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6204684765805153,44.7973743793357],[-0.6204169498377229,44.79735773276919]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":82.52406198147352,"sectionId":"15955-as=126515","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6204169498377229,44.79735773276919],[-0.6199205615843131,44.79770954571217],[-0.6198341319574392,44.79778787682651],[-0.6197786949287285,44.797860086636454],[-0.6197420186573377,44.79791674542534]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":29.423142854320123,"sectionId":"15955-as=4633","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6206846693570309,44.79717406062051],[-0.6204169498377229,44.79735773276919]]}},{"type":"Feature","properties":{"name":"Allée de la Boétie","distance":97.6365141675942,"sectionId":"17008-17010","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6134612050310447,44.800307666080954],[-0.6131061225000746,44.799654764639726],[-0.6130188090616121,44.79948701121046]]}},{"type":"Feature","properties":{"name":"Allée Paul Pascal","distance":209.6187008023678,"sectionId":"17008-15987","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6159351826868764,44.79963016129116],[-0.6148548850088098,44.7999222318196],[-0.6134612050310447,44.800307666080954]]}},{"type":"Feature","properties":{"name":"Allée de la Boétie","distance":170.073447997066,"sectionId":"17008-17007","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6124529785310876,44.80122124830705],[-0.6136317936961506,44.80089355155994],[-0.6136891609441237,44.80084389463964],[-0.6136993430699275,44.8007842964138],[-0.6134612050310447,44.800307666080954]]}},{"type":"Feature","properties":{"name":"Avenue Raymond Boivin","distance":119.7666555954162,"sectionId":"16342-16751","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6207756796871756,44.802417021304976],[-0.6192614171451878,44.802438103692516]]}},{"type":"Feature","properties":{"name":"Avenue des Chasseurs","distance":100.90526481201479,"sectionId":"16342-16343","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6207756796871756,44.802417021304976],[-0.6209176256124728,44.80151418988168]]}},{"type":"Feature","properties":{"name":"Avenue Raymond Boivin","distance":238.172381560311,"sectionId":"16342-17288","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6237854723855056,44.80244520763538],[-0.6223787240079985,44.8023952530901],[-0.6218535242761636,44.802397746195254],[-0.6207756796871756,44.802417021304976]]}},{"type":"Feature","properties":{"name":"Avenue Pey Berland","distance":31.531131598021904,"sectionId":"17282-22908","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6092841275076156,44.80081351866447],[-0.6090653389529017,44.80083334365167],[-0.6089749828407462,44.80082702247377],[-0.6088896288733325,44.80081369619789]]}},{"type":"Feature","properties":{"name":"Avenue Pey Berland","distance":31.836771164726617,"sectionId":"17282-17749","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6095588933797128,44.80069147420939],[-0.6095433744470546,44.800686111356214],[-0.6095169419858123,44.80067821221731],[-0.6094891856112683,44.80067341790884],[-0.6094606216789674,44.80067189220863],[-0.6094320078361272,44.800673611069556],[-0.609404228006376,44.80067854643998],[-0.6093780398362934,44.80068667427534],[-0.6093537996328163,44.800697622936454],[-0.6093325063404421,44.80071118055606],[-0.6093145218999927,44.800727065401425],[-0.6093003176402956,44.80074472201834],[-0.6092902498764418,44.800763778769024],[-0.6092846692958378,44.800783774111395],[-0.6092835421296164,44.80080416861948],[-0.6092841275076156,44.80081351866447]]}},{"type":"Feature","properties":{"name":"Avenue Pey Berland","distance":13.475689530438705,"sectionId":"17282-17750","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6092841275076156,44.80081351866447],[-0.6092872134389681,44.800824410846154],[-0.6092952706295212,44.80084397338659],[-0.6093076799333551,44.80086231681581],[-0.6093240400121736,44.80087909353607],[-0.6093439326374661,44.80089368623924],[-0.6093668414517708,44.80090593114398],[-0.6093768517601454,44.800910207684005]]}},{"type":"Feature","properties":{"name":"Avenue Pey Berland","distance":31.531131598021904,"sectionId":"22908-17282","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6092841275076156,44.80081351866447],[-0.6090653389529017,44.80083334365167],[-0.6089749828407462,44.80082702247377],[-0.6088896288733325,44.80081369619789]]}},{"type":"Feature","properties":{"name":"Avenue Pey Berland","distance":186.68113909349134,"sectionId":"22908-17283","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6088896288733325,44.80081369619789],[-0.6085799584066818,44.800788479981314],[-0.6080043730763947,44.80067702210039],[-0.6074385571916169,44.80050327451889],[-0.6067595134788911,44.80015574212107]]}},{"type":"Feature","properties":{"name":"Avenue Phenix Haut-Brion","distance":101.77018548342245,"sectionId":"16926-16425","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6137206908151805,44.804021385254835],[-0.614133694372727,44.80488918499556]]}},{"type":"Feature","properties":{"name":"Rue Jean Charcot","distance":140.66944780143913,"sectionId":"16926-16607","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6120315589483181,44.804418707609955],[-0.6137206908151805,44.804021385254835]]}},{"type":"Feature","properties":{"name":"Avenue Phenix Haut-Brion","distance":135.34790903844672,"sectionId":"16926-16512","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6132006267363936,44.80286043204193],[-0.6137206908151805,44.804021385254835]]}},{"type":"Feature","properties":{"name":"Esplanade des Antilles","distance":102.09282088760797,"sectionId":"15883-15884","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6183588167645683,44.79466389064747],[-0.6195693809825837,44.79434475553062]]}},{"type":"Feature","properties":{"name":"Esplanade des Antilles","distance":19.467221819665728,"sectionId":"15883-15875","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6195693809825837,44.79434475553062],[-0.6196800405722029,44.7945013115898]]}},{"type":"Feature","properties":{"name":"Esplanade des Antilles","distance":155.28047351841127,"sectionId":"15883-15882","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6195693809825837,44.79434475553062],[-0.6214063507691692,44.793851257111]]}},{"type":"Feature","properties":{"name":"Esplanade des Antilles","distance":19.467221819665728,"sectionId":"15875-15883","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6195693809825837,44.79434475553062],[-0.6196800405722029,44.7945013115898]]}},{"type":"Feature","properties":{"name":"Esplanade des Antilles","distance":154.0392387954897,"sectionId":"15875-15874","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6196800405722029,44.7945013115898],[-0.6214998958983052,44.794007185475536]]}},{"type":"Feature","properties":{"name":"Allée Maine de Biran","distance":229.63144539364484,"sectionId":"15875-27481","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6196800405722029,44.7945013115898],[-0.6207090517644245,44.796434535973084]]}},{"type":"Feature","properties":{"name":"Esplanade des Antilles","distance":103.98334574006651,"sectionId":"15875-15876","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6184503784224944,44.79483267624182],[-0.6196800405722029,44.7945013115898]]}},{"type":"Feature","properties":{"name":"Avenue Marc Desbats","distance":87.75874012876531,"sectionId":"16872-16186","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6167453060802395,44.80336708893274],[-0.6171779755265052,44.80349701217258],[-0.6177762813257962,44.80365923002183]]}},{"type":"Feature","properties":{"name":"Rue Henri Dunant","distance":79.71428747170923,"sectionId":"16872-16873","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6177762813257962,44.80365923002183],[-0.6181716384499761,44.802999044575934]]}},{"type":"Feature","properties":{"name":"Avenue Marc Desbats","distance":48.08885250136549,"sectionId":"16872-as=125302","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6177762813257962,44.80365923002183],[-0.618345051263509,44.803812475306586],[-0.618345051263509,44.803812475306586]]}},{"type":"Feature","properties":{"name":"Avenue du Maréchal Juin","distance":62.46242539651717,"sectionId":"17060-23345","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6293204244529603,44.79411999485734],[-0.6299894216177588,44.79420431001102],[-0.6300986751286143,44.79421550612817]]}},{"type":"Feature","properties":{"name":"Allée Serpentine","distance":11.923782026064451,"sectionId":"17060-26548","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6293356239872048,44.7942267997652],[-0.6293204244529603,44.79411999485734]]}},{"type":"Feature","properties":{"name":"Avenue du Maréchal Juin","distance":27.155852529963504,"sectionId":"17060-as=126835","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6292324178976736,44.79411329562805],[-0.6293204244529603,44.79411999485734]]}},{"type":"Feature","properties":{"name":"Avenue du Maréchal Juin","distance":62.46242539651717,"sectionId":"23345-17060","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6293204244529603,44.79411999485734],[-0.6299894216177588,44.79420431001102],[-0.6300986751286143,44.79421550612817]]}},{"type":"Feature","properties":{"name":"Avenue du Maréchal Juin","distance":14.105450125090007,"sectionId":"23345-26551","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6300986751286143,44.79421550612817],[-0.6301554624670233,44.79422126038577],[-0.6302761572107939,44.79421524538567]]}},{"type":"Feature","properties":{"name":"Avenue du Maréchal Juin","distance":63.3164508270886,"sectionId":"23345-26548","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6293356239872048,44.7942267997652],[-0.6299850149512828,44.79426895082378],[-0.6300637174822687,44.794257069772094],[-0.6300986751286143,44.79421550612817]]}},{"type":"Feature","properties":{"name":"Rue Rémi Belleau","distance":212.81310713888283,"sectionId":"20162-20328","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.602782077306796,44.79565498770984],[-0.6009368419951288,44.79497610594576],[-0.6008332212950126,44.79496587468037],[-0.6007391107869555,44.794988402491136],[-0.6004554726115798,44.79519916794754]]}},{"type":"Feature","properties":{"name":"Rue Malherbe","distance":39.31984619829041,"sectionId":"20162-20161","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6025536281227533,44.79596940673287],[-0.602782077306796,44.79565498770984]]}},{"type":"Feature","properties":{"name":"Piste Cyclable Thouars","distance":52.93970658050486,"sectionId":"25687-25688","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5924110577336282,44.796670224070986],[-0.5924120055885662,44.79652299995097],[-0.5924389591219411,44.796194159508005]]}},{"type":"Feature","properties":{"name":"Résidence Raba 2","distance":11.82342507620666,"sectionId":"25687-20375","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5922619312697354,44.79666268358289],[-0.5924110577336282,44.796670224070986]]}},{"type":"Feature","properties":{"name":"Résidence Raba 2","distance":6.083310888318299,"sectionId":"25687-20510","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5924110577336282,44.796670224070986],[-0.5924878194613906,44.79667374462788]]}},{"type":"Feature","properties":{"name":"Piste Cyclable Thouars","distance":82.28904264322718,"sectionId":"25687-25686","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5923505719694316,44.79740711467132],[-0.5923292350170777,44.79725960360406],[-0.5923761742138395,44.796847436536005],[-0.5923915796231064,44.79679010808445],[-0.5924110577336282,44.796670224070986]]}},{"type":"Feature","properties":{"name":"Rue Vincent Van Gogh","distance":61.39809185215909,"sectionId":"17642-15982","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6062731049713567,44.796886388278814],[-0.6062384746510979,44.796935500567905],[-0.6060646683392302,44.79706947001512],[-0.6060515855655876,44.79710303532343],[-0.6062054888302197,44.797205083374266],[-0.6062420038829148,44.7972346436974],[-0.6062516361617374,44.79727334410128],[-0.6062007210507739,44.797310901675424]]}},{"type":"Feature","properties":{"name":"Rue du Général Bordas","distance":69.02269942389425,"sectionId":"19990-19991","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5885653989972357,44.80106764762856],[-0.5877041787751051,44.80096663185932]]}},{"type":"Feature","properties":{"name":"Rue du Général Bordas","distance":54.18548890816193,"sectionId":"19990-19989","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5892428261966974,44.801140946932136],[-0.5885653989972357,44.80106764762856]]}},{"type":"Feature","properties":{"name":"Avenue Paul Lapie","distance":182.54932980577178,"sectionId":"19990-20268","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5879957097363121,44.802660342236095],[-0.5885653989972357,44.80106764762856]]}},{"type":"Feature","properties":{"name":"Rue du Général Bordas","distance":69.02269942389425,"sectionId":"19991-19990","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5885653989972357,44.80106764762856],[-0.5877041787751051,44.80096663185932]]}},{"type":"Feature","properties":{"name":"Rue du Général Margueritte","distance":97.86211014506463,"sectionId":"19991-19999","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5877041787751051,44.80096663185932],[-0.5879596389119017,44.8001921565681],[-0.5879684525217116,44.800179267056144],[-0.5879797101290751,44.80016702109408],[-0.5880356658461944,44.80012688090375]]}},{"type":"Feature","properties":{"name":"Rue du Général Margueritte","distance":176.31229940323976,"sectionId":"19991-19998","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5871427200275997,44.802502850829214],[-0.5877041787751051,44.80096663185932]]}},{"type":"Feature","properties":{"name":"Rue du Général Bordas","distance":76.68431550718005,"sectionId":"19991-19992","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5877041787751051,44.80096663185932],[-0.5867477686237127,44.800852667230565]]}},{"type":"Feature","properties":{"name":"Rue du Général Percin","distance":139.05917659095974,"sectionId":"20001-20002","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5895090725482314,44.800385584844534],[-0.58992678783263,44.799169445830465]]}},{"type":"Feature","properties":{"name":"Rue de Verdun","distance":55.14445662696081,"sectionId":"20001-20170","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5888327396472829,44.80026468961341],[-0.5895090725482314,44.800385584844534]]}},{"type":"Feature","properties":{"name":"Rue du Général Percin","distance":86.50087703034708,"sectionId":"20001-19989","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5895090725482314,44.800385584844534],[-0.5892428261966974,44.801140946932136]]}},{"type":"Feature","properties":{"name":"Rue du Général Sarrail","distance":55.27686022048643,"sectionId":"20002-20004","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.58992678783263,44.799169445830465],[-0.5892437059848279,44.799063900248946]]}},{"type":"Feature","properties":{"name":"Rue du Général Sarrail","distance":65.9441429701129,"sectionId":"20002-20003","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5907424423278052,44.799292871840485],[-0.58992678783263,44.799169445830465]]}},{"type":"Feature","properties":{"name":"Rue du Général Percin","distance":139.05917659095974,"sectionId":"20002-20001","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5895090725482314,44.800385584844534],[-0.58992678783263,44.799169445830465]]}},{"type":"Feature","properties":{"name":"Voie 1 Faculté des Sciences","distance":203.53882103166345,"sectionId":"20530-633","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5952993982979592,44.80805550937134],[-0.5957916772073627,44.80794446111475],[-0.5977172695857862,44.80742792452227]]}},{"type":"Feature","properties":{"name":"Voie 1 Faculté des Sciences","distance":98.13636901682756,"sectionId":"20530-20532","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5977172695857862,44.80742792452227],[-0.597874059368516,44.8074157438142],[-0.5979524659489079,44.80740810890347],[-0.5988915706544438,44.807154774322285]]}},{"type":"Feature","properties":{"name":"Voie 1 Faculté des Sciences","distance":99.52126559992901,"sectionId":"20530-20535","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5988426315947495,44.807068947301644],[-0.5978031134926304,44.807341223397415],[-0.5977510058625681,44.807378762978466],[-0.5977172695857862,44.80742792452227]]}},{"type":"Feature","properties":{"name":"Voie 1 Faculté des Sciences","distance":68.51389739415018,"sectionId":"20530-57744","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5977172695857862,44.80742792452227],[-0.597854529927741,44.80760179742024],[-0.5980661419872498,44.80799106177666]]}},{"type":"Feature","properties":{"name":"Voie 1 Faculté des Sciences","distance":64.48583899542464,"sectionId":"20530-27615","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5977172695857862,44.80742792452227],[-0.5974342271774864,44.806883431617564]]}},{"type":"Feature","properties":{"name":"Voie 1 Faculté des Sciences","distance":98.13636901682756,"sectionId":"20532-20530","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5977172695857862,44.80742792452227],[-0.597874059368516,44.8074157438142],[-0.5979524659489079,44.80740810890347],[-0.5988915706544438,44.807154774322285]]}},{"type":"Feature","properties":{"name":"Voie 1 Faculté des Sciences","distance":10.288390732665064,"sectionId":"20532-20535","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5988426315947495,44.807068947301644],[-0.5988915706544438,44.807154774322285]]}},{"type":"Feature","properties":{"name":"Voie 1 Faculté des Sciences","distance":72.60010827841442,"sectionId":"20532-20401","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5988915706544438,44.807154774322285],[-0.5995847070439414,44.80697111145264],[-0.5996286700816077,44.80694502371109],[-0.5996391429552208,44.80691312145729],[-0.5996080759009443,44.806864276637434]]}},{"type":"Feature","properties":{"name":"Voie 1 Faculté des Sciences","distance":45.33504723363512,"sectionId":"20534-20535","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5986420259585337,44.80668658521703],[-0.5988426315947495,44.807068947301644]]}},{"type":"Feature","properties":{"name":"Voie 2 Faculté des Sciences","distance":24.778048194803624,"sectionId":"20534-57743","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5989344322699931,44.8066063743094],[-0.5986420259585337,44.80668658521703]]}},{"type":"Feature","properties":{"name":"Voie 2 Faculté des Sciences","distance":108.7059924381715,"sectionId":"20534-27615","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5986420259585337,44.80668658521703],[-0.5986085122932912,44.80660098221495],[-0.5985102987368742,44.80659255893835],[-0.5974342271774864,44.806883431617564]]}},{"type":"Feature","properties":{"name":"Voie 1 Faculté des Sciences","distance":99.52126559992901,"sectionId":"20535-20530","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5988426315947495,44.807068947301644],[-0.5978031134926304,44.807341223397415],[-0.5977510058625681,44.807378762978466],[-0.5977172695857862,44.80742792452227]]}},{"type":"Feature","properties":{"name":"Voie 1 Faculté des Sciences","distance":10.288390732665064,"sectionId":"20535-20532","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5988426315947495,44.807068947301644],[-0.5988915706544438,44.807154774322285]]}},{"type":"Feature","properties":{"name":"Voie 1 Faculté des Sciences","distance":45.33504723363512,"sectionId":"20535-20534","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5986420259585337,44.80668658521703],[-0.5988426315947495,44.807068947301644]]}},{"type":"Feature","properties":{"name":"Voie 1 Faculté des Sciences","distance":64.70642330644836,"sectionId":"20535-20401","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5996080759009443,44.806864276637434],[-0.5992583538122628,44.80694519566831],[-0.5988426315947495,44.807068947301644]]}},{"type":"Feature","properties":{"name":"Voie 2 Faculté des Sciences","distance":52.86655070899751,"sectionId":"20140-20528","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.592062101007606,44.808997893070945],[-0.591431092111132,44.809155283153466]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":7.321943879012857,"sectionId":"20140-629","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5914292510220244,44.809221191179155],[-0.591431092111132,44.809155283153466]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":124.36462490710926,"sectionId":"20140-as=126843","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.591431092111132,44.809155283153466],[-0.5914839063504418,44.80826441673125],[-0.5915018630781435,44.80803675315485],[-0.5915018630781435,44.80803675315485]]}},{"type":"Feature","properties":{"name":"Voie 2 Faculté des Sciences","distance":96.0907933617037,"sectionId":"23331-57743","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6000262959420235,44.806251188302866],[-0.5999348309531958,44.80632245574727],[-0.5998900748003526,44.80634738377534],[-0.5998325830138282,44.80636694958399],[-0.5992828698886403,44.8065164069221],[-0.5989344322699931,44.8066063743094]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":13.371123386008321,"sectionId":"23331-23329","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6000262959420235,44.806251188302866],[-0.600060223085032,44.80627371606054],[-0.6000995468708117,44.806291478794876],[-0.6001424767978303,44.80630417284332],[-0.600171475528634,44.80630856983659]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":15.246299081898979,"sectionId":"23331-25438","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.599956256747319,44.80612656908074],[-0.5999559228819504,44.806131354014994],[-0.5999620246643437,44.806164221128526],[-0.5999761415146336,44.80619575357184],[-0.5999975914733543,44.80622516218688],[-0.6000262959420235,44.806251188302866]]}},{"type":"Feature","properties":{"name":"Voie 2 Faculté des Sciences","distance":24.778048194803624,"sectionId":"57743-20534","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5989344322699931,44.8066063743094],[-0.5986420259585337,44.80668658521703]]}},{"type":"Feature","properties":{"name":"Voie 2 Faculté des Sciences","distance":96.0907933617037,"sectionId":"57743-23331","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6000262959420235,44.806251188302866],[-0.5999348309531958,44.80632245574727],[-0.5998900748003526,44.80634738377534],[-0.5998325830138282,44.80636694958399],[-0.5992828698886403,44.8065164069221],[-0.5989344322699931,44.8066063743094]]}},{"type":"Feature","properties":{"name":"Voie 1 Faculté des Sciences","distance":125.8361127275229,"sectionId":"57743-53588","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6002329645957412,44.806650251454165],[-0.6001973295634049,44.80657255031752],[-0.6001536528787481,44.80652470489435],[-0.6001142908939995,44.80650063376368],[-0.6000701011779578,44.80648427779792],[-0.6000239709706738,44.806475164866164],[-0.5999641946606086,44.806472504461425],[-0.5990734619459711,44.806711467022254],[-0.5990160386491407,44.8067127043345],[-0.5989766255742842,44.80669367847544],[-0.5989634588475646,44.80667510042032],[-0.5989344322699931,44.8066063743094]]}},{"type":"Feature","properties":{"name":"Avenue Roul","distance":81.73785862580856,"sectionId":"20348-19892","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5943365232877257,44.806354562138054],[-0.5947896707780729,44.80624727667067],[-0.5953226814922169,44.806134221973636]]}},{"type":"Feature","properties":{"name":"Impasse Roul","distance":57.28443135316896,"sectionId":"20348-as=129186","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5943365232877257,44.806354562138054],[-0.5942781595498954,44.8063033480999],[-0.5941898322559428,44.806282988130604],[-0.5938749719654605,44.80632707823243],[-0.5936575716898786,44.80631475967341]]}},{"type":"Feature","properties":{"name":"Avenue Roul","distance":192.95901701186682,"sectionId":"20348-as=126798","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5943365232877257,44.806354562138054],[-0.5940634620328182,44.8064257077243],[-0.593749511142539,44.8064904875932],[-0.5933108051042018,44.80656154999093],[-0.592899132447576,44.80660347097803],[-0.5926728544520203,44.80664566032003],[-0.5923547711049446,44.80672335842478],[-0.5921605825632146,44.80675410074487],[-0.5919754450763087,44.806776336560645],[-0.5919754450763087,44.806776336560645]]}},{"type":"Feature","properties":{"name":"Avenue Roul","distance":81.73785862580856,"sectionId":"19892-20348","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5943365232877257,44.806354562138054],[-0.5947896707780729,44.80624727667067],[-0.5953226814922169,44.806134221973636]]}},{"type":"Feature","properties":{"name":"Rue Ernest Renan","distance":94.7277352083966,"sectionId":"19892-19893","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5953226814922169,44.806134221973636],[-0.5951509690186139,44.80529017486023]]}},{"type":"Feature","properties":{"name":"Avenue Roul","distance":86.2284660101008,"sectionId":"19892-20195","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5953226814922169,44.806134221973636],[-0.5960323517262976,44.805982879768784],[-0.5961729812650408,44.805957264236206],[-0.5963748769008166,44.80593403532045]]}},{"type":"Feature","properties":{"name":"Avenue Roger Chaumet","distance":19.027359440890386,"sectionId":"23042-24285","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6315243641467698,44.80392518549436],[-0.6315340391954343,44.80387388904114],[-0.6316085245585873,44.80376674305387]]}},{"type":"Feature","properties":{"name":"Boulevard Saint Martin","distance":"Unknown","sectionId":"23042-as=126249","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6314561092610305,44.80373152224987],[-0.6316085245585873,44.80376674305387]]}},{"type":"Feature","properties":{"name":"Avenue Roger Chaumet","distance":32.548405747736865,"sectionId":"23042-as=3835","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6316085245585873,44.80376674305387],[-0.6317755599815049,44.803604212865146],[-0.631872080810827,44.80354356705513]]}},{"type":"Feature","properties":{"name":"Allée des Roses du Haut-Brion","distance":119.50022669089049,"sectionId":"17520-16389","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6226363449300576,44.80618073546984],[-0.6219867823531581,44.806820565912034],[-0.6219414548120491,44.80699334807181],[-0.6219974203338794,44.807096603254664]]}},{"type":"Feature","properties":{"name":"Rue du Relais","distance":133.6124393368543,"sectionId":"17554-17553","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6067089864241451,44.79436691118033],[-0.6061315950818825,44.79452485079389],[-0.6061092063287035,44.79456132364093],[-0.6063805818624042,44.79507717995475],[-0.6064285442523097,44.79511178212509],[-0.6065960838034486,44.79514268204756]]}},{"type":"Feature","properties":{"name":"Rue du Relais","distance":76.67424583325604,"sectionId":"17554-17555","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6065960838034486,44.79514268204756],[-0.6075399926453159,44.79530020462924]]}},{"type":"Feature","properties":{"name":"Résidence les Ombrages","distance":279.89166138132606,"sectionId":"20430-20377","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5898589085239744,44.79578531672493],[-0.5899479844179094,44.79503572498155],[-0.5913537011187363,44.79501395070779],[-0.5924129675978201,44.79487752946063]]}},{"type":"Feature","properties":{"name":"Résidence les Ombrages","distance":196.97663317934845,"sectionId":"20430-20376","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5923415956072579,44.79592698879076],[-0.5898589085239744,44.79578531672493]]}},{"type":"Feature","properties":{"name":"Rue André Messager","distance":55.77682777041475,"sectionId":"20430-19618","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5897684222230885,44.79628065133203],[-0.5898253807501236,44.79584015404845],[-0.5898589085239744,44.79578531672493]]}},{"type":"Feature","properties":{"name":"Avenue du Maréchal Juin","distance":14.105450125090007,"sectionId":"26551-23345","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6300986751286143,44.79421550612817],[-0.6301554624670233,44.79422126038577],[-0.6302761572107939,44.79421524538567]]}},{"type":"Feature","properties":{"name":"Rond-point de la Médaille Militaire","distance":17.96735293916831,"sectionId":"26551-26550","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6302761572107939,44.79421524538567],[-0.6302847239099877,44.79423677223508],[-0.6302978490150781,44.79425635188144],[-0.6303152913315477,44.794274172190185],[-0.6303365118563365,44.79428970986326],[-0.630360856647935,44.794302625438924],[-0.6303879299434385,44.79431266129845],[-0.6304168196130063,44.794319396138],[-0.6304296964116521,44.79432096689277]]}},{"type":"Feature","properties":{"name":"Rond-point de la Médaille Militaire","distance":10.748588668661977,"sectionId":"26551-17122","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6302978682609254,44.79412203599371],[-0.6302899692820373,44.79413120648],[-0.6302793575573499,44.79415154390092],[-0.6302733591019212,44.794172815055575],[-0.6302723187342687,44.794194468432394],[-0.6302761572107939,44.79421524538567]]}},{"type":"Feature","properties":{"name":"Rond-point de la Médaille Militaire","distance":41.302714366533486,"sectionId":"26550-30099","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6304296964116521,44.79432096689277],[-0.6304470149531787,44.794322756178836],[-0.6304773739582742,44.7943226877932],[-0.6305075121814364,44.79431911317031],[-0.6305362989393375,44.7943121584943],[-0.6309071398690205,44.7941820380093]]}},{"type":"Feature","properties":{"name":"Rond-point de la Médaille Militaire","distance":17.96735293916831,"sectionId":"26550-26551","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6302761572107939,44.79421524538567],[-0.6302847239099877,44.79423677223508],[-0.6302978490150781,44.79425635188144],[-0.6303152913315477,44.794274172190185],[-0.6303365118563365,44.79428970986326],[-0.630360856647935,44.794302625438924],[-0.6303879299434385,44.79431266129845],[-0.6304168196130063,44.794319396138],[-0.6304296964116521,44.79432096689277]]}},{"type":"Feature","properties":{"name":"Avenue de Saige","distance":25.896131174923312,"sectionId":"26550-17403","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6304296964116521,44.79432096689277],[-0.6304058027417296,44.79447595354736],[-0.6303931736083461,44.79455265789623]]}},{"type":"Feature","properties":{"name":"Rue des Poilus","distance":26.558624127725103,"sectionId":"28691-17302","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6322151558794488,44.80515079027539],[-0.6318972150442006,44.80522787563589]]}},{"type":"Feature","properties":{"name":"Esplanade Charles de Gaulle","distance":52.4515096054109,"sectionId":"28691-28692","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6318972150442006,44.80522787563589],[-0.631700007696165,44.80477699651276]]}},{"type":"Feature","properties":{"name":"Rue des Poilus","distance":80.2488760984979,"sectionId":"28691-16403","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6318972150442006,44.80522787563589],[-0.6314907472446162,44.805315804114095],[-0.6312936765512386,44.805381281255926],[-0.6310311958108813,44.80544893631451],[-0.6309416636166261,44.80546791955571]]}},{"type":"Feature","properties":{"name":"Esplanade Charles de Gaulle","distance":52.4515096054109,"sectionId":"28692-28691","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6318972150442006,44.80522787563589],[-0.631700007696165,44.80477699651276]]}},{"type":"Feature","properties":{"name":"Avenue Eugène Et Marc Dulout","distance":48.52527129235806,"sectionId":"28692-as=126956","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6315426422940877,44.80483886296448],[-0.631700007696165,44.80477699651276]]}},{"type":"Feature","properties":{"name":"Avenue Eugène Et Marc Dulout","distance":6.922457625431717,"sectionId":"28692-as=2793","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.631700007696165,44.80477699651276],[-0.6317753874490736,44.80474530328229]]}},{"type":"Feature","properties":{"name":"Rond-point Plume la Poule","distance":24.393041089589218,"sectionId":"20292-20109","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5848152581641884,44.80002097670167],[-0.584823946514801,44.80001827063563],[-0.5848514384041558,44.80000461247142],[-0.5848732153146589,44.79998654027504],[-0.584888081579911,44.79996517271796],[-0.5848948583079588,44.799941898190326],[-0.5848933768158041,44.79991807323484],[-0.584883737742695,44.79989531615156],[-0.584866277504544,44.79987496755884],[-0.5848423427184414,44.79985833623324],[-0.5848152076639289,44.79984721067967]]}},{"type":"Feature","properties":{"name":"Rue Peydavant","distance":171.67293957183048,"sectionId":"20292-19689","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5851495033491008,44.80153219107884],[-0.5849576140738918,44.80109963195287],[-0.5849531781805696,44.80108526862295],[-0.584918103457541,44.8008427032057],[-0.5849157167020617,44.8004991167341],[-0.584901669286926,44.80032408035752],[-0.5848873902476819,44.80020228956969],[-0.5848768565687293,44.80013055623425],[-0.5848531622910493,44.80005878732148],[-0.5848152581641884,44.80002097670167]]}},{"type":"Feature","properties":{"name":"Rond-point Plume la Poule","distance":29.40414055634349,"sectionId":"20292-20249","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5846706106451018,44.799865821105186],[-0.5846606362024301,44.79987226104711],[-0.5846422598198197,44.79989211773739],[-0.584631386281011,44.79991462055669],[-0.5846285631198808,44.79993840102652],[-0.5846343211001409,44.79996182094681],[-0.584647945002451,44.79998355163412],[-0.5846687140143846,44.80000217449828],[-0.5846954189829496,44.80001655658468],[-0.5847263568330243,44.80002576067163],[-0.5847594624249837,44.800029131193845],[-0.5847927097471398,44.80002664192913],[-0.5848152581641884,44.80002097670167]]}},{"type":"Feature","properties":{"name":"Rond-point Plume la Poule","distance":24.393041089589218,"sectionId":"20109-20292","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5848152581641884,44.80002097670167],[-0.584823946514801,44.80001827063563],[-0.5848514384041558,44.80000461247142],[-0.5848732153146589,44.79998654027504],[-0.584888081579911,44.79996517271796],[-0.5848948583079588,44.799941898190326],[-0.5848933768158041,44.79991807323484],[-0.584883737742695,44.79989531615156],[-0.584866277504544,44.79987496755884],[-0.5848423427184414,44.79985833623324],[-0.5848152076639289,44.79984721067967]]}},{"type":"Feature","properties":{"name":"Rond-point Plume la Poule","distance":12.32828346242257,"sectionId":"20109-20249","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5848152076639289,44.79984721067967],[-0.5847811153178921,44.799840177929354],[-0.5847476836218268,44.799839700309704],[-0.5847151315753353,44.799845230427906],[-0.5846854516196511,44.79985625507602],[-0.5846706106451018,44.799865821105186]]}},{"type":"Feature","properties":{"name":"Rue Lafitte","distance":64.7676950263024,"sectionId":"20109-as=126415","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5848152076639289,44.79984721067967],[-0.5848745420644292,44.79976778005969],[-0.5849099847830717,44.799275276226325]]}},{"type":"Feature","properties":{"name":"Rue du 19 Mars 1962","distance":116.81977955479941,"sectionId":"16433-26644","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6320923791784995,44.81123934229949],[-0.6318710706919177,44.81019945317003]]}},{"type":"Feature","properties":{"name":"Avenue Colonel Robert Jacqui","distance":105.07136389506199,"sectionId":"16433-16434","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6320923791784995,44.81123934229949],[-0.6334066349679124,44.81109917839348]]}},{"type":"Feature","properties":{"name":"Avenue Colonel Robert Jacqui","distance":19.692088481499226,"sectionId":"16433-16432","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6318455929708662,44.81126325695497],[-0.6320923791784995,44.81123934229949]]}},{"type":"Feature","properties":{"name":"Rue du 19 Mars 1962","distance":116.81977955479941,"sectionId":"26644-16433","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6320923791784995,44.81123934229949],[-0.6318710706919177,44.81019945317003]]}},{"type":"Feature","properties":{"name":"Mail Pierre Mendès France","distance":87.65996480559085,"sectionId":"26644-27894","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6318710706919177,44.81019945317003],[-0.631543529639951,44.810387736416686],[-0.6314331489596068,44.8104033316262],[-0.6309912993060639,44.81066543778118]]}},{"type":"Feature","properties":{"name":"Rue Dourout","distance":181.56232779130826,"sectionId":"19842-19841","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.582926096946988,44.80891678917791],[-0.582596396707485,44.81053449802052]]}},{"type":"Feature","properties":{"name":"Résidence la Boétie","distance":143.29919695739068,"sectionId":"19842-20469","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.582926096946988,44.80891678917791],[-0.5824634086743018,44.80885695508423],[-0.5818707986583633,44.80878751802392],[-0.5814757888340496,44.80876599535923],[-0.5813256223797156,44.808544619005495]]}},{"type":"Feature","properties":{"name":"Rue Dourout","distance":45.37496411529443,"sectionId":"19842-as=128441","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5829533291412462,44.808775800980634],[-0.582926096946988,44.80891678917791]]}},{"type":"Feature","properties":{"name":"Résidence la Boétie","distance":143.29919695739068,"sectionId":"20469-19842","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.582926096946988,44.80891678917791],[-0.5824634086743018,44.80885695508423],[-0.5818707986583633,44.80878751802392],[-0.5814757888340496,44.80876599535923],[-0.5813256223797156,44.808544619005495]]}},{"type":"Feature","properties":{"name":"Résidence Crespy I","distance":28.522819316840636,"sectionId":"22367-20476","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5892726378677615,44.80354429207371],[-0.5891628548496484,44.80378890572265]]}},{"type":"Feature","properties":{"name":"Résidence Crespy I","distance":27.212061090518603,"sectionId":"22367-22371","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5891628548496484,44.80378890572265],[-0.5890468881739451,44.804019571503474]]}},{"type":"Feature","properties":{"name":"Résidence Crespy I","distance":72.32199174498545,"sectionId":"22367-22368","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5891628548496484,44.80378890572265],[-0.5893550784513267,44.80383193426334],[-0.5895540975018551,44.80339479164763],[-0.5895402813859256,44.80334766444167]]}},{"type":"Feature","properties":{"name":"Résidence Crespy I","distance":85.0794930753868,"sectionId":"22369-22370","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5896731806453948,44.803293474578275],[-0.5902629811953956,44.803407909148746],[-0.5903015988135556,44.8033087710468],[-0.5902601349755588,44.80326062493925],[-0.5900259725883658,44.80322072338686]]}},{"type":"Feature","properties":{"name":"Résidence Crespy I","distance":12.110737212705239,"sectionId":"22369-22368","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5896731806453948,44.803293474578275],[-0.5895402813859256,44.80334766444167]]}},{"type":"Feature","properties":{"name":"Rue Fenelon","distance":20.130458704350282,"sectionId":"19918-19917","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5978580732608683,44.79681376542394],[-0.5977397996493297,44.7969742505215]]}},{"type":"Feature","properties":{"name":"Résidence Château Raba","distance":54.183684430564774,"sectionId":"19918-20506","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5977397996493297,44.7969742505215],[-0.598340238553185,44.79720919580894]]}},{"type":"Feature","properties":{"name":"Rue Fenelon","distance":146.3311616445374,"sectionId":"19918-21901","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5977397996493297,44.7969742505215],[-0.5969775878878063,44.79802151633341],[-0.5969300603777217,44.7980891399777],[-0.5969918950318113,44.798133216314305]]}},{"type":"Feature","properties":{"name":"Résidence Château Raba","distance":54.183684430564774,"sectionId":"20506-19918","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5977397996493297,44.7969742505215],[-0.598340238553185,44.79720919580894]]}},{"type":"Feature","properties":{"name":"Avenue de Thouars","distance":24.215925485178396,"sectionId":"20375-19617","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5922783509610803,44.796444976952124],[-0.5922619312697354,44.79666268358289]]}},{"type":"Feature","properties":{"name":"Résidence Raba 2","distance":11.82342507620666,"sectionId":"20375-25687","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5922619312697354,44.79666268358289],[-0.5924110577336282,44.796670224070986]]}},{"type":"Feature","properties":{"name":"Avenue de Thouars","distance":75.57352734579268,"sectionId":"20375-19733","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5922619312697354,44.79666268358289],[-0.5922214191211087,44.79700744633009],[-0.5921843731680444,44.79734083928537]]}},{"type":"Feature","properties":{"name":"Rue de Compostelle","distance":28.653536118411385,"sectionId":"17561-17562","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.609292376100524,44.79406793627747],[-0.6096161550702309,44.794183685429104]]}},{"type":"Feature","properties":{"name":"Rue Léo Ferré","distance":308.4738521789393,"sectionId":"17562-17208","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6096161550702309,44.794183685429104],[-0.6095831599544377,44.79425076358718],[-0.6098307675918202,44.79474619754953],[-0.6098041661993026,44.794780012345896],[-0.6090098538580561,44.79499124498106],[-0.6089914340021404,44.79502642141042],[-0.6094181761785373,44.79587335001899],[-0.6093804401984299,44.79590715775977],[-0.6086453402267731,44.796098491349674]]}},{"type":"Feature","properties":{"name":"Rue de Compostelle","distance":28.653536118411385,"sectionId":"17562-17561","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.609292376100524,44.79406793627747],[-0.6096161550702309,44.794183685429104]]}},{"type":"Feature","properties":{"name":"Rue de Compostelle","distance":81.29056289974486,"sectionId":"17562-17773","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6096161550702309,44.794183685429104],[-0.6102377641172693,44.79436438733048],[-0.6105819573232397,44.79443030040655]]}},{"type":"Feature","properties":{"name":"Allée Baudrimont","distance":99.81884595893575,"sectionId":"20410-20411","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6027296980286029,44.80673175962899],[-0.6015473838064842,44.807046746653825]]}},{"type":"Feature","properties":{"name":"Avenue Prévost","distance":38.25143560853815,"sectionId":"20410-20407","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6029063912671518,44.80705235166629],[-0.6027296980286029,44.80673175962899]]}},{"type":"Feature","properties":{"name":"Avenue Prévost","distance":74.01837943828706,"sectionId":"20410-20397","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6027296980286029,44.80673175962899],[-0.6024013038858907,44.80610770975058]]}},{"type":"Feature","properties":{"name":"Allée Baudrimont","distance":99.81884595893575,"sectionId":"20411-20410","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6027296980286029,44.80673175962899],[-0.6015473838064842,44.807046746653825]]}},{"type":"Feature","properties":{"name":"Résidence Michel Montaigne","distance":74.05233531651987,"sectionId":"20450-20453","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.582654089070662,44.80271207266947],[-0.5831183975565108,44.802133084830125]]}},{"type":"Feature","properties":{"name":"Résidence Michel Montaigne","distance":30.212145792789855,"sectionId":"20450-19693","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5829773948842143,44.80285700859803],[-0.582654089070662,44.80271207266947]]}},{"type":"Feature","properties":{"name":"Résidence Michel Montaigne","distance":50.56254232387431,"sectionId":"20450-20452","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.582654089070662,44.80271207266947],[-0.5825764361023581,44.8026780356692],[-0.5823824907116107,44.802592892016165],[-0.5822225659064574,44.802790523505124]]}},{"type":"Feature","properties":{"name":"Résidence Michel Montaigne","distance":74.05233531651987,"sectionId":"20453-20450","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.582654089070662,44.80271207266947],[-0.5831183975565108,44.802133084830125]]}},{"type":"Feature","properties":{"name":"Rue Henry de Montherlant","distance":87.72326062047789,"sectionId":"20060-20061","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5816756531470041,44.795922453916624],[-0.5815380589027282,44.79588868285579],[-0.5814732549235175,44.79584748460213],[-0.5814372947108952,44.795800153210344],[-0.581356943586693,44.79549847817847],[-0.5813518493489928,44.79537369545283],[-0.5813456481642605,44.795235165102824]]}},{"type":"Feature","properties":{"name":"Rue Henry de Montherlant","distance":"Unknown","sectionId":"20060-as=125304","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5814783761385266,44.79643501556176],[-0.5816756531470041,44.795922453916624]]}},{"type":"Feature","properties":{"name":"Rue Jacques Juillac","distance":159.2184857514275,"sectionId":"20071-30127","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5873405205806616,44.81311328679103],[-0.587507771417311,44.81325682730876],[-0.5882334710459839,44.81387964457536],[-0.5882836764128162,44.81390751766863],[-0.5886514671698074,44.81402581361711],[-0.5887850089633541,44.81407096556667]]}},{"type":"Feature","properties":{"name":"Rue Jacques Juillac","distance":99.76631812087524,"sectionId":"20071-20073","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5873405205806616,44.81311328679103],[-0.587041665128302,44.812862104636736],[-0.5870014528229264,44.812836167974545],[-0.5869533553365147,44.812815704674364],[-0.5868924492112061,44.81280294184921],[-0.586828819542169,44.81279521936008],[-0.5862677591195563,44.81279020825787]]}},{"type":"Feature","properties":{"name":"Rue Maurice Berteaux","distance":13.786158477410662,"sectionId":"20071-20197","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5873405205806616,44.81311328679103],[-0.5874394502332281,44.81301107708922]]}},{"type":"Feature","properties":{"name":"Rue de Megret","distance":52.337547553701306,"sectionId":"20481-20213","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5879740703110379,44.80459364035909],[-0.587784386056661,44.80454467402358],[-0.5873478577180511,44.80444115657791]]}},{"type":"Feature","properties":{"name":"Rue de Megret","distance":41.965782875112474,"sectionId":"20481-20043","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5884806678820967,44.80460857465829],[-0.5883571332519366,44.80464317169309],[-0.5882875173174691,44.80465500674462],[-0.5882368607727104,44.80465228094047],[-0.5881834186771948,44.80464342734509],[-0.5879740703110379,44.80459364035909]]}},{"type":"Feature","properties":{"name":"Résidence Crespy II","distance":30.251101385160432,"sectionId":"20481-20479","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5878582517449966,44.804853216293985],[-0.5879740703110379,44.80459364035909]]}},{"type":"Feature","properties":{"name":"Rue de Megret","distance":52.337547553701306,"sectionId":"20213-20481","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5879740703110379,44.80459364035909],[-0.587784386056661,44.80454467402358],[-0.5873478577180511,44.80444115657791]]}},{"type":"Feature","properties":{"name":"Rue de Megret","distance":51.474880658849315,"sectionId":"20213-20215","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5873478577180511,44.80444115657791],[-0.5867244760266841,44.8043076775135]]}},{"type":"Feature","properties":{"name":"Avenue Paul Lapie","distance":204.32440434045327,"sectionId":"20213-20268","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5873478577180511,44.80444115657791],[-0.5879957097363121,44.802660342236095]]}},{"type":"Feature","properties":{"name":"Rue Peydavant","distance":171.67293957183048,"sectionId":"19689-20292","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5851495033491008,44.80153219107884],[-0.5849576140738918,44.80109963195287],[-0.5849531781805696,44.80108526862295],[-0.584918103457541,44.8008427032057],[-0.5849157167020617,44.8004991167341],[-0.584901669286926,44.80032408035752],[-0.5848873902476819,44.80020228956969],[-0.5848768565687293,44.80013055623425],[-0.5848531622910493,44.80005878732148],[-0.5848152581641884,44.80002097670167]]}},{"type":"Feature","properties":{"name":"Rue du Général Bordas","distance":111.67931214270908,"sectionId":"19689-19993","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.58600702822517,44.8007377500221],[-0.585970707689142,44.80076609991251],[-0.5858914425051014,44.8008546272021],[-0.5858157990720313,44.80094646334614],[-0.5857341732693,44.80103569550913],[-0.5856488940025563,44.80112315107179],[-0.5855596919311252,44.80120856827141],[-0.5854660395668815,44.80129160340103],[-0.5853680464074918,44.801371982752094],[-0.5852641076434639,44.80144831559702],[-0.5851495033491008,44.80153219107884]]}},{"type":"Feature","properties":{"name":"Rue Peydavant","distance":13.99979854709641,"sectionId":"19689-as=128588","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5851741241733962,44.80158764319367],[-0.5851495033491008,44.80153219107884]]}},{"type":"Feature","properties":{"name":"Rue Robespierre","distance":103.40587477480041,"sectionId":"19598-19679","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5850959289495298,44.808524217323345],[-0.5838043431839468,44.80837808926339]]}},{"type":"Feature","properties":{"name":"Rue Peydavant","distance":267.3441256494578,"sectionId":"19598-20286","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5851117818471763,44.81090727732481],[-0.5851579712044871,44.81038235731549],[-0.5851517060606226,44.81025517937484],[-0.5850621839157236,44.80935907642656],[-0.5849621448807082,44.808981544439824],[-0.5849714183548708,44.80880307072202],[-0.5850959289495298,44.808524217323345]]}},{"type":"Feature","properties":{"name":"Rue Peydavant","distance":43.33023570246905,"sectionId":"19598-19763","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5850959289495298,44.808524217323345],[-0.5853168094815572,44.808167198079275]]}},{"type":"Feature","properties":{"name":"Rue Ambroise Pare","distance":79.18251176762708,"sectionId":"19598-as=129242","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5850959289495298,44.808524217323345],[-0.5860853898792252,44.808634154471086]]}},{"type":"Feature","properties":{"name":"Rue Peydavant","distance":127.5517969220892,"sectionId":"20287-19627","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5864864687442536,44.80581270157772],[-0.5865034209105237,44.80571298705664],[-0.5865690362884969,44.80533176401814],[-0.5866361089763721,44.80492923565233],[-0.5866746519603945,44.8046721880755]]}},{"type":"Feature","properties":{"name":"Rue Peydavant","distance":25.23851171417042,"sectionId":"20287-as=128590","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5864736482133087,44.80588680315619],[-0.5864864687442536,44.80581270157772]]}},{"type":"Feature","properties":{"name":"Résidence Crespy II","distance":2.9376094501562036,"sectionId":"20287-as=128591","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5865689008012638,44.80581277243472],[-0.5864864687442536,44.80581270157772]]}},{"type":"Feature","properties":{"name":"Rue Léo Delibes","distance":84.82911708757146,"sectionId":"19583-19761","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.584141209074514,44.795217084931785],[-0.5833254041750363,44.79571293010645]]}},{"type":"Feature","properties":{"name":"Rue d'Alembert","distance":62.27090663914448,"sectionId":"19583-19584","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.584141209074514,44.795217084931785],[-0.5846472686524727,44.79564658849234]]}},{"type":"Feature","properties":{"name":"Rue d'Alembert","distance":20.296610935157894,"sectionId":"19583-19582","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5839761420156613,44.795077165607054],[-0.584141209074514,44.795217084931785]]}},{"type":"Feature","properties":{"name":"Rue d'Alembert","distance":62.27090663914448,"sectionId":"19584-19583","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.584141209074514,44.795217084931785],[-0.5846472686524727,44.79564658849234]]}},{"type":"Feature","properties":{"name":"Rue Gustave Courbet","distance":84.98362358250272,"sectionId":"19584-35880","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5846472686524727,44.79564658849234],[-0.5848533112551045,44.7955054213432],[-0.5849910017310761,44.79542270967738],[-0.5850319923870405,44.795365746929185],[-0.5850659103723002,44.79529270233151],[-0.585051126765477,44.795219751746686],[-0.5849855407068508,44.795168040524224],[-0.5848900376167527,44.79514384648763],[-0.584790537238073,44.79517337702367]]}},{"type":"Feature","properties":{"name":"Rue d'Alembert","distance":13.356235869437771,"sectionId":"19584-19585","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5846472686524727,44.79564658849234],[-0.5847300149816487,44.79570163250422],[-0.5847781845475827,44.795721463465725]]}},{"type":"Feature","properties":{"name":"Résidence le Prado","distance":63.512063082665755,"sectionId":"19584-20443","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5846472686524727,44.79564658849234],[-0.5852664622881532,44.795726519264385],[-0.5853450185170811,44.795716205499474],[-0.5853964467092139,44.7956602647751]]}},{"type":"Feature","properties":{"name":"Rue Gabriel Faure","distance":168.79774964062716,"sectionId":"26871-19964","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6042882382750667,44.79684094366318],[-0.6051643027973448,44.79734565370451],[-0.6058602084364522,44.79786435749591]]}},{"type":"Feature","properties":{"name":"Rue Gabriel Faure","distance":15.623017053244986,"sectionId":"26871-25046","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.604111969837402,44.79685463755314],[-0.6041333633495584,44.79686494963479],[-0.6041639657718203,44.79687280787559],[-0.6041963550463374,44.796874844185176],[-0.6042283621381364,44.796870766974635],[-0.6042578629736161,44.796861003894286],[-0.6042828653712338,44.79684606849776],[-0.6042882382750667,44.79684094366318]]}},{"type":"Feature","properties":{"name":"Rue Gabriel Faure","distance":30.810158933321645,"sectionId":"26871-25245","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6042882382750667,44.79684094366318],[-0.6043015427615663,44.79682709967243],[-0.6043125792764688,44.796805310200725],[-0.6043154335148863,44.796782158566785],[-0.6043097072060759,44.79675936896613],[-0.6042959953553246,44.796738363864144],[-0.6042750248552663,44.79672065162491],[-0.6042482577090789,44.796707356983966],[-0.604217649743204,44.79669940886188],[-0.6041852661857061,44.796697462462895],[-0.6041532535664538,44.796701449756725],[-0.6041237584157965,44.796711302714655],[-0.6040987560359596,44.79672623807645],[-0.604094233275002,44.79673079546311]]}},{"type":"Feature","properties":{"name":"Rue des Flamboyants","distance":34.13205872061303,"sectionId":"16628-16627","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6197644570798326,44.8049764093837],[-0.619980510101008,44.80504781568014],[-0.6201737519763828,44.80505418675388]]}},{"type":"Feature","properties":{"name":"Rue des Flamboyants","distance":46.2112516805716,"sectionId":"16628-16629","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6201737519763828,44.80505418675388],[-0.6207580646347948,44.80506171139595]]}},{"type":"Feature","properties":{"name":"Rue des Flamboyants","distance":16.577689815120618,"sectionId":"16628-16631","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6202864288590101,44.80518005017042],[-0.6201737519763828,44.80505418675388]]}},{"type":"Feature","properties":{"name":"Rue des Flamboyants","distance":46.2112516805716,"sectionId":"16629-16628","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6201737519763828,44.80505418675388],[-0.6207580646347948,44.80506171139595]]}},{"type":"Feature","properties":{"name":"Rue des Flamboyants","distance":18.032076666193404,"sectionId":"16629-16630","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6207580646347948,44.80506171139595],[-0.6209765883858974,44.80501529813661]]}},{"type":"Feature","properties":{"name":"Rue des Flamboyants","distance":39.54239018154094,"sectionId":"16629-16631","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6207580646347948,44.80506171139595],[-0.6202864288590101,44.80518005017042]]}},{"type":"Feature","properties":{"name":"Rue Robespierre","distance":85.26112900003378,"sectionId":"20102-26647","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5825067803575857,44.808361672208974],[-0.582223347048623,44.80830700119719],[-0.5814737141394966,44.8081419763692]]}},{"type":"Feature","properties":{"name":"Rue Jouis","distance":335.51640250211256,"sectionId":"20102-19952","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5825067803575857,44.808361672208974],[-0.5841858371471785,44.80558750187525]]}},{"type":"Feature","properties":{"name":"Rue Robespierre","distance":32.805673458179434,"sectionId":"20102-as=4624","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5826167316320662,44.80836364546584],[-0.5825067803575857,44.808361672208974]]}},{"type":"Feature","properties":{"name":"Rue Frédéric Sevene","distance":22.17655495400244,"sectionId":"19952-19953","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5841858371471785,44.80558750187525],[-0.5839926048931097,44.805442794196125]]}},{"type":"Feature","properties":{"name":"Rue Jouis","distance":335.51640250211256,"sectionId":"19952-20102","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5825067803575857,44.808361672208974],[-0.5841858371471785,44.80558750187525]]}},{"type":"Feature","properties":{"name":"Rue Frédéric Sevene","distance":88.22200475016068,"sectionId":"19952-19951","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5849876235953666,44.80613983686355],[-0.5841858371471785,44.80558750187525]]}},{"type":"Feature","properties":{"name":"Rue Lafitte","distance":220.72344604592155,"sectionId":"19670-19579","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5856717428526199,44.79693579087962],[-0.5856117122030445,44.79704668255914],[-0.585448166292606,44.79736469286718],[-0.5851507788091184,44.79797797637938],[-0.5851168591768824,44.79807543313699],[-0.584984869444343,44.79865278398458],[-0.5849744606561111,44.79869292822052],[-0.584977520995132,44.798744178335795],[-0.585015235590998,44.79884406116928]]}},{"type":"Feature","properties":{"name":"Rue Lafitte","distance":101.94622116171514,"sectionId":"19670-19620","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5856717428526199,44.79693579087962],[-0.5857694496967596,44.79669633556681],[-0.5859913165365825,44.79604678625102]]}},{"type":"Feature","properties":{"name":"Chemin Bénédigues","distance":68.1520371045074,"sectionId":"19670-19671","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5856717428526199,44.79693579087962],[-0.5853851966016531,44.79689735213065],[-0.5848285086423236,44.796809595995924]]}},{"type":"Feature","properties":{"name":"Rue Charles Gounod","distance":107.38740379805421,"sectionId":"19670-19772","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5870244283657843,44.797018707197054],[-0.5859361428374773,44.79694565065381],[-0.5856717428526199,44.79693579087962]]}},{"type":"Feature","properties":{"name":"Rue Lamartine","distance":115.22060213046018,"sectionId":"20119-20118","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5861690395503226,44.81189917006904],[-0.5861560852156734,44.811444846293305],[-0.5861018004954792,44.81086318887048]]}},{"type":"Feature","properties":{"name":"Rue de Suzon","distance":78.76111770494428,"sectionId":"20119-20286","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5861018004954792,44.81086318887048],[-0.5859845926135046,44.81088922412883],[-0.5854254764783853,44.81090702889927],[-0.5851117818471763,44.81090727732481]]}},{"type":"Feature","properties":{"name":"Rue Lamartine","distance":87.93140050358335,"sectionId":"20119-20120","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5861018004954792,44.81086318887048],[-0.5860744512494211,44.81075514235164],[-0.586087117329687,44.8101573214773],[-0.586101036755573,44.81007391743919]]}},{"type":"Feature","properties":{"name":"Rue de Suzon","distance":152.69465701578034,"sectionId":"20119-20198","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5878802718810091,44.8104521851498],[-0.5872933614143089,44.81044015805655],[-0.5872123898312404,44.810444513222485],[-0.5871315852683003,44.81045561919193],[-0.5870585288065299,44.81047125510089],[-0.5869861748702153,44.81049614722422],[-0.5861900730992796,44.810831760005584],[-0.5861018004954792,44.81086318887048]]}},{"type":"Feature","properties":{"name":"Rue du Professeur Arnozan","distance":119.82673773968105,"sectionId":"20120-20309","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.587258968721268,44.80943205713267],[-0.5869946792994337,44.809725860605276],[-0.5869553984093602,44.80975349323368],[-0.5862566885838594,44.810043427025995],[-0.586101036755573,44.81007391743919]]}},{"type":"Feature","properties":{"name":"Rue Lamartine","distance":87.93140050358335,"sectionId":"20120-20119","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5861018004954792,44.81086318887048],[-0.5860744512494211,44.81075514235164],[-0.586087117329687,44.8101573214773],[-0.586101036755573,44.81007391743919]]}},{"type":"Feature","properties":{"name":"Rue Lamartine","distance":159.11569377356224,"sectionId":"20120-19599","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.586101036755573,44.81007391743919],[-0.5861144545900808,44.80993566947612],[-0.5861563400219824,44.80864203725283]]}},{"type":"Feature","properties":{"name":"Chemin Bénédigues","distance":108.96475987555287,"sectionId":"19671-19672","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5836766845477668,44.79691508101888],[-0.5837427845097533,44.796753193138706],[-0.5837611277281213,44.79672874344472],[-0.5837972155731294,44.79670481553668],[-0.5838394896553647,44.796694925573334],[-0.5838847328635979,44.79669413035713],[-0.5847198183399579,44.79681752619857],[-0.5847798261838104,44.796818156943374],[-0.5848285086423236,44.796809595995924]]}},{"type":"Feature","properties":{"name":"Chemin Bénédigues","distance":68.1520371045074,"sectionId":"19671-19670","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5856717428526199,44.79693579087962],[-0.5853851966016531,44.79689735213065],[-0.5848285086423236,44.796809595995924]]}},{"type":"Feature","properties":{"name":"Rue César Franck","distance":180.88093600875067,"sectionId":"19671-19759","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5848285086423236,44.796809595995924],[-0.5850169643146096,44.79611696207837],[-0.5850193902134347,44.796086798297395],[-0.5850023742812925,44.796055265606725],[-0.5849717317571858,44.796028396322626],[-0.584917160415909,44.79601345149175],[-0.584550601354561,44.79595978695407],[-0.5844971066755662,44.795960121885095],[-0.5844453276825956,44.79597787856817],[-0.5839721605433712,44.79625664083094]]}},{"type":"Feature","properties":{"name":"Rue Blaise Pascal","distance":60.30626493578607,"sectionId":"19681-19680","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5844384020875807,44.80730298439016],[-0.5841417671664542,44.80780318649656]]}},{"type":"Feature","properties":{"name":"Rue Blaise Pascal","distance":53.236705476991645,"sectionId":"19681-19682","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5847038209642228,44.80686249834282],[-0.5844384020875807,44.80730298439016]]}},{"type":"Feature","properties":{"name":"Rue Parmentier","distance":100.9324556536979,"sectionId":"19681-20254","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.585610866426628,44.80766229960811],[-0.5844384020875807,44.80730298439016]]}},{"type":"Feature","properties":{"name":"Impasse des Acacias","distance":41.22823239556642,"sectionId":"19551-19552","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5807320014946282,44.79863200587201],[-0.581086460953338,44.79885730911431],[-0.581117210519938,44.79888183393539]]}},{"type":"Feature","properties":{"name":"Impasse des Bleuets","distance":39.247334823585575,"sectionId":"19551-19688","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5807320014946282,44.79863200587201],[-0.5810459800769706,44.79835836100999]]}},{"type":"Feature","properties":{"name":"Impasse des Acacias","distance":38.65258894181085,"sectionId":"19551-19550","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.58038085195626,44.79839272485266],[-0.5804263357493041,44.79844263936947],[-0.5805825453067416,44.7985377118534],[-0.5807320014946282,44.79863200587201]]}},{"type":"Feature","properties":{"name":"Impasse des Bleuets","distance":39.247334823585575,"sectionId":"19688-19551","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5807320014946282,44.79863200587201],[-0.5810459800769706,44.79835836100999]]}},{"type":"Feature","properties":{"name":"Rue Blumerel","distance":19.360497918579878,"sectionId":"19692-19691","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5839626726056485,44.80214458791417],[-0.5838428615218176,44.80220988906455],[-0.583779240354156,44.80225909656631]]}},{"type":"Feature","properties":{"name":"Rue Blumerel","distance":91.88821038037247,"sectionId":"19692-19693","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.583779240354156,44.80225909656631],[-0.5836206208357682,44.80235958108798],[-0.5829773948842143,44.80285700859803]]}},{"type":"Feature","properties":{"name":"Rue Lafontaine","distance":86.02055063145504,"sectionId":"19692-19809","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.583779240354156,44.80225909656631],[-0.5838561565533614,44.80233216131662],[-0.5840214904145854,44.80249639498091],[-0.5840454397181574,44.80252545730956],[-0.5840655525816808,44.80255590167351],[-0.5840818178198008,44.80258754826163],[-0.5840940867889167,44.80262004143532],[-0.5841022220233854,44.802653205362546],[-0.5841060804628767,44.802686774307496],[-0.5841058923088552,44.80272038068938],[-0.5841013993973294,44.8027539425629],[-0.5840928263396867,44.80278700244013],[-0.5840800356669424,44.80281938448854],[-0.5840295974202206,44.80291375799513],[-0.5840053833237241,44.80295370653722]]}},{"type":"Feature","properties":{"name":"Rue Pacaris","distance":83.56659020552662,"sectionId":"19697-48658","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.583594741220704,44.799262579054854],[-0.5832923617410791,44.79910797790636],[-0.5829402645496848,44.79893917806156],[-0.5827289793055835,44.798831340566984]]}},{"type":"Feature","properties":{"name":"Rue du Bois Gentil","distance":13.862195185210712,"sectionId":"19697-as=126024","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.583594741220704,44.799262579054854],[-0.5836314252312519,44.79924007378001],[-0.58366202783672,44.79920929244566],[-0.5836843096349736,44.79917084611297],[-0.5836878231762777,44.79916011024313]]}},{"type":"Feature","properties":{"name":"Rue Pacaris","distance":10.736569687467808,"sectionId":"19697-as=126275","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.583594741220704,44.799262579054854],[-0.583594741220704,44.799262579054854]]}},{"type":"Feature","properties":{"name":"Rue du Bois Gentil","distance":1.2243965021096705,"sectionId":"19698-as=126024","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5836878231762777,44.79916011024313],[-0.5838850510735177,44.79855745999362]]}},{"type":"Feature","properties":{"name":"Avenue de Breuil","distance":93.5186894888945,"sectionId":"19588-19730","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5971281849445176,44.80254005614149],[-0.5977955031681217,44.80299827663063],[-0.597913280144674,44.80308102995233],[-0.5979900250654584,44.80311454502185]]}},{"type":"Feature","properties":{"name":"Rue Alfred Charlionnet","distance":213.34049248778138,"sectionId":"19588-19587","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.594810758112071,44.80352351693588],[-0.5971281849445176,44.80254005614149]]}},{"type":"Feature","properties":{"name":"Avenue de Breuil","distance":136.49188960199973,"sectionId":"19588-19729","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5958868153279412,44.801686235444606],[-0.5971281849445176,44.80254005614149]]}},{"type":"Feature","properties":{"name":"Rue Calixte Camelle","distance":60.553892533250384,"sectionId":"19734-19735","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.594898196507284,44.7982785100566],[-0.5942055605025433,44.79804610025062]]}},{"type":"Feature","properties":{"name":"Rue Calixte Camelle","distance":162.96629838453512,"sectionId":"19734-25686","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5942055605025433,44.79804610025062],[-0.5923505719694316,44.79740711467132]]}},{"type":"Feature","properties":{"name":"Rue Paul Louis Courrier","distance":154.66578179236623,"sectionId":"19734-20269","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5928693700846391,44.799062920016524],[-0.5942055605025433,44.79804610025062]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":123.03146999493745,"sectionId":"19586-20038","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5923260252980941,44.80541946553582],[-0.5923897774172039,44.80526679765398],[-0.5927545423625904,44.80435463593653]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":82.16585293993857,"sectionId":"19586-20143","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5927545423625904,44.80435463593653],[-0.5930434137916174,44.803644041633945]]}},{"type":"Feature","properties":{"name":"Rue Alfred Charlionnet","distance":187.33765532312296,"sectionId":"19586-19587","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5927545423625904,44.80435463593653],[-0.5928818422751819,44.80432836445688],[-0.5929500293409798,44.80430783372962],[-0.5930876841834949,44.80425484085722],[-0.594810758112071,44.80352351693588]]}},{"type":"Feature","properties":{"name":"Rue Alfred Charlionnet","distance":5.392985913455869,"sectionId":"19586-38853","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5927545423625904,44.80435463593653],[-0.5926887131867463,44.804341941868636]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":38.42502997676879,"sectionId":"19963-17056","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6030959881292656,44.796167611720165],[-0.6034283903360506,44.79591529769285]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":10.80348717335794,"sectionId":"19963-23330","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6030959881292656,44.796167611720165],[-0.6029775749561365,44.79611911546831]]}},{"type":"Feature","properties":{"name":"Rue Gabriel Faure","distance":100.72537457402946,"sectionId":"19963-25245","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6030959881292656,44.796167611720165],[-0.604094233275002,44.79673079546311]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":47.73120500416763,"sectionId":"19963-as=124830","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6026178012516087,44.79654680953026],[-0.6030959881292656,44.796167611720165]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":38.42502997676879,"sectionId":"17056-19963","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6030959881292656,44.796167611720165],[-0.6034283903360506,44.79591529769285]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":65.697722455604,"sectionId":"17056-17057","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6034283903360506,44.79591529769285],[-0.6039887601312252,44.7954786555727]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":21.54450347922228,"sectionId":"24224-20137","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5911565152469914,44.810435278298364],[-0.5911347603798242,44.8104415501873],[-0.5911030828954811,44.81045714351977],[-0.5910771330750205,44.81047733036299],[-0.5910582441855303,44.810501167810585],[-0.5910470956051911,44.81052737327255],[-0.5910444930150597,44.810554660169785],[-0.5910504787063213,44.81058167593988],[-0.5910571820878934,44.810593805537806]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":11.253052213409786,"sectionId":"24224-24225","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5910571820878934,44.810593805537806],[-0.591064842376468,44.810607075991314],[-0.5910866215297996,44.8106296295616],[-0.5911149799611192,44.810648101897804],[-0.5911484667740644,44.81066154790002],[-0.5911550088205666,44.81066296284028]]}},{"type":"Feature","properties":{"name":"Rue de Suzon","distance":114.3219916065404,"sectionId":"24224-19898","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5910571820878934,44.810593805537806],[-0.5909585918400966,44.81060988973802],[-0.590879501047489,44.81061193609171],[-0.5905232485977291,44.810552647589326],[-0.5902234056482158,44.8105213046118],[-0.5900801846626157,44.81051771753086],[-0.5897444609170819,44.8105137195487],[-0.5896315190587665,44.81053710171911]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":217.9115167842337,"sectionId":"27462-22866","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6021125593266066,44.796799076337216],[-0.601778041738363,44.79705010191015],[-0.6015717121996816,44.79718815701013],[-0.6014062180306077,44.79728726403015],[-0.6002719999343514,44.79794600713293],[-0.600032246774405,44.798081784266614]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":11.012374452098957,"sectionId":"27462-20149","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6021125593266066,44.796799076337216],[-0.6022145735222436,44.796866559883405]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":65.55382682099903,"sectionId":"27462-as=125061","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6024211081568865,44.796556538702916],[-0.6021125593266066,44.796799076337216]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":11.012374452098957,"sectionId":"20149-27462","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6021125593266066,44.796799076337216],[-0.6022145735222436,44.796866559883405]]}},{"type":"Feature","properties":{"name":"Avenue Pey-Berland","distance":449.4555122633761,"sectionId":"20149-25611","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6061927458767559,44.79975627139223],[-0.6059317490517415,44.799578616180426],[-0.6022145735222436,44.796866559883405]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":219.6067302119729,"sectionId":"20149-19939","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6001156711618988,44.798157515156575],[-0.6007363153333832,44.797795913029184],[-0.6011471230819231,44.797560941994476],[-0.601624488781473,44.797285666493565],[-0.6019543238940018,44.79706091369991],[-0.6022145735222436,44.796866559883405]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":47.73120500416763,"sectionId":"20149-as=124830","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6022145735222436,44.796866559883405],[-0.6026178012516087,44.79654680953026]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":11.461572143311226,"sectionId":"29095-29094","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5965714569927393,44.80037406839496],[-0.5965496063379294,44.80035845449937],[-0.5964961619808105,44.80033330006744],[-0.59644967915179,44.800320356824194]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":38.02598991989588,"sectionId":"29095-29089","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5965703030351481,44.8006820962064],[-0.5966105078610685,44.80064713400643],[-0.5966399934201979,44.800606655431295],[-0.5966571152591831,44.800562694304766],[-0.5966609809813749,44.80051717058117],[-0.596651461465492,44.80047207015828],[-0.5966289326868998,44.80042936295386],[-0.5965945226617212,44.80039090501591],[-0.5965714569927393,44.80037406839496]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":179.0481517770969,"sectionId":"29095-22876","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5965714569927393,44.80037406839496],[-0.5966065505768284,44.80029368618983],[-0.5966421564433161,44.800243825663614],[-0.5966890680479796,44.80019468857001],[-0.5967895070909665,44.80011728434324],[-0.5970630569834293,44.79995513252617],[-0.5981996355267528,44.79928031462285]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":182.41654101047672,"sectionId":"29094-20148","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5981196130069676,44.79920231276052],[-0.597256936689572,44.79972064159159],[-0.5967529805243248,44.800022591958026],[-0.5966733187427891,44.80008015155433],[-0.5966113719988965,44.80013165584795],[-0.5965555336345896,44.80019386689131],[-0.59644967915179,44.800320356824194]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":11.461572143311226,"sectionId":"29094-29095","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5965714569927393,44.80037406839496],[-0.5965496063379294,44.80035845449937],[-0.5964961619808105,44.80033330006744],[-0.59644967915179,44.800320356824194]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":43.13883337642083,"sectionId":"29094-38609","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.59644967915179,44.800320356824194],[-0.5964365410597219,44.8003166285008],[-0.5963733139310687,44.80030907916642],[-0.5963094185501041,44.800311099648546],[-0.5962473803957882,44.800322610089026],[-0.5961900701269465,44.800342979222755],[-0.5961399683688416,44.800371407962906],[-0.5960992695628712,44.8004065657782],[-0.5960696574508229,44.800447048207396],[-0.5960526614748141,44.800491005252994],[-0.5960516029257379,44.800504460980235]]}},{"type":"Feature","properties":{"name":"Avenue des Erables","distance":253.12580082191295,"sectionId":"16537-16583","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6222925693597104,44.810466415289795],[-0.6232630403559571,44.81263813827225]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Nancel Pénard","distance":64.33912267051146,"sectionId":"16537-16538","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6222925693597104,44.810466415289795],[-0.6230681813424483,44.8102911840886]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Nancel Pénard","distance":22.01956833232724,"sectionId":"16537-as=125781","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6207934155278639,44.8108114736739],[-0.6222925693597104,44.810466415289795]]}},{"type":"Feature","properties":{"name":"Avenue des Erables","distance":253.12580082191295,"sectionId":"16583-16537","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6222925693597104,44.810466415289795],[-0.6232630403559571,44.81263813827225]]}},{"type":"Feature","properties":{"name":"Rue Robert Escarpit","distance":297.62452915871484,"sectionId":"30942-29759","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6095170708821552,44.80091872951914],[-0.609645861768104,44.80123173384342],[-0.6098627747233983,44.801652743087374],[-0.6100256344382521,44.80197025086304],[-0.6102145576305503,44.80231800974073],[-0.6102746480075385,44.802519869898916],[-0.6102833204074737,44.80270885886091],[-0.6102606287240187,44.80287587226174],[-0.6101937762554739,44.803418672063685],[-0.6101889075141375,44.80350458555031]]}},{"type":"Feature","properties":{"name":"Rue Robert Escarpit","distance":146.32551694032168,"sectionId":"30942-29758","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6101889075141375,44.80350458555031],[-0.6101801842884359,44.80365421992753],[-0.610206470894454,44.803867872979],[-0.6102692445527341,44.80406406284131],[-0.6105283300895166,44.80455814100816],[-0.6106006068118239,44.804776729961674]]}},{"type":"Feature","properties":{"name":"Allée Geoffroy Saint Hilaire","distance":225.03711890579635,"sectionId":"30942-16677","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6075186009733935,44.80418854536408],[-0.6100017784272912,44.80351286738155],[-0.6101889075141375,44.80350458555031]]}},{"type":"Feature","properties":{"name":"Rue Robert Escarpit","distance":146.32551694032168,"sectionId":"29758-30942","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6101889075141375,44.80350458555031],[-0.6101801842884359,44.80365421992753],[-0.610206470894454,44.803867872979],[-0.6102692445527341,44.80406406284131],[-0.6105283300895166,44.80455814100816],[-0.6106006068118239,44.804776729961674]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":31.81117903719622,"sectionId":"29758-16532","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6106006068118239,44.804776729961674],[-0.6105555555458666,44.804784736149614],[-0.6105129720634351,44.80479779870992],[-0.6104738497376451,44.804815615860576],[-0.6104392913358336,44.80483761210394],[-0.6104101470629192,44.8048632199577],[-0.610387014558631,44.80489187995684],[-0.6103708590590293,44.80492284080355],[-0.6103617505497511,44.804955199451264],[-0.6103603574437853,44.80497740406887]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":18.316983191160908,"sectionId":"29758-16531","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6108199774483072,44.80481444701006],[-0.6107808001779206,44.8047970435848],[-0.610738110337762,44.804784165720726],[-0.6106929576121422,44.80477641067098],[-0.610646742377925,44.804773914143865],[-0.6106006068118239,44.804776729961674]]}},{"type":"Feature","properties":{"name":"Rue Pierre Curie","distance":178.7880040760648,"sectionId":"25389-20296","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5887035242411404,44.810498010601194],[-0.5885869552620311,44.811032269844475],[-0.5885868525057598,44.811089565096644],[-0.5886814800999837,44.81154437538894],[-0.5886991732985334,44.81157651688587],[-0.5887240558786314,44.811600144042565],[-0.5887597569719424,44.81161460187101],[-0.5888038793038597,44.811622037871665],[-0.589314061184245,44.81162305646567],[-0.5893995354674162,44.81164017740682]]}},{"type":"Feature","properties":{"name":"Rue Jacques Chaban Delmas","distance":14.615847701942995,"sectionId":"25389-30059","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5893995354674162,44.81164017740682],[-0.5893946812002283,44.81164960900728],[-0.5893917698490269,44.8116719510796],[-0.5893974469546659,44.81169402214993],[-0.5894113591477376,44.81171421189336],[-0.5894322745472114,44.81173102778901],[-0.5894588461655127,44.81174316110927],[-0.5894712877183582,44.81174583129971]]}},{"type":"Feature","properties":{"name":"Rue Jacques Chaban Delmas","distance":9.935936054409408,"sectionId":"25389-30057","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5894924222691592,44.81158734105841],[-0.5894789472944313,44.811588396836235],[-0.5894497313444721,44.811596795535],[-0.589424772230038,44.81161055489405],[-0.5894060291727687,44.81162862219449],[-0.5893995354674162,44.81164017740682]]}},{"type":"Feature","properties":{"name":"Rue Jacques Chaban Delmas","distance":14.615847701942995,"sectionId":"30059-25389","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5893995354674162,44.81164017740682],[-0.5893946812002283,44.81164960900728],[-0.5893917698490269,44.8116719510796],[-0.5893974469546659,44.81169402214993],[-0.5894113591477376,44.81171421189336],[-0.5894322745472114,44.81173102778901],[-0.5894588461655127,44.81174316110927],[-0.5894712877183582,44.81174583129971]]}},{"type":"Feature","properties":{"name":"Rue Jacques Chaban Delmas","distance":32.82909282405267,"sectionId":"30059-30057","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5894712877183582,44.81174583129971],[-0.5894889915955749,44.811749686662],[-0.5895205357187211,44.81175022267025],[-0.5895511995099065,44.8117447509677],[-0.5895784681385476,44.8117335310762],[-0.589600623776862,44.8117174279415],[-0.589615723996806,44.81169776400813],[-0.5896229686826812,44.81167591575606],[-0.5896215689214397,44.811653439472536],[-0.5896116367034588,44.81163213325877],[-0.5895941513251375,44.811613497602615],[-0.5895700808805486,44.811598853178495],[-0.5895415301630279,44.81158948479116],[-0.5895103009684368,44.81158587607232],[-0.5894924222691592,44.81158734105841]]}},{"type":"Feature","properties":{"name":"Rue Jacques Chaban Delmas","distance":82.51186263940376,"sectionId":"30059-30058","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5893594529373799,44.81248406737403],[-0.5893886249477766,44.81236928349199],[-0.5894599697557291,44.81182419928541],[-0.5894712877183582,44.81174583129971]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":13.371123386008321,"sectionId":"23329-23331","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6000262959420235,44.806251188302866],[-0.600060223085032,44.80627371606054],[-0.6000995468708117,44.806291478794876],[-0.6001424767978303,44.80630417284332],[-0.600171475528634,44.80630856983659]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":16.573352880365977,"sectionId":"23329-23317","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.600171475528634,44.80630856983659],[-0.6001879688616436,44.806311290751964],[-0.6002343700708929,44.806312704675065],[-0.600280538200863,44.80630836068337],[-0.6003248371071614,44.806298400647876],[-0.6003661414122264,44.80628304035933],[-0.6003712714452328,44.80628008541878]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":37.66412317589656,"sectionId":"23329-53586","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.600171475528634,44.80630856983659],[-0.6002370989939261,44.80635639834469],[-0.6002826991601264,44.806417922566894],[-0.6003802276684883,44.80660833529063]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":16.573352880365977,"sectionId":"23317-23329","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.600171475528634,44.80630856983659],[-0.6001879688616436,44.806311290751964],[-0.6002343700708929,44.806312704675065],[-0.600280538200863,44.80630836068337],[-0.6003248371071614,44.806298400647876],[-0.6003661414122264,44.80628304035933],[-0.6003712714452328,44.80628008541878]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":9.9062642621911,"sectionId":"23317-23133","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6003712714452328,44.80628008541878],[-0.6004029693428196,44.8062628672184],[-0.6004343442787473,44.80623845263771],[-0.6004552821986776,44.80621508908806]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":34.75371038026277,"sectionId":"23317-53583","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.600500201452968,44.806578093243665],[-0.6003911459816946,44.80636530484626],[-0.6003712714452328,44.80628008541878]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":11.84295632015308,"sectionId":"25438-649","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5999951036373583,44.806025258018686],[-0.5999857389047671,44.806035373400114],[-0.5999680339751972,44.806065931207954],[-0.5999579091474151,44.80609832099349],[-0.599956256747319,44.80612656908074]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":15.246299081898979,"sectionId":"25438-23331","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.599956256747319,44.80612656908074],[-0.5999559228819504,44.806131354014994],[-0.5999620246643437,44.806164221128526],[-0.5999761415146336,44.80619575357184],[-0.5999975914733543,44.80622516218688],[-0.6000262959420235,44.806251188302866]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":8.801537498063256,"sectionId":"26731-20352","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6007358852897697,44.80735466712789],[-0.6008390553247239,44.80732491684311]]}},{"type":"Feature","properties":{"name":"Rue de la Vieille Tour","distance":34.725279131029644,"sectionId":"26731-20392","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6004399085619743,44.807585639041214],[-0.6007358852897697,44.80735466712789]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":24.197450655317496,"sectionId":"26731-25654","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6007358852897697,44.80735466712789],[-0.6008795044312589,44.807547040725375]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":77.51928063771237,"sectionId":"26731-53585","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6004237858826246,44.806693377047004],[-0.6006164642014908,44.80706955323045],[-0.6007358852897697,44.80735466712789]]}},{"type":"Feature","properties":{"name":"Rue du Général Margueritte","distance":135.90582525114897,"sectionId":"19999-37097","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5880356658461944,44.80012688090375],[-0.5880231571514054,44.80010682695326],[-0.588015116049456,44.80008537090995],[-0.5880124057429235,44.80006825077964],[-0.588013315841325,44.80004831397582],[-0.5883960860467061,44.79893904008061]]}},{"type":"Feature","properties":{"name":"Rue du Général Margueritte","distance":97.86211014506463,"sectionId":"19999-19991","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5877041787751051,44.80096663185932],[-0.5879596389119017,44.8001921565681],[-0.5879684525217116,44.800179267056144],[-0.5879797101290751,44.80016702109408],[-0.5880356658461944,44.80012688090375]]}},{"type":"Feature","properties":{"name":"Rue de Verdun","distance":64.86481200022105,"sectionId":"19999-20170","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5880356658461944,44.80012688090375],[-0.5888327396472829,44.80026468961341]]}},{"type":"Feature","properties":{"name":"Rue du Maréchal Foch","distance":137.2763505251308,"sectionId":"20170-20004","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5888327396472829,44.80026468961341],[-0.5892437059848279,44.799063900248946]]}},{"type":"Feature","properties":{"name":"Rue de Verdun","distance":55.14445662696081,"sectionId":"20170-20001","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5888327396472829,44.80026468961341],[-0.5895090725482314,44.800385584844534]]}},{"type":"Feature","properties":{"name":"Rue de Verdun","distance":64.86481200022105,"sectionId":"20170-19999","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5880356658461944,44.80012688090375],[-0.5888327396472829,44.80026468961341]]}},{"type":"Feature","properties":{"name":"Avenue Prévost","distance":99.02586638296772,"sectionId":"20407-25955","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6032483547232231,44.80789937519473],[-0.6032584369381895,44.807807622033835],[-0.6032463633667129,44.80769747323436],[-0.6031835001439588,44.80757443006975],[-0.6029063912671518,44.80705235166629]]}},{"type":"Feature","properties":{"name":"Avenue Prévost","distance":38.25143560853815,"sectionId":"20407-20410","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6029063912671518,44.80705235166629],[-0.6027296980286029,44.80673175962899]]}},{"type":"Feature","properties":{"name":"Avenue de Collegno","distance":75.77637331135824,"sectionId":"20407-20405","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6038053565986792,44.806815962071745],[-0.6033246495961759,44.80694172298992],[-0.6029063912671518,44.80705235166629]]}},{"type":"Feature","properties":{"name":"Rue Debussy","distance":222.28425612596598,"sectionId":"25046-19823","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.604111969837402,44.79685463755314],[-0.6037216585126362,44.797204726582656],[-0.6037028575219571,44.79722577112107],[-0.6036934902817037,44.7972479580397],[-0.6036983070576454,44.79726834425349],[-0.6037165704416053,44.797293348995304],[-0.6051360946018491,44.79834322327829]]}},{"type":"Feature","properties":{"name":"Rue Gabriel Faure","distance":15.623017053244986,"sectionId":"25046-26871","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.604111969837402,44.79685463755314],[-0.6041333633495584,44.79686494963479],[-0.6041639657718203,44.79687280787559],[-0.6041963550463374,44.796874844185176],[-0.6042283621381364,44.796870766974635],[-0.6042578629736161,44.796861003894286],[-0.6042828653712338,44.79684606849776],[-0.6042882382750667,44.79684094366318]]}},{"type":"Feature","properties":{"name":"Rue Gabriel Faure","distance":15.360667000661985,"sectionId":"25046-25245","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.604094233275002,44.79673079546311],[-0.6040806537445562,44.79674428781476],[-0.6040690420189989,44.796766996318645],[-0.6040663083311959,44.796790054040066],[-0.6040719138993855,44.79681293755851],[-0.6040857519524935,44.79683393868597],[-0.6041065961696062,44.79685165496167],[-0.604111969837402,44.79685463755314]]}},{"type":"Feature","properties":{"name":"Rue Robespierre","distance":61.11285102080789,"sectionId":"19843-19679","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5838043431839468,44.80837808926339],[-0.5830314995900483,44.808371088178305]]}},{"type":"Feature","properties":{"name":"Rue Dourout","distance":45.37496411529443,"sectionId":"19843-as=128441","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5830314995900483,44.808371088178305],[-0.5829533291412462,44.808775800980634]]}},{"type":"Feature","properties":{"name":"Rue Robespierre","distance":32.805673458179434,"sectionId":"19843-as=4624","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5830314995900483,44.808371088178305],[-0.5826167316320662,44.80836364546584]]}},{"type":"Feature","properties":{"name":"Impasse Doyen Henri Vizioz","distance":106.08871455711692,"sectionId":"19845-19844","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5958535522035362,44.81201358750806],[-0.5956737382215742,44.812028009427486],[-0.5954147285449465,44.81212600812668],[-0.5950539714450978,44.81219560304909],[-0.5949821653898325,44.81223129282504],[-0.594871339916261,44.81231704014313],[-0.5946333376497162,44.81235014458704]]}},{"type":"Feature","properties":{"name":"Rue du Professeur Arnozan","distance":12.392216717418354,"sectionId":"20314-20316","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5880525730551078,44.80870096572785],[-0.5880009960901588,44.8086936745718],[-0.5879490890951463,44.80869531189805],[-0.5878989934571109,44.80870572007875]]}},{"type":"Feature","properties":{"name":"Rue du Professeur Arnozan","distance":16.20968836432482,"sectionId":"20314-19601","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5877737931600661,44.80881470450807],[-0.5877891905082092,44.80878151917059],[-0.5878168520114754,44.80875019903867],[-0.5878542230141327,44.8087244279529],[-0.5878989934571109,44.80870572007875]]}},{"type":"Feature","properties":{"name":"Rue du Professeur Arnozan","distance":165.91247489355774,"sectionId":"20314-29243","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5878989934571109,44.80870572007875],[-0.5878985733962901,44.808656278438136],[-0.5879133190691808,44.808610592268735],[-0.5881589115750767,44.80821783574398],[-0.588322763537062,44.80795530317108],[-0.5885370847150049,44.80761929278278],[-0.5886581373609443,44.80743765211994],[-0.5886778278341419,44.80737181164313],[-0.5886892546935539,44.80732974323805]]}},{"type":"Feature","properties":{"name":"Rue du Professeur Arnozan","distance":17.869311247666648,"sectionId":"20313-19601","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5878411980233785,44.808960402602814],[-0.5878295212829524,44.80895374453358],[-0.5877980712366706,44.80892419881176],[-0.5877774777567956,44.80889016688674],[-0.5877690061891921,44.80885368073574],[-0.5877737931600661,44.80881470450807]]}},{"type":"Feature","properties":{"name":"Rue du Professeur Arnozan","distance":16.501191075786526,"sectionId":"20313-20312","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5876967809948078,44.80906765093253],[-0.5878411980233785,44.808960402602814]]}},{"type":"Feature","properties":{"name":"Rue du Professeur Arnozan","distance":31.73240214800459,"sectionId":"20313-20315","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5878411980233785,44.808960402602814],[-0.5878699478536283,44.80897706171185],[-0.5879169880987768,44.80899278355843],[-0.5879680545444791,44.80900000078214],[-0.5880199618127187,44.8089983634471],[-0.5880699313891591,44.80898795919719],[-0.5881148338577947,44.808969337159716],[-0.5881522048686085,44.808943565977096],[-0.5881797231688719,44.80891198002606]]}},{"type":"Feature","properties":{"name":"Rue du Professeur Arnozan","distance":16.20968836432482,"sectionId":"19601-20314","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5877737931600661,44.80881470450807],[-0.5877891905082092,44.80878151917059],[-0.5878168520114754,44.80875019903867],[-0.5878542230141327,44.8087244279529],[-0.5878989934571109,44.80870572007875]]}},{"type":"Feature","properties":{"name":"Rue du Professeur Arnozan","distance":17.869311247666648,"sectionId":"19601-20313","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5878411980233785,44.808960402602814],[-0.5878295212829524,44.80895374453358],[-0.5877980712366706,44.80892419881176],[-0.5877774777567956,44.80889016688674],[-0.5877690061891921,44.80885368073574],[-0.5877737931600661,44.80881470450807]]}},{"type":"Feature","properties":{"name":"Rue Ambroise Pare","distance":31.141710877522698,"sectionId":"19601-as=129078","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5873770289998756,44.808771890909945],[-0.5877737931600661,44.80881470450807]]}},{"type":"Feature","properties":{"name":"Rue de Megret","distance":68.27216480380936,"sectionId":"20209-20210","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5890841607714429,44.8035065501129],[-0.5893277101316055,44.80291684525887]]}},{"type":"Feature","properties":{"name":"Rue de Tremeuge","distance":62.714328059835836,"sectionId":"20209-20388","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5900930684965086,44.803064835654624],[-0.5893277101316055,44.80291684525887]]}},{"type":"Feature","properties":{"name":"Rue de Megret","distance":194.1286109378141,"sectionId":"20209-19988","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5893277101316055,44.80291684525887],[-0.5899764767772134,44.80123120461399]]}},{"type":"Feature","properties":{"name":"Rue de Tremeuge","distance":109.11536202214292,"sectionId":"20209-20268","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5893277101316055,44.80291684525887],[-0.5879957097363121,44.802660342236095]]}},{"type":"Feature","properties":{"name":"Rue Rosa Bonheur","distance":74.16498899229559,"sectionId":"16885-16461","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6298909344003979,44.80713449809973],[-0.6307440648849332,44.806857015563125]]}},{"type":"Feature","properties":{"name":"Rue Herman Lemoine","distance":20.443367462590878,"sectionId":"16885-16882","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6307440648849332,44.806857015563125],[-0.6308228069958516,44.80703232765483]]}},{"type":"Feature","properties":{"name":"Rue Herman Lemoine","distance":71.93448215954267,"sectionId":"16885-16884","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6306234818854873,44.80621829611289],[-0.6306365218612896,44.80626661526872],[-0.6306450702024092,44.80635813790758],[-0.6306486321612742,44.8063745095646],[-0.6306590124033353,44.806398681046375],[-0.6306750517124591,44.806430329018575],[-0.6306803317925543,44.806457906319956],[-0.6306849891099978,44.80664837521006],[-0.6306929410031198,44.80668622687498],[-0.6307440648849332,44.806857015563125]]}},{"type":"Feature","properties":{"name":"Avenue des Roses","distance":172.04781601700324,"sectionId":"16390-16031","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6225024468729391,44.80605356820456],[-0.6203579837622806,44.80579151082335]]}},{"type":"Feature","properties":{"name":"Avenue de Chiquet","distance":226.58752450479852,"sectionId":"16390-16391","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6225024468729391,44.80605356820456],[-0.6224613147631213,44.80599506275945],[-0.6224417892651352,44.805895782007745],[-0.6224407517219616,44.805808794384184],[-0.6224477000784474,44.805726056595354],[-0.6224749750294986,44.80563654574861],[-0.6226454477593392,44.80532285044612],[-0.6233837381286472,44.80430535103232],[-0.6234301620012386,44.80417829556763]]}},{"type":"Feature","properties":{"name":"Avenue de Chiquet","distance":17.712598543394254,"sectionId":"16390-16389","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6226363449300576,44.80618073546984],[-0.6225543114140023,44.806113713653644],[-0.6225024468729391,44.80605356820456]]}},{"type":"Feature","properties":{"name":"Place de la Rotonde","distance":28.410448661685233,"sectionId":"16345-16647","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6211277020072631,44.80020345272752],[-0.6210962280620484,44.80020193251621],[-0.6210604341508559,44.800204153181646],[-0.6210256519866348,44.80021039538001],[-0.6209926279117554,44.800220455181694],[-0.6209623664605869,44.80023421052297],[-0.6209356026851959,44.800251277668224],[-0.6209129397183759,44.80027118699994],[-0.620895101322692,44.800293374976256],[-0.6208825643659315,44.80031737599955],[-0.6208754813095524,44.80034561747293]]}},{"type":"Feature","properties":{"name":"Place de la Rotonde","distance":25.83447993838288,"sectionId":"16345-15940","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.621319849440657,44.80036588083269],[-0.6213186695944687,44.800341055352014],[-0.6213114060205586,44.800316063253675],[-0.6212985166110381,44.80029215112416],[-0.6212804253703502,44.8002700261308],[-0.6212575506546714,44.80025030553417],[-0.6212305520699511,44.80023341874604],[-0.6212000948648919,44.80021988508263],[-0.6211669536217501,44.80020995012894],[-0.6211277020072631,44.80020345272752]]}},{"type":"Feature","properties":{"name":"Avenue des Chasseurs","distance":118.24916588200344,"sectionId":"16345-16346","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6211277020072631,44.80020345272752],[-0.6213004097149313,44.79914595828795]]}},{"type":"Feature","properties":{"name":"Rue du Sable","distance":166.98875271527916,"sectionId":"16185-27338","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6164543226763436,44.803260855030295],[-0.6168285557962804,44.80209841143373],[-0.6168791979063539,44.80194158747085],[-0.6168391325300605,44.80186566024569],[-0.6167556010158722,44.80183102215729]]}},{"type":"Feature","properties":{"name":"Avenue Marc Desbats","distance":110.2466275822656,"sectionId":"16185-16509","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.615239654429878,44.802825724109816],[-0.6153253922776348,44.802909658776635],[-0.6154169921340998,44.802982146643814],[-0.6155701253983191,44.803037093951346],[-0.6161896625291661,44.80318089852451],[-0.616276575552105,44.8032008360743],[-0.6163431484066114,44.80321925830456],[-0.6164543226763436,44.803260855030295]]}},{"type":"Feature","properties":{"name":"Avenue Marc Desbats","distance":25.858874372526277,"sectionId":"16185-as=3996","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6164543226763436,44.803260855030295],[-0.6167453060802395,44.80336708893274]]}},{"type":"Feature","properties":{"name":"Rue André Pujol","distance":92.57940859568856,"sectionId":"27888-17246","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6324496511934334,44.80593829283401],[-0.6324844789986086,44.80605924437815],[-0.6325908846172884,44.80652085973066],[-0.6325879215274339,44.80659833652428],[-0.6325669597352549,44.80664521908078],[-0.6325405304841869,44.80668164633392],[-0.6324539626388954,44.80672359754805]]}},{"type":"Feature","properties":{"name":"Rue Etienne Marcel","distance":28.27382709586264,"sectionId":"27888-27887","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6321219936157869,44.80681716620748],[-0.6322493369730197,44.80678571413149],[-0.6324150830141619,44.806739162560774],[-0.6324539626388954,44.80672359754805]]}},{"type":"Feature","properties":{"name":"Rue Etienne Marcel","distance":63.000513736069166,"sectionId":"27888-16589","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6324539626388954,44.80672359754805],[-0.6325920429160863,44.8067159446926],[-0.6327101795127357,44.8067110906548],[-0.6332361872648015,44.80662438438843]]}},{"type":"Feature","properties":{"name":"Avenue Jean Babin","distance":12.087600165086242,"sectionId":"24466-24465","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6156768201359397,44.79399961355941],[-0.6156526050200689,44.79398669082804],[-0.6156264329505059,44.79397887497639],[-0.6155989374492497,44.793974164029656],[-0.6155706291935013,44.79397263183339],[-0.6155333858256525,44.793975887879235]]}},{"type":"Feature","properties":{"name":"Avenue Jean Babin","distance":31.229778472679072,"sectionId":"24466-24467","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6155333858256525,44.793975887879235],[-0.6155150003343454,44.79397926501141],[-0.6154889310513023,44.79398721043652],[-0.6154650679663705,44.79399805846027],[-0.6154440254664889,44.79401151930165],[-0.6154261541432936,44.79402713139891],[-0.6154120740266681,44.79404469487382],[-0.6154021244365604,44.794063568357515],[-0.6153966616078093,44.794083380192184],[-0.6153956460811245,44.79410350104953],[-0.6153991815732995,44.79412356730009],[-0.615407096727245,44.7941428637257],[-0.6154193689965467,44.794161030707826],[-0.6154355914160596,44.794177630769035],[-0.6154612586161684,44.79419555204469]]}},{"type":"Feature","properties":{"name":"Avenue Camille Jullian","distance":22.91535055457348,"sectionId":"24466-as=129160","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6155333858256525,44.793975887879235],[-0.6154316421681246,44.79378271545963]]}},{"type":"Feature","properties":{"name":"Avenue Jean Babin","distance":31.229778472679072,"sectionId":"24467-24466","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6155333858256525,44.793975887879235],[-0.6155150003343454,44.79397926501141],[-0.6154889310513023,44.79398721043652],[-0.6154650679663705,44.79399805846027],[-0.6154440254664889,44.79401151930165],[-0.6154261541432936,44.79402713139891],[-0.6154120740266681,44.79404469487382],[-0.6154021244365604,44.794063568357515],[-0.6153966616078093,44.794083380192184],[-0.6153956460811245,44.79410350104953],[-0.6153991815732995,44.79412356730009],[-0.615407096727245,44.7941428637257],[-0.6154193689965467,44.794161030707826],[-0.6154355914160596,44.794177630769035],[-0.6154612586161684,44.79419555204469]]}},{"type":"Feature","properties":{"name":"Avenue Jean Babin","distance":188.83428035354547,"sectionId":"24467-15887","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6154612586161684,44.79419555204469],[-0.6152358745688526,44.79442855631564],[-0.6150797995591784,44.79463503429334],[-0.6150024983682802,44.79474397006756],[-0.6148701229340214,44.79495113564059],[-0.6144286227959143,44.79572258881573]]}},{"type":"Feature","properties":{"name":"Avenue Jean Babin","distance":16.29322356557697,"sectionId":"24467-24464","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6154612586161684,44.79419555204469],[-0.6154779893937518,44.79420411852564],[-0.6155031154014182,44.79421340900411],[-0.6155300811831919,44.794219758318505],[-0.615557985997172,44.7942229248549],[-0.6155863191564409,44.794222834767886],[-0.6156143230908581,44.794219512143265],[-0.6156411139730908,44.79421298508247],[-0.6156559924187647,44.79421016985492]]}},{"type":"Feature","properties":{"name":"Avenue Léon Duguit","distance":161.92766372085768,"sectionId":"16523-17043","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6197420186573377,44.79791674542534],[-0.6194786248644971,44.79783045100641],[-0.6193415050909358,44.79783292325726],[-0.6178180737614022,44.79822614617144]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":108.3525881084446,"sectionId":"16523-as=126002","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6197420186573377,44.79791674542534],[-0.619674985431359,44.79806220178395],[-0.6196534263183395,44.79814603499814],[-0.6195621258338636,44.79854783037248],[-0.61954823353056,44.79862682528336],[-0.6195334642132676,44.798693867006456],[-0.6195059889727553,44.79877617687853],[-0.6194440544979725,44.798863817364484],[-0.6194440544979725,44.798863817364484]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":6.929442102040447,"sectionId":"16523-as=126515","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6197420186573377,44.79791674542534],[-0.6197420186573377,44.79791674542534]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":218.5911599528599,"sectionId":"16524-16525","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6193705422846755,44.79893633192673],[-0.6192666141752466,44.799022155831324],[-0.6191949743718183,44.79908217916486],[-0.6191225174967163,44.79913322010869],[-0.6177134374746924,44.79998024457636],[-0.617381254762092,44.80015683440266],[-0.6172610122507112,44.800198493889766]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":6.299992852194525,"sectionId":"16524-16505","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6194418446698561,44.798961628216425],[-0.6193705422846755,44.79893633192673]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":"Unknown","sectionId":"16524-as=126002","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6194440544979725,44.798863817364484],[-0.6193705422846755,44.79893633192673]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":19.54625937637842,"sectionId":"16532-16515","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6103603574437853,44.80497740406887],[-0.6103658722406546,44.80502100931274],[-0.6103789898494902,44.805052662443366],[-0.6103989517907268,44.805082476822214],[-0.6104254491939214,44.80510956142019],[-0.610457696199699,44.805133490765726]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":223.05849514408268,"sectionId":"16532-16418","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6103603574437853,44.80497740406887],[-0.6102416731476096,44.80505630049977],[-0.6093609804982133,44.805292703326025],[-0.6089328820933197,44.80542366556679],[-0.6085024915423672,44.805586768337015],[-0.6081042800352606,44.80578893545684],[-0.6078964088953601,44.80591678083899]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":31.81117903719622,"sectionId":"16532-29758","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6106006068118239,44.804776729961674],[-0.6105555555458666,44.804784736149614],[-0.6105129720634351,44.80479779870992],[-0.6104738497376451,44.804815615860576],[-0.6104392913358336,44.80483761210394],[-0.6104101470629192,44.8048632199577],[-0.610387014558631,44.80489187995684],[-0.6103708590590293,44.80492284080355],[-0.6103617505497511,44.804955199451264],[-0.6103603574437853,44.80497740406887]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":10.921982831656416,"sectionId":"16533-24049","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6234178340187196,44.79431128839112],[-0.6234293696050142,44.79429353467743],[-0.6234423775206727,44.79426096032506],[-0.623447983227195,44.79422736066147],[-0.6234472882692765,44.79421630251364]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":24.172520685249022,"sectionId":"16533-16499","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6231775707522589,44.79442983674528],[-0.6232246360340484,44.794423832992166],[-0.6232697548294568,44.79441302671984],[-0.6233116419193608,44.79439709854741],[-0.6233495792825354,44.79437670194018],[-0.6233823212594589,44.794352146845085],[-0.6234091554857965,44.794324176632806],[-0.6234178340187196,44.79431128839112]]}},{"type":"Feature","properties":{"name":"Avenue du Maréchal Juin","distance":300.1616390718817,"sectionId":"16533-16722","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6234178340187196,44.79431128839112],[-0.6237221181089105,44.79435185913626],[-0.6247273891165576,44.79453692240349],[-0.6249724780782864,44.79455352265644],[-0.6252296224110706,44.794548568385494],[-0.6254792438607671,44.79452457544526],[-0.6258143132994877,44.79445713964546],[-0.6270886859262708,44.794153454899394]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":10.921982831656416,"sectionId":"24049-16533","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6234178340187196,44.79431128839112],[-0.6234293696050142,44.79429353467743],[-0.6234423775206727,44.79426096032506],[-0.623447983227195,44.79422736066147],[-0.6234472882692765,44.79421630251364]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":15.777696480927105,"sectionId":"24049-27234","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6234472882692765,44.79421630251364],[-0.6234458588040597,44.79419355689098],[-0.6234360607683638,44.794160448048565],[-0.6234190187604384,44.794128831195835],[-0.6233951680713367,44.79409959329795],[-0.623379009221982,44.79408605511891]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Roger Marcade","distance":87.98652237629899,"sectionId":"16542-16429","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.629585442485553,44.809839194970834],[-0.6293560511976012,44.809064046406846]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Nancel Pénard","distance":13.960999402863148,"sectionId":"16542-24369","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.629184852615813,44.80908644455927],[-0.6292866856569652,44.80908184416916],[-0.6293100458423282,44.80907902688786],[-0.6293323634785113,44.809073720518974],[-0.6293560511976012,44.809064046406846]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Nancel Pénard","distance":10.88570633035663,"sectionId":"16542-30479","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6293560511976012,44.809064046406846],[-0.6293719767148879,44.80905570096907],[-0.6293881639829623,44.80904347357378],[-0.6294015915521055,44.809029622638924],[-0.6294115186519919,44.80901444205471],[-0.6294179679267837,44.80899829143424],[-0.629420588809221,44.80898163238363]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Nancel Pénard","distance":10.88570633035663,"sectionId":"30479-16542","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6293560511976012,44.809064046406846],[-0.6293719767148879,44.80905570096907],[-0.6293881639829623,44.80904347357378],[-0.6294015915521055,44.809029622638924],[-0.6294115186519919,44.80901444205471],[-0.6294179679267837,44.80899829143424],[-0.629420588809221,44.80898163238363]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Nancel Pénard","distance":47.92153521317158,"sectionId":"30479-16430","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.629420588809221,44.80898163238363],[-0.629652082695442,44.80898028122187],[-0.6298357784740931,44.80896342907721],[-0.6300172199596933,44.80892484828186]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Nancel Pénard","distance":60.26340626305801,"sectionId":"30479-as=124743","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.629420588809221,44.80898163238363],[-0.6294196565290228,44.80896481645575],[-0.6294148261779847,44.8089483951602],[-0.6294063729855621,44.80893272004912],[-0.6293945778425069,44.80891823257752],[-0.6293795896871496,44.8089052883294],[-0.6293618100380457,44.80889423482468],[-0.6293417610440407,44.808885325654884],[-0.6293200911471531,44.80887881038025],[-0.6292971905398143,44.80887485671662],[-0.6292736963422004,44.80887353441843],[-0.6287725252732359,44.80890087469299],[-0.6287495026144481,44.80890503235491],[-0.6287495026144481,44.80890503235491]]}},{"type":"Feature","properties":{"name":"Rue Edouard Herriot","distance":61.92707946900748,"sectionId":"19863-19864","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5814665934575787,44.80293981469017],[-0.5818440451069568,44.802451306972245]]}},{"type":"Feature","properties":{"name":"Rue Jean Cocteau","distance":73.38936196597737,"sectionId":"19863-19797","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5806009916716915,44.80272159659935],[-0.5811214153243898,44.80289897681461],[-0.5811628656707487,44.80291037317946],[-0.5812126574797136,44.802917543295294],[-0.5814665934575787,44.80293981469017]]}},{"type":"Feature","properties":{"name":"Rue Edouard Herriot","distance":24.406826628925433,"sectionId":"19863-19862","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.581742359284271,44.803038507850836],[-0.5814665934575787,44.80293981469017]]}},{"type":"Feature","properties":{"name":"Rue Francisco Ferrer","distance":58.38365143851038,"sectionId":"24949-19933","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5831112470882293,44.81130090973327],[-0.5823728634221069,44.811295159599865]]}},{"type":"Feature","properties":{"name":"Rue Francisco Ferrer","distance":81.98805554636697,"sectionId":"24949-19934","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5832376806298483,44.810574383277476],[-0.5831321089724198,44.81129043371454],[-0.5831112470882293,44.81130090973327]]}},{"type":"Feature","properties":{"name":"Résidence Parc de Suzon","distance":14.152728515047444,"sectionId":"24949-24956","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5831128403084147,44.81142832487604],[-0.5831112470882293,44.81130090973327]]}},{"type":"Feature","properties":{"name":"Avenue Eugène Et Marc Dulout","distance":16.621446005553718,"sectionId":"16404-36295","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6308082702318089,44.805101932908464],[-0.6310054379205055,44.80505005617093]]}},{"type":"Feature","properties":{"name":"Place de la Cinquième République","distance":41.99686592261216,"sectionId":"16404-16403","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6309416636166261,44.80546791955571],[-0.6308082702318089,44.805101932908464]]}},{"type":"Feature","properties":{"name":"Avenue Louis Laugaa","distance":13.056451284638742,"sectionId":"16404-34733","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6308082702318089,44.805101932908464],[-0.6306521263403831,44.80514015827631]]}},{"type":"Feature","properties":{"name":"Avenue Eugène Et Marc Dulout","distance":16.621446005553718,"sectionId":"36295-16404","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6308082702318089,44.805101932908464],[-0.6310054379205055,44.80505005617093]]}},{"type":"Feature","properties":{"name":"Avenue Eugène Et Marc Dulout","distance":48.52527129235806,"sectionId":"36295-as=126956","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6310054379205055,44.80505005617093],[-0.6315426422940877,44.80483886296448]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":12.125424048530629,"sectionId":"16527-16508","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6153385571934318,44.80267772650684],[-0.6153364654040295,44.802644372137614],[-0.6153268250556507,44.802611708134364],[-0.6153100657452605,44.80258053158951],[-0.615303508186988,44.80257281271715]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":56.52805026919938,"sectionId":"16527-16528","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.615303508186988,44.80257281271715],[-0.6152864964207331,44.80255173351191],[-0.615256667312281,44.80252601707166],[-0.6152213755605574,44.80250398750852],[-0.6151816708648136,44.80248624203316],[-0.6151384709982685,44.802473291968006],[-0.6150929350149372,44.80246546080013],[-0.6150462106887153,44.80246289220998],[-0.6149994457920003,44.80246572988077],[-0.6149540237413818,44.80247383975708],[-0.6149109434836983,44.802487009925166],[-0.6148714565204808,44.80250502044121],[-0.6148365336181026,44.802527209874604],[-0.6148070361770309,44.802553190517365],[-0.6147836711369854,44.802582129156775],[-0.61476728863565,44.80261345827888],[-0.6147625339756065,44.80263045494609]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":299.6037419725218,"sectionId":"16527-16526","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6170348711673813,44.80045800961697],[-0.6170499004003688,44.80055437117076],[-0.6170502946190675,44.80060300361275],[-0.61697962835816,44.80100531093893],[-0.6169503503639924,44.80118803013178],[-0.6169187837436451,44.80134839135547],[-0.6168924403559787,44.801440753744146],[-0.6168568122660602,44.80153638414043],[-0.616825821419348,44.801601058571414],[-0.6167927076211578,44.80167021458375],[-0.6167301170117867,44.801773728855174],[-0.6166342064730959,44.80189875154662],[-0.6165503586931487,44.80199420358758],[-0.6164402360209595,44.80209841836813],[-0.6163112116692124,44.80219782904178],[-0.6161666511965815,44.80229566161493],[-0.6159774135699967,44.802397346684565],[-0.6157918313912205,44.80247864648155],[-0.615571817260901,44.802553653726214],[-0.6154639142190489,44.80257023603777],[-0.6153704507822452,44.802572936844314],[-0.615303508186988,44.80257281271715]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":56.52805026919938,"sectionId":"16528-16527","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.615303508186988,44.80257281271715],[-0.6152864964207331,44.80255173351191],[-0.615256667312281,44.80252601707166],[-0.6152213755605574,44.80250398750852],[-0.6151816708648136,44.80248624203316],[-0.6151384709982685,44.802473291968006],[-0.6150929350149372,44.80246546080013],[-0.6150462106887153,44.80246289220998],[-0.6149994457920003,44.80246572988077],[-0.6149540237413818,44.80247383975708],[-0.6149109434836983,44.802487009925166],[-0.6148714565204808,44.80250502044121],[-0.6148365336181026,44.802527209874604],[-0.6148070361770309,44.802553190517365],[-0.6147836711369854,44.802582129156775],[-0.61476728863565,44.80261345827888],[-0.6147625339756065,44.80263045494609]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":13.353281068862792,"sectionId":"16528-16511","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6147625339756065,44.80263045494609],[-0.6147580792273154,44.80264618091557],[-0.6147563766644196,44.80267956579638],[-0.6147622452297926,44.802712619964204],[-0.6147790223180165,44.802748120007365]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":130.1503849186161,"sectionId":"16528-16529","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6147625339756065,44.80263045494609],[-0.614598453051524,44.802679360079466],[-0.613496601667769,44.802763828463895],[-0.6133540134994483,44.80278421322541],[-0.6131457210272049,44.80282019760035]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":24.667902145537262,"sectionId":"16511-16510","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6147790223180165,44.802748120007365],[-0.614795752078701,44.802774793403024],[-0.6148225199575824,44.802802138670415],[-0.6148551519737177,44.8028261446386],[-0.6148928397129124,44.80284602625028],[-0.614934424102314,44.80286146000727],[-0.6149789817149987,44.80287184467361],[-0.6150150402426817,44.802875833309585]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":13.353281068862792,"sectionId":"16511-16528","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6147625339756065,44.80263045494609],[-0.6147580792273154,44.80264618091557],[-0.6147563766644196,44.80267956579638],[-0.6147622452297926,44.802712619964204],[-0.6147790223180165,44.802748120007365]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":126.26779800757205,"sectionId":"16511-16512","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6132006267363936,44.80286043204193],[-0.6132796930719145,44.80283999364101],[-0.6135067955756608,44.802803321316375],[-0.6144130858114965,44.80273587784009],[-0.6146243232260284,44.80272871420799],[-0.6147790223180165,44.802748120007365]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":313.1190616218841,"sectionId":"16500-16499","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6213182259154546,44.79683321692945],[-0.6213754986914892,44.7967701363326],[-0.6214078181817128,44.79672874971149],[-0.6222035070004565,44.796173176638625],[-0.6224653251436485,44.795922331894936],[-0.6225583555844427,44.79580820526483],[-0.6226574597696795,44.795651816008714],[-0.6227210744785149,44.79548835961729],[-0.623041379539649,44.794585876764295],[-0.6230671298693938,44.79452857390379],[-0.6231164019748372,44.79447916964883],[-0.6231775707522589,44.79442983674528]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":24.259252535994005,"sectionId":"16500-16501","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6212388052444724,44.79702510154128],[-0.6212663286467812,44.79701008200081],[-0.6212903771077768,44.796992110266075],[-0.621309968732785,44.796971668024554],[-0.6213247529603133,44.796949216858536],[-0.6213342642575237,44.79692540217889],[-0.6213382896275583,44.796900861355645],[-0.6213367310466968,44.79687604792815],[-0.6213296449907175,44.79685186093363],[-0.6213182259154546,44.79683321692945]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":10.238402325571663,"sectionId":"16500-16519","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6213182259154546,44.79683321692945],[-0.6212775698220261,44.79678820861615],[-0.6212349465970253,44.796764252395086]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":24.172520685249022,"sectionId":"16499-16533","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6231775707522589,44.79442983674528],[-0.6232246360340484,44.794423832992166],[-0.6232697548294568,44.79441302671984],[-0.6233116419193608,44.79439709854741],[-0.6233495792825354,44.79437670194018],[-0.6233823212594589,44.794352146845085],[-0.6234091554857965,44.794324176632806],[-0.6234178340187196,44.79431128839112]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":313.1190616218841,"sectionId":"16499-16500","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6213182259154546,44.79683321692945],[-0.6213754986914892,44.7967701363326],[-0.6214078181817128,44.79672874971149],[-0.6222035070004565,44.796173176638625],[-0.6224653251436485,44.795922331894936],[-0.6225583555844427,44.79580820526483],[-0.6226574597696795,44.795651816008714],[-0.6227210744785149,44.79548835961729],[-0.623041379539649,44.794585876764295],[-0.6230671298693938,44.79452857390379],[-0.6231164019748372,44.79447916964883],[-0.6231775707522589,44.79442983674528]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":18.784035601369755,"sectionId":"16499-16518","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6229576027525034,44.794378110453],[-0.6229959303669044,44.79439814909484],[-0.6230380271767303,44.79441374362295],[-0.6230832223265556,44.79442428482021],[-0.6231302418987021,44.79442963310357],[-0.6231775707522589,44.79442983674528]]}},{"type":"Feature","properties":{"name":"Avenue François Coppée","distance":51.518570834476904,"sectionId":"16672-16671","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6281220146836525,44.80859624319518],[-0.6282293320247212,44.80850588921426],[-0.6286706524024379,44.80836209049072]]}},{"type":"Feature","properties":{"name":"Avenue François Coppée","distance":58.644815558025456,"sectionId":"16672-16673","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6286706524024379,44.80836209049072],[-0.6293441143335687,44.80814088793653]]}},{"type":"Feature","properties":{"name":"Rue Goya","distance":83.23683538579216,"sectionId":"16672-16269","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6282005990874134,44.807691547607696],[-0.6286706524024379,44.80836209049072]]}},{"type":"Feature","properties":{"name":"Rue Goya","distance":83.07449695351706,"sectionId":"16673-16768","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6293441143335687,44.80814088793653],[-0.628875764665801,44.807471374277796]]}},{"type":"Feature","properties":{"name":"Avenue François Coppée","distance":58.644815558025456,"sectionId":"16673-16672","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6286706524024379,44.80836209049072],[-0.6293441143335687,44.80814088793653]]}},{"type":"Feature","properties":{"name":"Avenue François Coppée","distance":87.90606932512317,"sectionId":"16673-16462","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6293441143335687,44.80814088793653],[-0.6303581801530276,44.807816474705625]]}},{"type":"Feature","properties":{"name":"Avenue de Collegno","distance":67.0682544578046,"sectionId":"16419-16418","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6078964088953601,44.80591678083899],[-0.6078302525593452,44.805872666855656],[-0.6077219503111821,44.80583043016253],[-0.6076431280068599,44.80581644514331],[-0.6075600175791895,44.8058208828806],[-0.6071178372245689,44.805933187131934]]}},{"type":"Feature","properties":{"name":"Allée Fernand Daguin","distance":262.61546110008396,"sectionId":"16419-16677","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6071178372245689,44.805933187131934],[-0.6068737935162611,44.80547285645166],[-0.6068788460365943,44.80544035652477],[-0.6069260040929072,44.8054194932643],[-0.607950940714577,44.805144392773784],[-0.6079819304096579,44.80510377330623],[-0.607974868224023,44.805059676593075],[-0.6075186009733935,44.80418854536408]]}},{"type":"Feature","properties":{"name":"Avenue de Collegno","distance":139.988255719182,"sectionId":"16419-16421","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6071178372245689,44.805933187131934],[-0.6058777899405831,44.806265275312114],[-0.605848050437367,44.80626522721314],[-0.6058186525035695,44.806258502158755],[-0.6058008971288182,44.80624167907911],[-0.6056844644651586,44.806002687415926]]}},{"type":"Feature","properties":{"name":"Allée Geoffroy Saint Hilaire","distance":225.03711890579635,"sectionId":"16677-30942","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6075186009733935,44.80418854536408],[-0.6100017784272912,44.80351286738155],[-0.6101889075141375,44.80350458555031]]}},{"type":"Feature","properties":{"name":"Allée Fernand Daguin","distance":262.61546110008396,"sectionId":"16677-16419","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6071178372245689,44.805933187131934],[-0.6068737935162611,44.80547285645166],[-0.6068788460365943,44.80544035652477],[-0.6069260040929072,44.8054194932643],[-0.607950940714577,44.805144392773784],[-0.6079819304096579,44.80510377330623],[-0.607974868224023,44.805059676593075],[-0.6075186009733935,44.80418854536408]]}},{"type":"Feature","properties":{"name":"Allée Geoffroy Saint Hilaire","distance":110.64159952501466,"sectionId":"16677-16753","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6062086005106154,44.804538531610724],[-0.6075186009733935,44.80418854536408]]}},{"type":"Feature","properties":{"name":"Esplanade du 8 Mai 1945","distance":15.180066243493455,"sectionId":"36338-13302","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.588214814102791,44.809443166299296],[-0.588373883302409,44.8094493184656],[-0.5884052365925718,44.809442744302494]]}},{"type":"Feature","properties":{"name":"Passage Mairie","distance":54.94634720505522,"sectionId":"36338-20159","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5885014872928597,44.809885072212275],[-0.5884357184487395,44.80988156196186],[-0.58841173029649,44.80985196114969],[-0.5884358148559534,44.80950096338401],[-0.5884052365925718,44.809442744302494]]}},{"type":"Feature","properties":{"name":"Esplanade du 8 Mai 1945","distance":12.801480738445878,"sectionId":"36338-13307","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5884052365925718,44.809442744302494],[-0.5884217979114016,44.80942825916713],[-0.5884433216987119,44.8093329041959]]}},{"type":"Feature","properties":{"name":"Avenue de Thouars","distance":98.5466430460188,"sectionId":"20125-20280","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5933858786547904,44.799536648197865],[-0.5934177642341696,44.79962599311371],[-0.5934280812983581,44.79969611136094],[-0.5934215705793868,44.79982306263804],[-0.5933327965604626,44.800272404632096],[-0.5933378311746387,44.800416106713314]]}},{"type":"Feature","properties":{"name":"Rue Léon Bourgeois","distance":186.32581944229105,"sectionId":"20125-20126","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5933858786547904,44.799536648197865],[-0.5935226534972625,44.79949611353793],[-0.5950341181897741,44.7983501527892]]}},{"type":"Feature","properties":{"name":"Avenue de Thouars","distance":69.36827000441308,"sectionId":"20125-20269","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5928693700846391,44.799062920016524],[-0.5930135094852443,44.799112145319356],[-0.5930966794062063,44.7991575314657],[-0.5931860090700474,44.799228666593606],[-0.5932346390227299,44.79927811662657],[-0.5932890719379768,44.7993577409731],[-0.593355786352114,44.799476072897974],[-0.5933858786547904,44.799536648197865]]}},{"type":"Feature","properties":{"name":"Place des Droits de l'Homme et du Citoyen","distance":34.17126696135054,"sectionId":"16750-15809","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6297406522332688,44.805356804530206],[-0.6298412361821026,44.80565600613529]]}},{"type":"Feature","properties":{"name":"Avenue Louis Laugaa","distance":61.58570895446834,"sectionId":"16750-34720","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6297406522332688,44.805356804530206],[-0.6293759743209543,44.805437265972536],[-0.6292255265951838,44.805477559656374],[-0.6290182849240853,44.80555840129723]]}},{"type":"Feature","properties":{"name":"Avenue Louis Laugaa","distance":76.09166977928622,"sectionId":"16750-34733","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6306521263403831,44.80514015827631],[-0.6299725716897439,44.80531823402517],[-0.6297406522332688,44.805356804530206]]}},{"type":"Feature","properties":{"name":"Rue du Chanoine Dufraisse","distance":75.1769054187043,"sectionId":"15809-16309","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6307163518160297,44.8053924150303],[-0.6300931266018449,44.80559094399586],[-0.6298412361821026,44.80565600613529]]}},{"type":"Feature","properties":{"name":"Place des Droits de l'Homme et du Citoyen","distance":34.17126696135054,"sectionId":"15809-16750","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6297406522332688,44.805356804530206],[-0.6298412361821026,44.80565600613529]]}},{"type":"Feature","properties":{"name":"Rue Gambetta","distance":23.960689829208565,"sectionId":"35012-16714","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6330096504694444,44.80516829540005],[-0.63286743820531,44.80497780590039]]}},{"type":"Feature","properties":{"name":"Place Germaine Tillion","distance":58.96704530697383,"sectionId":"35012-35011","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6330096504694444,44.80516829540005],[-0.6323132574139818,44.80535818369297]]}},{"type":"Feature","properties":{"name":"Rue Gambetta","distance":19.257729856409963,"sectionId":"35012-16713","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6331285166762349,44.80531962325583],[-0.6330096504694444,44.80516829540005]]}},{"type":"Feature","properties":{"name":"Rue Gambetta","distance":23.960689829208565,"sectionId":"16714-35012","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6330096504694444,44.80516829540005],[-0.63286743820531,44.80497780590039]]}},{"type":"Feature","properties":{"name":"Rue des Poilus","distance":66.42579061494557,"sectionId":"16714-17303","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.63286743820531,44.80497780590039],[-0.633645900316175,44.804753042016685]]}},{"type":"Feature","properties":{"name":"Rue Gambetta","distance":34.77171792164629,"sectionId":"16714-as=126957","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.63286743820531,44.80497780590039],[-0.6327029084058575,44.80475442771743],[-0.6326781083125196,44.80469621477551],[-0.6326781083125196,44.80469621477551]]}},{"type":"Feature","properties":{"name":"Rue de Tremeuge","distance":69.96181050955994,"sectionId":"20385-38854","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5929742433737365,44.803628480598185],[-0.5926428126483259,44.803556705180576],[-0.5921218055751118,44.80346029306825]]}},{"type":"Feature","properties":{"name":"Rue de Tremeuge","distance":42.881554226792666,"sectionId":"20385-20386","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5921218055751118,44.80346029306825],[-0.5915990886301392,44.803357521495506]]}},{"type":"Feature","properties":{"name":"Résidence Santillane","distance":137.47940041329522,"sectionId":"20385-20474","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5921218055751118,44.80346029306825],[-0.5917861784203291,44.80428523458168],[-0.5912725273716545,44.80418600579809]]}},{"type":"Feature","properties":{"name":"Rue de Tremeuge","distance":42.881554226792666,"sectionId":"20386-20385","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5921218055751118,44.80346029306825],[-0.5915990886301392,44.803357521495506]]}},{"type":"Feature","properties":{"name":"Rue de Tremeuge","distance":43.64169499566597,"sectionId":"20386-20387","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5915990886301392,44.803357521495506],[-0.5910668377371494,44.803253624036394]]}},{"type":"Feature","properties":{"name":"Résidence Santillane","distance":95.57564595829774,"sectionId":"20386-20474","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5915990886301392,44.803357521495506],[-0.5912725273716545,44.80418600579809]]}},{"type":"Feature","properties":{"name":"Résidence Verlaine 1","distance":4.123784031126229,"sectionId":"19993-20438","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5859920373070406,44.80070218999017],[-0.58600702822517,44.8007377500221]]}},{"type":"Feature","properties":{"name":"Rue du Général Bordas","distance":111.67931214270908,"sectionId":"19993-19689","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.58600702822517,44.8007377500221],[-0.585970707689142,44.80076609991251],[-0.5858914425051014,44.8008546272021],[-0.5858157990720313,44.80094646334614],[-0.5857341732693,44.80103569550913],[-0.5856488940025563,44.80112315107179],[-0.5855596919311252,44.80120856827141],[-0.5854660395668815,44.80129160340103],[-0.5853680464074918,44.801371982752094],[-0.5852641076434639,44.80144831559702],[-0.5851495033491008,44.80153219107884]]}},{"type":"Feature","properties":{"name":"Rue du Général Bordas","distance":59.95195591522515,"sectionId":"19993-19992","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5867477686237127,44.800852667230565],[-0.58600702822517,44.8007377500221]]}},{"type":"Feature","properties":{"name":"Avenue des Arts Et Metiers","distance":93.51943339536162,"sectionId":"25408-42838","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6012665955153395,44.80519957824972],[-0.6009801384404047,44.80465094733964],[-0.600955876153085,44.80460892631881],[-0.6009256674504355,44.80457096710187],[-0.6008591839170515,44.804523526585875],[-0.6007471674791848,44.80446221351912]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":12.982232664008855,"sectionId":"25408-23255","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6006221089494935,44.80453445507072],[-0.6006426594849548,44.804529210294945],[-0.6006816050860443,44.80451257327835],[-0.6007157124173687,44.80449140513154],[-0.6007471674791848,44.80446221351912]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":40.23154623544655,"sectionId":"25408-25407","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6007471674791848,44.80446221351912],[-0.6007656266090102,44.8044376672032],[-0.600779651529618,44.804406955492446],[-0.6007857513570579,44.80437496327611],[-0.6007837353086343,44.8043426875024],[-0.6007736651711555,44.804311117121586],[-0.6007558665292493,44.804281412896984],[-0.6007309006839782,44.80425445787905],[-0.6006994552154997,44.80423113112104],[-0.6006628378897702,44.80421211187704],[-0.600621977611209,44.80419809139395],[-0.6005781652854597,44.80418947921323],[-0.6005624050351719,44.804188356648226]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Nancel Pénard","distance":22.995233370600936,"sectionId":"16535-54610","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6202000052487621,44.81094462359676],[-0.6200476726549595,44.81097622682765],[-0.619935245200211,44.810926762624696]]}},{"type":"Feature","properties":{"name":"Avenue du Vallon","distance":48.71661923600989,"sectionId":"16535-17441","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6202000052487621,44.81094462359676],[-0.6202566293124819,44.81102813039847],[-0.6205413373877039,44.81112437627026],[-0.6206897558564304,44.81118442213069]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Nancel Pénard","distance":26.378629663078833,"sectionId":"16535-as=126200","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6202000052487621,44.81094462359676],[-0.6205187955250818,44.8108745794685]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Nancel Pénard","distance":9.350711604620717,"sectionId":"54610-16555","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.619935245200211,44.810926762624696],[-0.6198349122372658,44.81088219392614]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Nancel Pénard","distance":22.995233370600936,"sectionId":"54610-16535","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6202000052487621,44.81094462359676],[-0.6200476726549595,44.81097622682765],[-0.619935245200211,44.810926762624696]]}},{"type":"Feature","properties":{"name":"Rue Pacaris","distance":168.61050685716106,"sectionId":"48659-30633","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5826367980250649,44.798750738834926],[-0.5825623129236875,44.79869633382162],[-0.5821326794744244,44.79840764328983],[-0.5815222702920838,44.79799699890225],[-0.5812250803486825,44.79779538678289],[-0.5811058814962979,44.797695276271334]]}},{"type":"Feature","properties":{"name":"Rue Pacaris","distance":8.38800921705258,"sectionId":"48659-48661","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5827337220341308,44.79874885656027],[-0.582712552901107,44.79874006487575],[-0.5826886772694229,44.798736583182176],[-0.5826643959799237,44.79873878940399],[-0.5826424758571195,44.79874641621764],[-0.5826367980250649,44.798750738834926]]}},{"type":"Feature","properties":{"name":"Rue Pacaris","distance":11.575180864661384,"sectionId":"48659-48660","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5826367980250649,44.798750738834926],[-0.5826252769756187,44.79875875870665],[-0.5826146096272298,44.79877440862122],[-0.5826116359824939,44.79879170788335],[-0.582616738227273,44.79880866266057],[-0.5826293051273863,44.79882358065419],[-0.5826479678020144,44.79883479343604],[-0.5826554480804653,44.79883708007676]]}},{"type":"Feature","properties":{"name":"Rue Pacaris","distance":168.61050685716106,"sectionId":"30633-48659","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5826367980250649,44.798750738834926],[-0.5825623129236875,44.79869633382162],[-0.5821326794744244,44.79840764328983],[-0.5815222702920838,44.79799699890225],[-0.5812250803486825,44.79779538678289],[-0.5811058814962979,44.797695276271334]]}},{"type":"Feature","properties":{"name":"Rue Pacaris","distance":15.259814669288431,"sectionId":"30633-30632","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5809358583233416,44.7977036927822],[-0.5809409190700705,44.797707767263674],[-0.5809672243169812,44.797719820632636],[-0.5809969770617486,44.797726270466526],[-0.5810281346262272,44.79772682075763],[-0.5810584129569158,44.79772136326226],[-0.5810854296505773,44.79771024324407],[-0.5811058814962979,44.797695276271334]]}},{"type":"Feature","properties":{"name":"Rue Pacaris","distance":17.37626168156613,"sectionId":"30633-30634","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5811058814962979,44.797695276271334],[-0.5811222045583413,44.79767494433155],[-0.581129341182702,44.79765337027799],[-0.5811279618236558,44.79763116357018],[-0.5811181781801152,44.79761012232174],[-0.5811008372354939,44.79759166116655],[-0.5810771703619295,44.7975772727113],[-0.581049012358213,44.797567980156245]]}},{"type":"Feature","properties":{"name":"Impasse Mairie","distance":88.0839445319193,"sectionId":"49410-20159","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5896127506596973,44.80994108199276],[-0.5885014872928597,44.809885072212275]]}},{"type":"Feature","properties":{"name":"Passage Mairie","distance":45.02761964670162,"sectionId":"20159-36388","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5885996140983818,44.81021726093555],[-0.5884971601343006,44.8102119353497],[-0.5884732557712753,44.81018368313062],[-0.5885014872928597,44.809885072212275]]}},{"type":"Feature","properties":{"name":"Passage Mairie","distance":54.94634720505522,"sectionId":"20159-36338","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5885014872928597,44.809885072212275],[-0.5884357184487395,44.80988156196186],[-0.58841173029649,44.80985196114969],[-0.5884358148559534,44.80950096338401],[-0.5884052365925718,44.809442744302494]]}},{"type":"Feature","properties":{"name":"Impasse Mairie","distance":88.0839445319193,"sectionId":"20159-49410","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5896127506596973,44.80994108199276],[-0.5885014872928597,44.809885072212275]]}},{"type":"Feature","properties":{"name":"Voie 1 Faculté des Sciences","distance":22.224052159305163,"sectionId":"614-565","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5920620861449233,44.809101217559316],[-0.5920833237562817,44.80912117566137],[-0.59211075591493,44.80913697453161],[-0.5921425472550291,44.80914759114289],[-0.5921770223162955,44.80915253791176],[-0.5922122586493441,44.80915142513561],[-0.5922459829311133,44.809144324608255],[-0.5922764550367651,44.80913174169464],[-0.5923014576779416,44.80911464724327]]}},{"type":"Feature","properties":{"name":"Voie 1 Faculté des Sciences","distance":12.027001004109959,"sectionId":"614-20528","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.592062101007606,44.808997893070945],[-0.5920560745649794,44.80900474944799],[-0.5920450280480412,44.809028519599096],[-0.5920424066246759,44.809053465004695],[-0.5920481262695825,44.80907823708883],[-0.5920620861449233,44.809101217559316]]}},{"type":"Feature","properties":{"name":"Voie 1 Faculté des Sciences","distance":52.21357424624937,"sectionId":"614-629","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5914292510220244,44.809221191179155],[-0.5918779057579182,44.80910838491132],[-0.591964754953042,44.809102939930625],[-0.5920620861449233,44.809101217559316]]}},{"type":"Feature","properties":{"name":"Esplanade du 8 Mai 1945","distance":45.72182228237763,"sectionId":"13307-20482","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5884433216987119,44.8093329041959],[-0.5884496275106204,44.80905408229004],[-0.588440489708443,44.809021130382774],[-0.5884180327850829,44.80899985888062],[-0.5883272668548667,44.808966779621706]]}},{"type":"Feature","properties":{"name":"Esplanade du 8 Mai 1945","distance":9.481303952045053,"sectionId":"13307-13289","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.58832341738245,44.80933182236562],[-0.5884433216987119,44.8093329041959]]}},{"type":"Feature","properties":{"name":"Esplanade du 8 Mai 1945","distance":12.801480738445878,"sectionId":"13307-36338","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5884052365925718,44.809442744302494],[-0.5884217979114016,44.80942825916713],[-0.5884433216987119,44.8093329041959]]}},{"type":"Feature","properties":{"name":"Allée du 7eme Art","distance":373.2933102355968,"sectionId":"28940-27350","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5909511668127475,44.812623544396445],[-0.5910638012599737,44.81257485773017],[-0.5912388657746035,44.8125004184211],[-0.5913181665871189,44.81245701767912],[-0.5917119486618941,44.812198391093595],[-0.5917754354442839,44.812134770482885],[-0.5918484956615023,44.812094809335896],[-0.592091543614231,44.81197615372202],[-0.5922883144237633,44.811854094556566],[-0.5924320910993154,44.811736591267085],[-0.5925403396734101,44.81162570483094],[-0.5926239454592466,44.811566132554546],[-0.5927334378641754,44.8114975451563],[-0.5928350152651911,44.81140146238646],[-0.592902132312796,44.81130475640597],[-0.5929916653465276,44.81112915117395],[-0.5930532642854286,44.81102919626336],[-0.5931454559922102,44.81095106570616],[-0.5932376196923449,44.810898879568605],[-0.5933332085698515,44.81086307015932],[-0.5935603093493157,44.81080743181822],[-0.5936800687216522,44.81076959737419],[-0.5938280368006075,44.81070519819918],[-0.5939750321222723,44.810623173474006],[-0.5941450725904092,44.810500784290554],[-0.5943043354637455,44.81037197922775]]}},{"type":"Feature","properties":{"name":"Rue Pierre Noailles","distance":12.132583811719412,"sectionId":"28940-20053","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5943043354637455,44.81037197922775],[-0.5943136504963611,44.810373216283445],[-0.5943343098917043,44.810373734545614],[-0.5943548403409727,44.81037218499194],[-0.5943748517399348,44.81036839978373],[-0.594393855711396,44.810362664599566],[-0.594411467758116,44.81035490150907],[-0.5944273314080498,44.81034548210374],[-0.5944407225173641,44.81033496976032]]}},{"type":"Feature","properties":{"name":"Rue Pierre Noailles","distance":14.03740334188305,"sectionId":"28940-28643","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5941901639134951,44.81028631546872],[-0.5941945325778943,44.810301581463854],[-0.5942017163889127,44.81031531719373],[-0.5942116339015154,44.810328245888506],[-0.594224130788562,44.81033992201472],[-0.5942388225515645,44.81035026763737],[-0.5942555548617322,44.81035883722191],[-0.594273822528686,44.810365646731825],[-0.5942933561386616,44.810370434430695],[-0.5943043354637455,44.81037197922775]]}},{"type":"Feature","properties":{"name":"Place Henri Goulinat","distance":7.652125252222003,"sectionId":"16882-25322","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6309171201956937,44.80701688540854],[-0.6308228069958516,44.80703232765483]]}},{"type":"Feature","properties":{"name":"Rue Herman Lemoine","distance":15.529575151178136,"sectionId":"16882-16493","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6308228069958516,44.80703232765483],[-0.6308833205895168,44.80716534165337]]}},{"type":"Feature","properties":{"name":"Rue Herman Lemoine","distance":20.443367462590878,"sectionId":"16882-16885","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6307440648849332,44.806857015563125],[-0.6308228069958516,44.80703232765483]]}},{"type":"Feature","properties":{"name":"Avenue Fanning Lafontaine","distance":101.35234787484588,"sectionId":"16607-16424","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6124134883332674,44.8052897517341],[-0.6120315589483181,44.804418707609955]]}},{"type":"Feature","properties":{"name":"Rue Jean Charcot","distance":140.66944780143913,"sectionId":"16607-16926","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6120315589483181,44.804418707609955],[-0.6137206908151805,44.804021385254835]]}},{"type":"Feature","properties":{"name":"Avenue Fanning Lafontaine","distance":44.40676687460218,"sectionId":"16607-16513","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6120315589483181,44.804418707609955],[-0.6119350205019235,44.804228995774906],[-0.6117154585853717,44.80410741972833]]}},{"type":"Feature","properties":{"name":"Allée Georges Brassens","distance":51.68870015643347,"sectionId":"16757-16758","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6091390095554492,44.80751947833871],[-0.6084853871706092,44.80752697399567]]}},{"type":"Feature","properties":{"name":"Allée Georges Brassens","distance":140.484436546141,"sectionId":"16757-16017","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6080748822995544,44.807963565585],[-0.6089467209524296,44.80805796902329],[-0.6090351588021958,44.80805570349236],[-0.6090965047188327,44.808033037969096],[-0.6091413221133111,44.807988916656456],[-0.6091544775464598,44.80793426937],[-0.6091390095554492,44.80751947833871]]}},{"type":"Feature","properties":{"name":"Allée Georges Brassens","distance":12.87948698978308,"sectionId":"16758-16759","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6084853871706092,44.80752697399567],[-0.6083608681400925,44.807601729324546]]}},{"type":"Feature","properties":{"name":"Allée Georges Brassens","distance":51.68870015643347,"sectionId":"16758-16757","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6091390095554492,44.80751947833871],[-0.6084853871706092,44.80752697399567]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":65.697722455604,"sectionId":"17057-17056","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6034283903360506,44.79591529769285],[-0.6039887601312252,44.7954786555727]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":287.5184186611685,"sectionId":"17057-5936","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6039887601312252,44.7954786555727],[-0.6043142144126518,44.795214487797686],[-0.6047093366718237,44.79471903023624],[-0.6049384497657054,44.794366930672375],[-0.6050704052824838,44.794059438838374],[-0.6051568722383457,44.79373059798659],[-0.6052587178431771,44.79311156322309]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":9.038341232720912,"sectionId":"17057-23328","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6039085937317981,44.795420660585705],[-0.6039887601312252,44.7954786555727]]}},{"type":"Feature","properties":{"name":"Avenue de la Paillère","distance":14.4582020421248,"sectionId":"17057-as=124587","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6046553414757291,44.795582789032636],[-0.6039887601312252,44.7954786555727]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":287.5184186611685,"sectionId":"5936-17057","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6039887601312252,44.7954786555727],[-0.6043142144126518,44.795214487797686],[-0.6047093366718237,44.79471903023624],[-0.6049384497657054,44.794366930672375],[-0.6050704052824838,44.794059438838374],[-0.6051568722383457,44.79373059798659],[-0.6052587178431771,44.79311156322309]]}},{"type":"Feature","properties":{"name":"Avenue de Gradignan","distance":92.90182191600985,"sectionId":"16341-16769","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6248167158546375,44.80108108882604],[-0.6250574579169583,44.80152311339261],[-0.6252738215622851,44.8018510579183]]}},{"type":"Feature","properties":{"name":"Avenue de Gradignan","distance":115.63172018024912,"sectionId":"16341-16166","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6243970870013743,44.80008390397228],[-0.6245693022808264,44.80051478083818],[-0.6248167158546375,44.80108108882604]]}},{"type":"Feature","properties":{"name":"Avenue des Deux Ponts","distance":112.27072999656092,"sectionId":"16341-16489","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6248167158546375,44.80108108882604],[-0.6235468187345438,44.80153305782432]]}},{"type":"Feature","properties":{"name":"Avenue des Charmilles","distance":149.41060355703632,"sectionId":"16341-16253","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6267055904211111,44.801112215789686],[-0.6248167158546375,44.80108108882604]]}},{"type":"Feature","properties":{"name":"Avenue de Gradignan","distance":185.18635635047238,"sectionId":"16773-16501","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6230278625711209,44.79802290803133],[-0.62280310269126,44.79791124792263],[-0.6220637521887495,44.79768832964385],[-0.6218377001392427,44.797586257738956],[-0.6216094528428143,44.79743714161939],[-0.6212388052444724,44.79702510154128]]}},{"type":"Feature","properties":{"name":"Avenue de Gradignan","distance":230.2695236738108,"sectionId":"16773-as=124854","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6230278625711209,44.79802290803133],[-0.6232016659512233,44.79816727002914],[-0.6232568515883903,44.79824613668069],[-0.6233380145767139,44.79842831233607],[-0.62351715536543,44.7988306835563],[-0.6236262062981425,44.7990317888845],[-0.6237362428375728,44.799200252445544],[-0.6238378786593499,44.799355831389505],[-0.6242505867429745,44.7998889472887],[-0.6242505867429745,44.7998889472887]]}},{"type":"Feature","properties":{"name":"Allée Jeanne Chanay","distance":188.04999371511542,"sectionId":"16773-as=2791","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6230278625711209,44.79802290803133],[-0.6230766380044211,44.797979645418174],[-0.6230977354875343,44.79795095727731],[-0.6231147149730231,44.797925192918854],[-0.6231194732177401,44.797890178964],[-0.6229419063962776,44.797400015667755],[-0.62276837826354,44.79670226093422],[-0.6227195929221027,44.796584274090556],[-0.6226420968425924,44.796498641008384],[-0.6225458868614242,44.796423242951676]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":21.124767328130645,"sectionId":"16501-16502","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6209883616111087,44.797016050297394],[-0.6210075664953562,44.79702570832341],[-0.6210385234299463,44.79703715415457],[-0.6210715216635927,44.79704484155538],[-0.621105797944393,44.79704870474341],[-0.6211405890182478,44.79704867793801],[-0.6211749940740346,44.79704451957051],[-0.6212078992917575,44.79703662544278],[-0.6212388052444724,44.79702510154128]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":24.259252535994005,"sectionId":"16501-16500","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6212388052444724,44.79702510154128],[-0.6212663286467812,44.79701008200081],[-0.6212903771077768,44.796992110266075],[-0.621309968732785,44.796971668024554],[-0.6213247529603133,44.796949216858536],[-0.6213342642575237,44.79692540217889],[-0.6213382896275583,44.796900861355645],[-0.6213367310466968,44.79687604792815],[-0.6213296449907175,44.79685186093363],[-0.6213182259154546,44.79683321692945]]}},{"type":"Feature","properties":{"name":"Avenue de Gradignan","distance":185.18635635047238,"sectionId":"16501-16773","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6230278625711209,44.79802290803133],[-0.62280310269126,44.79791124792263],[-0.6220637521887495,44.79768832964385],[-0.6218377001392427,44.797586257738956],[-0.6216094528428143,44.79743714161939],[-0.6212388052444724,44.79702510154128]]}},{"type":"Feature","properties":{"name":"Avenue de Gradignan","distance":91.17864248869049,"sectionId":"16040-17022","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6248421499497538,44.80544780398771],[-0.6242857966554964,44.80616683431997]]}},{"type":"Feature","properties":{"name":"Avenue Béranger","distance":96.10163535316842,"sectionId":"16040-16039","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6259480769330436,44.805108556981914],[-0.6250197402986414,44.80543061337116],[-0.6249316103386584,44.80545179922281],[-0.6248421499497538,44.80544780398771]]}},{"type":"Feature","properties":{"name":"Avenue de Gradignan","distance":113.53222787111412,"sectionId":"16040-16377","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6256155342448166,44.80460184989887],[-0.6254839110316924,44.80468517533525],[-0.625412944756455,44.804725137248546],[-0.6253919753631582,44.804738115318315],[-0.6253773011304238,44.80475602857069],[-0.6252467953998022,44.80497863358408],[-0.6251569503101162,44.80508923728474],[-0.6248421499497538,44.80544780398771]]}},{"type":"Feature","properties":{"name":"Rue François Rabelais","distance":59.72927421111016,"sectionId":"19945-25688","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.593193462358844,44.79621797596893],[-0.5924389591219411,44.796194159508005]]}},{"type":"Feature","properties":{"name":"Rue François Rabelais","distance":132.38404984891974,"sectionId":"19945-19944","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5948658704777255,44.79626871633933],[-0.593193462358844,44.79621797596893]]}},{"type":"Feature","properties":{"name":"Rue Frédéric Sevene","distance":12.153081714270742,"sectionId":"19951-19683","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5850986212444692,44.80621552009868],[-0.5849876235953666,44.80613983686355]]}},{"type":"Feature","properties":{"name":"Rue Frédéric Sevene","distance":88.22200475016068,"sectionId":"19951-19952","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5849876235953666,44.80613983686355],[-0.5841858371471785,44.80558750187525]]}},{"type":"Feature","properties":{"name":"Rue Verdeau","distance":203.4130712025672,"sectionId":"19951-19628","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5849876235953666,44.80613983686355],[-0.5861198120682125,44.80449537688717]]}},{"type":"Feature","properties":{"name":"Avenue Camille Jullian","distance":22.91535055457348,"sectionId":"16211-as=129160","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6154316421681246,44.79378271545963],[-0.6150382268229753,44.793035756445974]]}},{"type":"Feature","properties":{"name":"Rue Graham Bell","distance":69.79400391986347,"sectionId":"30956-28446","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6183521141724402,44.80048385125475],[-0.6177700580488659,44.80001150404143]]}},{"type":"Feature","properties":{"name":"Rue Graham Bell","distance":38.221980893265865,"sectionId":"30956-28442","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6184777365899734,44.80079802889875],[-0.618485522849563,44.80065598995257],[-0.6184751143584594,44.80060506367932],[-0.6184349093767768,44.80055112175027],[-0.6183521141724402,44.80048385125475]]}},{"type":"Feature","properties":{"name":"Mail Pierre Mendès France","distance":87.65996480559085,"sectionId":"27894-26644","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6318710706919177,44.81019945317003],[-0.631543529639951,44.810387736416686],[-0.6314331489596068,44.8104033316262],[-0.6309912993060639,44.81066543778118]]}},{"type":"Feature","properties":{"name":"Mail Pierre Mendès France","distance":87.4220997415703,"sectionId":"27894-27893","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6309912993060639,44.81066543778118],[-0.6309816781326227,44.81072565067979],[-0.6306916282646684,44.810894447494356],[-0.6305753552429254,44.8109049149586],[-0.6301628211966482,44.811140317985114]]}},{"type":"Feature","properties":{"name":"Rue Nelson Paillou","distance":47.63196026621833,"sectionId":"27894-27895","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6309912993060639,44.81066543778118],[-0.6306107064487226,44.810333015277955]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Roger Marcade","distance":156.0429454454069,"sectionId":"27893-16429","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6301628211966482,44.811140317985114],[-0.6298387235875248,44.81085293357542],[-0.6297863851179157,44.81078947312329],[-0.6297691243754254,44.8106902110446],[-0.6297218291258211,44.810290847235564],[-0.629585442485553,44.809839194970834]]}},{"type":"Feature","properties":{"name":"Avenue Colonel Robert Jacqui","distance":6.058881201658697,"sectionId":"27893-24367","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6301628211966482,44.811140317985114],[-0.630105762234423,44.8111767311133]]}},{"type":"Feature","properties":{"name":"Mail Pierre Mendès France","distance":87.4220997415703,"sectionId":"27893-27894","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6309912993060639,44.81066543778118],[-0.6309816781326227,44.81072565067979],[-0.6306916282646684,44.810894447494356],[-0.6305753552429254,44.8109049149586],[-0.6301628211966482,44.811140317985114]]}},{"type":"Feature","properties":{"name":"Avenue Colonel Robert Jacqui","distance":145.91589373373117,"sectionId":"27893-16432","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6318455929708662,44.81126325695497],[-0.6317249917245114,44.8112592701739],[-0.6305172785593685,44.81138124024923],[-0.6304681540560341,44.811376862585156],[-0.6304263407523278,44.811361981999944],[-0.6303972042151998,44.81134543564304],[-0.63033557803451,44.811293262062975],[-0.6301628211966482,44.811140317985114]]}},{"type":"Feature","properties":{"name":"Place de la Cinquième République","distance":75.36571962102067,"sectionId":"16403-16402","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6311754385788592,44.80612572631919],[-0.6309416636166261,44.80546791955571]]}},{"type":"Feature","properties":{"name":"Rue des Poilus","distance":80.2488760984979,"sectionId":"16403-28691","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6318972150442006,44.80522787563589],[-0.6314907472446162,44.805315804114095],[-0.6312936765512386,44.805381281255926],[-0.6310311958108813,44.80544893631451],[-0.6309416636166261,44.80546791955571]]}},{"type":"Feature","properties":{"name":"Place de la Cinquième République","distance":41.99686592261216,"sectionId":"16403-16404","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6309416636166261,44.80546791955571],[-0.6308082702318089,44.805101932908464]]}},{"type":"Feature","properties":{"name":"Avenue de Collegno","distance":139.988255719182,"sectionId":"16421-16419","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6071178372245689,44.805933187131934],[-0.6058777899405831,44.806265275312114],[-0.605848050437367,44.80626522721314],[-0.6058186525035695,44.806258502158755],[-0.6058008971288182,44.80624167907911],[-0.6056844644651586,44.806002687415926]]}},{"type":"Feature","properties":{"name":"Avenue de Collegno","distance":74.66326163399513,"sectionId":"16421-49828","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6056844644651586,44.806002687415926],[-0.6053620107596795,44.80537088988191]]}},{"type":"Feature","properties":{"name":"Impasse du Colonel René Fonck","distance":32.43746354000328,"sectionId":"23488-16427","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6300299939272938,44.80975663521422],[-0.6300665539802885,44.80979060116377],[-0.6301670803130618,44.80983756968866],[-0.6302326330233528,44.809841603305614],[-0.6303966248624713,44.809837360339436]]}},{"type":"Feature","properties":{"name":"Avenue Béranger","distance":96.10163535316842,"sectionId":"16039-16040","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6259480769330436,44.805108556981914],[-0.6250197402986414,44.80543061337116],[-0.6249316103386584,44.80545179922281],[-0.6248421499497538,44.80544780398771]]}},{"type":"Feature","properties":{"name":"Rue Chateaubriand","distance":51.1148304228422,"sectionId":"16039-57284","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6256792607284879,44.804690975514546],[-0.6256808520038644,44.80470156946084],[-0.6257622381237632,44.80484239266766],[-0.6258285714502998,44.80493264189838],[-0.6259480769330436,44.805108556981914]]}},{"type":"Feature","properties":{"name":"Avenue Béranger","distance":127.53720286806625,"sectionId":"16039-16038","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6273931098724322,44.80459851259172],[-0.62596287340999,44.805103454483124],[-0.6259480769330436,44.805108556981914]]}},{"type":"Feature","properties":{"name":"Rue Chateaubriand","distance":13.899623907224552,"sectionId":"16039-as=129224","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6259480769330436,44.805108556981914],[-0.626032587655328,44.80521828645975]]}},{"type":"Feature","properties":{"name":"Rue de l'Amiral Prouhet","distance":42.50463375230305,"sectionId":"15842-22264","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6288534679758239,44.80246991038936],[-0.6283159846498326,44.80246624911388]]}},{"type":"Feature","properties":{"name":"Rue de Chenevière","distance":65.04837749224372,"sectionId":"15842-16384","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6283159846498326,44.80246624911388],[-0.6283827483430332,44.801882537913045]]}},{"type":"Feature","properties":{"name":"Rue de l'Amiral Prouhet","distance":111.34133191188806,"sectionId":"15842-15843","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6283159846498326,44.80246624911388],[-0.6269081382588043,44.80248142592167]]}},{"type":"Feature","properties":{"name":"Rue Pierre Curie","distance":84.27768886797054,"sectionId":"16462-16461","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6298909344003979,44.80713449809973],[-0.6303581801530276,44.807816474705625]]}},{"type":"Feature","properties":{"name":"Avenue François Coppée","distance":62.73938609802648,"sectionId":"16462-16674","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.631075393174946,44.807574857356464],[-0.6303581801530276,44.807816474705625]]}},{"type":"Feature","properties":{"name":"Rue Pierre Curie","distance":46.4184713757076,"sectionId":"16462-16463","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6306339972617606,44.808185392863834],[-0.6303581801530276,44.807816474705625]]}},{"type":"Feature","properties":{"name":"Avenue François Coppée","distance":87.90606932512317,"sectionId":"16462-16673","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6293441143335687,44.80814088793653],[-0.6303581801530276,44.807816474705625]]}},{"type":"Feature","properties":{"name":"Avenue Jean Cordier","distance":97.36590988555584,"sectionId":"16939-16869","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6238502063826362,44.812110102232744],[-0.6246231752046867,44.811427684732095]]}},{"type":"Feature","properties":{"name":"Avenue Maurice Faye","distance":245.66316171564787,"sectionId":"16939-17039","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6238502063826362,44.812110102232744],[-0.6247758361554655,44.81422144580021]]}},{"type":"Feature","properties":{"name":"Avenue Maurice Faye","distance":211.27948704539767,"sectionId":"16939-16538","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6230681813424483,44.8102911840886],[-0.6238502063826362,44.812110102232744]]}},{"type":"Feature","properties":{"name":"Avenue Hector Domecq","distance":157.79532484530753,"sectionId":"16869-16539","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.624018432989894,44.81007380965053],[-0.6246231752046867,44.811427684732095]]}},{"type":"Feature","properties":{"name":"Avenue Jean Cordier","distance":97.36590988555584,"sectionId":"16869-16939","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6238502063826362,44.812110102232744],[-0.6246231752046867,44.811427684732095]]}},{"type":"Feature","properties":{"name":"Avenue Hector Domecq","distance":250.22726959968978,"sectionId":"16869-16870","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6246231752046867,44.811427684732095],[-0.6255499929281934,44.81358177457588]]}},{"type":"Feature","properties":{"name":"Avenue Jean Cordier","distance":83.87520296489441,"sectionId":"16869-as=126161","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6246231752046867,44.811427684732095],[-0.6252858666250618,44.810838008755574]]}},{"type":"Feature","properties":{"name":"Avenue Jean Jaurès","distance":14.803451962816148,"sectionId":"16952-16953","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6261384776787635,44.80778442185393],[-0.6262970044470864,44.80771351675207]]}},{"type":"Feature","properties":{"name":"Avenue Jean Jaurès","distance":33.44570286236015,"sectionId":"16952-16951","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6257873812750893,44.80795235979245],[-0.6261384776787635,44.80778442185393]]}},{"type":"Feature","properties":{"name":"Rue du Pont de Chiquet","distance":155.43629871840645,"sectionId":"16952-54608","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6261384776787635,44.80778442185393],[-0.6249092925072115,44.80740696481559],[-0.6248520460804974,44.807394105576876],[-0.6247876652228975,44.807386518354136],[-0.624455380481736,44.80737467638733],[-0.62441545453202,44.807365589021266],[-0.6243864593343019,44.80734921690008],[-0.6243411479644546,44.807293675486406]]}},{"type":"Feature","properties":{"name":"Rue Rossini","distance":93.98710663900548,"sectionId":"16949-17139","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6149636158821615,44.81253617954805],[-0.6154697640153065,44.813301834604765]]}},{"type":"Feature","properties":{"name":"Avenue Jean Jaurès","distance":98.59625577629868,"sectionId":"16949-as=124715","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6149636158821615,44.81253617954805],[-0.6161061910203061,44.812180504220024]]}},{"type":"Feature","properties":{"name":"Avenue Mozart","distance":91.44399623627726,"sectionId":"16950-17140","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6162453655944039,44.812137179078924],[-0.6167264185774021,44.812885880405375]]}},{"type":"Feature","properties":{"name":"Avenue Jean Jaurès","distance":98.59625577629868,"sectionId":"16950-as=124715","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6161061910203061,44.812180504220024],[-0.6162453655944039,44.812137179078924]]}},{"type":"Feature","properties":{"name":"Avenue Jean Jaurès","distance":46.97525994355878,"sectionId":"16950-as=125389","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6162453655944039,44.812137179078924],[-0.6167864017679299,44.81196240066467]]}},{"type":"Feature","properties":{"name":"Rue Auguste Renoir","distance":27.50777331129066,"sectionId":"15977-15981","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6061403033668107,44.796389468898305],[-0.6060638161924718,44.79663106410612]]}},{"type":"Feature","properties":{"name":"Rue Auguste Renoir","distance":27.021896829283776,"sectionId":"15977-15978","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6061403033668107,44.796389468898305],[-0.6059079132524073,44.79656781491607]]}},{"type":"Feature","properties":{"name":"Rue Auguste Renoir","distance":27.88406659025956,"sectionId":"15977-15976","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6062165705893053,44.79614436735729],[-0.6061403033668107,44.796389468898305]]}},{"type":"Feature","properties":{"name":"Rue Auguste Renoir","distance":91.31997892889466,"sectionId":"15978-15979","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6059079132524073,44.79656781491607],[-0.6056337756651824,44.79677658077793],[-0.6055341462595111,44.79678775689993],[-0.6050567334529893,44.796471117352944]]}},{"type":"Feature","properties":{"name":"Rue Auguste Renoir","distance":14.190630511192367,"sectionId":"15978-15981","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6060638161924718,44.79663106410612],[-0.6059079132524073,44.79656781491607]]}},{"type":"Feature","properties":{"name":"Rue Auguste Renoir","distance":27.021896829283776,"sectionId":"15978-15977","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6061403033668107,44.796389468898305],[-0.6059079132524073,44.79656781491607]]}},{"type":"Feature","properties":{"name":"Allée Ausone","distance":144.7824658632035,"sectionId":"31834-15989","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6155228591083164,44.798835583950826],[-0.6152654804808804,44.798364973747326],[-0.6150089132604547,44.79789109428041],[-0.6148726813755127,44.797617157607036]]}},{"type":"Feature","properties":{"name":"Accès Maison de Retraite Mutualiste","distance":59.93277999103447,"sectionId":"30018-as=126003","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6100281494112885,44.805710327171916],[-0.6100281494112885,44.805710327171916]]}},{"type":"Feature","properties":{"name":"Rue Léo Valentin","distance":69.81934642923306,"sectionId":"17036-16435","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6077160928261833,44.809473202346354],[-0.6070114019224195,44.80985200795313]]}},{"type":"Feature","properties":{"name":"Place du Professeur Piéchaud","distance":50.68655859418028,"sectionId":"17036-17119","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6077160928261833,44.809473202346354],[-0.6082347158446524,44.80920497076243]]}},{"type":"Feature","properties":{"name":"Place du Professeur Piéchaud","distance":24.33876973180703,"sectionId":"17036-17118","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6075898372026082,44.809273619724856],[-0.607652215883496,44.809384695151834],[-0.6077160928261833,44.809473202346354]]}},{"type":"Feature","properties":{"name":"Avenue Pierre Wiehn","distance":177.06068999791498,"sectionId":"30757-30758","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6317138802751466,44.803460696747564],[-0.6316421029121511,44.80330552186036],[-0.6315897765456633,44.802766148215255],[-0.6315470655030366,44.802321145803056],[-0.6315169722533645,44.80210455383939],[-0.6315015955196683,44.80205730030505],[-0.6314303730376181,44.80188679333691]]}},{"type":"Feature","properties":{"name":"Avenue Pierre Wiehn","distance":182.98773949711259,"sectionId":"30757-17230","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6313345077378727,44.801901565174525],[-0.6314783672824089,44.80327336510994],[-0.6314813869813739,44.80331326598157],[-0.6314927031809078,44.803350289514356],[-0.6315278629932808,44.80338015576388],[-0.6315731149546422,44.8034015021162],[-0.6317138802751466,44.803460696747564]]}},{"type":"Feature","properties":{"name":"Avenue Pierre Wiehn","distance":15.531237812456,"sectionId":"30757-17297","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.631872080810827,44.80354356705513],[-0.6317138802751466,44.803460696747564]]}},{"type":"Feature","properties":{"name":"Avenue Pierre Wiehn","distance":177.06068999791498,"sectionId":"30758-30757","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6317138802751466,44.803460696747564],[-0.6316421029121511,44.80330552186036],[-0.6315897765456633,44.802766148215255],[-0.6315470655030366,44.802321145803056],[-0.6315169722533645,44.80210455383939],[-0.6315015955196683,44.80205730030505],[-0.6314303730376181,44.80188679333691]]}},{"type":"Feature","properties":{"name":"Rue Georges Pompidou","distance":7.756360198973574,"sectionId":"30758-17230","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6313345077378727,44.801901565174525],[-0.6314303730376181,44.80188679333691]]}},{"type":"Feature","properties":{"name":"Rue Georges Pompidou","distance":300.45778553688336,"sectionId":"30758-17231","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6314303730376181,44.80188679333691],[-0.6317942235850258,44.80183175458292],[-0.6318613026678508,44.80181195605702],[-0.6319174453304689,44.8017812462328],[-0.6319441479387236,44.80174517065194],[-0.6319605095374122,44.80171365924802],[-0.6319516566111693,44.801607282476205],[-0.6319660973756419,44.801573400142665],[-0.632006852774727,44.801541470054566],[-0.6326379737337389,44.801436904643296],[-0.6327094448633475,44.801428586152106],[-0.6327626334814607,44.80142931949511],[-0.633370389361369,44.80141179682576],[-0.633410583765787,44.80141916079589],[-0.6334535441094192,44.80143427370291],[-0.6334762915225891,44.80145390597681],[-0.6334876053757905,44.801480840003684],[-0.633551475932883,44.80202443885787],[-0.63357142696817,44.80205992517739],[-0.6336094064987315,44.802102402569886],[-0.6337264819578062,44.802205321666236],[-0.6339034211751292,44.802374701785695]]}},{"type":"Feature","properties":{"name":"Avenue Pierre Wiehn","distance":25.047920075001585,"sectionId":"30758-25409","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6314303730376181,44.80188679333691],[-0.6313587518996446,44.80174008123639],[-0.6313066635366836,44.801680487252156]]}},{"type":"Feature","properties":{"name":"Avenue de Bardanac","distance":67.56526577949016,"sectionId":"25034-16014","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6125672769128109,44.7940197076383],[-0.6119745595212183,44.79445778236543]]}},{"type":"Feature","properties":{"name":"Avenue de Bardanac","distance":67.56526577949016,"sectionId":"16014-25034","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6125672769128109,44.7940197076383],[-0.6119745595212183,44.79445778236543]]}},{"type":"Feature","properties":{"name":"Rue de Compostelle","distance":110.33932014219675,"sectionId":"16014-17773","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6105819573232397,44.79443030040655],[-0.6113393276055692,44.794471741482965],[-0.6119745595212183,44.79445778236543]]}},{"type":"Feature","properties":{"name":"Avenue de Bardanac","distance":123.78916336200672,"sectionId":"16014-16015","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6119745595212183,44.79445778236543],[-0.6118649377906765,44.7945416183104],[-0.6108716764102907,44.79524851413376]]}},{"type":"Feature","properties":{"name":"Place du Cardinal","distance":6.236198105560703,"sectionId":"16129-16251","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.627149054686297,44.80405002871358],[-0.6271324783500616,44.803995137202875]]}},{"type":"Feature","properties":{"name":"Rue Bossuet","distance":63.904612898003506,"sectionId":"16129-16038","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6273931098724322,44.80459851259172],[-0.627149054686297,44.80405002871358]]}},{"type":"Feature","properties":{"name":"Place du Cardinal","distance":"Unknown","sectionId":"16129-as=3961","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6265227405338982,44.80412582527825],[-0.627149054686297,44.80405002871358]]}},{"type":"Feature","properties":{"name":"Boulevard Saint Martin","distance":47.63160036012414,"sectionId":"16129-as=4745","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.627149054686297,44.80405002871358],[-0.6277485516591668,44.80400827027071]]}},{"type":"Feature","properties":{"name":"Avenue de Gradignan","distance":11.097661212943857,"sectionId":"16255-57281","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6256309069148038,44.80426916582181],[-0.6256426564041526,44.80426953318824],[-0.6256692271731027,44.80427252168953],[-0.6256910946650486,44.804277771560514],[-0.6257044756993364,44.80428257653887],[-0.6257172027943432,44.80428826028153],[-0.6257371603933585,44.804300564940576],[-0.6257521823861885,44.80431219554282]]}},{"type":"Feature","properties":{"name":"Avenue de Gradignan","distance":17.65980251588187,"sectionId":"16255-25024","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6257521823861885,44.80431219554282],[-0.6257664823442374,44.804332265321975],[-0.6257750286646305,44.80435272191227],[-0.6257773155487234,44.80436687117453],[-0.6257768141566817,44.804381109323394],[-0.6257708702113112,44.80440202784385],[-0.6257589470606139,44.804421609435856],[-0.6257479237046967,44.804433494912594],[-0.6257186658929844,44.80445471683499]]}},{"type":"Feature","properties":{"name":"Place du Cardinal","distance":69.22481645579504,"sectionId":"16255-as=3961","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6257521823861885,44.80431219554282],[-0.6258347801976771,44.80421172903405],[-0.6258604745204708,44.80419403393842],[-0.6258877998187484,44.804181706008556],[-0.6259179820150542,44.80416881860744],[-0.625959449590928,44.804160064447714],[-0.6261942637967857,44.80414362359268],[-0.6265227405338982,44.80412582527825],[-0.6265227405338982,44.80412582527825]]}},{"type":"Feature","properties":{"name":"Avenue des Lacs","distance":122.25581021480515,"sectionId":"16252-16769","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6252738215622851,44.8018510579183],[-0.6268196929754306,44.80186600150498]]}},{"type":"Feature","properties":{"name":"Avenue des Lacs","distance":123.61702796181545,"sectionId":"16252-16384","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6268196929754306,44.80186600150498],[-0.6283827483430332,44.801882537913045]]}},{"type":"Feature","properties":{"name":"Avenue du Cardinal","distance":68.79016653528711,"sectionId":"16252-15843","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6269081382588043,44.80248142592167],[-0.626912201111341,44.802431328490826],[-0.6268196929754306,44.80186600150498]]}},{"type":"Feature","properties":{"name":"Avenue du Cardinal","distance":84.2090617199777,"sectionId":"16252-16253","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6268196929754306,44.80186600150498],[-0.6267055904211111,44.801112215789686]]}},{"type":"Feature","properties":{"name":"Rue de la Ramée","distance":35.781469385964904,"sectionId":"17372-17370","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6303640321588959,44.79343483472454],[-0.6304017045255174,44.79375586260076]]}},{"type":"Feature","properties":{"name":"Rue de la Ramée","distance":60.14067591316265,"sectionId":"17369-25437","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.627080073458247,44.79361836120969],[-0.6271228490174839,44.79362663580185],[-0.6271651816057452,44.79362987981102],[-0.627836075908068,44.793587669035915]]}},{"type":"Feature","properties":{"name":"Rue des Résédas","distance":152.85324603179282,"sectionId":"17369-26807","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.627080073458247,44.79361836120969],[-0.6270454836376967,44.79359541209286],[-0.6270212788505493,44.793562582841204],[-0.6270148447324665,44.79353873566962],[-0.6268444155250309,44.79226335915188]]}},{"type":"Feature","properties":{"name":"Rue de la Ramée","distance":45.730054349167304,"sectionId":"25437-26709","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.627836075908068,44.793587669035915],[-0.6284124019636882,44.793554507407194]]}},{"type":"Feature","properties":{"name":"Rue de la Ramée","distance":36.265766462327065,"sectionId":"25437-30140","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.627836075908068,44.793587669035915],[-0.6278441251990456,44.79375379720857],[-0.6278533162913976,44.79391394341432]]}},{"type":"Feature","properties":{"name":"Rue de la Ramée","distance":60.14067591316265,"sectionId":"25437-17369","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.627080073458247,44.79361836120969],[-0.6271228490174839,44.79362663580185],[-0.6271651816057452,44.79362987981102],[-0.627836075908068,44.793587669035915]]}},{"type":"Feature","properties":{"name":"Rue des Résédas","distance":152.85324603179282,"sectionId":"26807-17369","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.627080073458247,44.79361836120969],[-0.6270454836376967,44.79359541209286],[-0.6270212788505493,44.793562582841204],[-0.6270148447324665,44.79353873566962],[-0.6268444155250309,44.79226335915188]]}},{"type":"Feature","properties":{"name":"Avenue Pey Berland","distance":16.14959921660132,"sectionId":"17749-17280","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.60963791548459,44.800817874852086],[-0.6096391446131232,44.80080315232458],[-0.6096378667872699,44.80078274405728],[-0.6096320655610014,44.80076283968727],[-0.6096217634550005,44.80074379883161],[-0.6096073730735705,44.800726148890426],[-0.6095891807458483,44.800710421274296],[-0.6095588933797128,44.80069147420939]]}},{"type":"Feature","properties":{"name":"Avenue Pey Berland","distance":31.836771164726617,"sectionId":"17749-17282","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6095588933797128,44.80069147420939],[-0.6095433744470546,44.800686111356214],[-0.6095169419858123,44.80067821221731],[-0.6094891856112683,44.80067341790884],[-0.6094606216789674,44.80067189220863],[-0.6094320078361272,44.800673611069556],[-0.609404228006376,44.80067854643998],[-0.6093780398362934,44.80068667427534],[-0.6093537996328163,44.800697622936454],[-0.6093325063404421,44.80071118055606],[-0.6093145218999927,44.800727065401425],[-0.6093003176402956,44.80074472201834],[-0.6092902498764418,44.800763778769024],[-0.6092846692958378,44.800783774111395],[-0.6092835421296164,44.80080416861948],[-0.6092841275076156,44.80081351866447]]}},{"type":"Feature","properties":{"name":"Avenue Léon Duguit","distance":"Unknown","sectionId":"17749-as=127941","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6096747182570297,44.80062564089148],[-0.6095588933797128,44.80069147420939]]}},{"type":"Feature","properties":{"name":"Rue Marc Sangnier","distance":43.34275485769344,"sectionId":"31586-16436","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6061904248093064,44.80935934252739],[-0.6067367308739857,44.809327157783876]]}},{"type":"Feature","properties":{"name":"Rue du Colonel Rozanoff","distance":62.63599041191104,"sectionId":"16436-16435","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6070114019224195,44.80985200795313],[-0.6068910981952097,44.80969493507652],[-0.6067962175351043,44.80952147165574],[-0.6067367308739857,44.809327157783876]]}},{"type":"Feature","properties":{"name":"Rue Marc Sangnier","distance":43.34275485769344,"sectionId":"16436-31586","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6061904248093064,44.80935934252739],[-0.6067367308739857,44.809327157783876]]}},{"type":"Feature","properties":{"name":"Rue Marc Sangnier","distance":67.71469107757473,"sectionId":"16436-17118","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6067367308739857,44.809327157783876],[-0.6075898372026082,44.809273619724856]]}},{"type":"Feature","properties":{"name":"Avenue Marcel Pagnol","distance":129.79467181343782,"sectionId":"16504-16347","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6199814020393726,44.797727427460025],[-0.6207722802030106,44.798098076945784],[-0.6210338750266592,44.798189920842134],[-0.621365980846125,44.79824006230291],[-0.6214167578327167,44.79826691178667]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":54.968126684741065,"sectionId":"16504-16503","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6199814020393726,44.797727427460025],[-0.6204684765805153,44.7973743793357]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":145.42175609588054,"sectionId":"16504-16505","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6194418446698561,44.798961628216425],[-0.6195021725914712,44.798900793646354],[-0.6195449015210602,44.79884178032961],[-0.6195814077790118,44.798778370789044],[-0.61961484939489,44.798698393336664],[-0.6197865959542884,44.79802018370532],[-0.6198483445901574,44.797873183893095],[-0.6199814020393726,44.797727427460025]]}},{"type":"Feature","properties":{"name":"Avenue Marcel Pagnol","distance":129.79467181343782,"sectionId":"16347-16504","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6199814020393726,44.797727427460025],[-0.6207722802030106,44.798098076945784],[-0.6210338750266592,44.798189920842134],[-0.621365980846125,44.79824006230291],[-0.6214167578327167,44.79826691178667]]}},{"type":"Feature","properties":{"name":"Avenue des Chasseurs","distance":98.45200141850133,"sectionId":"16347-16346","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6213004097149313,44.79914595828795],[-0.6214359298816667,44.79832035139863],[-0.6214167578327167,44.79826691178667]]}},{"type":"Feature","properties":{"name":"Avenue du Maréchal Juin","distance":62.20969222638523,"sectionId":"25908-16722","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6270886859262708,44.794153454899394],[-0.6274282079982271,44.79408244900793],[-0.6275512127806726,44.794066904402],[-0.6277226389497402,44.794048824033965],[-0.6278565756756521,44.794040137058424]]}},{"type":"Feature","properties":{"name":"Avenue du Maréchal Juin","distance":109.14089292562147,"sectionId":"25908-as=126835","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6278565756756521,44.794040137058424],[-0.6280772120147169,44.794048141962],[-0.6284686254573436,44.79406393973606],[-0.6288910052258898,44.79408730595882],[-0.6292324178976736,44.79411329562805]]}},{"type":"Feature","properties":{"name":"Avenue du Maréchal Juin","distance":7.4728868448321535,"sectionId":"25908-as=2848","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6278562848933282,44.79403090537901],[-0.6278565756756521,44.794040137058424]]}},{"type":"Feature","properties":{"name":"Rue des Marguerites","distance":109.39344950645419,"sectionId":"16590-17129","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6334931477747833,44.807382520972965],[-0.6321402210686764,44.8075884236563]]}},{"type":"Feature","properties":{"name":"Rue Etienne Marcel","distance":53.464348530588545,"sectionId":"16590-16591","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6334931477747833,44.807382520972965],[-0.6336468350273577,44.807851273265534]]}},{"type":"Feature","properties":{"name":"Rue Etienne Marcel","distance":86.62391639664976,"sectionId":"16590-16589","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6332361872648015,44.80662438438843],[-0.6334931477747833,44.807382520972965]]}},{"type":"Feature","properties":{"name":"Avenue Maurice Faye","distance":245.66316171564787,"sectionId":"17039-16939","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6238502063826362,44.812110102232744],[-0.6247758361554655,44.81422144580021]]}},{"type":"Feature","properties":{"name":"Rue du Général Bordas","distance":58.876155035781174,"sectionId":"19989-19988","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5899764767772134,44.80123120461399],[-0.5892428261966974,44.801140946932136]]}},{"type":"Feature","properties":{"name":"Rue du Général Bordas","distance":54.18548890816193,"sectionId":"19989-19990","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5892428261966974,44.801140946932136],[-0.5885653989972357,44.80106764762856]]}},{"type":"Feature","properties":{"name":"Rue du Général Percin","distance":86.50087703034708,"sectionId":"19989-20001","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5895090725482314,44.800385584844534],[-0.5892428261966974,44.801140946932136]]}},{"type":"Feature","properties":{"name":"Allée René Laroumagne","distance":102.27481631511532,"sectionId":"20522-20520","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6033760385970242,44.80532050067225],[-0.6030579491786829,44.805401832883284],[-0.6021666254435213,44.80564680328958]]}},{"type":"Feature","properties":{"name":"Allée René Laroumagne","distance":102.27481631511532,"sectionId":"20520-20522","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6033760385970242,44.80532050067225],[-0.6030579491786829,44.805401832883284],[-0.6021666254435213,44.80564680328958]]}},{"type":"Feature","properties":{"name":"Allée René Laroumagne","distance":48.96005588607306,"sectionId":"20520-20412","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6021666254435213,44.80564680328958],[-0.601584876390149,44.80579773715195]]}},{"type":"Feature","properties":{"name":"Allée René Laroumagne","distance":66.23232471137628,"sectionId":"20520-20521","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6021666254435213,44.80564680328958],[-0.6018719681467807,44.80508861502246]]}},{"type":"Feature","properties":{"name":"Allée René Laroumagne","distance":"Unknown","sectionId":"20520-as=127945","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6022917175528385,44.80588894695939],[-0.6021666254435213,44.80564680328958]]}},{"type":"Feature","properties":{"name":"Allée René Laroumagne","distance":"Unknown","sectionId":"30378-as=127945","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6022917175528385,44.80588894695939],[-0.6022917175528385,44.80588894695939]]}},{"type":"Feature","properties":{"name":"Voie 1 Faculté des Sciences","distance":72.60010827841442,"sectionId":"20401-20532","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5988915706544438,44.807154774322285],[-0.5995847070439414,44.80697111145264],[-0.5996286700816077,44.80694502371109],[-0.5996391429552208,44.80691312145729],[-0.5996080759009443,44.806864276637434]]}},{"type":"Feature","properties":{"name":"Voie 1 Faculté des Sciences","distance":64.70642330644836,"sectionId":"20401-20535","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5996080759009443,44.806864276637434],[-0.5992583538122628,44.80694519566831],[-0.5988426315947495,44.807068947301644]]}},{"type":"Feature","properties":{"name":"Avenue des Facultes","distance":30.836226217949225,"sectionId":"20401-53581","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5996080759009443,44.806864276637434],[-0.5999683281837823,44.80675796006154]]}},{"type":"Feature","properties":{"name":"Voie 1 Faculté des Sciences","distance":68.51389739415018,"sectionId":"57744-20530","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5977172695857862,44.80742792452227],[-0.597854529927741,44.80760179742024],[-0.5980661419872498,44.80799106177666]]}},{"type":"Feature","properties":{"name":"Voie 1 Faculté des Sciences","distance":30.76724976820844,"sectionId":"57744-23291","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5980661419872498,44.80799106177666],[-0.598175104191677,44.80825698384061]]}},{"type":"Feature","properties":{"name":"Voie 1 Faculté des Sciences","distance":256.6868902257629,"sectionId":"57744-53587","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5980661419872498,44.80799106177666],[-0.6000949198921345,44.80744522031754],[-0.6001726211701689,44.80739060327828],[-0.600184254021919,44.80727700151726],[-0.600137809708099,44.80714523969952],[-0.6003041573304841,44.80685873719832],[-0.600306549408043,44.806789658363755],[-0.6002766793537899,44.806733069436376]]}},{"type":"Feature","properties":{"name":"Rue Georges Bizet","distance":9.009049730323163,"sectionId":"34169-19576","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.587796914409828,44.79791488591274],[-0.5877750460731076,44.79799448753065]]}},{"type":"Feature","properties":{"name":"Allée des Charmes","distance":50.288304042878806,"sectionId":"34169-23429","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5872243072582464,44.79794565051813],[-0.587323430036597,44.797871359204876],[-0.5873510577697331,44.79785787626137],[-0.5873858173825413,44.79784921292544],[-0.5874304460787433,44.79785275964089],[-0.5876443911271026,44.797887358198196],[-0.587796914409828,44.79791488591274]]}},{"type":"Feature","properties":{"name":"Rue Georges Bizet","distance":95.39551269712327,"sectionId":"34169-19771","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5880899537441516,44.79708175177864],[-0.587796914409828,44.79791488591274]]}},{"type":"Feature","properties":{"name":"Rue Aldona","distance":140.77576037334674,"sectionId":"19576-19575","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5895145995675709,44.798263440100435],[-0.5877750460731076,44.79799448753065]]}},{"type":"Feature","properties":{"name":"Rue Aldona","distance":88.50573412695198,"sectionId":"19576-19577","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5877750460731076,44.79799448753065],[-0.5874940924930621,44.79876580341441]]}},{"type":"Feature","properties":{"name":"Rue Georges Bizet","distance":9.009049730323163,"sectionId":"19576-34169","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.587796914409828,44.79791488591274],[-0.5877750460731076,44.79799448753065]]}},{"type":"Feature","properties":{"name":"Impasse des Acacias","distance":36.30525584771499,"sectionId":"19554-19553","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5811476582560566,44.79898500943584],[-0.5811458600226866,44.79899272299039],[-0.5811303789384671,44.7990205051733],[-0.5811081752372063,44.799045976754684],[-0.5810804613885764,44.79906828881808],[-0.581047582708136,44.79908688999771],[-0.5810113237821022,44.799101994341925],[-0.5808605655680199,44.79915583565918],[-0.5808249881772474,44.7991717292149],[-0.5808042810274717,44.79918463227966]]}},{"type":"Feature","properties":{"name":"Rue Ronsard","distance":186.69250154172965,"sectionId":"20161-20328","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6004554726115798,44.79519916794754],[-0.6025536281227533,44.79596940673287]]}},{"type":"Feature","properties":{"name":"Rue Malherbe","distance":39.31984619829041,"sectionId":"20161-20162","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6025536281227533,44.79596940673287],[-0.602782077306796,44.79565498770984]]}},{"type":"Feature","properties":{"name":"Rue Ronsard","distance":37.42534267983329,"sectionId":"20161-23330","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6025536281227533,44.79596940673287],[-0.6029775749561365,44.79611911546831]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":10.80348717335794,"sectionId":"23330-19963","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6030959881292656,44.796167611720165],[-0.6029775749561365,44.79611911546831]]}},{"type":"Feature","properties":{"name":"Rue Ronsard","distance":37.42534267983329,"sectionId":"23330-20161","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6025536281227533,44.79596940673287],[-0.6029775749561365,44.79611911546831]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":106.96476888783167,"sectionId":"23330-23328","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6039085937317981,44.795420660585705],[-0.6031698247275253,44.795968441697646],[-0.6029775749561365,44.79611911546831]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":65.55382682099903,"sectionId":"23330-as=125061","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6029775749561365,44.79611911546831],[-0.6024211081568865,44.796556538702916]]}},{"type":"Feature","properties":{"name":"Rue Lamartine","distance":95.37480538901114,"sectionId":"20073-20107","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.586804278974005,44.813557993963954],[-0.5867538962503042,44.81347031161888],[-0.5866759275563211,44.81336232983947],[-0.586411832963497,44.813016905663964],[-0.5863411349325663,44.81292202654684],[-0.5863038493318639,44.81286176635362],[-0.5862677591195563,44.81279020825787]]}},{"type":"Feature","properties":{"name":"Rue Jacques Juillac","distance":99.76631812087524,"sectionId":"20073-20071","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5873405205806616,44.81311328679103],[-0.587041665128302,44.812862104636736],[-0.5870014528229264,44.812836167974545],[-0.5869533553365147,44.812815704674364],[-0.5868924492112061,44.81280294184921],[-0.586828819542169,44.81279521936008],[-0.5862677591195563,44.81279020825787]]}},{"type":"Feature","properties":{"name":"Rue Lamartine","distance":53.206872321615506,"sectionId":"20073-20116","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5862677591195563,44.81279020825787],[-0.5862499193941397,44.81273942413745],[-0.5862286700997095,44.81266028170668],[-0.5862081168638413,44.81255571430498],[-0.5861961879227796,44.812429075256624],[-0.5861854658165723,44.812315730242524]]}},{"type":"Feature","properties":{"name":"Avenue Maréchal de Lattre de Tassigny","distance":113.48390393231695,"sectionId":"20116-20160","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5876207778322377,44.81232353005264],[-0.5861854658165723,44.812315730242524]]}},{"type":"Feature","properties":{"name":"Rue Lamartine","distance":53.206872321615506,"sectionId":"20116-20073","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5862677591195563,44.81279020825787],[-0.5862499193941397,44.81273942413745],[-0.5862286700997095,44.81266028170668],[-0.5862081168638413,44.81255571430498],[-0.5861961879227796,44.812429075256624],[-0.5861854658165723,44.812315730242524]]}},{"type":"Feature","properties":{"name":"Résidence Jocelin","distance":87.13681627840607,"sectionId":"20116-20416","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5861854658165723,44.812315730242524],[-0.585083395922537,44.812322723297065]]}},{"type":"Feature","properties":{"name":"Rue Lamartine","distance":30.566795377472573,"sectionId":"20116-as=4740","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5861854658165723,44.812315730242524],[-0.5861746180764528,44.812040638802586]]}},{"type":"Feature","properties":{"name":"Rue du Professeur Jeanneney","distance":193.9029175452635,"sectionId":"20124-25679","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5823120971842611,44.801480439965296],[-0.5834060449157008,44.80059704873425],[-0.5834441836997187,44.80057350681739],[-0.5834936025775972,44.800562491143026],[-0.5835423164432371,44.80056455949858],[-0.5835794510121128,44.80058185615917],[-0.5838946256883838,44.80088108504668],[-0.5839187422932206,44.800933203016335]]}},{"type":"Feature","properties":{"name":"Rue Léon Blum","distance":123.7044902845429,"sectionId":"20124-20123","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.582923523265462,44.8017866446877],[-0.5838852843041873,44.80099947645523],[-0.5839187422932206,44.800933203016335]]}},{"type":"Feature","properties":{"name":"Allée Georges Simenon","distance":69.60603756604718,"sectionId":"29726-16224","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6207757593926647,44.80773671572647],[-0.6208438246939155,44.80756726410974],[-0.6208753055605339,44.807510410245456],[-0.6211193583536668,44.80726995538044],[-0.6210701817858093,44.80721431798189],[-0.6210431820372987,44.807195449262856]]}},{"type":"Feature","properties":{"name":"Allée Georges Simenon","distance":39.003361561326564,"sectionId":"29726-17517","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6210431820372987,44.807195449262856],[-0.6206966773237143,44.80705387855583],[-0.6206160801426124,44.80701978018523]]}},{"type":"Feature","properties":{"name":"Allée Georges Simenon","distance":39.003361561326564,"sectionId":"17517-29726","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6210431820372987,44.807195449262856],[-0.6206966773237143,44.80705387855583],[-0.6206160801426124,44.80701978018523]]}},{"type":"Feature","properties":{"name":"Rue du Relais","distance":111.56658824969621,"sectionId":"17555-17554","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6075399926453159,44.79530020462924],[-0.6073473808465167,44.794923192266666],[-0.6073108465849874,44.794909487512825],[-0.6066385318067892,44.79508710593935],[-0.6065960838034486,44.79514268204756]]}},{"type":"Feature","properties":{"name":"Rue du Relais","distance":57.60998981550031,"sectionId":"17555-17556","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6075399926453159,44.79530020462924],[-0.6082477944066069,44.79542278223798]]}},{"type":"Feature","properties":{"name":"Résidence Parc de Suzon","distance":24.159332733596397,"sectionId":"24953-24954","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.583498074377168,44.81186020148482],[-0.5834151477483808,44.8118514635641],[-0.583339522877605,44.81180547207159],[-0.5833320972450592,44.81171859716562]]}},{"type":"Feature","properties":{"name":"Résidence Parc de Suzon","distance":35.46218168528991,"sectionId":"24953-24952","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5836397916982583,44.81212859390735],[-0.5835181598504503,44.81207945772821],[-0.583498074377168,44.81186020148482]]}},{"type":"Feature","properties":{"name":"Résidence Parc de Suzon","distance":24.159332733596397,"sectionId":"24954-24953","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.583498074377168,44.81186020148482],[-0.5834151477483808,44.8118514635641],[-0.583339522877605,44.81180547207159],[-0.5833320972450592,44.81171859716562]]}},{"type":"Feature","properties":{"name":"Résidence Parc de Suzon","distance":48.34288473685892,"sectionId":"24954-24956","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5833320972450592,44.81171859716562],[-0.5833240118119575,44.81143383395952],[-0.5831128403084147,44.81142832487604]]}},{"type":"Feature","properties":{"name":"Résidence Parc de Suzon","distance":29.134589966344706,"sectionId":"24954-24955","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5833320972450592,44.81171859716562],[-0.583224791348128,44.81171260887287],[-0.5831303031730319,44.81165631158226],[-0.5831192966936468,44.81155864960264]]}},{"type":"Feature","properties":{"name":"Impasse Roul","distance":17.244597636034413,"sectionId":"20418-as=129186","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5936575716898786,44.80631475967341],[-0.5936575716898786,44.80631475967341]]}},{"type":"Feature","properties":{"name":"Rue Pacaris","distance":14.176492830435482,"sectionId":"23612-30632","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5809334049683368,44.79758882598663],[-0.5809148995955872,44.797606614248636],[-0.5809037870823118,44.797627322579665],[-0.5809009882528249,44.797649480684846],[-0.5809065177071692,44.79767128647251],[-0.5809201542524736,44.797691215521326],[-0.5809358583233416,44.7977036927822]]}},{"type":"Feature","properties":{"name":"Rue Pacaris","distance":9.888360001386687,"sectionId":"23612-30634","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.581049012358213,44.797567980156245],[-0.5810180438256437,44.79756436114913],[-0.5809870762128263,44.797566867649735],[-0.58095823935601,44.797575162349034],[-0.5809334049683368,44.79758882598663]]}},{"type":"Feature","properties":{"name":"Rue Pacaris","distance":151.0456282947014,"sectionId":"23612-20134","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5809334049683368,44.79758882598663],[-0.580551225556099,44.79734484755646],[-0.580068242143265,44.79702386877795],[-0.5796231749395211,44.79672052167198],[-0.5795537033330288,44.79665100351513]]}},{"type":"Feature","properties":{"name":"Rue Pacaris","distance":15.259814669288431,"sectionId":"30632-30633","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5809358583233416,44.7977036927822],[-0.5809409190700705,44.797707767263674],[-0.5809672243169812,44.797719820632636],[-0.5809969770617486,44.797726270466526],[-0.5810281346262272,44.79772682075763],[-0.5810584129569158,44.79772136326226],[-0.5810854296505773,44.79771024324407],[-0.5811058814962979,44.797695276271334]]}},{"type":"Feature","properties":{"name":"Rue Pacaris","distance":14.176492830435482,"sectionId":"30632-23612","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5809334049683368,44.79758882598663],[-0.5809148995955872,44.797606614248636],[-0.5809037870823118,44.797627322579665],[-0.5809009882528249,44.797649480684846],[-0.5809065177071692,44.79767128647251],[-0.5809201542524736,44.797691215521326],[-0.5809358583233416,44.7977036927822]]}},{"type":"Feature","properties":{"name":"Rue Edmond Michelet","distance":88.43289217776649,"sectionId":"30632-19550","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5809358583233416,44.7977036927822],[-0.5808584173957647,44.797770719640575],[-0.580759003608699,44.797879155128626],[-0.5806907311756506,44.79796751274467],[-0.58038085195626,44.79839272485266]]}},{"type":"Feature","properties":{"name":"Rue Parmentier","distance":100.9324556536979,"sectionId":"20254-19681","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.585610866426628,44.80766229960811],[-0.5844384020875807,44.80730298439016]]}},{"type":"Feature","properties":{"name":"Rue Peydavant","distance":98.14648994073804,"sectionId":"20254-19813","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5860118123630705,44.80683708913506],[-0.5860038221047741,44.80688678729566],[-0.5860167644909039,44.80692920220184],[-0.5860127062527715,44.80697315811535],[-0.585610866426628,44.80766229960811]]}},{"type":"Feature","properties":{"name":"Rue Peydavant","distance":60.708740988852604,"sectionId":"20254-19763","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5853168094815572,44.808167198079275],[-0.585610866426628,44.80766229960811]]}},{"type":"Feature","properties":{"name":"Rue François Rabelais","distance":67.67579822769204,"sectionId":"19944-19942","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5957169283102807,44.79632937035617],[-0.5953694502999431,44.79629585589488],[-0.5949731293696177,44.79627235214532],[-0.5948658704777255,44.79626871633933]]}},{"type":"Feature","properties":{"name":"Rue François Rabelais","distance":132.38404984891974,"sectionId":"19944-19945","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5948658704777255,44.79626871633933],[-0.593193462358844,44.79621797596893]]}},{"type":"Feature","properties":{"name":"Résidence Raba 2","distance":45.56089540434719,"sectionId":"21898-20510","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5926451115140102,44.79696865908753],[-0.5925867961775646,44.79698707642441],[-0.5924861081899795,44.796952873086965],[-0.5924584451942022,44.7969190653337],[-0.5924878194613906,44.79667374462788]]}},{"type":"Feature","properties":{"name":"Résidence Raba 2","distance":6.083310888318299,"sectionId":"20510-25687","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5924110577336282,44.796670224070986],[-0.5924878194613906,44.79667374462788]]}},{"type":"Feature","properties":{"name":"Résidence Raba 2","distance":45.09523782792048,"sectionId":"20510-21898","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5924878194613906,44.79667374462788],[-0.592639381701318,44.79667976655872],[-0.5926733442907576,44.79671112320306],[-0.5926451115140102,44.79696865908753]]}},{"type":"Feature","properties":{"name":"Avenue des Arts Et Metiers","distance":71.04550221136599,"sectionId":"20412-42838","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.601584876390149,44.80579773715195],[-0.6012665955153395,44.80519957824972]]}},{"type":"Feature","properties":{"name":"Allée René Laroumagne","distance":48.96005588607306,"sectionId":"20412-20520","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6021666254435213,44.80564680328958],[-0.601584876390149,44.80579773715195]]}},{"type":"Feature","properties":{"name":"Avenue des Arts Et Metiers","distance":41.21920373273579,"sectionId":"20412-22891","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6017685441052617,44.806145044514714],[-0.601584876390149,44.80579773715195]]}},{"type":"Feature","properties":{"name":"Rond-point Plume la Poule","distance":29.40414055634349,"sectionId":"20249-20292","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5846706106451018,44.799865821105186],[-0.5846606362024301,44.79987226104711],[-0.5846422598198197,44.79989211773739],[-0.584631386281011,44.79991462055669],[-0.5846285631198808,44.79993840102652],[-0.5846343211001409,44.79996182094681],[-0.584647945002451,44.79998355163412],[-0.5846687140143846,44.80000217449828],[-0.5846954189829496,44.80001655658468],[-0.5847263568330243,44.80002576067163],[-0.5847594624249837,44.800029131193845],[-0.5847927097471398,44.80002664192913],[-0.5848152581641884,44.80002097670167]]}},{"type":"Feature","properties":{"name":"Rond-point Plume la Poule","distance":12.32828346242257,"sectionId":"20249-20109","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5848152076639289,44.79984721067967],[-0.5847811153178921,44.799840177929354],[-0.5847476836218268,44.799839700309704],[-0.5847151315753353,44.799845230427906],[-0.5846854516196511,44.79985625507602],[-0.5846706106451018,44.799865821105186]]}},{"type":"Feature","properties":{"name":"Rue Pacaris","distance":108.65787609562342,"sectionId":"20249-as=126275","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5846706106451018,44.799865821105186],[-0.5845446748750324,44.79982438925881],[-0.5842750151742157,44.79966704773293],[-0.584055863863987,44.79953045415536],[-0.5838172528492933,44.79939627503608],[-0.5836954339824488,44.799327417824934],[-0.583594741220704,44.799262579054854]]}},{"type":"Feature","properties":{"name":"Rue André Messager","distance":199.36381948263733,"sectionId":"19618-19617","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5922783509610803,44.796444976952124],[-0.5921876898744992,44.79643360775383],[-0.5909773960995183,44.796359769140246],[-0.5897684222230885,44.79628065133203]]}},{"type":"Feature","properties":{"name":"Rue André Messager","distance":55.77682777041475,"sectionId":"19618-20430","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5897684222230885,44.79628065133203],[-0.5898253807501236,44.79584015404845],[-0.5898589085239744,44.79578531672493]]}},{"type":"Feature","properties":{"name":"Rue André Messager","distance":107.5971551852465,"sectionId":"19618-19619","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5897684222230885,44.79628065133203],[-0.5884126126163992,44.79620020875445]]}},{"type":"Feature","properties":{"name":"Rue André Messager","distance":192.2477239860676,"sectionId":"19619-19620","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5884126126163992,44.79620020875445],[-0.5859913165365825,44.79604678625102]]}},{"type":"Feature","properties":{"name":"Rue André Messager","distance":107.5971551852465,"sectionId":"19619-19618","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5897684222230885,44.79628065133203],[-0.5884126126163992,44.79620020875445]]}},{"type":"Feature","properties":{"name":"Rue Georges Bizet","distance":73.16100494392796,"sectionId":"19619-20009","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5886201223908932,44.795558312862916],[-0.5884126126163992,44.79620020875445]]}},{"type":"Feature","properties":{"name":"Rue Georges Bizet","distance":101.18509621215271,"sectionId":"19619-19771","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5884126126163992,44.79620020875445],[-0.5880899537441516,44.79708175177864]]}},{"type":"Feature","properties":{"name":"Rue du Haut Carre","distance":80.57365087120077,"sectionId":"20053-19802","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5944407225173641,44.81033496976032],[-0.5947431460640369,44.810446213011325],[-0.5953333058379465,44.810684745640245]]}},{"type":"Feature","properties":{"name":"Rue Pierre Noailles","distance":34.564865465432916,"sectionId":"20053-28642","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5944407225173641,44.81033496976032],[-0.5944521996892678,44.81032217576111],[-0.5945133408600697,44.81018043632527],[-0.5945170158935137,44.810164285583184],[-0.5945170002760433,44.81014780105634],[-0.5945132069583248,44.81013161606993],[-0.594505658371524,44.81011609024261],[-0.5944946351421221,44.81010166511787],[-0.5944804179016955,44.810088782235205],[-0.594463402358993,44.810077699335835],[-0.5944439898304671,44.81006876406697],[-0.5944228342264861,44.81006231609056]]}},{"type":"Feature","properties":{"name":"Rue Pierre Noailles","distance":12.132583811719412,"sectionId":"20053-28940","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5943043354637455,44.81037197922775],[-0.5943136504963611,44.810373216283445],[-0.5943343098917043,44.810373734545614],[-0.5943548403409727,44.81037218499194],[-0.5943748517399348,44.81036839978373],[-0.594393855711396,44.810362664599566],[-0.594411467758116,44.81035490150907],[-0.5944273314080498,44.81034548210374],[-0.5944407225173641,44.81033496976032]]}},{"type":"Feature","properties":{"name":"Rue Marivaux","distance":143.7483166291619,"sectionId":"21900-20186","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5984941854509571,44.79876959648253],[-0.5997139160059415,44.798065466565966],[-0.5995584697456817,44.797928416799316]]}},{"type":"Feature","properties":{"name":"Rue Marivaux","distance":142.26611268611245,"sectionId":"20186-21900","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5995584697456817,44.797928416799316],[-0.5983513532798703,44.79863800133438],[-0.5984941854509571,44.79876959648253]]}},{"type":"Feature","properties":{"name":"Rue Marivaux","distance":19.102047389788034,"sectionId":"20186-19940","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5997444328869818,44.79781866557593],[-0.5995584697456817,44.797928416799316]]}},{"type":"Feature","properties":{"name":"Avenue de la Marne","distance":145.2444416845771,"sectionId":"20513-25700","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5959392521576963,44.79447186994839],[-0.5954968380460426,44.79449820011946],[-0.59515921866524,44.79448058846603],[-0.5948698901247353,44.794429920465475],[-0.5941555003119894,44.79425369005078]]}},{"type":"Feature","properties":{"name":"Avenue de la Marne","distance":84.25886615472552,"sectionId":"20513-23479","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.596962525832824,44.7942880795142],[-0.596718890129175,44.794375688623745],[-0.5965060776399489,44.7944159299597],[-0.5959392521576963,44.79447186994839]]}},{"type":"Feature","properties":{"name":"Avenue de la Marne","distance":84.67000126342548,"sectionId":"20513-25664","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5959392521576963,44.79447186994839],[-0.5959390680250395,44.794393864488775],[-0.5959447113890358,44.794376840644354],[-0.595963724452301,44.79436119567471],[-0.5960224204527539,44.79434285452892],[-0.5965393705192873,44.794300652609074],[-0.59683847161794,44.79421390194165]]}},{"type":"Feature","properties":{"name":"Avenue de la Marne","distance":145.2444416845771,"sectionId":"25700-20513","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5959392521576963,44.79447186994839],[-0.5954968380460426,44.79449820011946],[-0.59515921866524,44.79448058846603],[-0.5948698901247353,44.794429920465475],[-0.5941555003119894,44.79425369005078]]}},{"type":"Feature","properties":{"name":"Avenue Georges Clémenceau","distance":104.75651454178886,"sectionId":"20033-19894","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5945591266873305,44.804573269848255],[-0.5956951221808845,44.80408803249884]]}},{"type":"Feature","properties":{"name":"Avenue Georges Clémenceau","distance":211.2417855172708,"sectionId":"20033-19730","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5956951221808845,44.80408803249884],[-0.5979900250654584,44.80311454502185]]}},{"type":"Feature","properties":{"name":"Rue Matteoti","distance":98.18699938622947,"sectionId":"20033-20104","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5963189105283733,44.80485238606977],[-0.5956951221808845,44.80408803249884]]}},{"type":"Feature","properties":{"name":"Avenue du Lycée","distance":93.98384606426458,"sectionId":"20033-19587","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.594810758112071,44.80352351693588],[-0.595640292336261,44.80404274296636],[-0.5956951221808845,44.80408803249884]]}},{"type":"Feature","properties":{"name":"Rue Camille Saint-Saëns","distance":100.89612736212217,"sectionId":"19749-19748","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5827995422326325,44.79544303896483],[-0.5827263613068654,44.79559686185562],[-0.5826967176719626,44.795645088623786],[-0.58266853671454,44.795680207463164],[-0.5823519493253732,44.79602960833392],[-0.5822565001424345,44.79625673810243]]}},{"type":"Feature","properties":{"name":"Rue des Flamboyants","distance":18.032076666193404,"sectionId":"16630-16629","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6207580646347948,44.80506171139595],[-0.6209765883858974,44.80501529813661]]}},{"type":"Feature","properties":{"name":"Rue des Flamboyants","distance":16.577689815120618,"sectionId":"16631-16628","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6202864288590101,44.80518005017042],[-0.6201737519763828,44.80505418675388]]}},{"type":"Feature","properties":{"name":"Rue des Flamboyants","distance":39.54239018154094,"sectionId":"16631-16629","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6207580646347948,44.80506171139595],[-0.6202864288590101,44.80518005017042]]}},{"type":"Feature","properties":{"name":"Rue des Flamboyants","distance":15.235011616417305,"sectionId":"16631-16632","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6202864288590101,44.80518005017042],[-0.6201678190527815,44.80528814201962]]}},{"type":"Feature","properties":{"name":"Rue Ernest Renan","distance":92.36202940615266,"sectionId":"19893-19894","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5951509690186139,44.80529017486023],[-0.5945591266873305,44.804573269848255]]}},{"type":"Feature","properties":{"name":"Rue Jules Guesde","distance":104.37244417936219,"sectionId":"19893-20104","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5951509690186139,44.80529017486023],[-0.5963189105283733,44.80485238606977]]}},{"type":"Feature","properties":{"name":"Rue Ernest Renan","distance":94.7277352083966,"sectionId":"19893-19892","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5953226814922169,44.806134221973636],[-0.5951509690186139,44.80529017486023]]}},{"type":"Feature","properties":{"name":"Rue Lafitte","distance":16.958359101791018,"sectionId":"20096-20111","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5862735772825147,44.79490789896886],[-0.5863172883442309,44.79475842595066]]}},{"type":"Feature","properties":{"name":"Rue Lafitte","distance":55.58382593690049,"sectionId":"20096-20055","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5861596889364554,44.79540171578158],[-0.5862735772825147,44.79490789896886]]}},{"type":"Feature","properties":{"name":"Rue Blumerel","distance":24.899261815325442,"sectionId":"22360-19691","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5842133684977429,44.80200895198547],[-0.5839626726056485,44.80214458791417]]}},{"type":"Feature","properties":{"name":"Rue Peydavant","distance":15.665824151134887,"sectionId":"22360-22361","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5851201875665865,44.80179119926634],[-0.5851151390953323,44.80180360951636],[-0.5851126547813236,44.801830802419424],[-0.5851184993276105,44.801857642697826],[-0.5851322212241612,44.801882973521195],[-0.5851533689567878,44.801905638057626],[-0.5851729305762308,44.80191907417385]]}},{"type":"Feature","properties":{"name":"Rue Peydavant","distance":13.0665165449725,"sectionId":"22360-22359","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5852274849938373,44.80170782441463],[-0.5851994546724691,44.8017169054496],[-0.585168829747565,44.80173309463922],[-0.5851439143747236,44.80175360792707],[-0.5851256628779079,44.80177751441675],[-0.5851201875665865,44.80179119926634]]}},{"type":"Feature","properties":{"name":"Rue Blumerel","distance":79.61806735510142,"sectionId":"22360-19690","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5842133684977429,44.80200895198547],[-0.584341590760821,44.80194411950809],[-0.5844760048016592,44.801872033368106],[-0.5845646978369996,44.80183098220742],[-0.5846658913618529,44.80179531144972],[-0.584750823944423,44.80177531110105],[-0.5848536747407324,44.80176629484492],[-0.5849531948594707,44.801768932415065],[-0.5850656636308562,44.80178415428938],[-0.5851201875665865,44.80179119926634]]}},{"type":"Feature","properties":{"name":"Rue Blumerel","distance":41.115485243672175,"sectionId":"19693-19631","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5829773948842143,44.80285700859803],[-0.5826711868171895,44.80315617672418]]}},{"type":"Feature","properties":{"name":"Résidence Michel Montaigne","distance":30.212145792789855,"sectionId":"19693-20450","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5829773948842143,44.80285700859803],[-0.582654089070662,44.80271207266947]]}},{"type":"Feature","properties":{"name":"Rue Blumerel","distance":91.88821038037247,"sectionId":"19693-19692","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.583779240354156,44.80225909656631],[-0.5836206208357682,44.80235958108798],[-0.5829773948842143,44.80285700859803]]}},{"type":"Feature","properties":{"name":"Piste Cyclable Thouars","distance":82.28904264322718,"sectionId":"25686-25687","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5923505719694316,44.79740711467132],[-0.5923292350170777,44.79725960360406],[-0.5923761742138395,44.796847436536005],[-0.5923915796231064,44.79679010808445],[-0.5924110577336282,44.796670224070986]]}},{"type":"Feature","properties":{"name":"Rue Calixte Camelle","distance":162.96629838453512,"sectionId":"25686-19734","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5942055605025433,44.79804610025062],[-0.5923505719694316,44.79740711467132]]}},{"type":"Feature","properties":{"name":"Rue Calixte Camelle","distance":15.064754146033055,"sectionId":"25686-19733","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5923505719694316,44.79740711467132],[-0.5921843731680444,44.79734083928537]]}},{"type":"Feature","properties":{"name":"Piste Cyclable Thouars","distance":152.00607641459752,"sectionId":"25686-25685","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5917724060901783,44.798699046797225],[-0.5918262080728558,44.79866095443481],[-0.5918542530380289,44.798625747422626],[-0.5919036377979995,44.79856752606221],[-0.5920635466287136,44.79824241381726],[-0.5921288760566719,44.79807459931594],[-0.5922720098590404,44.79755949289481],[-0.5923505719694316,44.79740711467132]]}},{"type":"Feature","properties":{"name":"Avenue de Thouars","distance":75.57352734579268,"sectionId":"19733-20375","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5922619312697354,44.79666268358289],[-0.5922214191211087,44.79700744633009],[-0.5921843731680444,44.79734083928537]]}},{"type":"Feature","properties":{"name":"Rue Calixte Camelle","distance":15.064754146033055,"sectionId":"19733-25686","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5923505719694316,44.79740711467132],[-0.5921843731680444,44.79734083928537]]}},{"type":"Feature","properties":{"name":"Rue Charles Gounod","distance":325.0818275110984,"sectionId":"19733-19771","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5921843731680444,44.79734083928537],[-0.5880899537441516,44.79708175177864]]}},{"type":"Feature","properties":{"name":"Avenue de Thouars","distance":140.4029716539044,"sectionId":"19733-as=126725","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5921843731680444,44.79734083928537],[-0.5921674174069451,44.79743217761519],[-0.592075271313752,44.79777469763343],[-0.5919795209869134,44.7980715696703],[-0.5919150812532874,44.798257732715236],[-0.591749738721691,44.79856265778556],[-0.591749738721691,44.79856265778556]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":105.07652712491878,"sectionId":"20145-20144","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5934361361385686,44.80267325106588],[-0.5936100667772646,44.80223202842981],[-0.593751791100703,44.801885148170584],[-0.5937916863746345,44.80182488375475],[-0.5938418315239782,44.80177681685403]]}},{"type":"Feature","properties":{"name":"Avenue de Thouars","distance":6.248556834265734,"sectionId":"20145-38858","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5937829356824031,44.80173931199198],[-0.5938418315239782,44.80177681685403]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":83.89035841554184,"sectionId":"20145-as=125560","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5938418315239782,44.80177681685403],[-0.5938869217759313,44.80173899885876],[-0.5939783800105355,44.80168386116087],[-0.5946487832190162,44.80128760236258]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":116.27590882813966,"sectionId":"20141-59021","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5914934469368046,44.80787730359128],[-0.5914955038673537,44.807768149397134],[-0.5915105515369655,44.80766236845958],[-0.5915349401615435,44.807503414462836],[-0.5916048453184486,44.80724231158861],[-0.5917028232152922,44.80692505131087],[-0.591766336803742,44.8068580488834]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":"Unknown","sectionId":"20141-as=126843","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5915018630781435,44.80803675315485],[-0.5914934469368046,44.80787730359128]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":13.587766855754914,"sectionId":"59021-59022","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.591766336803742,44.8068580488834],[-0.5917530461618853,44.80686457610261],[-0.5917244589228257,44.80687409658636],[-0.5916958079380658,44.80687768181939],[-0.5916634127232887,44.80687586530662],[-0.5916341990419611,44.8068684202106],[-0.5916084990576307,44.806855428560446]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":116.27590882813966,"sectionId":"59021-20141","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5914934469368046,44.80787730359128],[-0.5914955038673537,44.807768149397134],[-0.5915105515369655,44.80766236845958],[-0.5915349401615435,44.807503414462836],[-0.5916048453184486,44.80724231158861],[-0.5917028232152922,44.80692505131087],[-0.591766336803742,44.8068580488834]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":11.773333959844777,"sectionId":"59021-29241","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.591766336803742,44.8068580488834],[-0.5918101268319217,44.806836178667034],[-0.5918345249577794,44.806821633226996],[-0.5918524526885063,44.80680284983291],[-0.5918630512275317,44.806781595907665]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":11.415174101239872,"sectionId":"29089-29090","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5964472687166597,44.8007340007718],[-0.5964623967240166,44.800731090165144],[-0.5965197072826585,44.80071072089456],[-0.5965703030351481,44.8006820962064]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":38.02598991989588,"sectionId":"29089-29095","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5965703030351481,44.8006820962064],[-0.5966105078610685,44.80064713400643],[-0.5966399934201979,44.800606655431295],[-0.5966571152591831,44.800562694304766],[-0.5966609809813749,44.80051717058117],[-0.596651461465492,44.80047207015828],[-0.5966289326868998,44.80042936295386],[-0.5965945226617212,44.80039090501591],[-0.5965714569927393,44.80037406839496]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":"Unknown","sectionId":"29089-as=125538","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5966519084589246,44.80082806120818],[-0.5965703030351481,44.8006820962064]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":9.038341232720912,"sectionId":"23328-17057","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6039085937317981,44.795420660585705],[-0.6039887601312252,44.7954786555727]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":106.96476888783167,"sectionId":"23328-23330","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6039085937317981,44.795420660585705],[-0.6031698247275253,44.795968441697646],[-0.6029775749561365,44.79611911546831]]}},{"type":"Feature","properties":{"name":"Esplanade d'Alcala de Henares","distance":27.234089291123645,"sectionId":"30496-as=127951","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5903439306842265,44.811647667559505],[-0.5902987171722328,44.811890740754194]]}},{"type":"Feature","properties":{"name":"Esplanade d'Alcala de Henares","distance":27.234089291123645,"sectionId":"30495-as=127951","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5902987171722328,44.811890740754194],[-0.5902507396256396,44.81214867142865]]}},{"type":"Feature","properties":{"name":"Allée François Pommez","distance":65.6034661246004,"sectionId":"30616-31147","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6294033291781501,44.80882408599701],[-0.6293940991229648,44.80880411165057],[-0.6293735963000191,44.80874377910505],[-0.6290654939923932,44.808286074605]]}},{"type":"Feature","properties":{"name":"Allée François Pommez","distance":65.6034661246004,"sectionId":"31147-30616","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6294033291781501,44.80882408599701],[-0.6293940991229648,44.80880411165057],[-0.6293735963000191,44.80874377910505],[-0.6290654939923932,44.808286074605]]}},{"type":"Feature","properties":{"name":"Rue Faust","distance":101.90428139214077,"sectionId":"16591-16608","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6324014687974893,44.808087433957105],[-0.6336468350273577,44.807851273265534]]}},{"type":"Feature","properties":{"name":"Rue Etienne Marcel","distance":53.464348530588545,"sectionId":"16591-16590","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6334931477747833,44.807382520972965],[-0.6336468350273577,44.807851273265534]]}},{"type":"Feature","properties":{"name":"Rue Etienne Marcel","distance":27.13306703172629,"sectionId":"27887-27886","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6318478280770993,44.80695050696602],[-0.6318708487837335,44.806920224357256],[-0.6319028551906827,44.80689397884912],[-0.6319438869450177,44.8068723997569],[-0.6319909504692127,44.806852159469905],[-0.6321219936157869,44.80681716620748]]}},{"type":"Feature","properties":{"name":"Rue Etienne Marcel","distance":28.27382709586264,"sectionId":"27887-27888","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6321219936157869,44.80681716620748],[-0.6322493369730197,44.80678571413149],[-0.6324150830141619,44.806739162560774],[-0.6324539626388954,44.80672359754805]]}},{"type":"Feature","properties":{"name":"Avenue Roger Cohé","distance":32.76940641056105,"sectionId":"27887-35397","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6319839823463206,44.80700867766565],[-0.6321437358089756,44.80698348760759],[-0.6321551389995546,44.80697970027553],[-0.6321645022481974,44.80697165405251],[-0.6321691078827614,44.80696240849734],[-0.6321689445737956,44.80695178380184],[-0.6321219936157869,44.80681716620748]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":23.036102566929706,"sectionId":"27555-30945","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6053857356036779,44.80792308022486],[-0.6054001766340339,44.807937486119535],[-0.6054326700956663,44.807961318969674],[-0.6054700997347832,44.80798112179187],[-0.6055114214751282,44.807996387180324],[-0.6055557287739428,44.808006783535625],[-0.6056017362113596,44.80801199127104],[-0.6056351334495721,44.808011833433156]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":170.94111504385845,"sectionId":"27555-20354","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6032398452665743,44.80796972897076],[-0.6040862033879802,44.80802308816946],[-0.6044102554291122,44.80802678270622],[-0.6046669698534264,44.80801603512214],[-0.6049138040245279,44.80799298852568],[-0.6053857356036779,44.80792308022486]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":10.639242253111677,"sectionId":"27555-25956","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6053373108555657,44.807834712668125],[-0.6053401918614544,44.807848403993674],[-0.605353450516638,44.8078803234028],[-0.6053735427531568,44.80791022455468],[-0.6053857356036779,44.80792308022486]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":9.9062642621911,"sectionId":"23133-23317","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6003712714452328,44.80628008541878],[-0.6004029693428196,44.8062628672184],[-0.6004343442787473,44.80623845263771],[-0.6004552821986776,44.80621508908806]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":26.76016642066438,"sectionId":"23133-22873","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6004552821986776,44.80621508908806],[-0.600459300840116,44.80621054784122],[-0.6004771262259215,44.80617989605552],[-0.6004871301046085,44.80614760012556],[-0.60048911044938,44.80611447719136],[-0.6004830139884674,44.806081700009884],[-0.6004690175607165,44.80605007372619],[-0.6004474467548337,44.80602075910165],[-0.6004191042273229,44.8059944513845],[-0.6004152790420273,44.805991960079176]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":56.946403477518494,"sectionId":"27599-49830","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6001917895831032,44.80508794082779],[-0.6001801286553827,44.80506533891499],[-0.6001751297462741,44.80503189640559],[-0.6001113002571422,44.80457918076215]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":86.32907519861166,"sectionId":"49830-27599","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6001113002571422,44.80457918076215],[-0.6001919930211759,44.804566447287385],[-0.6002310290208128,44.804567463723345],[-0.6002652944923549,44.804577188982584],[-0.6002929120260635,44.804595952744],[-0.6003172631288484,44.80461914385206],[-0.6003255820382929,44.804655093656024],[-0.6003762695458309,44.805049311332716],[-0.6003701914379115,44.805065448321265],[-0.6003577627118009,44.80508728136275],[-0.6003331205991393,44.80510400598139],[-0.6003071760979338,44.80511203382507],[-0.6002763652487775,44.80511508100307],[-0.6002474654232318,44.80511428422006],[-0.6002234344914212,44.80510837878168],[-0.6001917895831032,44.80508794082779]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":22.066986628957334,"sectionId":"49830-23353","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6001113002571422,44.80457918076215],[-0.6000852811907536,44.8043813726086]]}},{"type":"Feature","properties":{"name":"Rue de la Vieille Tour","distance":265.57456224783147,"sectionId":"19747-20232","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6005709443936075,44.81246494703294],[-0.6005489109202315,44.81225404099302],[-0.6004032409470913,44.811165952732004],[-0.6001777192518086,44.81026010596803],[-0.6001605108446603,44.810093998251546]]}},{"type":"Feature","properties":{"name":"Rue Camille Pelletan","distance":17.77809751901286,"sectionId":"19747-as=126612","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6005709443936075,44.81246494703294],[-0.6005709443936075,44.81246494703294]]}},{"type":"Feature","properties":{"name":"Rue de la Vieille Tour","distance":265.57456224783147,"sectionId":"20232-19747","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6005709443936075,44.81246494703294],[-0.6005489109202315,44.81225404099302],[-0.6004032409470913,44.811165952732004],[-0.6001777192518086,44.81026010596803],[-0.6001605108446603,44.810093998251546]]}},{"type":"Feature","properties":{"name":"Rue de la Vieille Tour","distance":149.03986333512012,"sectionId":"20232-as=128764","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6001605108446603,44.810093998251546],[-0.6002637299224294,44.80892227291324],[-0.6002824056991044,44.80875498884317]]}},{"type":"Feature","properties":{"name":"Avenue des Facultes","distance":76.42168320251702,"sectionId":"20396-20397","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6033032501363998,44.80586050945838],[-0.6024013038858907,44.80610770975058]]}},{"type":"Feature","properties":{"name":"Voie de l'Université 4","distance":113.30708152163238,"sectionId":"20396-20405","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6033032501363998,44.80586050945838],[-0.6038053565986792,44.806815962071745]]}},{"type":"Feature","properties":{"name":"Avenue des Facultes","distance":215.9117404965051,"sectionId":"20396-17751","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6057238322161185,44.8049954861119],[-0.6053676163335752,44.80520964438705],[-0.6051171421916265,44.8053260432795],[-0.6046422978811481,44.80549675584039],[-0.6033032501363998,44.80586050945838]]}},{"type":"Feature","properties":{"name":"Avenue Prévost","distance":74.01837943828706,"sectionId":"20397-20410","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6027296980286029,44.80673175962899],[-0.6024013038858907,44.80610770975058]]}},{"type":"Feature","properties":{"name":"Avenue des Facultes","distance":76.42168320251702,"sectionId":"20397-20396","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6033032501363998,44.80586050945838],[-0.6024013038858907,44.80610770975058]]}},{"type":"Feature","properties":{"name":"Avenue des Facultes","distance":0.41428521499304705,"sectionId":"20397-as=127946","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6024013038858907,44.80610770975058],[-0.6023964071705596,44.806109036414746]]}},{"type":"Feature","properties":{"name":"Rue Doyen Henri Vizioz","distance":113.38223176111663,"sectionId":"19847-19844","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5972536510442011,44.81180591126048],[-0.5964206283636074,44.811967014130445],[-0.5958535522035362,44.81201358750806]]}},{"type":"Feature","properties":{"name":"Rue du Haut Carre","distance":72.88645435938582,"sectionId":"19847-19614","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5972536510442011,44.81180591126048],[-0.5973681622161326,44.812083436514975],[-0.5975106500427024,44.81243610629011]]}},{"type":"Feature","properties":{"name":"Rue du Haut Carre","distance":10.626337942777024,"sectionId":"19847-20054","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5972166531379761,44.811713936264894],[-0.5972536510442011,44.81180591126048]]}},{"type":"Feature","properties":{"name":"Rue Pierre Noailles","distance":174.55092266160443,"sectionId":"28643-19731","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5920218479019826,44.81051866672442],[-0.5922877783847363,44.810485045889244],[-0.5933586256701098,44.81029439020979],[-0.5934688957326942,44.810278925819105],[-0.5941901639134951,44.81028631546872]]}},{"type":"Feature","properties":{"name":"Rue Pierre Noailles","distance":35.927295496249066,"sectionId":"28643-28642","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5944228342264861,44.81006231609056],[-0.5944004351257461,44.8100582495383],[-0.5943774464355764,44.810056904073946],[-0.594354505244212,44.81005834964841],[-0.5943321111292474,44.810062480393896],[-0.5943110162640742,44.81006918245979],[-0.5942918409173845,44.81007825608442],[-0.5942749471610891,44.81008941958086],[-0.5942608289715072,44.810102477178496],[-0.5942499635055617,44.81011696338905],[-0.5942427072317411,44.81013250662338],[-0.5941909183568125,44.810257825699686],[-0.5941890479904948,44.81027247809178],[-0.5941901639134951,44.81028631546872]]}},{"type":"Feature","properties":{"name":"Rue Pierre Noailles","distance":14.03740334188305,"sectionId":"28643-28940","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5941901639134951,44.81028631546872],[-0.5941945325778943,44.810301581463854],[-0.5942017163889127,44.81031531719373],[-0.5942116339015154,44.810328245888506],[-0.594224130788562,44.81033992201472],[-0.5942388225515645,44.81035026763737],[-0.5942555548617322,44.81035883722191],[-0.594273822528686,44.810365646731825],[-0.5942933561386616,44.810370434430695],[-0.5943043354637455,44.81037197922775]]}},{"type":"Feature","properties":{"name":"Rond-point de la Légion d'Honneur","distance":11.564228064257836,"sectionId":"29243-29242","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5886892546935539,44.80732974323805],[-0.5887206567832344,44.80734226475539],[-0.5887557979583218,44.80734980387392],[-0.5887924808823762,44.80735161918249],[-0.5888287887820327,44.80734741083005]]}},{"type":"Feature","properties":{"name":"Rue du Professeur Arnozan","distance":165.91247489355774,"sectionId":"29243-20314","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5878989934571109,44.80870572007875],[-0.5878985733962901,44.808656278438136],[-0.5879133190691808,44.808610592268735],[-0.5881589115750767,44.80821783574398],[-0.588322763537062,44.80795530317108],[-0.5885370847150049,44.80761929278278],[-0.5886581373609443,44.80743765211994],[-0.5886778278341419,44.80737181164313],[-0.5886892546935539,44.80732974323805]]}},{"type":"Feature","properties":{"name":"Rond-point de la Légion d'Honneur","distance":11.214951161189218,"sectionId":"29243-29245","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5886892546935539,44.80732974323805],[-0.58866168440338,44.8073116959087],[-0.5886407323645357,44.80729019682212],[-0.5886270748051944,44.80726594530009],[-0.5886221785661602,44.80724420989426]]}},{"type":"Feature","properties":{"name":"Esplanade du 8 Mai 1945","distance":19.74912817954634,"sectionId":"20312-20485","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5876967809948078,44.80906765093253],[-0.587919333101578,44.80914837087973]]}},{"type":"Feature","properties":{"name":"Rue du Professeur Arnozan","distance":16.501191075786526,"sectionId":"20312-20313","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5876967809948078,44.80906765093253],[-0.5878411980233785,44.808960402602814]]}},{"type":"Feature","properties":{"name":"Rue du Professeur Arnozan","distance":36.59824679703776,"sectionId":"20312-20311","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5873844207319046,44.80931081429517],[-0.5876967809948078,44.80906765093253]]}},{"type":"Feature","properties":{"name":"Avenue Eugène Et Marc Dulout","distance":26.499953366246448,"sectionId":"16601-36294","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6322121990324753,44.804561645228155],[-0.6324972230262332,44.80443615401674]]}},{"type":"Feature","properties":{"name":"Rue Gambetta","distance":"Unknown","sectionId":"16601-as=126957","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6326781083125196,44.80469621477551],[-0.6324972230262332,44.80443615401674]]}},{"type":"Feature","properties":{"name":"Avenue Eugène Et Marc Dulout","distance":8.297496953834068,"sectionId":"16601-as=126955","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6324972230262332,44.80443615401674],[-0.6325905772401907,44.804402042115]]}},{"type":"Feature","properties":{"name":"Rue César Franck","distance":79.14133929284861,"sectionId":"19759-19761","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5839721605433712,44.79625664083094],[-0.5833254041750363,44.79571293010645]]}},{"type":"Feature","properties":{"name":"Rue César Franck","distance":180.88093600875067,"sectionId":"19759-19671","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5848285086423236,44.796809595995924],[-0.5850169643146096,44.79611696207837],[-0.5850193902134347,44.796086798297395],[-0.5850023742812925,44.796055265606725],[-0.5849717317571858,44.796028396322626],[-0.584917160415909,44.79601345149175],[-0.584550601354561,44.79595978695407],[-0.5844971066755662,44.795960121885095],[-0.5844453276825956,44.79597787856817],[-0.5839721605433712,44.79625664083094]]}},{"type":"Feature","properties":{"name":"Rue César Franck","distance":16.99063648591804,"sectionId":"19759-19762","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5839721605433712,44.79625664083094],[-0.5840965601187471,44.796381356983915]]}},{"type":"Feature","properties":{"name":"Rue de Megret","distance":51.474880658849315,"sectionId":"20215-20213","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5873478577180511,44.80444115657791],[-0.5867244760266841,44.8043076775135]]}},{"type":"Feature","properties":{"name":"Rue Peydavant","distance":85.83111608911443,"sectionId":"20215-19997","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5867244760266841,44.8043076775135],[-0.586742943242999,44.804098105472036],[-0.5867200351165935,44.803925150249526],[-0.5866897638792186,44.803723330809916],[-0.5866414389109001,44.80354045736144]]}},{"type":"Feature","properties":{"name":"Rue Peydavant","distance":40.6780038541356,"sectionId":"20215-19627","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5866746519603945,44.8046721880755],[-0.5867244760266841,44.8043076775135]]}},{"type":"Feature","properties":{"name":"Résidence Parc de Suzon","distance":26.07975780285104,"sectionId":"24952-24950","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5836514704914351,44.81236324867341],[-0.5836397916982583,44.81212859390735]]}},{"type":"Feature","properties":{"name":"Résidence Parc de Suzon","distance":35.46218168528991,"sectionId":"24952-24953","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5836397916982583,44.81212859390735],[-0.5835181598504503,44.81207945772821],[-0.583498074377168,44.81186020148482]]}},{"type":"Feature","properties":{"name":"Avenue Phenix Haut-Brion","distance":97.1741193072366,"sectionId":"17285-16425","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.614133694372727,44.80488918499556],[-0.6145145899145501,44.80572097974112]]}},{"type":"Feature","properties":{"name":"Avenue du Rond Point","distance":144.53866301540458,"sectionId":"17285-16605","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6145145899145501,44.80572097974112],[-0.6127699290240495,44.80610926622104]]}},{"type":"Feature","properties":{"name":"Avenue Phenix Haut-Brion","distance":286.0570535751517,"sectionId":"17285-16227","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6145145899145501,44.80572097974112],[-0.6156386765922829,44.808168934866266]]}},{"type":"Feature","properties":{"name":"Avenue du Rond Point","distance":15.668589679459423,"sectionId":"17285-as=124624","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6155903790794491,44.80546780660766],[-0.6145145899145501,44.80572097974112]]}},{"type":"Feature","properties":{"name":"Esplanade des Antilles","distance":149.94565227312697,"sectionId":"15887-15886","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6144286227959143,44.79572258881573],[-0.6162000239246755,44.79524135064804]]}},{"type":"Feature","properties":{"name":"Avenue Jean Babin","distance":24.48044129490206,"sectionId":"15887-15879","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6144286227959143,44.79572258881573],[-0.6143089022443278,44.795925838115174]]}},{"type":"Feature","properties":{"name":"Avenue Jean Babin","distance":188.83428035354547,"sectionId":"15887-24467","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6154612586161684,44.79419555204469],[-0.6152358745688526,44.79442855631564],[-0.6150797995591784,44.79463503429334],[-0.6150024983682802,44.79474397006756],[-0.6148701229340214,44.79495113564059],[-0.6144286227959143,44.79572258881573]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":18.784035601369755,"sectionId":"16518-16499","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6229576027525034,44.794378110453],[-0.6229959303669044,44.79439814909484],[-0.6230380271767303,44.79441374362295],[-0.6230832223265556,44.79442428482021],[-0.6231302418987021,44.79442963310357],[-0.6231775707522589,44.79442983674528]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":6.935833046561477,"sectionId":"16518-27582","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6229018336977635,44.79433016103196],[-0.6229246857275096,44.79435357540785],[-0.6229576027525034,44.794378110453]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":303.620466664412,"sectionId":"16518-as=126826","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6229576027525034,44.794378110453],[-0.6230065329894773,44.7944702385557],[-0.623007881833746,44.79452190359879],[-0.622998499584751,44.7945497681119],[-0.6229446771716683,44.79470192255521],[-0.6228279547226726,44.7950268794269],[-0.6226888175547365,44.79540587968823],[-0.6226282527213566,44.79555545611212],[-0.6225514224920026,44.79569987535973],[-0.6224591750543634,44.7958345161116],[-0.6223705393675297,44.79594408856817],[-0.6222797711924088,44.79603382039288],[-0.6222142800053897,44.796092929349115],[-0.6221148692430387,44.796175999870194],[-0.6214402181527549,44.79664231874026],[-0.6213139958518566,44.7967215579503],[-0.6213139958518566,44.7967215579503]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":10.238402325571663,"sectionId":"16519-16500","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6213182259154546,44.79683321692945],[-0.6212775698220261,44.79678820861615],[-0.6212349465970253,44.796764252395086]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":27.532825889614816,"sectionId":"16519-16521","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6212349465970253,44.796764252395086],[-0.6211898407631874,44.79674911331413],[-0.6211560774032907,44.79674334207002],[-0.621121414817604,44.79674138295748],[-0.621086753801537,44.796743477542655],[-0.6210529725600052,44.796749507780675],[-0.6210210755715437,44.79675935160369],[-0.6209916772190072,44.796772719199055],[-0.6209657650414958,44.796789218793606],[-0.6209439477830334,44.7968084706697],[-0.6209334497793274,44.79682060587063]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":"Unknown","sectionId":"16519-as=126826","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6213139958518566,44.7967215579503],[-0.6212349465970253,44.796764252395086]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":23.55848653085408,"sectionId":"16526-15986","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6169246743947955,44.80027864516549],[-0.6169181496341023,44.800303715660036],[-0.6169169114561555,44.80032834777615],[-0.6169212349803718,44.800352893097326],[-0.6169309431724723,44.800376546503315],[-0.6169460078373359,44.800398858473734],[-0.6169658787591578,44.800419125838864],[-0.6169898907244851,44.80043682925261],[-0.6170177629827337,44.800451527224496],[-0.6170348711673813,44.80045800961697]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":299.6037419725218,"sectionId":"16526-16527","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6170348711673813,44.80045800961697],[-0.6170499004003688,44.80055437117076],[-0.6170502946190675,44.80060300361275],[-0.61697962835816,44.80100531093893],[-0.6169503503639924,44.80118803013178],[-0.6169187837436451,44.80134839135547],[-0.6168924403559787,44.801440753744146],[-0.6168568122660602,44.80153638414043],[-0.616825821419348,44.801601058571414],[-0.6167927076211578,44.80167021458375],[-0.6167301170117867,44.801773728855174],[-0.6166342064730959,44.80189875154662],[-0.6165503586931487,44.80199420358758],[-0.6164402360209595,44.80209841836813],[-0.6163112116692124,44.80219782904178],[-0.6161666511965815,44.80229566161493],[-0.6159774135699967,44.802397346684565],[-0.6157918313912205,44.80247864648155],[-0.615571817260901,44.802553653726214],[-0.6154639142190489,44.80257023603777],[-0.6153704507822452,44.802572936844314],[-0.615303508186988,44.80257281271715]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":11.170325214183489,"sectionId":"16526-16507","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6170348711673813,44.80045800961697],[-0.6170485946892249,44.80046297815326],[-0.6170814680759295,44.80047067072388],[-0.617115746124498,44.800474535112365],[-0.6171504073520003,44.80047442363929],[-0.6171720137256175,44.800471934783396]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":18.316983191160908,"sectionId":"16531-29758","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6108199774483072,44.80481444701006],[-0.6107808001779206,44.8047970435848],[-0.610738110337762,44.804784165720726],[-0.6106929576121422,44.80477641067098],[-0.610646742377925,44.804773914143865],[-0.6106006068118239,44.804776729961674]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":14.688062080817172,"sectionId":"16531-16514","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6109243507247113,44.804921214813355],[-0.6109078682169812,44.804890389227104],[-0.6108844433263534,44.80486185594839],[-0.6108550051008734,44.80483630614212],[-0.6108199774483072,44.80481444701006]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":298.42966904862527,"sectionId":"16531-16529","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6131457210272049,44.80282019760035],[-0.612865978007332,44.802911330050875],[-0.6127279699885666,44.802970484397314],[-0.6125839031423049,44.80304199222661],[-0.6124376263584324,44.8031327577409],[-0.6122808241948917,44.80324133345106],[-0.6121804089566304,44.803331002343064],[-0.6120377369710926,44.803483359676555],[-0.6119837921032429,44.80355740951318],[-0.6119359879848945,44.803622436171246],[-0.6117246316080097,44.80399128170782],[-0.611609849393684,44.80418491159654],[-0.6115092999059415,44.804327012359145],[-0.6114140580000519,44.8044366947833],[-0.6113277220276336,44.804528978575675],[-0.6112302010882644,44.80461441078422],[-0.6111287609394298,44.804693841691],[-0.6110180428676794,44.804760505029506],[-0.6109513723332212,44.80478496226963],[-0.6108199774483072,44.80481444701006]]}},{"type":"Feature","properties":{"name":"Avenue du Vallon","distance":36.922952828509025,"sectionId":"16536-17441","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6205284245130067,44.81087246378458],[-0.6206897558564304,44.81118442213069]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Nancel Pénard","distance":26.378629663078833,"sectionId":"16536-as=126200","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6205187955250818,44.8108745794685],[-0.6205284245130067,44.81087246378458]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Nancel Pénard","distance":22.01956833232724,"sectionId":"16536-as=125781","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6205284245130067,44.81087246378458],[-0.6207934155278639,44.8108114736739]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Nancel Pénard","distance":71.96085736034365,"sectionId":"16547-16546","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6328764318135781,44.80911814029118],[-0.6337864428814863,44.80910835023672]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":26.76016642066438,"sectionId":"22873-23133","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6004552821986776,44.80621508908806],[-0.600459300840116,44.80621054784122],[-0.6004771262259215,44.80617989605552],[-0.6004871301046085,44.80614760012556],[-0.60048911044938,44.80611447719136],[-0.6004830139884674,44.806081700009884],[-0.6004690175607165,44.80605007372619],[-0.6004474467548337,44.80602075910165],[-0.6004191042273229,44.8059944513845],[-0.6004152790420273,44.805991960079176]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":12.940884640330772,"sectionId":"22873-20350","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6004152790420273,44.805991960079176],[-0.6003848094757422,44.80597211553534],[-0.6003456121077931,44.805954348901174],[-0.6003025617233329,44.80594174883157],[-0.6002739308007025,44.805937160069774]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":153.7858142268606,"sectionId":"22873-as=126638","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6004152790420273,44.805991960079176],[-0.6004194219007658,44.80591444814489],[-0.6005805773055457,44.80550235433324],[-0.6006272799907852,44.80538502988931],[-0.6006545461952569,44.80528471572321],[-0.6006640080685695,44.80507560510431],[-0.6006119587252647,44.8046312546883],[-0.6006119587252647,44.8046312546883]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":12.982232664008855,"sectionId":"23255-25408","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6006221089494935,44.80453445507072],[-0.6006426594849548,44.804529210294945],[-0.6006816050860443,44.80451257327835],[-0.6007157124173687,44.80449140513154],[-0.6007471674791848,44.80446221351912]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":13.756390736258664,"sectionId":"23255-27598","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6004523068258636,44.8045365874173],[-0.6004654573699035,44.804540495084915],[-0.6005101061451532,44.804546288283035],[-0.6005554058204732,44.80454629558172],[-0.6006000935370055,44.804540556959594],[-0.6006221089494935,44.80453445507072]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":"Unknown","sectionId":"23255-as=126638","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6006119587252647,44.8046312546883],[-0.6006221089494935,44.80453445507072]]}},{"type":"Feature","properties":{"name":"Impasse des Acacias","distance":38.65258894181085,"sectionId":"19550-19551","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.58038085195626,44.79839272485266],[-0.5804263357493041,44.79844263936947],[-0.5805825453067416,44.7985377118534],[-0.5807320014946282,44.79863200587201]]}},{"type":"Feature","properties":{"name":"Rue Edmond Michelet","distance":88.43289217776649,"sectionId":"19550-30632","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5809358583233416,44.7977036927822],[-0.5808584173957647,44.797770719640575],[-0.580759003608699,44.797879155128626],[-0.5806907311756506,44.79796751274467],[-0.58038085195626,44.79839272485266]]}},{"type":"Feature","properties":{"name":"Rue des Camélias","distance":51.414020822603305,"sectionId":"19550-20182","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.58038085195626,44.79839272485266],[-0.5803079985196377,44.79834214057878],[-0.5798295503254133,44.79815136572929]]}},{"type":"Feature","properties":{"name":"Rue Edmond Michelet","distance":53.526586463421125,"sectionId":"19550-19859","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.58038085195626,44.79839272485266],[-0.5802604971016735,44.79855514735146],[-0.5801201979851714,44.79874684345496],[-0.5800742667089831,44.79882215617057]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":14.403602600293043,"sectionId":"19895-19899","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5912520546581699,44.81011634475008],[-0.5912290658125761,44.81024498686175]]}},{"type":"Feature","properties":{"name":"Avenue Espeleta","distance":109.92119421824361,"sectionId":"19895-19896","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5912520546581699,44.81011634475008],[-0.5898639664009762,44.81006134052601]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":14.380752818501296,"sectionId":"19895-as=3852","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5912749521066185,44.8099454334626],[-0.5912520546581699,44.81011634475008]]}},{"type":"Feature","properties":{"name":"Avenue Espeleta","distance":12.21888636264409,"sectionId":"19896-19897","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5898639664009762,44.81006134052601],[-0.5898432957757949,44.81017036133909]]}},{"type":"Feature","properties":{"name":"Avenue Espeleta","distance":109.92119421824361,"sectionId":"19896-19895","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5912520546581699,44.81011634475008],[-0.5898639664009762,44.81006134052601]]}},{"type":"Feature","properties":{"name":"Rue Fenelon","distance":146.3311616445374,"sectionId":"21901-19918","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5977397996493297,44.7969742505215],[-0.5969775878878063,44.79802151633341],[-0.5969300603777217,44.7980891399777],[-0.5969918950318113,44.798133216314305]]}},{"type":"Feature","properties":{"name":"Rue de Suzon","distance":51.202442341393656,"sectionId":"19934-19841","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.582596396707485,44.81053449802052],[-0.5827608332558103,44.81052517520639],[-0.5828788700545551,44.81052875399449],[-0.5832376806298483,44.810574383277476]]}},{"type":"Feature","properties":{"name":"Rue Francisco Ferrer","distance":81.98805554636697,"sectionId":"19934-24949","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5832376806298483,44.810574383277476],[-0.5831321089724198,44.81129043371454],[-0.5831112470882293,44.81130090973327]]}},{"type":"Feature","properties":{"name":"Rue de Suzon","distance":105.2953574621651,"sectionId":"19934-20367","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5832376806298483,44.810574383277476],[-0.5839712380041369,44.81070414171307],[-0.5845266756419456,44.81081239400367]]}},{"type":"Feature","properties":{"name":"Allée Eugène Delacroix","distance":69.565360288823,"sectionId":"16600-15979","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6050567334529893,44.796471117352944],[-0.6052886303193759,44.796303058213795],[-0.6054086379978214,44.795921806801715]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":35.87534262659825,"sectionId":"16514-30017","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6107277124972792,44.80517572599702],[-0.6107621223100063,44.80516751707603],[-0.6108030385396361,44.805152075120866],[-0.6108399996450758,44.80513207439936],[-0.6108722704371572,44.80510789858727],[-0.610897931726438,44.80508123011038],[-0.610917236087017,44.80505206095512],[-0.6109306041913777,44.8050190265257],[-0.6109359769232754,44.804985615346844],[-0.6109336575526042,44.80495262854044],[-0.6109244770091288,44.804921210804665],[-0.6109243507247113,44.804921214813355]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":14.688062080817172,"sectionId":"16514-16531","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6109243507247113,44.804921214813355],[-0.6109078682169812,44.804890389227104],[-0.6108844433263534,44.80486185594839],[-0.6108550051008734,44.80483630614212],[-0.6108199774483072,44.80481444701006]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":110.74438188856962,"sectionId":"16514-16513","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6109243507247113,44.804921214813355],[-0.6109778634207867,44.804874564511614],[-0.6110272552289882,44.804822730119284],[-0.6111009851415007,44.80476552875814],[-0.6112652610657652,44.80464284482136],[-0.6114697276603485,44.80445276356772],[-0.611583089288273,44.80431521058364],[-0.6117154585853717,44.80410741972833]]}},{"type":"Feature","properties":{"name":"Avenue Fanning Lafontaine","distance":44.40676687460218,"sectionId":"16513-16607","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6120315589483181,44.804418707609955],[-0.6119350205019235,44.804228995774906],[-0.6117154585853717,44.80410741972833]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":110.74438188856962,"sectionId":"16513-16514","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6109243507247113,44.804921214813355],[-0.6109778634207867,44.804874564511614],[-0.6110272552289882,44.804822730119284],[-0.6111009851415007,44.80476552875814],[-0.6112652610657652,44.80464284482136],[-0.6114697276603485,44.80445276356772],[-0.611583089288273,44.80431521058364],[-0.6117154585853717,44.80410741972833]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":169.32003023287675,"sectionId":"16513-as=125623","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6117154585853717,44.80410741972833],[-0.6119918161579154,44.80363498641018],[-0.612038098281536,44.80356586424403],[-0.6120943476023514,44.80349426351782],[-0.6122070209454944,44.80336799202706],[-0.6123054077384538,44.803280279280585],[-0.6124588637336369,44.803166765170374],[-0.6126697869678392,44.80304755188783],[-0.6128054005550593,44.802984510025624],[-0.6129673496982034,44.80292981987449],[-0.6129673496982034,44.80292981987449]]}},{"type":"Feature","properties":{"name":"Avenue Espeleta","distance":49.22156636001229,"sectionId":"19898-19897","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5898432957757949,44.81017036133909],[-0.5897865465220927,44.81016944982386],[-0.5897660433831342,44.810175501783306],[-0.5897471870710399,44.810185645531945],[-0.5897178156650436,44.810205759870755],[-0.5896953532557284,44.8102311511603],[-0.5896856406540187,44.810260103692954],[-0.5896643451299463,44.810466792888754],[-0.5896315190587665,44.81053710171911]]}},{"type":"Feature","properties":{"name":"Rue de Suzon","distance":35.1032210184355,"sectionId":"19898-27869","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5896315190587665,44.81053710171911],[-0.5891885489291463,44.810515857685246]]}},{"type":"Feature","properties":{"name":"Rue de Suzon","distance":114.3219916065404,"sectionId":"19898-24224","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5910571820878934,44.810593805537806],[-0.5909585918400966,44.81060988973802],[-0.590879501047489,44.81061193609171],[-0.5905232485977291,44.810552647589326],[-0.5902234056482158,44.8105213046118],[-0.5900801846626157,44.81051771753086],[-0.5897444609170819,44.8105137195487],[-0.5896315190587665,44.81053710171911]]}},{"type":"Feature","properties":{"name":"Rue Pierre Curie","distance":117.61450862792057,"sectionId":"19898-30057","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5894924222691592,44.81158734105841],[-0.5895011255785437,44.811536080115346],[-0.5895485158701184,44.81113471148511],[-0.5895368594479263,44.81106742786561],[-0.5895467275782218,44.810980007343225],[-0.5895859324901913,44.810898327112554],[-0.5896315190587665,44.81053710171911]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":13.756390736258664,"sectionId":"27598-23255","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6004523068258636,44.8045365874173],[-0.6004654573699035,44.804540495084915],[-0.6005101061451532,44.804546288283035],[-0.6005554058204732,44.80454629558172],[-0.6006000935370055,44.804540556959594],[-0.6006221089494935,44.80453445507072]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":22.88964203417339,"sectionId":"27598-23254","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6002816167230712,44.80438470667476],[-0.6002860344366656,44.8044068171943],[-0.6003001004996978,44.80443754046262],[-0.6003214882036597,44.80446596007055],[-0.6003497681706776,44.80449127886543],[-0.6003839946460026,44.804512535873315],[-0.6004229917650951,44.80452913773373],[-0.6004523068258636,44.8045365874173]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":145.45098074425906,"sectionId":"27598-as=126637","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6004523068258636,44.8045365874173],[-0.600509179884899,44.80463477855403],[-0.6005733752040296,44.80519864421006],[-0.6005184813348118,44.80542793014191],[-0.6003524924280303,44.805815314116046],[-0.6003524924280303,44.805815314116046]]}},{"type":"Feature","properties":{"name":"Rue André Pujol","distance":65.5359256494749,"sectionId":"35011-17246","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6324496511934334,44.80593829283401],[-0.632434424831285,44.80579104134143],[-0.6324194213976093,44.805679455993634],[-0.6323806819730596,44.805534576928295],[-0.6323132574139818,44.80535818369297]]}},{"type":"Feature","properties":{"name":"Rue André Pujol","distance":24.342444688083525,"sectionId":"35011-17302","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6323132574139818,44.80535818369297],[-0.6323063410732528,44.80535083751426],[-0.6322151558794488,44.80515079027539]]}},{"type":"Feature","properties":{"name":"Place Germaine Tillion","distance":58.96704530697383,"sectionId":"35011-35012","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6330096504694444,44.80516829540005],[-0.6323132574139818,44.80535818369297]]}},{"type":"Feature","properties":{"name":"Rue Paul Louis Courrier","distance":154.66578179236623,"sectionId":"20269-19734","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5928693700846391,44.799062920016524],[-0.5942055605025433,44.79804610025062]]}},{"type":"Feature","properties":{"name":"Avenue de Thouars","distance":69.36827000441308,"sectionId":"20269-20125","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5928693700846391,44.799062920016524],[-0.5930135094852443,44.799112145319356],[-0.5930966794062063,44.7991575314657],[-0.5931860090700474,44.799228666593606],[-0.5932346390227299,44.79927811662657],[-0.5932890719379768,44.7993577409731],[-0.593355786352114,44.799476072897974],[-0.5933858786547904,44.799536648197865]]}},{"type":"Feature","properties":{"name":"Avenue de Thouars","distance":52.52533019587334,"sectionId":"20269-as=126726","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5925596857402758,44.79896524744904],[-0.5928693700846391,44.799062920016524]]}},{"type":"Feature","properties":{"name":"Piste Cyclable Thouars","distance":152.00607641459752,"sectionId":"25685-25686","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5917724060901783,44.798699046797225],[-0.5918262080728558,44.79866095443481],[-0.5918542530380289,44.798625747422626],[-0.5919036377979995,44.79856752606221],[-0.5920635466287136,44.79824241381726],[-0.5921288760566719,44.79807459931594],[-0.5922720098590404,44.79755949289481],[-0.5923505719694316,44.79740711467132]]}},{"type":"Feature","properties":{"name":"Avenue de Thouars","distance":11.608656027403358,"sectionId":"25685-19573","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5916468256867602,44.79864509009591],[-0.5917497936407278,44.798687419707996],[-0.5917724060901783,44.798699046797225]]}},{"type":"Feature","properties":{"name":"Avenue de Thouars","distance":69.00061398894486,"sectionId":"25685-as=126726","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5917724060901783,44.798699046797225],[-0.5919524158719314,44.79877371472242],[-0.5925596857402758,44.79896524744904]]}},{"type":"Feature","properties":{"name":"Avenue Maréchal Leclerc","distance":111.98156296721476,"sectionId":"42110-38841","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5915715782126126,44.806807000539166],[-0.5915090177488784,44.80680708866843],[-0.5913368025222011,44.80679496035687],[-0.5908938621177842,44.8067209348852],[-0.5905757280150876,44.80668206352678],[-0.5903967975998345,44.806669785464045],[-0.5901752386690532,44.80668821935534]]}},{"type":"Feature","properties":{"name":"Rue Michel Slitinsky","distance":182.0501098143617,"sectionId":"42110-42109","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5908768346438454,44.805135111541],[-0.5906837568081132,44.80561703771333],[-0.5905348321161508,44.80598080558536],[-0.5905150214038407,44.80608124173051],[-0.5903879310139973,44.80640756665086],[-0.5903578595570199,44.806450944462185],[-0.5901752386690532,44.80668821935534]]}},{"type":"Feature","properties":{"name":"Avenue Maréchal Leclerc","distance":92.92016041657902,"sectionId":"42110-as=129010","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5901752386690532,44.80668821935534],[-0.5900668502588153,44.80669722554523],[-0.5898059115588464,44.80676806815446],[-0.5896115332989635,44.80685113260901],[-0.5891428865667643,44.80706941649979],[-0.5891428865667643,44.80706941649979]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":121.29569251335961,"sectionId":"38610-38858","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.594965116161893,44.80104390037088],[-0.5939644858741517,44.80162538649723],[-0.5938469430457691,44.801694410346975],[-0.5937829356824031,44.80173931199198]]}},{"type":"Feature","properties":{"name":"Avenue de Breuil","distance":4.848962643215482,"sectionId":"38610-19728","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.595003061518976,44.80107819332798],[-0.594965116161893,44.80104390037088]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":105.5729527828473,"sectionId":"38610-38609","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5960516029257379,44.800504460980235],[-0.5959309872915364,44.80055863064847],[-0.5958849997721064,44.80057188544617],[-0.5958214851930315,44.80058407289871],[-0.5957329840916419,44.800609481645786],[-0.5956846277519224,44.80062938725619],[-0.5956218191447994,44.80066101003569],[-0.594965116161893,44.80104390037088]]}},{"type":"Feature","properties":{"name":"Avenue de Thouars","distance":152.71870044750227,"sectionId":"38858-20280","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5937829356824031,44.80173931199198],[-0.5936578669771625,44.80161048284419],[-0.5936113475162896,44.80143863472075],[-0.5936014720252016,44.8012578816845],[-0.5933378311746387,44.800416106713314]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":107.7608464765911,"sectionId":"38858-38856","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5937829356824031,44.80173931199198],[-0.5937256983954406,44.8017974219153],[-0.5936815058843903,44.801867911286266],[-0.5933681929699226,44.802659092840265]]}},{"type":"Feature","properties":{"name":"Avenue de Thouars","distance":6.248556834265734,"sectionId":"38858-20145","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5937829356824031,44.80173931199198],[-0.5938418315239782,44.80177681685403]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":121.29569251335961,"sectionId":"38858-38610","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.594965116161893,44.80104390037088],[-0.5939644858741517,44.80162538649723],[-0.5938469430457691,44.801694410346975],[-0.5937829356824031,44.80173931199198]]}},{"type":"Feature","properties":{"name":"Rue de Megret","distance":41.965782875112474,"sectionId":"20043-20481","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5884806678820967,44.80460857465829],[-0.5883571332519366,44.80464317169309],[-0.5882875173174691,44.80465500674462],[-0.5882368607727104,44.80465228094047],[-0.5881834186771948,44.80464342734509],[-0.5879740703110379,44.80459364035909]]}},{"type":"Feature","properties":{"name":"Résidence Crespy II","distance":76.8052382335056,"sectionId":"20043-20479","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5884806678820967,44.80460857465829],[-0.5883302374673683,44.80493678617436],[-0.5878582517449966,44.804853216293985]]}},{"type":"Feature","properties":{"name":"Rue de Megret","distance":48.369444883854094,"sectionId":"20043-20211","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5884806678820967,44.80460857465829],[-0.5885406678952725,44.80452829208907],[-0.5887105096135855,44.80420566504319]]}},{"type":"Feature","properties":{"name":"Avenue Georges Lasserre","distance":40.2740626116692,"sectionId":"20043-20041","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5889610944976797,44.80472886989087],[-0.5886542831473074,44.80465369256098],[-0.5885823663057871,44.80463601009954],[-0.5885264449924408,44.80462131677126],[-0.5884806678820967,44.80460857465829]]}},{"type":"Feature","properties":{"name":"Résidence Crespy II","distance":30.251101385160432,"sectionId":"20479-20481","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5878582517449966,44.804853216293985],[-0.5879740703110379,44.80459364035909]]}},{"type":"Feature","properties":{"name":"Résidence Crespy II","distance":76.8052382335056,"sectionId":"20479-20043","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5884806678820967,44.80460857465829],[-0.5883302374673683,44.80493678617436],[-0.5878582517449966,44.804853216293985]]}},{"type":"Feature","properties":{"name":"Résidence Crespy II","distance":202.79712116928295,"sectionId":"20479-20041","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5889610944976797,44.80472886989087],[-0.5886829980587841,44.80541417034074],[-0.5876994344868887,44.805222967194084],[-0.5878582517449966,44.804853216293985]]}},{"type":"Feature","properties":{"name":"Résidence Verlaine 1","distance":53.05330784227177,"sectionId":"20441-20439","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5861338372861663,44.80013822103367],[-0.586027412261367,44.80060982177523]]}},{"type":"Feature","properties":{"name":"Résidence Verlaine 1","distance":58.56155310748734,"sectionId":"20441-20440","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5854018225157706,44.80007392124822],[-0.5855232293666495,44.80007099458327],[-0.5856560303851288,44.80007428452237],[-0.5861338372861663,44.80013822103367]]}},{"type":"Feature","properties":{"name":"Résidence Verlaine 1","distance":10.634046986594107,"sectionId":"20439-20438","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.586027412261367,44.80060982177523],[-0.5859920373070406,44.80070218999017]]}},{"type":"Feature","properties":{"name":"Résidence Verlaine 1","distance":53.05330784227177,"sectionId":"20439-20441","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5861338372861663,44.80013822103367],[-0.586027412261367,44.80060982177523]]}},{"type":"Feature","properties":{"name":"Résidence Verlaine 1","distance":134.10157301414836,"sectionId":"20439-20440","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.586027412261367,44.80060982177523],[-0.5853592721106728,44.800441534982994],[-0.5853133681106805,44.80042361452542],[-0.585262908907567,44.800397550129375],[-0.5852137325584219,44.80036973371973],[-0.5851667937689078,44.800349413620154],[-0.5850661293742216,44.80032781438058],[-0.585046244431454,44.8003193429479],[-0.5850335069241874,44.800309835473655],[-0.5850249128277378,44.800293711505674],[-0.5850179004471148,44.80019925666942],[-0.5850258695419495,44.80017684536448],[-0.5850409482486566,44.80015889419669],[-0.585065213853923,44.80014218482183],[-0.585099758104378,44.80012596216439],[-0.5851383287034368,44.800111414207564],[-0.5851858392247429,44.80009820588894],[-0.585229972873841,44.800089698171526],[-0.5852814104571961,44.80008267173622],[-0.5854018225157706,44.80007392124822]]}},{"type":"Feature","properties":{"name":"Résidence Verlaine 1","distance":58.56155310748734,"sectionId":"20440-20441","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5854018225157706,44.80007392124822],[-0.5855232293666495,44.80007099458327],[-0.5856560303851288,44.80007428452237],[-0.5861338372861663,44.80013822103367]]}},{"type":"Feature","properties":{"name":"Résidence Verlaine 1","distance":134.10157301414836,"sectionId":"20440-20439","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.586027412261367,44.80060982177523],[-0.5853592721106728,44.800441534982994],[-0.5853133681106805,44.80042361452542],[-0.585262908907567,44.800397550129375],[-0.5852137325584219,44.80036973371973],[-0.5851667937689078,44.800349413620154],[-0.5850661293742216,44.80032781438058],[-0.585046244431454,44.8003193429479],[-0.5850335069241874,44.800309835473655],[-0.5850249128277378,44.800293711505674],[-0.5850179004471148,44.80019925666942],[-0.5850258695419495,44.80017684536448],[-0.5850409482486566,44.80015889419669],[-0.585065213853923,44.80014218482183],[-0.585099758104378,44.80012596216439],[-0.5851383287034368,44.800111414207564],[-0.5851858392247429,44.80009820588894],[-0.585229972873841,44.800089698171526],[-0.5852814104571961,44.80008267173622],[-0.5854018225157706,44.80007392124822]]}},{"type":"Feature","properties":{"name":"Rue Chateaubriand","distance":37.78754038329178,"sectionId":"54607-57263","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6271222134196999,44.80622321408799],[-0.6272030595003117,44.80626800982233],[-0.6272974297225392,44.806329029437876],[-0.6273927257335697,44.80638700142655],[-0.6275035249587216,44.80642437225543]]}},{"type":"Feature","properties":{"name":"Rue Chateaubriand","distance":15.744050367617387,"sectionId":"54607-54606","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6269556598485034,44.80614553903033],[-0.6271222134196999,44.80622321408799]]}},{"type":"Feature","properties":{"name":"Avenue Jean Jaurès","distance":10.120170894261477,"sectionId":"54611-16555","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6198349122372658,44.81088219392614],[-0.6199400407258951,44.810830217920476]]}},{"type":"Feature","properties":{"name":"Avenue Jean Jaurès","distance":436.0878464555881,"sectionId":"54611-as=126199","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6199400407258951,44.810830217920476],[-0.6244699455687088,44.80859043076008],[-0.6244699455687088,44.80859043076008]]}},{"type":"Feature","properties":{"name":"Rue du Pin Vert","distance":183.32000091745482,"sectionId":"16951-16540","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6257873812750893,44.80795235979245],[-0.6268000100219724,44.80943708538574]]}},{"type":"Feature","properties":{"name":"Avenue Jean Jaurès","distance":33.44570286236015,"sectionId":"16951-16952","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6257873812750893,44.80795235979245],[-0.6261384776787635,44.80778442185393]]}},{"type":"Feature","properties":{"name":"Avenue Jean Jaurès","distance":"Unknown","sectionId":"16951-as=126199","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6244699455687088,44.80859043076008],[-0.6257873812750893,44.80795235979245]]}},{"type":"Feature","properties":{"name":"Rond-point de la Légion d'Honneur","distance":11.214951161189218,"sectionId":"29245-29243","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5886892546935539,44.80732974323805],[-0.58866168440338,44.8073116959087],[-0.5886407323645357,44.80729019682212],[-0.5886270748051944,44.80726594530009],[-0.5886221785661602,44.80724420989426]]}},{"type":"Feature","properties":{"name":"Rond-point de la Légion d'Honneur","distance":34.17171566015846,"sectionId":"29245-29246","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5886221785661602,44.80724420989426],[-0.588621415936724,44.80724009019121],[-0.5886238453005082,44.80721406998107],[-0.588634430050641,44.80718896353172],[-0.5886526282769173,44.80716622924626],[-0.5886773705178294,44.80714698184641],[-0.5887075705294533,44.807132066334205],[-0.588741642503092,44.807122433558284],[-0.5887779558604317,44.807118315126935],[-0.588814638637985,44.80712013042883],[-0.5888497740923654,44.80712757961261],[-0.5888817092578301,44.80714053467337],[-0.5889087463842209,44.80715814836274],[-0.5889215836520356,44.807171255589246]]}},{"type":"Feature","properties":{"name":"Avenue Maréchal Leclerc","distance":58.31711400300221,"sectionId":"29245-20181","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5878866023049307,44.80723804824538],[-0.5881419074841618,44.80725755977209],[-0.5883793790124525,44.80725484264933],[-0.5884712406536647,44.8072506834324],[-0.5886221785661602,44.80724420989426]]}},{"type":"Feature","properties":{"name":"Rond-point de la Légion d'Honneur","distance":34.17171566015846,"sectionId":"29246-29245","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5886221785661602,44.80724420989426],[-0.588621415936724,44.80724009019121],[-0.5886238453005082,44.80721406998107],[-0.588634430050641,44.80718896353172],[-0.5886526282769173,44.80716622924626],[-0.5886773705178294,44.80714698184641],[-0.5887075705294533,44.807132066334205],[-0.588741642503092,44.807122433558284],[-0.5887779558604317,44.807118315126935],[-0.588814638637985,44.80712013042883],[-0.5888497740923654,44.80712757961261],[-0.5888817092578301,44.80714053467337],[-0.5889087463842209,44.80715814836274],[-0.5889215836520356,44.807171255589246]]}},{"type":"Feature","properties":{"name":"Rond-point de la Légion d'Honneur","distance":16.24810686806674,"sectionId":"29246-29248","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5889215836520356,44.807171255589246],[-0.5889296984739978,44.80717964740053],[-0.5889433617377052,44.80720398879167],[-0.5889490151496328,44.80722975397872],[-0.5889465915290962,44.80725586410145],[-0.5889360013047008,44.80728088067426],[-0.5889178031544772,44.807303615004436],[-0.5889127340169472,44.807307558385496]]}},{"type":"Feature","properties":{"name":"Avenue Maréchal Leclerc","distance":"Unknown","sectionId":"29246-as=129010","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5891428865667643,44.80706941649979],[-0.5889215836520356,44.807171255589246]]}},{"type":"Feature","properties":{"name":"Avenue des Facultes","distance":75.06291632140197,"sectionId":"53582-20398","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6009433766419726,44.80649702704205],[-0.6013164859773779,44.8063971763014],[-0.601656043410043,44.80630490002932],[-0.6018331508031505,44.80626163727018]]}},{"type":"Feature","properties":{"name":"Avenue des Facultes","distance":82.36586228351959,"sectionId":"53582-53581","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5999683281837823,44.80675796006154],[-0.6009433766419726,44.80649702704205]]}},{"type":"Feature","properties":{"name":"Avenue des Facultes","distance":75.06291632140197,"sectionId":"20398-53582","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6009433766419726,44.80649702704205],[-0.6013164859773779,44.8063971763014],[-0.601656043410043,44.80630490002932],[-0.6018331508031505,44.80626163727018]]}},{"type":"Feature","properties":{"name":"Avenue des Arts Et Metiers","distance":13.921333808362212,"sectionId":"20398-22891","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6018331508031505,44.80626163727018],[-0.6017685441052617,44.806145044514714]]}},{"type":"Feature","properties":{"name":"Avenue des Facultes","distance":0.41428521499304705,"sectionId":"20398-as=127946","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6023964071705596,44.806109036414746],[-0.6018331508031505,44.80626163727018]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":77.45553631889318,"sectionId":"53584-20352","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6008390553247239,44.80732491684311],[-0.6007290629329844,44.80702464095927],[-0.6005427197009086,44.80666105414587]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":9.808750325847116,"sectionId":"53584-53583","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6005427197009086,44.80666105414587],[-0.600500201452968,44.806578093243665]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":34.75371038026277,"sectionId":"53583-23317","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.600500201452968,44.806578093243665],[-0.6003911459816946,44.80636530484626],[-0.6003712714452328,44.80628008541878]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":9.808750325847116,"sectionId":"53583-53584","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6005427197009086,44.80666105414587],[-0.600500201452968,44.806578093243665]]}},{"type":"Feature","properties":{"name":"Avenue de Collegno","distance":188.38101400184584,"sectionId":"49829-20405","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6045282040629822,44.8057139575337],[-0.6049214859992097,44.80646674541411],[-0.6049169551672597,44.80650760636224],[-0.6048803760431201,44.806531736759275],[-0.6038053565986792,44.806815962071745]]}},{"type":"Feature","properties":{"name":"Avenue de Collegno","distance":75.77637331135824,"sectionId":"20405-20407","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6038053565986792,44.806815962071745],[-0.6033246495961759,44.80694172298992],[-0.6029063912671518,44.80705235166629]]}},{"type":"Feature","properties":{"name":"Voie de l'Université 4","distance":113.30708152163238,"sectionId":"20405-20396","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6033032501363998,44.80586050945838],[-0.6038053565986792,44.806815962071745]]}},{"type":"Feature","properties":{"name":"Avenue de Collegno","distance":188.38101400184584,"sectionId":"20405-49829","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6045282040629822,44.8057139575337],[-0.6049214859992097,44.80646674541411],[-0.6049169551672597,44.80650760636224],[-0.6048803760431201,44.806531736759275],[-0.6038053565986792,44.806815962071745]]}},{"type":"Feature","properties":{"name":"Rue Pacaris","distance":83.56659020552662,"sectionId":"48658-19697","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.583594741220704,44.799262579054854],[-0.5832923617410791,44.79910797790636],[-0.5829402645496848,44.79893917806156],[-0.5827289793055835,44.798831340566984]]}},{"type":"Feature","properties":{"name":"Rue Pacaris","distance":10.57301256296736,"sectionId":"48658-48661","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5827289793055835,44.798831340566984],[-0.5827384285713649,44.798826628890204],[-0.5827526002510184,44.7988123999548],[-0.5827594067452039,44.79879570059374],[-0.5827583284342076,44.79877834881188],[-0.5827494770696917,44.79876214271927],[-0.5827337220341308,44.79874885656027]]}},{"type":"Feature","properties":{"name":"Rue Pacaris","distance":6.173280552840239,"sectionId":"48658-48660","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5826554480804653,44.79883708007676],[-0.5826707539367423,44.798841101991044],[-0.5826952140534086,44.79884177274662],[-0.5827185589605931,44.79883671340598],[-0.5827289793055835,44.798831340566984]]}},{"type":"Feature","properties":{"name":"Chemin Bénédigues","distance":217.14507437927628,"sectionId":"48661-19672","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5827337220341308,44.79874885656027],[-0.5827853745039706,44.79868219042253],[-0.583268278318656,44.79778003242338],[-0.5835407616371732,44.797264467046844],[-0.5836766845477668,44.79691508101888]]}},{"type":"Feature","properties":{"name":"Rue Pacaris","distance":8.38800921705258,"sectionId":"48661-48659","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5827337220341308,44.79874885656027],[-0.582712552901107,44.79874006487575],[-0.5826886772694229,44.798736583182176],[-0.5826643959799237,44.79873878940399],[-0.5826424758571195,44.79874641621764],[-0.5826367980250649,44.798750738834926]]}},{"type":"Feature","properties":{"name":"Rue Pacaris","distance":10.57301256296736,"sectionId":"48661-48658","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5827289793055835,44.798831340566984],[-0.5827384285713649,44.798826628890204],[-0.5827526002510184,44.7988123999548],[-0.5827594067452039,44.79879570059374],[-0.5827583284342076,44.79877834881188],[-0.5827494770696917,44.79876214271927],[-0.5827337220341308,44.79874885656027]]}},{"type":"Feature","properties":{"name":"Rue Pacaris","distance":11.575180864661384,"sectionId":"48660-48659","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5826367980250649,44.798750738834926],[-0.5826252769756187,44.79875875870665],[-0.5826146096272298,44.79877440862122],[-0.5826116359824939,44.79879170788335],[-0.582616738227273,44.79880866266057],[-0.5826293051273863,44.79882358065419],[-0.5826479678020144,44.79883479343604],[-0.5826554480804653,44.79883708007676]]}},{"type":"Feature","properties":{"name":"Rue Pacaris","distance":6.173280552840239,"sectionId":"48660-48658","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5826554480804653,44.79883708007676],[-0.5826707539367423,44.798841101991044],[-0.5826952140534086,44.79884177274662],[-0.5827185589605931,44.79883671340598],[-0.5827289793055835,44.798831340566984]]}},{"type":"Feature","properties":{"name":"Rue Clément Thomas","distance":270.12961887838844,"sectionId":"48660-19799","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5811691452983703,44.80095630755851],[-0.5812278188338076,44.80071745555957],[-0.5813280798233417,44.80021524677312],[-0.5814058414903404,44.80008001787614],[-0.5818333323795117,44.799525615444004],[-0.5826554480804653,44.79883708007676]]}},{"type":"Feature","properties":{"name":"Voie 2 Faculté des Sciences","distance":31.822360829268952,"sectionId":"20536-633","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5952249709914197,44.80781373927588],[-0.5952468358245578,44.80782142581367],[-0.5952810036401661,44.8078397134943],[-0.5953096255987316,44.80786241032181],[-0.5953313770930191,44.807888567267035],[-0.5953456968748769,44.80791730125153],[-0.5953517542823621,44.80794746746573],[-0.5953494764025928,44.80797789714909],[-0.5953387903257614,44.808007421536274],[-0.5953203808931142,44.80803484791099],[-0.5952993982979592,44.80805550937134]]}},{"type":"Feature","properties":{"name":"Voie 2 Faculté des Sciences","distance":25.5876626412521,"sectionId":"20536-628","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5952249709914197,44.80781373927588],[-0.5952081829491739,44.80780832448617],[-0.595166709232953,44.80780071723235],[-0.5951239638111067,44.807799095580044],[-0.5950815884641671,44.807803407634744],[-0.5950412249771774,44.807813601507114],[-0.5950044814906649,44.80782908587983],[-0.5949725984915655,44.80784946122066],[-0.594947041018141,44.80787387049176],[-0.5949446075557351,44.80787746060429]]}},{"type":"Feature","properties":{"name":"Voie 2 Faculté des Sciences","distance":208.14407121200617,"sectionId":"20536-27615","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5974342271774864,44.806883431617564],[-0.5958860300252984,44.80730270564037],[-0.5953256108039215,44.80773119586228],[-0.5952249709914197,44.80781373927588]]}},{"type":"Feature","properties":{"name":"Voie 2 Faculté des Sciences","distance":35.19358169795944,"sectionId":"628-622","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5949446075557351,44.80787746060429],[-0.5949285051511253,44.80790130079415],[-0.5949179451639134,44.807930821150336],[-0.5949156670563552,44.80796125082529],[-0.5949217242441157,44.80799141706321],[-0.5949359175539288,44.808020155090176],[-0.5949577952313793,44.808046308114015],[-0.5949862908718381,44.80806900901435],[-0.595020585044227,44.80808729278083],[-0.59505911177112,44.80810039816389],[-0.5951005800815373,44.80810791555126],[-0.5951234192899467,44.80810890524155]]}},{"type":"Feature","properties":{"name":"Voie 2 Faculté des Sciences","distance":261.43073921896337,"sectionId":"628-652","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5949446075557351,44.80787746060429],[-0.5947690839190122,44.80788336826787],[-0.5946998469257447,44.80789726706777],[-0.5942009134097537,44.808027438064606],[-0.594128240817669,44.808043066544016],[-0.5940534947521084,44.80805182417166],[-0.5938268212963905,44.80806745393388],[-0.5936005684499777,44.8080857724138],[-0.5935257071650636,44.8080947134956],[-0.5934147029657073,44.80811254340357],[-0.5933056935821438,44.80813598535228],[-0.5932335930355493,44.808152676161235],[-0.5931651963783955,44.808176006072415],[-0.5931021453999266,44.80820592322821],[-0.59304674698904,44.80824289526063],[-0.592968411543013,44.80830167098518],[-0.5924582036963829,44.80870180563772],[-0.5922283428118189,44.80888157207494],[-0.5922101006321526,44.80890358768679],[-0.5921882974571633,44.80894562386988]]}},{"type":"Feature","properties":{"name":"Voie 2 Faculté des Sciences","distance":25.5876626412521,"sectionId":"628-20536","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5952249709914197,44.80781373927588],[-0.5952081829491739,44.80780832448617],[-0.595166709232953,44.80780071723235],[-0.5951239638111067,44.807799095580044],[-0.5950815884641671,44.807803407634744],[-0.5950412249771774,44.807813601507114],[-0.5950044814906649,44.80782908587983],[-0.5949725984915655,44.80784946122066],[-0.594947041018141,44.80787387049176],[-0.5949446075557351,44.80787746060429]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":25.762290760336278,"sectionId":"20350-649","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6002739308007025,44.805937160069774],[-0.6002571906097627,44.805934537065355],[-0.600210663417118,44.80593312714963],[-0.6001646218698704,44.80593746711639],[-0.6001202025409176,44.805947520990586],[-0.6000790190830736,44.80596278728954],[-0.6000420649431202,44.805982964323555],[-0.6000106899797618,44.80600737879656],[-0.5999951036373583,44.806025258018686]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":12.940884640330772,"sectionId":"20350-22873","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6004152790420273,44.805991960079176],[-0.6003848094757422,44.80597211553534],[-0.6003456121077931,44.805954348901174],[-0.6003025617233329,44.80594174883157],[-0.6002739308007025,44.805937160069774]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":"Unknown","sectionId":"20350-as=126637","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6003524924280303,44.805815314116046],[-0.6002739308007025,44.805937160069774]]}},{"type":"Feature","properties":{"name":"Rue Henry de Montherlant","distance":135.42848338400242,"sectionId":"20063-20061","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5813456481642605,44.795235165102824],[-0.5814020732661829,44.79509871614635],[-0.5814178892816545,44.79459772472216],[-0.5814796208099137,44.794428589117054],[-0.5818017654633052,44.79409946398881]]}},{"type":"Feature","properties":{"name":"Allée du Doyen Georges Brus","distance":41.85408756076741,"sectionId":"27233-27232","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6240391870529518,44.79383701591695],[-0.6240537893794984,44.7938519548657],[-0.6240735513973247,44.79386645912628],[-0.6240964492439905,44.79387852126869],[-0.6241215821500758,44.79388789974787],[-0.6241486693360015,44.79389415309196],[-0.6241767007246009,44.793897313492515],[-0.6242051599693784,44.793897217235376],[-0.6242331632495562,44.793893892489045],[-0.624260084915637,44.793887449278174],[-0.624285167406502,44.79387791174713],[-0.624307807678016,44.79386574953668],[-0.6243273800841981,44.79385107267031],[-0.6243434078431439,44.79383434676631],[-0.6243555404381711,44.79381603341518],[-0.6243633010895383,44.793796598234096],[-0.6243665917990886,44.7937764947641],[-0.6243653202233378,44.793756266453194],[-0.6243595202746701,44.79373645272219],[-0.6243538295028445,44.79372240086953]]}},{"type":"Feature","properties":{"name":"Allée du Doyen Georges Brus","distance":59.08752852345024,"sectionId":"27233-27234","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.623379009221982,44.79408605511891],[-0.6240391870529518,44.79383701591695]]}},{"type":"Feature","properties":{"name":"Allée du Doyen Georges Brus","distance":45.811776876007734,"sectionId":"27232-27233","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6243538295028445,44.79372240086953],[-0.624334970292798,44.793700120683134],[-0.6243169080768918,44.79368448128721],[-0.6242955725086237,44.79367110822578],[-0.6242714912310648,44.793660345014246],[-0.6242453181412109,44.793652531145405],[-0.624217690182525,44.79364773640068],[-0.624189381857823,44.79364620634789],[-0.6241610244566637,44.793647920865816],[-0.6241292522555596,44.79365568973243],[-0.6241073132304374,44.793660893114975],[-0.6240834519009825,44.793671742946664],[-0.6240621590119209,44.79368521342958],[-0.6240443014253713,44.79370100668777],[-0.6240302240113766,44.793718571230144],[-0.6240202829481174,44.793737535371456],[-0.6240146968491151,44.793757351643734],[-0.6240136899859823,44.79377756248323],[-0.6240172284542063,44.793797628466486],[-0.6240252840076023,44.79381710007585],[-0.6240391870529518,44.79383701591695]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":15.777696480927105,"sectionId":"27234-24049","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6234472882692765,44.79421630251364],[-0.6234458588040597,44.79419355689098],[-0.6234360607683638,44.794160448048565],[-0.6234190187604384,44.794128831195835],[-0.6233951680713367,44.79409959329795],[-0.623379009221982,44.79408605511891]]}},{"type":"Feature","properties":{"name":"Allée du Doyen Georges Brus","distance":59.08752852345024,"sectionId":"27234-27233","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.623379009221982,44.79408605511891],[-0.6240391870529518,44.79383701591695]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":21.738293701048324,"sectionId":"27234-16775","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.623379009221982,44.79408605511891],[-0.6233649326886178,44.79407344150927],[-0.6233291153729661,44.79405107091595],[-0.6232888920113646,44.79403307463359],[-0.6232450540560983,44.794019967940415],[-0.6231987547866544,44.7940119843381],[-0.6231514056468902,44.794009439186986],[-0.6231370346267664,44.79401025740016]]}},{"type":"Feature","properties":{"name":"Avenue de Genève","distance":111.5676283436214,"sectionId":"16752-27475","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6195571001638541,44.800067877994806],[-0.6196697256676994,44.79906661944379]]}},{"type":"Feature","properties":{"name":"Avenue Pierre Corneille","distance":129.67129144884257,"sectionId":"16752-16346","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6213004097149313,44.79914595828795],[-0.6211943184093939,44.79916104726907],[-0.6198129791943336,44.79906305082381],[-0.6196697256676994,44.79906661944379]]}},{"type":"Feature","properties":{"name":"Avenue Pierre Corneille","distance":21.82811587098074,"sectionId":"16752-16505","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6196697256676994,44.79906661944379],[-0.6195925499988103,44.7990102512667],[-0.6194418446698561,44.798961628216425]]}},{"type":"Feature","properties":{"name":"Avenue de Genève","distance":59.37854361851572,"sectionId":"28441-16491","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6193901306760591,44.8013866079945],[-0.6194581803946418,44.80085421141209]]}},{"type":"Feature","properties":{"name":"Avenue de Genève","distance":68.30803070278338,"sectionId":"28441-16648","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6194581803946418,44.80085421141209],[-0.6195375283914707,44.800241821394124]]}},{"type":"Feature","properties":{"name":"Rue Charles Bourseul","distance":77.7837580149208,"sectionId":"28441-28442","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6194581803946418,44.80085421141209],[-0.6184777365899734,44.80079802889875]]}},{"type":"Feature","properties":{"name":"Allée Geoffroy Saint Hilaire","distance":110.64159952501466,"sectionId":"16753-16677","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6062086005106154,44.804538531610724],[-0.6075186009733935,44.80418854536408]]}},{"type":"Feature","properties":{"name":"Avenue des Facultés","distance":63.65734565222472,"sectionId":"16753-17751","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6062086005106154,44.804538531610724],[-0.6060049440040546,44.80474992676894],[-0.6057238322161185,44.8049954861119]]}},{"type":"Feature","properties":{"name":"Avenue des Facultés","distance":115.32597461883752,"sectionId":"16753-as=127943","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6068476869041276,44.80355291536525],[-0.6062086005106154,44.804538531610724]]}},{"type":"Feature","properties":{"name":"Esplanade des Antilles","distance":154.0392387954897,"sectionId":"15874-15875","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6196800405722029,44.7945013115898],[-0.6214998958983052,44.794007185475536]]}},{"type":"Feature","properties":{"name":"Avenue Henri Vizioz","distance":325.2263733610952,"sectionId":"15874-27481","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6214998958983052,44.794007185475536],[-0.6220852878886478,44.79512314416106],[-0.6220924487429257,44.79515858918432],[-0.6220922625212997,44.79518381852401],[-0.6220818377405597,44.79520919380688],[-0.6220618295541408,44.79524514386064],[-0.6216927947041473,44.79588577083967],[-0.621666916966101,44.79593100617681],[-0.6216493436109074,44.795959401659815],[-0.6216276660577161,44.795982883165784],[-0.6215999975928964,44.796005654620494],[-0.6215726195635715,44.796024993642874],[-0.6210868183185433,44.796329541637235],[-0.6210598341342806,44.79634508447584],[-0.6210345688713166,44.79635777998568],[-0.6209931226773022,44.796372702293674],[-0.6209362305439071,44.79638946764688],[-0.6207830627101459,44.79642443237376],[-0.6207090517644245,44.796434535973084]]}},{"type":"Feature","properties":{"name":"Esplanade des Antilles","distance":18.833312371296387,"sectionId":"15874-15882","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6214063507691692,44.793851257111],[-0.6214998958983052,44.794007185475536]]}},{"type":"Feature","properties":{"name":"Esplanade des Antilles","distance":146.73181283342635,"sectionId":"15874-15873","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6214998958983052,44.794007185475536],[-0.6232295293179418,44.79352932641312]]}},{"type":"Feature","properties":{"name":"Allée Maine de Biran","distance":229.63144539364484,"sectionId":"27481-15875","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6196800405722029,44.7945013115898],[-0.6207090517644245,44.796434535973084]]}},{"type":"Feature","properties":{"name":"Avenue Henri Vizioz","distance":325.2263733610952,"sectionId":"27481-15874","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6214998958983052,44.794007185475536],[-0.6220852878886478,44.79512314416106],[-0.6220924487429257,44.79515858918432],[-0.6220922625212997,44.79518381852401],[-0.6220818377405597,44.79520919380688],[-0.6220618295541408,44.79524514386064],[-0.6216927947041473,44.79588577083967],[-0.621666916966101,44.79593100617681],[-0.6216493436109074,44.795959401659815],[-0.6216276660577161,44.795982883165784],[-0.6215999975928964,44.796005654620494],[-0.6215726195635715,44.796024993642874],[-0.6210868183185433,44.796329541637235],[-0.6210598341342806,44.79634508447584],[-0.6210345688713166,44.79635777998568],[-0.6209931226773022,44.796372702293674],[-0.6209362305439071,44.79638946764688],[-0.6207830627101459,44.79642443237376],[-0.6207090517644245,44.796434535973084]]}},{"type":"Feature","properties":{"name":"Allée Maine de Biran","distance":28.16329712016772,"sectionId":"27481-27482","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6207090517644245,44.796434535973084],[-0.6207399483295032,44.796553813770124],[-0.6208241702150991,44.79665391752819],[-0.6208367372807657,44.79666666959483]]}},{"type":"Feature","properties":{"name":"Rue Jacques Chaban Delmas","distance":9.935936054409408,"sectionId":"30057-25389","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5894924222691592,44.81158734105841],[-0.5894789472944313,44.811588396836235],[-0.5894497313444721,44.811596795535],[-0.589424772230038,44.81161055489405],[-0.5894060291727687,44.81162862219449],[-0.5893995354674162,44.81164017740682]]}},{"type":"Feature","properties":{"name":"Rue Jacques Chaban Delmas","distance":32.82909282405267,"sectionId":"30057-30059","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5894712877183582,44.81174583129971],[-0.5894889915955749,44.811749686662],[-0.5895205357187211,44.81175022267025],[-0.5895511995099065,44.8117447509677],[-0.5895784681385476,44.8117335310762],[-0.589600623776862,44.8117174279415],[-0.589615723996806,44.81169776400813],[-0.5896229686826812,44.81167591575606],[-0.5896215689214397,44.811653439472536],[-0.5896116367034588,44.81163213325877],[-0.5895941513251375,44.811613497602615],[-0.5895700808805486,44.811598853178495],[-0.5895415301630279,44.81158948479116],[-0.5895103009684368,44.81158587607232],[-0.5894924222691592,44.81158734105841]]}},{"type":"Feature","properties":{"name":"Rue Pierre Curie","distance":117.61450862792057,"sectionId":"30057-19898","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5894924222691592,44.81158734105841],[-0.5895011255785437,44.811536080115346],[-0.5895485158701184,44.81113471148511],[-0.5895368594479263,44.81106742786561],[-0.5895467275782218,44.810980007343225],[-0.5895859324901913,44.810898327112554],[-0.5896315190587665,44.81053710171911]]}},{"type":"Feature","properties":{"name":"Allée du Baron Sarget","distance":73.38275921964834,"sectionId":"16017-16016","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6081571627327063,44.80861901020956],[-0.608112945028603,44.808422050582635],[-0.6081246474862915,44.808226920418235],[-0.6081205669977053,44.80817588284182],[-0.6080748822995544,44.807963565585]]}},{"type":"Feature","properties":{"name":"Allée Georges Brassens","distance":140.484436546141,"sectionId":"16017-16757","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6080748822995544,44.807963565585],[-0.6089467209524296,44.80805796902329],[-0.6090351588021958,44.80805570349236],[-0.6090965047188327,44.808033037969096],[-0.6091413221133111,44.807988916656456],[-0.6091544775464598,44.80793426937],[-0.6091390095554492,44.80751947833871]]}},{"type":"Feature","properties":{"name":"Allée Georges Brassens","distance":28.999305499196264,"sectionId":"16017-30100","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6080748822995544,44.807963565585],[-0.607778420616625,44.80792153194589],[-0.6077251719231692,44.80789565556416]]}},{"type":"Feature","properties":{"name":"Allée Jacques Brel","distance":103.5816072592466,"sectionId":"30100-16917","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6077251719231692,44.80789565556416],[-0.6077092098150831,44.807848868398786],[-0.6076857128228177,44.80705895729611],[-0.607715901583938,44.806967106259115]]}},{"type":"Feature","properties":{"name":"Allée Georges Brassens","distance":28.999305499196264,"sectionId":"30100-16017","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6080748822995544,44.807963565585],[-0.607778420616625,44.80792153194589],[-0.6077251719231692,44.80789565556416]]}},{"type":"Feature","properties":{"name":"Allée Maine de Biran","distance":28.16329712016772,"sectionId":"27482-27481","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6207090517644245,44.796434535973084],[-0.6207399483295032,44.796553813770124],[-0.6208241702150991,44.79665391752819],[-0.6208367372807657,44.79666666959483]]}},{"type":"Feature","properties":{"name":"Allée Maine de Biran","distance":18.73075868937003,"sectionId":"27482-16521","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6208367372807657,44.79666666959483],[-0.6209334497793274,44.79682060587063]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":20.025482488512736,"sectionId":"16521-16522","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6209334497793274,44.79682060587063],[-0.6209266966304785,44.79682991932871],[-0.6209144884189325,44.79685309917056],[-0.6209076624294481,44.79687736881087],[-0.620906437322436,44.79690218078706],[-0.6209107622858779,44.796926725966905],[-0.6209206034504718,44.79695046492537],[-0.6209356744107941,44.79697286627953],[-0.6209525813577348,44.796990254580784]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":27.532825889614816,"sectionId":"16521-16519","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6212349465970253,44.796764252395086],[-0.6211898407631874,44.79674911331413],[-0.6211560774032907,44.79674334207002],[-0.621121414817604,44.79674138295748],[-0.621086753801537,44.796743477542655],[-0.6210529725600052,44.796749507780675],[-0.6210210755715437,44.79675935160369],[-0.6209916772190072,44.796772719199055],[-0.6209657650414958,44.796789218793606],[-0.6209439477830334,44.7968084706697],[-0.6209334497793274,44.79682060587063]]}},{"type":"Feature","properties":{"name":"Allée Maine de Biran","distance":18.73075868937003,"sectionId":"16521-27482","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6208367372807657,44.79666666959483],[-0.6209334497793274,44.79682060587063]]}},{"type":"Feature","properties":{"name":"Rue du Jasmin","distance":42.43310141074823,"sectionId":"16922-16627","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6197940289716289,44.804594956016665],[-0.6197644570798326,44.8049764093837]]}},{"type":"Feature","properties":{"name":"Allée des Pensées","distance":68.91004266284587,"sectionId":"16922-27339","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6197940289716289,44.804594956016665],[-0.6205874967411178,44.80460645449748],[-0.6206653246477516,44.804606589408365]]}},{"type":"Feature","properties":{"name":"Rue du Jasmin","distance":"Unknown","sectionId":"16922-as=124815","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6198124150619269,44.80396081435652],[-0.6197940289716289,44.804594956016665]]}},{"type":"Feature","properties":{"name":"Allée des Pensées","distance":68.91004266284587,"sectionId":"27339-16922","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6197940289716289,44.804594956016665],[-0.6205874967411178,44.80460645449748],[-0.6206653246477516,44.804606589408365]]}},{"type":"Feature","properties":{"name":"Avenue de la Paillère","distance":11.621961918660615,"sectionId":"25672-25671","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6093296767989641,44.79621991546355],[-0.6093291561101378,44.79624191223031],[-0.6093375415583543,44.79626470732654],[-0.6093461692478424,44.79627722527712],[-0.6093582367014488,44.79628810264326],[-0.6093717405532725,44.79629767325817],[-0.6093915158581251,44.79630839606761]]}},{"type":"Feature","properties":{"name":"Avenue de la Paillère","distance":55.80816127901788,"sectionId":"25672-17208","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6086453402267731,44.796098491349674],[-0.6089309237750757,44.79614960414153],[-0.6092201768736885,44.796194654296194],[-0.6093296767989641,44.79621991546355]]}},{"type":"Feature","properties":{"name":"Avenue de la Paillère","distance":9.825561916494804,"sectionId":"25672-25670","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.609403328369066,44.796153528874584],[-0.6093834161277263,44.7961608270074],[-0.6093700640590616,44.79616782684239],[-0.6093529054355558,44.796180712798815],[-0.6093399336354504,44.796195808026695],[-0.6093339169534729,44.796206808941946],[-0.6093296767989641,44.79621991546355]]}},{"type":"Feature","properties":{"name":"Rue Causserouge","distance":101.66984948552138,"sectionId":"16269-16268","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6282005990874134,44.807691547607696],[-0.6270343374935502,44.80807700681343]]}},{"type":"Feature","properties":{"name":"Rue Goya","distance":83.23683538579216,"sectionId":"16269-16672","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6282005990874134,44.807691547607696],[-0.6286706524024379,44.80836209049072]]}},{"type":"Feature","properties":{"name":"Rue Goya","distance":47.18450722649723,"sectionId":"16269-15824","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6284258411300346,44.80741807490818],[-0.6281325253156609,44.80752075817051],[-0.6281156728105808,44.80753246611176],[-0.6281071330058481,44.807549584175234],[-0.6281143361287055,44.80756953317888],[-0.6282005990874134,44.807691547607696]]}},{"type":"Feature","properties":{"name":"Rue Goya","distance":48.43891732758662,"sectionId":"15824-16768","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.628875764665801,44.807471374277796],[-0.6287778736268587,44.80733351621315],[-0.6287634251334943,44.80732109518429],[-0.6287384554084998,44.807314414841954],[-0.6287066572146164,44.80731786156016],[-0.6284258411300346,44.80741807490818]]}},{"type":"Feature","properties":{"name":"Rue Goya","distance":47.18450722649723,"sectionId":"15824-16269","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6284258411300346,44.80741807490818],[-0.6281325253156609,44.80752075817051],[-0.6281156728105808,44.80753246611176],[-0.6281071330058481,44.807549584175234],[-0.6281143361287055,44.80756953317888],[-0.6282005990874134,44.807691547607696]]}},{"type":"Feature","properties":{"name":"Avenue Alexandre Jaubert","distance":66.21813250398093,"sectionId":"15824-15823","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.628077623263275,44.80687588042583],[-0.6284258411300346,44.80741807490818]]}},{"type":"Feature","properties":{"name":"Allée du Parc","distance":123.96479618047614,"sectionId":"29865-24276","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6251557220834865,44.79835525067678],[-0.6252235443623254,44.79853442725268],[-0.6253424211924866,44.79879512357346],[-0.6253570080443737,44.79883393507788],[-0.6253441336001597,44.79894911215404],[-0.6253006823439052,44.79913940284026],[-0.6252653167943789,44.799186653058726],[-0.6251934642305719,44.79927137007889],[-0.6251940218304239,44.799306394869575],[-0.6252216428839411,44.799351276935035],[-0.6252628069394983,44.79941635645798]]}},{"type":"Feature","properties":{"name":"Rue Marc Sangnier","distance":409.86889035057266,"sectionId":"31583-20163","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6054698997467376,44.808677917346344],[-0.6053167485558499,44.808685474228426],[-0.6050002741756942,44.80861280895958],[-0.6040828411423665,44.808481354663485],[-0.6027342810020733,44.80841669793434],[-0.6022250951286805,44.80836238001198],[-0.6016281928333453,44.80830768443036],[-0.6012323873060919,44.80828166119162],[-0.6003365168343558,44.808270294930296]]}},{"type":"Feature","properties":{"name":"Rue de la Vieille Tour","distance":77.3856778038674,"sectionId":"20163-20392","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6003365168343558,44.808270294930296],[-0.6003523363859251,44.80782866074097],[-0.6003733332435589,44.80768062133278],[-0.6004399085619743,44.807585639041214]]}},{"type":"Feature","properties":{"name":"Rue Marc Sangnier","distance":409.86889035057266,"sectionId":"20163-31583","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6054698997467376,44.808677917346344],[-0.6053167485558499,44.808685474228426],[-0.6050002741756942,44.80861280895958],[-0.6040828411423665,44.808481354663485],[-0.6027342810020733,44.80841669793434],[-0.6022250951286805,44.80836238001198],[-0.6016281928333453,44.80830768443036],[-0.6012323873060919,44.80828166119162],[-0.6003365168343558,44.808270294930296]]}},{"type":"Feature","properties":{"name":"Rue Pierre Noailles","distance":159.0569242406936,"sectionId":"20163-23323","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5983600071891754,44.808352657301484],[-0.5985133829700419,44.80833654485694],[-0.5985687189015938,44.808333082649355],[-0.5987343814282154,44.80834756950181],[-0.5987899755560617,44.80834824280326],[-0.5988454433870515,44.808344866369325],[-0.5989001702869653,44.80833772989387],[-0.5989535079408616,44.80832658364371],[-0.5990050999131776,44.808311799227035],[-0.5990550079434781,44.80829436559926],[-0.5991571898185568,44.80826293662551],[-0.5992105385806428,44.8082519700641],[-0.5992650997585891,44.80824420807641],[-0.5993754289391398,44.80823585241999],[-0.5995421884606948,44.80822940427641],[-0.5999314250111244,44.80822321160716],[-0.6000415579701354,44.80823197716155],[-0.6003365168343558,44.808270294930296]]}},{"type":"Feature","properties":{"name":"Rue de la Vieille Tour","distance":18.639063547460367,"sectionId":"20163-as=128764","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6002824056991044,44.80875498884317],[-0.6003365168343558,44.808270294930296]]}},{"type":"Feature","properties":{"name":"Avenue de Candau","distance":84.20559208615786,"sectionId":"16226-16021","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6170217073769195,44.807881198466156],[-0.615993843363658,44.808079542423435]]}},{"type":"Feature","properties":{"name":"Rue des Chênes","distance":253.92000094599132,"sectionId":"16226-16020","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6177472367798235,44.8092290114272],[-0.6167811065759444,44.80945359434755],[-0.616645315066495,44.80943935484138],[-0.6165364233574833,44.80939399196652],[-0.61646524674378,44.80932247684998],[-0.615993843363658,44.808079542423435]]}},{"type":"Feature","properties":{"name":"Avenue de Candau","distance":7.593622285944763,"sectionId":"16226-as=126237","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.615993843363658,44.808079542423435],[-0.6159032985453854,44.80810233191559]]}},{"type":"Feature","properties":{"name":"Avenue Phenix Haut-Brion","distance":286.0570535751517,"sectionId":"16227-17285","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6145145899145501,44.80572097974112],[-0.6156386765922829,44.808168934866266]]}},{"type":"Feature","properties":{"name":"Avenue de Candau","distance":155.7820063749196,"sectionId":"16227-as=126208","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6156386765922829,44.808168934866266],[-0.6152163161768321,44.80829063968172],[-0.6149407433761301,44.80833362959324],[-0.6146353778205642,44.80834144227298],[-0.6137095978648442,44.80830933152997]]}},{"type":"Feature","properties":{"name":"Avenue de Candau","distance":7.593622285944763,"sectionId":"16227-as=126237","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6159032985453854,44.80810233191559],[-0.6156386765922829,44.808168934866266]]}},{"type":"Feature","properties":{"name":"Avenue de Candau","distance":36.99214773307388,"sectionId":"28915-16223","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6236435928320284,44.806901298311644],[-0.6233650667962933,44.80716889130704]]}},{"type":"Feature","properties":{"name":"Rue Frédéric Dard","distance":113.66526321734865,"sectionId":"28915-28916","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6233650667962933,44.80716889130704],[-0.6231515378650831,44.80702912734922],[-0.6231264615499323,44.807020737608084],[-0.6229645715312013,44.80702003888148],[-0.6229354966902789,44.8070265501599],[-0.622907280715257,44.8070467267688],[-0.6227481715748605,44.807221151580805],[-0.6225726617115123,44.80748699272951],[-0.6225691755040994,44.80750602129511],[-0.6225737605166194,44.80752461263547],[-0.6226144229930793,44.807611869660086]]}},{"type":"Feature","properties":{"name":"Rue Graham Bell","distance":38.221980893265865,"sectionId":"28442-30956","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6184777365899734,44.80079802889875],[-0.618485522849563,44.80065598995257],[-0.6184751143584594,44.80060506367932],[-0.6184349093767768,44.80055112175027],[-0.6183521141724402,44.80048385125475]]}},{"type":"Feature","properties":{"name":"Rue Charles Bourseul","distance":77.7837580149208,"sectionId":"28442-28441","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6194581803946418,44.80085421141209],[-0.6184777365899734,44.80079802889875]]}},{"type":"Feature","properties":{"name":"Rue Graham Bell","distance":23.44648192640334,"sectionId":"28442-28444","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6184440781769963,44.80100764276105],[-0.6184499042469171,44.800943227963295],[-0.6184777365899734,44.80079802889875]]}},{"type":"Feature","properties":{"name":"Rue du Bas-Brion","distance":161.1626786524148,"sectionId":"16020-16021","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6170217073769195,44.807881198466156],[-0.6170590958455054,44.807989010215174],[-0.6173561572583983,44.808381244432795],[-0.6176221330863448,44.808862838302616],[-0.6177472367798235,44.8092290114272]]}},{"type":"Feature","properties":{"name":"Rue des Chênes","distance":253.92000094599132,"sectionId":"16020-16226","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6177472367798235,44.8092290114272],[-0.6167811065759444,44.80945359434755],[-0.616645315066495,44.80943935484138],[-0.6165364233574833,44.80939399196652],[-0.61646524674378,44.80932247684998],[-0.615993843363658,44.808079542423435]]}},{"type":"Feature","properties":{"name":"Rue Chiquet Brion","distance":186.48697024767324,"sectionId":"16020-16225","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6177472367798235,44.8092290114272],[-0.6178619529184397,44.809224011545496],[-0.6186893706113094,44.80773942310523]]}},{"type":"Feature","properties":{"name":"Rue du Bas-Brion","distance":139.51796715911942,"sectionId":"16020-16019","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6177472367798235,44.8092290114272],[-0.6178290677973141,44.80954485299855],[-0.6179463556914555,44.80970984842017],[-0.6184989583193068,44.81034843710847]]}},{"type":"Feature","properties":{"name":"Rue Chiquet Brion","distance":186.48697024767324,"sectionId":"16225-16020","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6177472367798235,44.8092290114272],[-0.6178619529184397,44.809224011545496],[-0.6186893706113094,44.80773942310523]]}},{"type":"Feature","properties":{"name":"Avenue de Candau","distance":37.302716990741175,"sectionId":"16225-as=4723","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6186893706113094,44.80773942310523],[-0.6182176013896765,44.80773911700815]]}},{"type":"Feature","properties":{"name":"Avenue de Candau","distance":11.023824111941686,"sectionId":"16225-as=4007","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6189762294657988,44.80774515046019],[-0.6186893706113094,44.80773942310523]]}},{"type":"Feature","properties":{"name":"Avenue Roger Cohé","distance":227.7540824059606,"sectionId":"16434-16546","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6328764318135781,44.80911814029118],[-0.6328727374500808,44.80925428511151],[-0.6329473572416371,44.810243456326134],[-0.6329810111493155,44.810428044560325],[-0.633028961347352,44.8105402891574],[-0.633114214193189,44.81066611608326],[-0.6332377179105999,44.81086071646261],[-0.6334066349679124,44.81109917839348]]}},{"type":"Feature","properties":{"name":"Avenue Colonel Robert Jacqui","distance":105.07136389506199,"sectionId":"16434-16433","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6320923791784995,44.81123934229949],[-0.6334066349679124,44.81109917839348]]}},{"type":"Feature","properties":{"name":"Avenue Roger Cohé","distance":38.86964309877126,"sectionId":"16434-as=125501","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6334066349679124,44.81109917839348],[-0.633654882118616,44.811401236942395]]}},{"type":"Feature","properties":{"name":"Rue Dignac","distance":66.60132379399877,"sectionId":"25319-16492","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6309738476311294,44.807133985290996],[-0.6316353811792683,44.80694675051257],[-0.6317468675861465,44.80689859927188]]}},{"type":"Feature","properties":{"name":"Rue Dignac","distance":7.960356984402109,"sectionId":"25319-16493","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6309738476311294,44.807133985290996],[-0.6308833205895168,44.80716534165337]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":4.47481640967712,"sectionId":"16503-15955","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6204684765805153,44.7973743793357],[-0.6204169498377229,44.79735773276919]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":54.968126684741065,"sectionId":"16503-16504","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6199814020393726,44.797727427460025],[-0.6204684765805153,44.7973743793357]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":31.884455643552787,"sectionId":"16503-as=4702","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6204684765805153,44.7973743793357],[-0.6207581543563427,44.79717472074531]]}},{"type":"Feature","properties":{"name":"Cours Gambetta","distance":7.9504914545686685,"sectionId":"30132-30130","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.590891021962493,44.81256004356215],[-0.5908567345623567,44.81254392026931],[-0.5908188678605452,44.81253331486465],[-0.5908003747528613,44.81253101600426]]}},{"type":"Feature","properties":{"name":"Cours Gambetta","distance":8.909603367247186,"sectionId":"30132-30129","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5908003747528613,44.81253101600426],[-0.5907787072792661,44.812528547097024],[-0.5907381641463062,44.81252982687515],[-0.5906987540808859,44.81253710635883],[-0.5906903391271844,44.81254016451701]]}},{"type":"Feature","properties":{"name":"Rue Chateaubriand","distance":16.319015111931712,"sectionId":"22796-57263","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6275035249587216,44.80642437225543],[-0.6274975301480122,44.80643487320401],[-0.6274934084498641,44.806446035910135],[-0.6274918741446912,44.80645539389038],[-0.6274934651770765,44.80647099766352],[-0.6274972406471625,44.806481374391794],[-0.6275030802182302,44.80649118592944],[-0.627509315722027,44.806498447789295],[-0.62751662546439,44.806505155452946],[-0.6275241500267995,44.80651068779218],[-0.6275358685874478,44.80651717212261],[-0.6275479303243285,44.80652210000882],[-0.627563540838725,44.80652638192112],[-0.6275920194000862,44.80652960157727]]}},{"type":"Feature","properties":{"name":"Rue Chateaubriand","distance":55.906445882650424,"sectionId":"22796-15823","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6275920194000862,44.80652960157727],[-0.627788254837084,44.80667206946449],[-0.6278569569200072,44.806732783477294],[-0.627903370118661,44.80678030825671],[-0.6279585768594929,44.806846951464244],[-0.6280055653490072,44.806865517990936],[-0.628077623263275,44.80687588042583]]}},{"type":"Feature","properties":{"name":"Rue Chateaubriand","distance":8.100474640385087,"sectionId":"22796-57261","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6275920194000862,44.80652960157727],[-0.6276184584627973,44.80652674852308],[-0.6276386435663601,44.8065206495224],[-0.6276562573550565,44.80651214417997],[-0.6276774713309989,44.806494623383934]]}},{"type":"Feature","properties":{"name":"Avenue Jean Jaurès","distance":168.82569129498253,"sectionId":"15823-16953","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6262970044470864,44.80771351675207],[-0.627816776758649,44.806980587079366],[-0.628077623263275,44.80687588042583]]}},{"type":"Feature","properties":{"name":"Avenue Alexandre Jaubert","distance":66.21813250398093,"sectionId":"15823-15824","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.628077623263275,44.80687588042583],[-0.6284258411300346,44.80741807490818]]}},{"type":"Feature","properties":{"name":"Rue Chateaubriand","distance":55.906445882650424,"sectionId":"15823-22796","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6275920194000862,44.80652960157727],[-0.627788254837084,44.80667206946449],[-0.6278569569200072,44.806732783477294],[-0.627903370118661,44.80678030825671],[-0.6279585768594929,44.806846951464244],[-0.6280055653490072,44.806865517990936],[-0.628077623263275,44.80687588042583]]}},{"type":"Feature","properties":{"name":"Rue Chateaubriand","distance":53.80320351523915,"sectionId":"15823-57261","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.628077623263275,44.80687588042583],[-0.6280748824696294,44.80684652016259],[-0.6280619371304181,44.806819406628655],[-0.6277380396005221,44.806568765394],[-0.6276774713309989,44.806494623383934]]}},{"type":"Feature","properties":{"name":"Avenue Jean Jaurès","distance":80.49469412119308,"sectionId":"15823-15808","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.628077623263275,44.80687588042583],[-0.6283175187347362,44.80680688869197],[-0.6290203614854815,44.80660240666163]]}},{"type":"Feature","properties":{"name":"Avenue de Gradignan","distance":15.378629584953051,"sectionId":"16377-57283","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6255814707323305,44.80446636389337],[-0.6255949032852566,44.80448789323362],[-0.6256155342448166,44.80460184989887]]}},{"type":"Feature","properties":{"name":"Avenue de Gradignan","distance":113.53222787111412,"sectionId":"16377-16040","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6256155342448166,44.80460184989887],[-0.6254839110316924,44.80468517533525],[-0.625412944756455,44.804725137248546],[-0.6253919753631582,44.804738115318315],[-0.6253773011304238,44.80475602857069],[-0.6252467953998022,44.80497863358408],[-0.6251569503101162,44.80508923728474],[-0.6248421499497538,44.80544780398771]]}},{"type":"Feature","properties":{"name":"Rue Chateaubriand","distance":11.169892053631042,"sectionId":"16377-57284","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6256155342448166,44.80460184989887],[-0.6256515929207398,44.80466328919732],[-0.6256792607284879,44.804690975514546]]}},{"type":"Feature","properties":{"name":"Rue Chateaubriand","distance":51.1148304228422,"sectionId":"57284-16039","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6256792607284879,44.804690975514546],[-0.6256808520038644,44.80470156946084],[-0.6257622381237632,44.80484239266766],[-0.6258285714502998,44.80493264189838],[-0.6259480769330436,44.805108556981914]]}},{"type":"Feature","properties":{"name":"Rue Chateaubriand","distance":11.169892053631042,"sectionId":"57284-16377","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6256155342448166,44.80460184989887],[-0.6256515929207398,44.80466328919732],[-0.6256792607284879,44.804690975514546]]}},{"type":"Feature","properties":{"name":"Rue Chateaubriand","distance":26.6119113980076,"sectionId":"57284-25024","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6257186658929844,44.80445471683499],[-0.6257009824525093,44.80452409285669],[-0.6256986116441727,44.804580443310535],[-0.6256970738426726,44.80463293898663],[-0.625695584062968,44.80466054968195],[-0.6256792607284879,44.804690975514546]]}},{"type":"Feature","properties":{"name":"Avenue Jean Jaurès","distance":50.546300747539654,"sectionId":"16666-16260","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6174973955855689,44.811732712827244],[-0.6180778051564332,44.81154192413539]]}},{"type":"Feature","properties":{"name":"Rue Francis Plante","distance":91.2380477848837,"sectionId":"16666-16667","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6174973955855689,44.811732712827244],[-0.6180171131666972,44.81246612657396]]}},{"type":"Feature","properties":{"name":"Avenue Jean Jaurès","distance":46.97525994355878,"sectionId":"16666-as=125389","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6167864017679299,44.81196240066467],[-0.6174973955855689,44.811732712827244]]}},{"type":"Feature","properties":{"name":"Avenue Azam","distance":110.73508136917181,"sectionId":"16003-16004","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6311618754544944,44.800779946141475],[-0.6297668851998197,44.80069322459682]]}},{"type":"Feature","properties":{"name":"Avenue Pierre Wiehn","distance":30.576900135133936,"sectionId":"16003-17170","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6311618754544944,44.800779946141475],[-0.6311166921227062,44.80050654248247]]}},{"type":"Feature","properties":{"name":"Avenue Pierre Wiehn","distance":48.848733177817294,"sectionId":"16003-17161","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6312700013020841,44.80121295081171],[-0.6311618754544944,44.800779946141475]]}},{"type":"Feature","properties":{"name":"Rue Clément Thomas","distance":42.807483831646564,"sectionId":"19793-19795","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5810666445856678,44.80424561790561],[-0.5810664585556685,44.804120410507124],[-0.5810698140814963,44.80399518168156],[-0.5810581950693176,44.80391609564227],[-0.581043175686349,44.80386170890745]]}},{"type":"Feature","properties":{"name":"Passage Clément Thomas","distance":68.06071167463516,"sectionId":"19793-19794","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.581043175686349,44.80386170890745],[-0.5802724655869758,44.80381471774699],[-0.5801867371211297,44.8038034536805]]}},{"type":"Feature","properties":{"name":"Rue Clément Thomas","distance":83.91328747504457,"sectionId":"19793-19796","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.581043175686349,44.80386170890745],[-0.5809750774084989,44.803755394867444],[-0.5808904299093264,44.803669870160576],[-0.5804100776007701,44.8032597179412]]}},{"type":"Feature","properties":{"name":"Passage Clément Thomas","distance":68.06071167463516,"sectionId":"19794-19793","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.581043175686349,44.80386170890745],[-0.5802724655869758,44.80381471774699],[-0.5801867371211297,44.8038034536805]]}},{"type":"Feature","properties":{"name":"Rue Descartes","distance":93.78791039016886,"sectionId":"19814-19682","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5858764711911255,44.80673826182572],[-0.5857051846189175,44.806765685612355],[-0.5847038209642228,44.80686249834282]]}},{"type":"Feature","properties":{"name":"Rond-point Crespy","distance":16.367896713849614,"sectionId":"19814-19813","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5858764711911255,44.80673826182572],[-0.5858791298973353,44.80675057570142],[-0.585893314414082,44.80677579279143],[-0.5859150255991216,44.80679812419042],[-0.5859431700374432,44.806816469335665],[-0.585976347527421,44.80682988146932],[-0.5860118123630705,44.80683708913506]]}},{"type":"Feature","properties":{"name":"Rond-point Crespy","distance":13.684651915372697,"sectionId":"19814-58724","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5858764711911255,44.80673826182572],[-0.5858731840266255,44.80672374765225],[-0.5858757748189329,44.80669664146815],[-0.5858867725761041,44.80667063047827],[-0.5859056258139903,44.80664702023356],[-0.5859312438765092,44.80662709269295]]}},{"type":"Feature","properties":{"name":"Rue Peydavant","distance":98.14648994073804,"sectionId":"19813-20254","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5860118123630705,44.80683708913506],[-0.5860038221047741,44.80688678729566],[-0.5860167644909039,44.80692920220184],[-0.5860127062527715,44.80697315811535],[-0.585610866426628,44.80766229960811]]}},{"type":"Feature","properties":{"name":"Rond-point Crespy","distance":16.367896713849614,"sectionId":"19813-19814","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5858764711911255,44.80673826182572],[-0.5858791298973353,44.80675057570142],[-0.585893314414082,44.80677579279143],[-0.5859150255991216,44.80679812419042],[-0.5859431700374432,44.806816469335665],[-0.585976347527421,44.80682988146932],[-0.5860118123630705,44.80683708913506]]}},{"type":"Feature","properties":{"name":"Rond-point Crespy","distance":9.13809684300382,"sectionId":"19813-19812","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5861240457568794,44.80682526250225],[-0.5860886343059274,44.80683532250555],[-0.5860509488432163,44.806839555403144],[-0.5860118123630705,44.80683708913506]]}},{"type":"Feature","properties":{"name":"Rue Bossuet","distance":72.20255039086244,"sectionId":"16038-16128","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6276631170427468,44.80521949652113],[-0.6273931098724322,44.80459851259172]]}},{"type":"Feature","properties":{"name":"Avenue Béranger","distance":127.53720286806625,"sectionId":"16038-16039","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6273931098724322,44.80459851259172],[-0.62596287340999,44.805103454483124],[-0.6259480769330436,44.805108556981914]]}},{"type":"Feature","properties":{"name":"Rue Bossuet","distance":63.904612898003506,"sectionId":"16038-16129","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6273931098724322,44.80459851259172],[-0.627149054686297,44.80405002871358]]}},{"type":"Feature","properties":{"name":"Rue Razon","distance":233.60264035323357,"sectionId":"17230-16384","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6313345077378727,44.801901565174525],[-0.6294073278673378,44.80192776872536],[-0.6283827483430332,44.801882537913045]]}},{"type":"Feature","properties":{"name":"Avenue Pierre Wiehn","distance":182.98773949711259,"sectionId":"17230-30757","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6313345077378727,44.801901565174525],[-0.6314783672824089,44.80327336510994],[-0.6314813869813739,44.80331326598157],[-0.6314927031809078,44.803350289514356],[-0.6315278629932808,44.80338015576388],[-0.6315731149546422,44.8034015021162],[-0.6317138802751466,44.803460696747564]]}},{"type":"Feature","properties":{"name":"Rue Georges Pompidou","distance":7.756360198973574,"sectionId":"17230-30758","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6313345077378727,44.801901565174525],[-0.6314303730376181,44.80188679333691]]}},{"type":"Feature","properties":{"name":"Avenue Pierre Wiehn","distance":24.809391328640157,"sectionId":"17230-25409","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6313066635366836,44.801680487252156],[-0.6312995222207741,44.8017559353992],[-0.6313345077378727,44.801901565174525]]}},{"type":"Feature","properties":{"name":"Avenue Fanning Lafontaine","distance":30.401300092346553,"sectionId":"16606-16424","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6125250585888145,44.8055516828129],[-0.6124134883332674,44.8052897517341]]}},{"type":"Feature","properties":{"name":"Avenue Fanning Lafontaine","distance":64.88786460678034,"sectionId":"16606-16605","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6127699290240495,44.80610926622104],[-0.6125250585888145,44.8055516828129]]}},{"type":"Feature","properties":{"name":"Accès Maison de Retraite Mutualiste","distance":67.8140956196328,"sectionId":"16606-17793","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6125250585888145,44.8055516828129],[-0.6117017660984965,44.80572268210356]]}},{"type":"Feature","properties":{"name":"Rue Alfred de Musset","distance":140.57809099764344,"sectionId":"15830-15831","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6288499444519569,44.80393154326636],[-0.6292470081060891,44.80508717146898],[-0.6292569572675963,44.805162794691796]]}},{"type":"Feature","properties":{"name":"Boulevard Saint Martin","distance":61.28545772053333,"sectionId":"15830-16191","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6288499444519569,44.80393154326636],[-0.6296198397404436,44.803868150264506]]}},{"type":"Feature","properties":{"name":"Boulevard Saint Martin","distance":47.63160036012414,"sectionId":"15830-as=4745","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6277485516591668,44.80400827027071],[-0.6288499444519569,44.80393154326636]]}},{"type":"Feature","properties":{"name":"Esplanade des Antilles","distance":131.08184263719258,"sectionId":"15876-15877","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6168956162527585,44.795241569770326],[-0.6184503784224944,44.79483267624182]]}},{"type":"Feature","properties":{"name":"Esplanade des Antilles","distance":20.097295481467395,"sectionId":"15876-15884","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6183588167645683,44.79466389064747],[-0.6184503784224944,44.79483267624182]]}},{"type":"Feature","properties":{"name":"Esplanade des Antilles","distance":103.98334574006651,"sectionId":"15876-15875","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6184503784224944,44.79483267624182],[-0.6196800405722029,44.7945013115898]]}},{"type":"Feature","properties":{"name":"Impasse du Docteur Paul Fournial","distance":144.35268994317926,"sectionId":"15876-31649","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6184503784224944,44.79483267624182],[-0.6190857935197557,44.79605101324716]]}},{"type":"Feature","properties":{"name":"Avenue Pierre Wiehn","distance":92.76527351858567,"sectionId":"17170-17298","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6311166921227062,44.80050654248247],[-0.6309852322605088,44.79986573824809],[-0.6309706317758691,44.799784588297754],[-0.6309680186230336,44.799733053597684],[-0.6309711873600478,44.79967890203219]]}},{"type":"Feature","properties":{"name":"Avenue Pierre Wiehn","distance":30.576900135133936,"sectionId":"17170-16003","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6311618754544944,44.800779946141475],[-0.6311166921227062,44.80050654248247]]}},{"type":"Feature","properties":{"name":"Avenue Montesquieu","distance":157.307730056111,"sectionId":"17170-17162","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6311166921227062,44.80050654248247],[-0.6330550263178062,44.80018825982236]]}},{"type":"Feature","properties":{"name":"Rue du Pin Vert","distance":177.0871888978439,"sectionId":"17040-16431","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6274574680346562,44.81176640446349],[-0.6278458495754775,44.813336609117634]]}},{"type":"Feature","properties":{"name":"Avenue Mozart","distance":91.44399623627726,"sectionId":"17140-16950","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6162453655944039,44.812137179078924],[-0.6167264185774021,44.812885880405375]]}},{"type":"Feature","properties":{"name":"Avenue Pey Berland","distance":186.68113909349134,"sectionId":"17283-22908","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6088896288733325,44.80081369619789],[-0.6085799584066818,44.800788479981314],[-0.6080043730763947,44.80067702210039],[-0.6074385571916169,44.80050327451889],[-0.6067595134788911,44.80015574212107]]}},{"type":"Feature","properties":{"name":"Avenue Pey Berland","distance":63.06788545056804,"sectionId":"17283-25611","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6067595134788911,44.80015574212107],[-0.6061927458767559,44.79975627139223]]}},{"type":"Feature","properties":{"name":"Allée Pierre de Coubertin","distance":73.34893495666715,"sectionId":"17283-17289","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6067595134788911,44.80015574212107],[-0.6064220529332797,44.800236347919316],[-0.605885215623023,44.800376062741314]]}},{"type":"Feature","properties":{"name":"Avenue de Villemejan","distance":49.305730885501376,"sectionId":"25611-19824","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6065470639244804,44.79939101050488],[-0.6061927458767559,44.79975627139223]]}},{"type":"Feature","properties":{"name":"Avenue Pey-Berland","distance":449.4555122633761,"sectionId":"25611-20149","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6061927458767559,44.79975627139223],[-0.6059317490517415,44.799578616180426],[-0.6022145735222436,44.796866559883405]]}},{"type":"Feature","properties":{"name":"Avenue Pey Berland","distance":63.06788545056804,"sectionId":"25611-17283","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6067595134788911,44.80015574212107],[-0.6061927458767559,44.79975627139223]]}},{"type":"Feature","properties":{"name":"Avenue Pierre Corneille","distance":132.0022350083232,"sectionId":"16489-15938","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6235468187345438,44.80153305782432],[-0.6232012006720995,44.8003703697135]]}},{"type":"Feature","properties":{"name":"Avenue des Deux Ponts","distance":112.27072999656092,"sectionId":"16489-16341","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6248167158546375,44.80108108882604],[-0.6235468187345438,44.80153305782432]]}},{"type":"Feature","properties":{"name":"Avenue des Deux Ponts","distance":112.74533439743833,"sectionId":"16489-16490","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6235468187345438,44.80153305782432],[-0.6221211395213243,44.801523791125014]]}},{"type":"Feature","properties":{"name":"Avenue Pierre Corneille","distance":28.891734789861058,"sectionId":"16489-as=3903","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6237185655562585,44.80218948838196],[-0.6235468187345438,44.80153305782432]]}},{"type":"Feature","properties":{"name":"Avenue Pierre Corneille","distance":221.75083542600248,"sectionId":"16346-15938","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6232012006720995,44.8003703697135],[-0.6224215481183756,44.79934951528238],[-0.6223351685152967,44.7992937122823],[-0.6213004097149313,44.79914595828795]]}},{"type":"Feature","properties":{"name":"Avenue des Chasseurs","distance":118.24916588200344,"sectionId":"16346-16345","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6211277020072631,44.80020345272752],[-0.6213004097149313,44.79914595828795]]}},{"type":"Feature","properties":{"name":"Avenue des Chasseurs","distance":98.45200141850133,"sectionId":"16346-16347","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6213004097149313,44.79914595828795],[-0.6214359298816667,44.79832035139863],[-0.6214167578327167,44.79826691178667]]}},{"type":"Feature","properties":{"name":"Avenue Pierre Corneille","distance":129.67129144884257,"sectionId":"16346-16752","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6213004097149313,44.79914595828795],[-0.6211943184093939,44.79916104726907],[-0.6198129791943336,44.79906305082381],[-0.6196697256676994,44.79906661944379]]}},{"type":"Feature","properties":{"name":"Avenue du Maréchal Juin","distance":300.1616390718817,"sectionId":"16722-16533","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6234178340187196,44.79431128839112],[-0.6237221181089105,44.79435185913626],[-0.6247273891165576,44.79453692240349],[-0.6249724780782864,44.79455352265644],[-0.6252296224110706,44.794548568385494],[-0.6254792438607671,44.79452457544526],[-0.6258143132994877,44.79445713964546],[-0.6270886859262708,44.794153454899394]]}},{"type":"Feature","properties":{"name":"Avenue du Maréchal Juin","distance":62.20969222638523,"sectionId":"16722-25908","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6270886859262708,44.794153454899394],[-0.6274282079982271,44.79408244900793],[-0.6275512127806726,44.794066904402],[-0.6277226389497402,44.794048824033965],[-0.6278565756756521,44.794040137058424]]}},{"type":"Feature","properties":{"name":"Rue du Général Gouraud","distance":54.80984500943668,"sectionId":"16722-16723","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6270886859262708,44.794153454899394],[-0.6271397607279103,44.79464557544812]]}},{"type":"Feature","properties":{"name":"Allée Serpentine","distance":390.01731907776434,"sectionId":"26548-24279","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6293356239872048,44.7942267997652],[-0.6293462538206912,44.79433537202754],[-0.6293285258844772,44.794355215794624],[-0.6291488154746742,44.794440675501676],[-0.6289672565968061,44.79453898581649],[-0.628513743393875,44.79481100745702],[-0.6280734353191624,44.795192418121346],[-0.6277411178412703,44.79557506630393],[-0.6274711102434121,44.79596482426899],[-0.6274607879048836,44.79611847626145],[-0.6274827948689493,44.79627118709094],[-0.6275300466143741,44.79645714434769],[-0.6275454519386845,44.79659943585607],[-0.6275492906190561,44.79681929818507],[-0.6275501744942098,44.79698817721839],[-0.6275361969122202,44.79722248075931]]}},{"type":"Feature","properties":{"name":"Allée Serpentine","distance":11.923782026064451,"sectionId":"26548-17060","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6293356239872048,44.7942267997652],[-0.6293204244529603,44.79411999485734]]}},{"type":"Feature","properties":{"name":"Avenue du Maréchal Juin","distance":63.3164508270886,"sectionId":"26548-23345","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6293356239872048,44.7942267997652],[-0.6299850149512828,44.79426895082378],[-0.6300637174822687,44.794257069772094],[-0.6300986751286143,44.79421550612817]]}},{"type":"Feature","properties":{"name":"Piste Cyclable Thouars","distance":280.1525325079538,"sectionId":"25689-25688","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5924389591219411,44.796194159508005],[-0.5925582154445792,44.795084814159736],[-0.5925434084053987,44.79490809036547],[-0.5925170135340905,44.794780917490456],[-0.592470576961654,44.79465086454193],[-0.5923499605559438,44.794414515873356],[-0.5920778183532163,44.793876133815616],[-0.5920473615655151,44.79385025139916],[-0.5919747227009714,44.793750392727745]]}},{"type":"Feature","properties":{"name":"Rue de Tremeuge","distance":75.20454679017517,"sectionId":"19998-19996","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5871427200275997,44.802502850829214],[-0.5862241014385443,44.80232760458696]]}},{"type":"Feature","properties":{"name":"Rue du Général Margueritte","distance":176.31229940323976,"sectionId":"19998-19991","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5871427200275997,44.802502850829214],[-0.5877041787751051,44.80096663185932]]}},{"type":"Feature","properties":{"name":"Rue du Général Margueritte","distance":126.35540132595106,"sectionId":"19998-19997","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5871427200275997,44.802502850829214],[-0.5867905106293946,44.80346143889426],[-0.5867758335128497,44.803489917178766],[-0.5867523309703795,44.80351687214069],[-0.5867052543016262,44.80353709372638],[-0.5866414389109001,44.80354045736144]]}},{"type":"Feature","properties":{"name":"Rue de Tremeuge","distance":69.68328827239124,"sectionId":"19998-20268","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5879957097363121,44.802660342236095],[-0.5871427200275997,44.802502850829214]]}},{"type":"Feature","properties":{"name":"Rue Peydavant","distance":102.21205816879394,"sectionId":"19997-19995","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5866414389109001,44.80354045736144],[-0.5865886070546378,44.803425467501455],[-0.5864069909231818,44.80313797836744],[-0.586373946364976,44.803103077728615],[-0.5859945919392777,44.80275327348517]]}},{"type":"Feature","properties":{"name":"Rue Montesquieu","distance":97.53379317098036,"sectionId":"19997-19808","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5866414389109001,44.80354045736144],[-0.5864800984443781,44.80355040946131],[-0.586420303209506,44.80355941143457],[-0.5863615593812236,44.803546670521854],[-0.5858053346292776,44.80335350694344],[-0.5856979684373356,44.80330968904041],[-0.5855953349727717,44.80326058718053],[-0.5855319951303288,44.80322276786811]]}},{"type":"Feature","properties":{"name":"Rue Peydavant","distance":85.83111608911443,"sectionId":"19997-20215","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5867244760266841,44.8043076775135],[-0.586742943242999,44.804098105472036],[-0.5867200351165935,44.803925150249526],[-0.5866897638792186,44.803723330809916],[-0.5866414389109001,44.80354045736144]]}},{"type":"Feature","properties":{"name":"Rue du Général Margueritte","distance":126.35540132595106,"sectionId":"19997-19998","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5871427200275997,44.802502850829214],[-0.5867905106293946,44.80346143889426],[-0.5867758335128497,44.803489917178766],[-0.5867523309703795,44.80351687214069],[-0.5867052543016262,44.80353709372638],[-0.5866414389109001,44.80354045736144]]}},{"type":"Feature","properties":{"name":"Allée Peixotto","distance":187.26179540843094,"sectionId":"29935-29248","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5912555154959257,44.80751520978357],[-0.5905515651723987,44.807405373331754],[-0.5901770256962261,44.80736909201326],[-0.5893750442941084,44.80732684118528],[-0.5890792937801159,44.80732842662353],[-0.5890014349804157,44.80732376688344],[-0.5889127340169472,44.807307558385496]]}},{"type":"Feature","properties":{"name":"Rond-point de la Légion d'Honneur","distance":8.111059623261639,"sectionId":"29248-29242","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5889127340169472,44.807307558385496],[-0.5888930665239506,44.807322952362355],[-0.5888628608630143,44.80733777801807],[-0.5888287887820327,44.80734741083005]]}},{"type":"Feature","properties":{"name":"Rond-point de la Légion d'Honneur","distance":16.24810686806674,"sectionId":"29248-29246","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5889215836520356,44.807171255589246],[-0.5889296984739978,44.80717964740053],[-0.5889433617377052,44.80720398879167],[-0.5889490151496328,44.80722975397872],[-0.5889465915290962,44.80725586410145],[-0.5889360013047008,44.80728088067426],[-0.5889178031544772,44.807303615004436],[-0.5889127340169472,44.807307558385496]]}},{"type":"Feature","properties":{"name":"Allée Peixotto","distance":187.26179540843094,"sectionId":"29248-29935","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5912555154959257,44.80751520978357],[-0.5905515651723987,44.807405373331754],[-0.5901770256962261,44.80736909201326],[-0.5893750442941084,44.80732684118528],[-0.5890792937801159,44.80732842662353],[-0.5890014349804157,44.80732376688344],[-0.5889127340169472,44.807307558385496]]}},{"type":"Feature","properties":{"name":"Parking Eglise Notre Dame","distance":28.212075997293212,"sectionId":"20544-20542","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5921025824436333,44.81289446071338],[-0.5921067490056824,44.81264047826045]]}},{"type":"Feature","properties":{"name":"Rue du Relais","distance":81.70533966323775,"sectionId":"17556-17555","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6082477944066069,44.79542278223798],[-0.6081018694098145,44.79514698415391],[-0.6080696027872224,44.795134765721954],[-0.6075957062509978,44.7952645660447],[-0.6075399926453159,44.79530020462924]]}},{"type":"Feature","properties":{"name":"Rue du Relais","distance":13.915601122784324,"sectionId":"17556-17557","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6082477944066069,44.79542278223798],[-0.6083034349545852,44.79554163781109]]}},{"type":"Feature","properties":{"name":"Rue du Relais","distance":65.06113505633907,"sectionId":"17557-17209","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6085877055614487,44.79609131192823],[-0.6083034349545852,44.79554163781109]]}},{"type":"Feature","properties":{"name":"Rue du Relais","distance":13.915601122784324,"sectionId":"17557-17556","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6082477944066069,44.79542278223798],[-0.6083034349545852,44.79554163781109]]}},{"type":"Feature","properties":{"name":"Rue du Relais","distance":59.607783028044814,"sectionId":"17557-17210","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6083034349545852,44.79554163781109],[-0.6081092980994777,44.79606018908337]]}},{"type":"Feature","properties":{"name":"Résidence Parc de Suzon","distance":14.152728515047444,"sectionId":"24956-24949","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5831128403084147,44.81142832487604],[-0.5831112470882293,44.81130090973327]]}},{"type":"Feature","properties":{"name":"Résidence Parc de Suzon","distance":48.34288473685892,"sectionId":"24956-24954","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5833320972450592,44.81171859716562],[-0.5833240118119575,44.81143383395952],[-0.5831128403084147,44.81142832487604]]}},{"type":"Feature","properties":{"name":"Résidence Parc de Suzon","distance":14.484336649805044,"sectionId":"24956-24955","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5831192966936468,44.81155864960264],[-0.5831128403084147,44.81142832487604]]}},{"type":"Feature","properties":{"name":"Résidence Parc de Suzon","distance":62.90478234979809,"sectionId":"24955-24951","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5831192966936468,44.81155864960264],[-0.5823237210808098,44.81155307906197]]}},{"type":"Feature","properties":{"name":"Résidence Parc de Suzon","distance":29.134589966344706,"sectionId":"24955-24954","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5833320972450592,44.81171859716562],[-0.583224791348128,44.81171260887287],[-0.5831303031730319,44.81165631158226],[-0.5831192966936468,44.81155864960264]]}},{"type":"Feature","properties":{"name":"Résidence Parc de Suzon","distance":14.484336649805044,"sectionId":"24955-24956","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5831192966936468,44.81155864960264],[-0.5831128403084147,44.81142832487604]]}},{"type":"Feature","properties":{"name":"Boulevard Saint Martin","distance":88.70358947005236,"sectionId":"16191-17229","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6296198397404436,44.803868150264506],[-0.6307358512522636,44.8037873977151]]}},{"type":"Feature","properties":{"name":"Rue Byron","distance":123.92089171967304,"sectionId":"16191-16190","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6299514419578577,44.8049585728237],[-0.6296198397404436,44.803868150264506]]}},{"type":"Feature","properties":{"name":"Boulevard Saint Martin","distance":61.28545772053333,"sectionId":"16191-15830","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6288499444519569,44.80393154326636],[-0.6296198397404436,44.803868150264506]]}},{"type":"Feature","properties":{"name":"Rue des Camélias","distance":51.414020822603305,"sectionId":"20182-19550","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.58038085195626,44.79839272485266],[-0.5803079985196377,44.79834214057878],[-0.5798295503254133,44.79815136572929]]}},{"type":"Feature","properties":{"name":"Avenue Pey Berland","distance":13.475689530438705,"sectionId":"17750-17282","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6092841275076156,44.80081351866447],[-0.6092872134389681,44.800824410846154],[-0.6092952706295212,44.80084397338659],[-0.6093076799333551,44.80086231681581],[-0.6093240400121736,44.80087909353607],[-0.6093439326374661,44.80089368623924],[-0.6093668414517708,44.80090593114398],[-0.6093768517601454,44.800910207684005]]}},{"type":"Feature","properties":{"name":"Avenue Pey Berland","distance":11.430022845846054,"sectionId":"17750-as=2847","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6093768517601454,44.800910207684005],[-0.609392227574084,44.800915304854115],[-0.6094194483680796,44.80092164759661],[-0.6094477405449926,44.800924893510945],[-0.6094764558320666,44.800924792922395],[-0.6095045840201877,44.80092137789173],[-0.6095170708821552,44.80091872951914]]}},{"type":"Feature","properties":{"name":"Avenue des Facultés","distance":358.6712957056328,"sectionId":"17750-as=127943","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6093768517601454,44.800910207684005],[-0.6090330171219099,44.801145695808486],[-0.6087463550228671,44.80134657854071],[-0.6083970771729191,44.80163466550279],[-0.6081599651827935,44.801836857162016],[-0.6078710582825699,44.802133386560165],[-0.6075601838193506,44.80248331036001],[-0.6074589290933775,44.80261020572636],[-0.6068476869041276,44.80355291536525]]}},{"type":"Feature","properties":{"name":"Rue Pacaris","distance":17.37626168156613,"sectionId":"30634-30633","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5811058814962979,44.797695276271334],[-0.5811222045583413,44.79767494433155],[-0.581129341182702,44.79765337027799],[-0.5811279618236558,44.79763116357018],[-0.5811181781801152,44.79761012232174],[-0.5811008372354939,44.79759166116655],[-0.5810771703619295,44.7975772727113],[-0.581049012358213,44.797567980156245]]}},{"type":"Feature","properties":{"name":"Rue Pacaris","distance":9.888360001386687,"sectionId":"30634-23612","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.581049012358213,44.797567980156245],[-0.5810180438256437,44.79756436114913],[-0.5809870762128263,44.797566867649735],[-0.58095823935601,44.797575162349034],[-0.5809334049683368,44.79758882598663]]}},{"type":"Feature","properties":{"name":"Rue Henry de Montherlant","distance":130.4486175800037,"sectionId":"30634-as=125304","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.581049012358213,44.797567980156245],[-0.5811042401309843,44.79736535923975],[-0.5811276450833788,44.797281837287144],[-0.5813185214704116,44.796827040175025],[-0.5814783761385266,44.79643501556176],[-0.5814783761385266,44.79643501556176]]}},{"type":"Feature","properties":{"name":"Rue de Compostelle","distance":81.29056289974486,"sectionId":"17773-17562","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6096161550702309,44.794183685429104],[-0.6102377641172693,44.79436438733048],[-0.6105819573232397,44.79443030040655]]}},{"type":"Feature","properties":{"name":"Rue de Compostelle","distance":110.33932014219675,"sectionId":"17773-16014","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6105819573232397,44.79443030040655],[-0.6113393276055692,44.794471741482965],[-0.6119745595212183,44.79445778236543]]}},{"type":"Feature","properties":{"name":"Rue de Compostelle","distance":100.26459479246871,"sectionId":"17773-16015","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6105819573232397,44.79443030040655],[-0.6106522588520107,44.794478154455625],[-0.6107679436214124,44.79457393297544],[-0.6108433791667772,44.79465729678706],[-0.6109014663267107,44.79474040067302],[-0.610927642188038,44.79482100458504],[-0.6109431460304375,44.794894830803685],[-0.6109314692934735,44.79500735497405],[-0.6109058110921812,44.79512086359016],[-0.6108716764102907,44.79524851413376]]}},{"type":"Feature","properties":{"name":"Avenue des Arts Et Metiers","distance":41.21920373273579,"sectionId":"22891-20412","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6017685441052617,44.806145044514714],[-0.601584876390149,44.80579773715195]]}},{"type":"Feature","properties":{"name":"Avenue des Arts Et Metiers","distance":13.921333808362212,"sectionId":"22891-20398","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6018331508031505,44.80626163727018],[-0.6017685441052617,44.806145044514714]]}},{"type":"Feature","properties":{"name":"Place du 8 Mai 1945","distance":87.16933892512664,"sectionId":"19600-20311","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5873844207319046,44.80931081429517],[-0.5869495530264315,44.80913490627385],[-0.5869182103407327,44.80911724772109],[-0.5868969801111468,44.80909737856054],[-0.5868897255925573,44.80906824068419],[-0.5868927401554886,44.809039409557116],[-0.5869572195601603,44.80882496356797],[-0.5869876197288899,44.80872986951243]]}},{"type":"Feature","properties":{"name":"Rue Ambroise Pare","distance":66.44806474124479,"sectionId":"19600-19599","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5861563400219824,44.80864203725283],[-0.5869876197288899,44.80872986951243]]}},{"type":"Feature","properties":{"name":"Rue du Professeur Roux","distance":180.53763845208758,"sectionId":"19600-20181","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5878866023049307,44.80723804824538],[-0.5878531095493886,44.80734441032008],[-0.5870242927718372,44.808660341002444],[-0.5869876197288899,44.80872986951243]]}},{"type":"Feature","properties":{"name":"Rue Ambroise Pare","distance":31.141710877522698,"sectionId":"19600-as=129078","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5869876197288899,44.80872986951243],[-0.5873770289998756,44.808771890909945]]}},{"type":"Feature","properties":{"name":"Rue Peydavant","distance":127.5517969220892,"sectionId":"19627-20287","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5864864687442536,44.80581270157772],[-0.5865034209105237,44.80571298705664],[-0.5865690362884969,44.80533176401814],[-0.5866361089763721,44.80492923565233],[-0.5866746519603945,44.8046721880755]]}},{"type":"Feature","properties":{"name":"Rue Peydavant","distance":40.6780038541356,"sectionId":"19627-20215","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5866746519603945,44.8046721880755],[-0.5867244760266841,44.8043076775135]]}},{"type":"Feature","properties":{"name":"Rue Antoine Carles","distance":48.06835189526199,"sectionId":"19627-19628","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5866746519603945,44.8046721880755],[-0.5861198120682125,44.80449537688717]]}},{"type":"Feature","properties":{"name":"Rue Antoine Carles","distance":108.25164188039562,"sectionId":"19628-19629","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5861198120682125,44.80449537688717],[-0.5848800257630388,44.80408206975226]]}},{"type":"Feature","properties":{"name":"Rue Verdeau","distance":203.4130712025672,"sectionId":"19628-19951","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5849876235953666,44.80613983686355],[-0.5861198120682125,44.80449537688717]]}},{"type":"Feature","properties":{"name":"Rue Antoine Carles","distance":48.06835189526199,"sectionId":"19628-19627","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5866746519603945,44.8046721880755],[-0.5861198120682125,44.80449537688717]]}},{"type":"Feature","properties":{"name":"Rue Georges Bizet","distance":73.16100494392796,"sectionId":"20009-19619","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5886201223908932,44.795558312862916],[-0.5884126126163992,44.79620020875445]]}},{"type":"Feature","properties":{"name":"Rue Hector Berlioz","distance":195.36425322716408,"sectionId":"20009-20055","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5886201223908932,44.795558312862916],[-0.5861596889364554,44.79540171578158]]}},{"type":"Feature","properties":{"name":"Rue Georges Bizet","distance":71.9622073453714,"sectionId":"20009-20008","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5887778931031118,44.79492023813073],[-0.5886201223908932,44.795558312862916]]}},{"type":"Feature","properties":{"name":"Rue Lafitte","distance":55.290502118394535,"sectionId":"20055-19950","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5860323705535917,44.79589118155161],[-0.5861596889364554,44.79540171578158]]}},{"type":"Feature","properties":{"name":"Rue Lafitte","distance":55.58382593690049,"sectionId":"20055-20096","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5861596889364554,44.79540171578158],[-0.5862735772825147,44.79490789896886]]}},{"type":"Feature","properties":{"name":"Rue Hector Berlioz","distance":195.36425322716408,"sectionId":"20055-20009","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5886201223908932,44.795558312862916],[-0.5861596889364554,44.79540171578158]]}},{"type":"Feature","properties":{"name":"Avenue du Vallon","distance":29.667723555590786,"sectionId":"17441-17197","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6206897558564304,44.81118442213069],[-0.6208364325521509,44.811430275159225]]}},{"type":"Feature","properties":{"name":"Avenue du Vallon","distance":48.71661923600989,"sectionId":"17441-16535","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6202000052487621,44.81094462359676],[-0.6202566293124819,44.81102813039847],[-0.6205413373877039,44.81112437627026],[-0.6206897558564304,44.81118442213069]]}},{"type":"Feature","properties":{"name":"Avenue du Vallon","distance":36.922952828509025,"sectionId":"17441-16536","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6205284245130067,44.81087246378458],[-0.6206897558564304,44.81118442213069]]}},{"type":"Feature","properties":{"name":"Rue Gabriel Faure","distance":30.810158933321645,"sectionId":"25245-26871","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6042882382750667,44.79684094366318],[-0.6043015427615663,44.79682709967243],[-0.6043125792764688,44.796805310200725],[-0.6043154335148863,44.796782158566785],[-0.6043097072060759,44.79675936896613],[-0.6042959953553246,44.796738363864144],[-0.6042750248552663,44.79672065162491],[-0.6042482577090789,44.796707356983966],[-0.604217649743204,44.79669940886188],[-0.6041852661857061,44.796697462462895],[-0.6041532535664538,44.796701449756725],[-0.6041237584157965,44.796711302714655],[-0.6040987560359596,44.79672623807645],[-0.604094233275002,44.79673079546311]]}},{"type":"Feature","properties":{"name":"Rue Gabriel Faure","distance":100.72537457402946,"sectionId":"25245-19963","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6030959881292656,44.796167611720165],[-0.604094233275002,44.79673079546311]]}},{"type":"Feature","properties":{"name":"Rue Gabriel Faure","distance":15.360667000661985,"sectionId":"25245-25046","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.604094233275002,44.79673079546311],[-0.6040806537445562,44.79674428781476],[-0.6040690420189989,44.796766996318645],[-0.6040663083311959,44.796790054040066],[-0.6040719138993855,44.79681293755851],[-0.6040857519524935,44.79683393868597],[-0.6041065961696062,44.79685165496167],[-0.604111969837402,44.79685463755314]]}},{"type":"Feature","properties":{"name":"Rue des Flamboyants","distance":15.235011616417305,"sectionId":"16632-16631","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6202864288590101,44.80518005017042],[-0.6201678190527815,44.80528814201962]]}},{"type":"Feature","properties":{"name":"Rue Blanqui","distance":185.41995622201074,"sectionId":"19685-19686","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5831887578305832,44.8130770372922],[-0.5846415793250371,44.81303036486458],[-0.5846955641225412,44.81304172552366],[-0.5847264277124679,44.813061832026165],[-0.5847480533528729,44.813086013059646],[-0.5847567315086715,44.81312177221375],[-0.5847905382966339,44.81362056946996]]}},{"type":"Feature","properties":{"name":"Rue Jules Valles","distance":122.73154650857504,"sectionId":"19685-20108","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5840087065161284,44.81364925808745],[-0.5833944479768912,44.81367212232056],[-0.5833268487018581,44.81366569396263],[-0.5832773479482455,44.81364707496361],[-0.5832460809664701,44.81361436937356],[-0.5832336345599575,44.81356683807355],[-0.5831887578305832,44.8130770372922]]}},{"type":"Feature","properties":{"name":"Rue Blanqui","distance":78.80942823627964,"sectionId":"19685-19684","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5821933875355502,44.81311505203595],[-0.5831887578305832,44.8130770372922]]}},{"type":"Feature","properties":{"name":"Rue Bourges","distance":6.204946953081213,"sectionId":"23182-19723","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5822053501379916,44.81203081536906],[-0.5822195256664939,44.81197586969005]]}},{"type":"Feature","properties":{"name":"Rue Bourges","distance":32.111068870041414,"sectionId":"23182-20414","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5824723589146111,44.812248511199655],[-0.5823741712000737,44.81216323347901],[-0.5822557699497675,44.812068322946935],[-0.5822053501379916,44.81203081536906]]}},{"type":"Feature","properties":{"name":"Rue Bourges","distance":43.15532706013283,"sectionId":"23182-19722","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5821412127605833,44.8124160415655],[-0.5821412938540521,44.81236847600874],[-0.5821621961695906,44.81220999509623],[-0.5822053501379916,44.81203081536906]]}},{"type":"Feature","properties":{"name":"Rue Bourges","distance":6.204946953081213,"sectionId":"19723-23182","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5822053501379916,44.81203081536906],[-0.5822195256664939,44.81197586969005]]}},{"type":"Feature","properties":{"name":"Rue de Suzon","distance":99.70263831911069,"sectionId":"19723-20193","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5822195256664939,44.81197586969005],[-0.5820505428775261,44.81195894088225],[-0.5819462040872896,44.81195997437604],[-0.5814038097285079,44.81206172884313],[-0.5812389422249887,44.812088628990395],[-0.5809830832725752,44.812082901277265]]}},{"type":"Feature","properties":{"name":"Rue de Suzon","distance":25.718627158907925,"sectionId":"19723-as=126494","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5822675146941628,44.81178114683718],[-0.5822195256664939,44.81197586969005]]}},{"type":"Feature","properties":{"name":"Rue Bourges","distance":16.913065469476905,"sectionId":"20414-25911","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5824723589146111,44.812248511199655],[-0.582490067994727,44.81226263676386],[-0.5825124379612426,44.81228048904096],[-0.582546648003199,44.81229337427308],[-0.5825820775227311,44.81230144677011],[-0.5826588270171792,44.81231056002393]]}},{"type":"Feature","properties":{"name":"Rue Bourges","distance":32.111068870041414,"sectionId":"20414-23182","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5824723589146111,44.812248511199655],[-0.5823741712000737,44.81216323347901],[-0.5822557699497675,44.812068322946935],[-0.5822053501379916,44.81203081536906]]}},{"type":"Feature","properties":{"name":"Rue Bourges","distance":32.13151126266019,"sectionId":"20414-19722","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5821412127605833,44.8124160415655],[-0.5822168541435998,44.812374744402945],[-0.5823742292670113,44.81229448033498],[-0.5824723589146111,44.812248511199655]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":102.58901642789557,"sectionId":"19728-29092","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.595003061518976,44.80107819332798],[-0.5956578561455381,44.800701218459],[-0.595774021083448,44.80066088231499],[-0.5958302538970383,44.800647573885925],[-0.5958978737692194,44.800638319427264],[-0.5959739481210525,44.80063681493237],[-0.5960955461028271,44.80064098746413]]}},{"type":"Feature","properties":{"name":"Avenue de Breuil","distance":97.18652527801913,"sectionId":"19728-19729","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.595003061518976,44.80107819332798],[-0.5958868153279412,44.801686235444606]]}},{"type":"Feature","properties":{"name":"Avenue de Breuil","distance":4.848962643215482,"sectionId":"19728-38610","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.595003061518976,44.80107819332798],[-0.594965116161893,44.80104390037088]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":68.90354421244162,"sectionId":"19728-as=125560","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5946487832190162,44.80128760236258],[-0.595003061518976,44.80107819332798]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":15.887916153459132,"sectionId":"38609-29092","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5960516029257379,44.800504460980235],[-0.5960487952745205,44.80053652895545],[-0.5960583143303593,44.800581629428855],[-0.5960807164692279,44.80062434073841],[-0.5960955461028271,44.80064098746413]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":43.13883337642083,"sectionId":"38609-29094","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.59644967915179,44.800320356824194],[-0.5964365410597219,44.8003166285008],[-0.5963733139310687,44.80030907916642],[-0.5963094185501041,44.800311099648546],[-0.5962473803957882,44.800322610089026],[-0.5961900701269465,44.800342979222755],[-0.5961399683688416,44.800371407962906],[-0.5960992695628712,44.8004065657782],[-0.5960696574508229,44.800447048207396],[-0.5960526614748141,44.800491005252994],[-0.5960516029257379,44.800504460980235]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":105.5729527828473,"sectionId":"38609-38610","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5960516029257379,44.800504460980235],[-0.5959309872915364,44.80055863064847],[-0.5958849997721064,44.80057188544617],[-0.5958214851930315,44.80058407289871],[-0.5957329840916419,44.800609481645786],[-0.5956846277519224,44.80062938725619],[-0.5956218191447994,44.80066101003569],[-0.594965116161893,44.80104390037088]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":10.69023832591823,"sectionId":"19939-22866","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6001156711618988,44.798157515156575],[-0.600032246774405,44.798081784266614]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":219.6067302119729,"sectionId":"19939-20149","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6001156711618988,44.798157515156575],[-0.6007363153333832,44.797795913029184],[-0.6011471230819231,44.797560941994476],[-0.601624488781473,44.797285666493565],[-0.6019543238940018,44.79706091369991],[-0.6022145735222436,44.796866559883405]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":34.7363550426505,"sectionId":"19939-as=124883","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5986810940580379,44.79900107428764],[-0.6001156711618988,44.798157515156575]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":254.33122971889415,"sectionId":"27556-16418","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6078964088953601,44.80591678083899],[-0.6077716800222357,44.805996226583915],[-0.6073527494165163,44.80631426392598],[-0.6068867313727507,44.80665640353449],[-0.6065554926701945,44.8069139137733],[-0.6063456560278409,44.8070913638738],[-0.605757491691602,44.80762330174275]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":50.08043567178548,"sectionId":"27556-25956","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.605757491691602,44.80762330174275],[-0.6057145482988456,44.8076104300054],[-0.6056691358300782,44.8076025910679],[-0.6056226659682261,44.80760010050816],[-0.6055762696920832,44.80760283239072],[-0.6055309685626502,44.80761093449851],[-0.6054881348980691,44.80762409308484],[-0.6054488828118246,44.80764191250568],[-0.6054140794659372,44.80766409503106],[-0.6053846901984539,44.807689889404585],[-0.6053615596865048,44.80771863827693],[-0.605345285652203,44.80774978221213],[-0.6053360588329404,44.80778232425827],[-0.6053344964088883,44.80781399278839],[-0.6053373108555657,44.807834712668125]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":9.946402213610048,"sectionId":"27556-16517","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6058526999066345,44.807680729014336],[-0.6058319662825128,44.80766282926865],[-0.605796933194583,44.807640878692865],[-0.605757491691602,44.80762330174275]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":10.639242253111677,"sectionId":"25956-27555","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6053373108555657,44.807834712668125],[-0.6053401918614544,44.807848403993674],[-0.605353450516638,44.8078803234028],[-0.6053735427531568,44.80791022455468],[-0.6053857356036779,44.80792308022486]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":50.08043567178548,"sectionId":"25956-27556","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.605757491691602,44.80762330174275],[-0.6057145482988456,44.8076104300054],[-0.6056691358300782,44.8076025910679],[-0.6056226659682261,44.80760010050816],[-0.6055762696920832,44.80760283239072],[-0.6055309685626502,44.80761093449851],[-0.6054881348980691,44.80762409308484],[-0.6054488828118246,44.80764191250568],[-0.6054140794659372,44.80766409503106],[-0.6053846901984539,44.807689889404585],[-0.6053615596865048,44.80771863827693],[-0.605345285652203,44.80774978221213],[-0.6053360588329404,44.80778232425827],[-0.6053344964088883,44.80781399278839],[-0.6053373108555657,44.807834712668125]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":139.44414832145853,"sectionId":"25956-as=126047","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6053373108555657,44.807834712668125],[-0.6051873145541915,44.80787649092929],[-0.6048086836417823,44.8079348837127],[-0.6043747780243471,44.80796331771077],[-0.6038104886308437,44.80793435470706],[-0.6035977134475037,44.807921114835146]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":22.066986628957334,"sectionId":"23353-49830","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6001113002571422,44.80457918076215],[-0.6000852811907536,44.8043813726086]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":15.5371527113723,"sectionId":"23353-23254","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6000852811907536,44.8043813726086],[-0.6002051024416202,44.804381273287774],[-0.6002816167230712,44.80438470667476]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":93.10096248731578,"sectionId":"23353-as=4667","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6000852811907536,44.8043813726086],[-0.6000579938504631,44.8041835145103],[-0.5999881139459997,44.8036379351872],[-0.5999744803870597,44.80360602712762],[-0.5999527060266195,44.80358356514508],[-0.5999223500980054,44.80356146486022],[-0.5999223500980054,44.80356146486022]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":23.174906110573147,"sectionId":"23254-23249","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6004092627113612,44.80421004994941],[-0.6004031871109291,44.804212043923265],[-0.6003664081634719,44.804230954406414],[-0.6003349725257094,44.80425438002206],[-0.600309954985261,44.804281295846266],[-0.6002921946162614,44.80431095466363],[-0.6002820197436155,44.80434253534246],[-0.6002799831918216,44.80437475923374],[-0.6002816167230712,44.80438470667476]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":22.88964203417339,"sectionId":"23254-27598","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6002816167230712,44.80438470667476],[-0.6002860344366656,44.8044068171943],[-0.6003001004996978,44.80443754046262],[-0.6003214882036597,44.80446596007055],[-0.6003497681706776,44.80449127886543],[-0.6003839946460026,44.804512535873315],[-0.6004229917650951,44.80452913773373],[-0.6004523068258636,44.8045365874173]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":15.5371527113723,"sectionId":"23254-23353","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6000852811907536,44.8043813726086],[-0.6002051024416202,44.804381273287774],[-0.6002816167230712,44.80438470667476]]}},{"type":"Feature","properties":{"name":"Avenue de Collegno","distance":74.66326163399513,"sectionId":"49828-16421","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6056844644651586,44.806002687415926],[-0.6053620107596795,44.80537088988191]]}},{"type":"Feature","properties":{"name":"Rue du Professeur Arnozan","distance":16.72542092871129,"sectionId":"20311-20309","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5873844207319046,44.80931081429517],[-0.587258968721268,44.80943205713267]]}},{"type":"Feature","properties":{"name":"Rue du Professeur Arnozan","distance":36.59824679703776,"sectionId":"20311-20312","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5873844207319046,44.80931081429517],[-0.5876967809948078,44.80906765093253]]}},{"type":"Feature","properties":{"name":"Place du 8 Mai 1945","distance":87.16933892512664,"sectionId":"20311-19600","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5873844207319046,44.80931081429517],[-0.5869495530264315,44.80913490627385],[-0.5869182103407327,44.80911724772109],[-0.5868969801111468,44.80909737856054],[-0.5868897255925573,44.80906824068419],[-0.5868927401554886,44.809039409557116],[-0.5869572195601603,44.80882496356797],[-0.5869876197288899,44.80872986951243]]}},{"type":"Feature","properties":{"name":"Rue Charles Gounod","distance":107.38740379805421,"sectionId":"19772-19670","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5870244283657843,44.797018707197054],[-0.5859361428374773,44.79694565065381],[-0.5856717428526199,44.79693579087962]]}},{"type":"Feature","properties":{"name":"Impasse Charles Gounod","distance":41.63586125268604,"sectionId":"19772-19773","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5868890728028368,44.797380961659904],[-0.5870244283657843,44.797018707197054]]}},{"type":"Feature","properties":{"name":"Rue Charles Gounod","distance":84.55735550895919,"sectionId":"19772-19771","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5880899537441516,44.79708175177864],[-0.5870244283657843,44.797018707197054]]}},{"type":"Feature","properties":{"name":"Rue de Suzon","distance":152.69465701578034,"sectionId":"20198-20119","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5878802718810091,44.8104521851498],[-0.5872933614143089,44.81044015805655],[-0.5872123898312404,44.810444513222485],[-0.5871315852683003,44.81045561919193],[-0.5870585288065299,44.81047125510089],[-0.5869861748702153,44.81049614722422],[-0.5861900730992796,44.810831760005584],[-0.5861018004954792,44.81086318887048]]}},{"type":"Feature","properties":{"name":"Rue Maurice Berteaux","distance":92.4473378481852,"sectionId":"20198-as=129212","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5878775393091816,44.81047320487493],[-0.5878802718810091,44.8104521851498]]}},{"type":"Feature","properties":{"name":"Rue de Suzon","distance":3.147900149868857,"sectionId":"20198-as=129213","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5880181543569623,44.810460287421996],[-0.5878802718810091,44.8104521851498]]}},{"type":"Feature","properties":{"name":"Résidence Crespy I","distance":18.830733503042435,"sectionId":"20211-20477","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5887105096135855,44.80420566504319],[-0.5889352992729378,44.80426162947189]]}},{"type":"Feature","properties":{"name":"Rue de Megret","distance":83.08311282915437,"sectionId":"20211-20210","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5887105096135855,44.80420566504319],[-0.5890841607714429,44.8035065501129]]}},{"type":"Feature","properties":{"name":"Rue de Megret","distance":48.369444883854094,"sectionId":"20211-20043","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5884806678820967,44.80460857465829],[-0.5885406678952725,44.80452829208907],[-0.5887105096135855,44.80420566504319]]}},{"type":"Feature","properties":{"name":"Avenue Eugène Et Marc Dulout","distance":26.499953366246448,"sectionId":"36294-16601","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6322121990324753,44.804561645228155],[-0.6324972230262332,44.80443615401674]]}},{"type":"Feature","properties":{"name":"Avenue Eugène Et Marc Dulout","distance":6.922457625431717,"sectionId":"36294-as=2793","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6317753874490736,44.80474530328229],[-0.6322121990324753,44.804561645228155]]}},{"type":"Feature","properties":{"name":"Résidence Parc de Suzon","distance":39.60436362370245,"sectionId":"20415-24950","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5836514704914351,44.81236324867341],[-0.5841520718199863,44.81235053970521]]}},{"type":"Feature","properties":{"name":"Avenue Camille Jullian","distance":122.35030655929091,"sectionId":"24464-15886","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6162000239246755,44.79524135064804],[-0.6156559924187647,44.79421016985492]]}},{"type":"Feature","properties":{"name":"Avenue Jean Babin","distance":27.792591854207622,"sectionId":"24464-24465","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6156559924187647,44.79421016985492],[-0.6156887196234317,44.79419138287469],[-0.6157081737097578,44.7941768014107],[-0.6157242040577976,44.79416007672136],[-0.6157362188332708,44.79414185820801],[-0.6157439824322011,44.794122423615256],[-0.6157472818027955,44.79410241030045],[-0.6157460188800044,44.79408227179733],[-0.6157402274963963,44.794062547532015],[-0.6157300621073226,44.794043683007935],[-0.6157158147032175,44.79402629952435],[-0.6156978866188042,44.79401074465114],[-0.6156768201359397,44.79399961355941]]}},{"type":"Feature","properties":{"name":"Avenue Jean Babin","distance":16.29322356557697,"sectionId":"24464-24467","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6154612586161684,44.79419555204469],[-0.6154779893937518,44.79420411852564],[-0.6155031154014182,44.79421340900411],[-0.6155300811831919,44.794219758318505],[-0.615557985997172,44.7942229248549],[-0.6155863191564409,44.794222834767886],[-0.6156143230908581,44.794219512143265],[-0.6156411139730908,44.79421298508247],[-0.6156559924187647,44.79421016985492]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":21.738293701048324,"sectionId":"16775-27234","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.623379009221982,44.79408605511891],[-0.6233649326886178,44.79407344150927],[-0.6233291153729661,44.79405107091595],[-0.6232888920113646,44.79403307463359],[-0.6232450540560983,44.794019967940415],[-0.6231987547866544,44.7940119843381],[-0.6231514056468902,44.794009439186986],[-0.6231370346267664,44.79401025740016]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":35.836020355087975,"sectionId":"16775-16534","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6231370346267664,44.79401025740016],[-0.6231040167018932,44.79401230030511],[-0.6230579767963437,44.79402052344106],[-0.6230142903489584,44.794033986513604],[-0.6229741917014359,44.79405219977939],[-0.6229386683283478,44.79407477144728],[-0.6229088170250151,44.79410103599321],[-0.6228852351978004,44.79413043388792],[-0.6228685033105589,44.794162135888634],[-0.622859207481498,44.79419540265658],[-0.6228581922887556,44.794223541097814]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":53.91653228059629,"sectionId":"16775-15873","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6231370346267664,44.79401025740016],[-0.6232295293179418,44.79352932641312]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":35.836020355087975,"sectionId":"16534-16775","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6231370346267664,44.79401025740016],[-0.6231040167018932,44.79401230030511],[-0.6230579767963437,44.79402052344106],[-0.6230142903489584,44.794033986513604],[-0.6229741917014359,44.79405219977939],[-0.6229386683283478,44.79407477144728],[-0.6229088170250151,44.79410103599321],[-0.6228852351978004,44.79413043388792],[-0.6228685033105589,44.794162135888634],[-0.622859207481498,44.79419540265658],[-0.6228581922887556,44.794223541097814]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":101.05289008324817,"sectionId":"16534-31418","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6228581922887556,44.794223541097814],[-0.6220891500608492,44.794153541378215],[-0.6220459295387379,44.794154287438026],[-0.6220121544319436,44.794178514706246],[-0.6219157960357039,44.794463185128066]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":12.500964577807,"sectionId":"16534-27582","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6228581922887556,44.794223541097814],[-0.6228575381018047,44.79422923720932],[-0.6228634443436628,44.794262830412706],[-0.6228768697262494,44.79429528322983],[-0.6229018336977635,44.79433016103196]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":101.05289008324817,"sectionId":"31418-16534","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6228581922887556,44.794223541097814],[-0.6220891500608492,44.794153541378215],[-0.6220459295387379,44.794154287438026],[-0.6220121544319436,44.794178514706246],[-0.6219157960357039,44.794463185128066]]}},{"type":"Feature","properties":{"name":"Impasse Charles Gounod","distance":41.63586125268604,"sectionId":"19773-19772","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5868890728028368,44.797380961659904],[-0.5870244283657843,44.797018707197054]]}},{"type":"Feature","properties":{"name":"Rue François Rabelais","distance":120.21309939369743,"sectionId":"19940-19941","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5997444328869818,44.79781866557593],[-0.5996610459952546,44.79774554564548],[-0.599608677210136,44.79770720661802],[-0.5994247121537286,44.79757132962293],[-0.599229855218601,44.797443363996436],[-0.5990245244891643,44.797323927028145],[-0.5988108216087672,44.79721223149468],[-0.5986010282207422,44.79711248291793]]}},{"type":"Feature","properties":{"name":"Rue François Rabelais","distance":37.109170779093816,"sectionId":"19940-22866","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.600032246774405,44.798081784266614],[-0.5998714173251674,44.79791932188868],[-0.5997815792081415,44.7978502797926],[-0.5997444328869818,44.79781866557593]]}},{"type":"Feature","properties":{"name":"Rue Marivaux","distance":19.102047389788034,"sectionId":"19940-20186","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5997444328869818,44.79781866557593],[-0.5995584697456817,44.797928416799316]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":176.49113033809124,"sectionId":"16505-28446","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6177700580488659,44.80001150404143],[-0.6193161410168009,44.79906940487892],[-0.6194418446698561,44.798961628216425]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":6.299992852194525,"sectionId":"16505-16524","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6194418446698561,44.798961628216425],[-0.6193705422846755,44.79893633192673]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":145.42175609588054,"sectionId":"16505-16504","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6194418446698561,44.798961628216425],[-0.6195021725914712,44.798900793646354],[-0.6195449015210602,44.79884178032961],[-0.6195814077790118,44.798778370789044],[-0.61961484939489,44.798698393336664],[-0.6197865959542884,44.79802018370532],[-0.6198483445901574,44.797873183893095],[-0.6199814020393726,44.797727427460025]]}},{"type":"Feature","properties":{"name":"Avenue Pierre Corneille","distance":21.82811587098074,"sectionId":"16505-16752","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6196697256676994,44.79906661944379],[-0.6195925499988103,44.7990102512667],[-0.6194418446698561,44.798961628216425]]}},{"type":"Feature","properties":{"name":"Avenue Phenix Haut-Brion","distance":135.34790903844672,"sectionId":"16512-16926","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6132006267363936,44.80286043204193],[-0.6137206908151805,44.804021385254835]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":126.26779800757205,"sectionId":"16512-16511","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6132006267363936,44.80286043204193],[-0.6132796930719145,44.80283999364101],[-0.6135067955756608,44.802803321316375],[-0.6144130858114965,44.80273587784009],[-0.6146243232260284,44.80272871420799],[-0.6147790223180165,44.802748120007365]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":"Unknown","sectionId":"16512-as=125623","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6129673496982034,44.80292981987449],[-0.6132006267363936,44.80286043204193]]}},{"type":"Feature","properties":{"name":"Rue Francis Plante","distance":91.2380477848837,"sectionId":"16667-16666","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6174973955855689,44.811732712827244],[-0.6180171131666972,44.81246612657396]]}},{"type":"Feature","properties":{"name":"Rue Francis Plante","distance":116.10877413905617,"sectionId":"16667-16336","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6180171131666972,44.81246612657396],[-0.6186552030828344,44.813407648599856]]}},{"type":"Feature","properties":{"name":"Rue d'Alembert","distance":20.296610935157894,"sectionId":"19582-19583","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5839761420156613,44.795077165607054],[-0.584141209074514,44.795217084931785]]}},{"type":"Feature","properties":{"name":"Rue Edgar Degas","distance":12.689770872933028,"sectionId":"19582-20444","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5839761420156613,44.795077165607054],[-0.5840797735570805,44.794989943369195]]}},{"type":"Feature","properties":{"name":"Rue d'Alembert","distance":36.78571522459203,"sectionId":"19582-19581","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5836461685000797,44.794846686020186],[-0.5837668100483687,44.794906932276966],[-0.5839761420156613,44.795077165607054]]}},{"type":"Feature","properties":{"name":"Rue Edgar Degas","distance":12.689770872933028,"sectionId":"20444-19582","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5839761420156613,44.795077165607054],[-0.5840797735570805,44.794989943369195]]}},{"type":"Feature","properties":{"name":"Rue Edgar Degas","distance":96.15295971493049,"sectionId":"20444-20445","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5840797735570805,44.794989943369195],[-0.5844236606875618,44.79478281654653],[-0.584230838390085,44.79425543008137]]}},{"type":"Feature","properties":{"name":"Rue Edgar Degas","distance":94.19150816619624,"sectionId":"20444-20524","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5840797735570805,44.794989943369195],[-0.5838780242684416,44.79482568689926],[-0.5835818955947589,44.79467359260721],[-0.5837163456751022,44.79452450428282],[-0.5837273810790584,44.79445983817431],[-0.5836897762684092,44.794335179095135]]}},{"type":"Feature","properties":{"name":"Rue de Tremeuge","distance":43.64169499566597,"sectionId":"20387-20386","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5915990886301392,44.803357521495506],[-0.5910668377371494,44.803253624036394]]}},{"type":"Feature","properties":{"name":"Rue de Tremeuge","distance":44.46477251099298,"sectionId":"20387-59322","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5910668377371494,44.803253624036394],[-0.5905249464257029,44.80314674222542]]}},{"type":"Feature","properties":{"name":"Résidence Santillane","distance":95.57981284617065,"sectionId":"20387-59321","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5910668377371494,44.803253624036394],[-0.5907270103192183,44.804079438664374]]}},{"type":"Feature","properties":{"name":"Rue de Tremeuge","distance":44.46477251099298,"sectionId":"59322-20387","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5910668377371494,44.803253624036394],[-0.5905249464257029,44.80314674222542]]}},{"type":"Feature","properties":{"name":"Résidence Santillane","distance":79.60858858184373,"sectionId":"59322-59326","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5905249464257029,44.80314674222542],[-0.5904664136725409,44.80331388463563],[-0.5903815669251798,44.80351433914252],[-0.5902925021536,44.80364707653377],[-0.5902159882306977,44.80375343248929],[-0.590171096602116,44.80381403797354]]}},{"type":"Feature","properties":{"name":"Rue de Tremeuge","distance":30.101086637502526,"sectionId":"59322-as=3825","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5905249464257029,44.80314674222542],[-0.590157115142759,44.803076982358874]]}},{"type":"Feature","properties":{"name":"Avenue Louis Laugaa","distance":146.25108063773922,"sectionId":"34720-16375","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6290182849240853,44.80555840129723],[-0.6285684873881706,44.80572598444604],[-0.6284511748392223,44.80577103070341],[-0.6283504602057898,44.80581644832542],[-0.6282244937130259,44.8058787957062],[-0.6281343999061584,44.80593711544333],[-0.6279950443851617,44.80603338386267],[-0.6279020485950477,44.80612271271428],[-0.6276472320417161,44.80639863800813]]}},{"type":"Feature","properties":{"name":"Rue Nelson Mandela","distance":36.41247207116926,"sectionId":"34720-34718","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6292068035750316,44.805857500152804],[-0.6290182849240853,44.80555840129723]]}},{"type":"Feature","properties":{"name":"Avenue Louis Laugaa","distance":61.58570895446834,"sectionId":"34720-16750","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6297406522332688,44.805356804530206],[-0.6293759743209543,44.805437265972536],[-0.6292255265951838,44.805477559656374],[-0.6290182849240853,44.80555840129723]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":82.39900020453348,"sectionId":"38853-38854","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5929742433737365,44.803628480598185],[-0.5926887131867463,44.804341941868636]]}},{"type":"Feature","properties":{"name":"Rue Alfred Charlionnet","distance":5.392985913455869,"sectionId":"38853-19586","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5927545423625904,44.80435463593653],[-0.5926887131867463,44.804341941868636]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":123.49650665791592,"sectionId":"38853-38852","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5926887131867463,44.804341941868636],[-0.5925756756217709,44.8046214336666],[-0.5923629414503087,44.80515495263081],[-0.5922567476898352,44.805410420472995]]}},{"type":"Feature","properties":{"name":"Résidence Santillane","distance":137.47940041329522,"sectionId":"20474-20385","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5921218055751118,44.80346029306825],[-0.5917861784203291,44.80428523458168],[-0.5912725273716545,44.80418600579809]]}},{"type":"Feature","properties":{"name":"Résidence Santillane","distance":95.57564595829774,"sectionId":"20474-20386","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5915990886301392,44.803357521495506],[-0.5912725273716545,44.80418600579809]]}},{"type":"Feature","properties":{"name":"Rue Chateaubriand","distance":63.4453368256979,"sectionId":"54606-16376","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6264257207198175,44.80572872752301],[-0.6264898994294626,44.80581445866783],[-0.6265736345610354,44.80590495026556],[-0.6266235932582861,44.80595232858612],[-0.6266806804304974,44.80599557147015],[-0.6267695182097334,44.806053613885474],[-0.6269556598485034,44.80614553903033]]}},{"type":"Feature","properties":{"name":"Rue Chateaubriand","distance":15.744050367617387,"sectionId":"54606-54607","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6269556598485034,44.80614553903033],[-0.6271222134196999,44.80622321408799]]}},{"type":"Feature","properties":{"name":"Avenue des Facultes","distance":30.836226217949225,"sectionId":"53581-20401","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5996080759009443,44.806864276637434],[-0.5999683281837823,44.80675796006154]]}},{"type":"Feature","properties":{"name":"Avenue des Facultes","distance":82.36586228351959,"sectionId":"53581-53582","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5999683281837823,44.80675796006154],[-0.6009433766419726,44.80649702704205]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":37.66412317589656,"sectionId":"53586-23329","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.600171475528634,44.80630856983659],[-0.6002370989939261,44.80635639834469],[-0.6002826991601264,44.806417922566894],[-0.6003802276684883,44.80660833529063]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":10.054058286682851,"sectionId":"53586-53585","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6003802276684883,44.80660833529063],[-0.6004237858826246,44.806693377047004]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":77.51928063771237,"sectionId":"53585-26731","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6004237858826246,44.806693377047004],[-0.6006164642014908,44.80706955323045],[-0.6007358852897697,44.80735466712789]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":10.054058286682851,"sectionId":"53585-53586","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6003802276684883,44.80660833529063],[-0.6004237858826246,44.806693377047004]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":7.321943879012857,"sectionId":"629-20140","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5914292510220244,44.809221191179155],[-0.591431092111132,44.809155283153466]]}},{"type":"Feature","properties":{"name":"Voie 1 Faculté des Sciences","distance":52.21357424624937,"sectionId":"629-614","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5914292510220244,44.809221191179155],[-0.5918779057579182,44.80910838491132],[-0.591964754953042,44.809102939930625],[-0.5920620861449233,44.809101217559316]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":138.78422329076022,"sectionId":"629-23169","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5913453901569167,44.81046886122681],[-0.5913836861716776,44.810033457263316],[-0.5914137225703756,44.80976811846953],[-0.5914187093093916,44.80950897546958],[-0.5914292510220244,44.809221191179155]]}},{"type":"Feature","properties":{"name":"Esplanade du 8 Mai 1945","distance":27.816039719353128,"sectionId":"13306-13285","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5885482454810009,44.80883927887937],[-0.5881968501730691,44.80882730336783]]}},{"type":"Feature","properties":{"name":"Allée des Charmes","distance":50.288304042878806,"sectionId":"23429-34169","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5872243072582464,44.79794565051813],[-0.587323430036597,44.797871359204876],[-0.5873510577697331,44.79785787626137],[-0.5873858173825413,44.79784921292544],[-0.5874304460787433,44.79785275964089],[-0.5876443911271026,44.797887358198196],[-0.587796914409828,44.79791488591274]]}},{"type":"Feature","properties":{"name":"Allée des Charmes","distance":7.7465584094030095,"sectionId":"23429-23432","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5872243072582464,44.79794565051813],[-0.5871286171694389,44.797930742521565]]}},{"type":"Feature","properties":{"name":"Allée des Charmes","distance":9.605229852797715,"sectionId":"23429-23431","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5872243072582464,44.79794565051813],[-0.5873434046687883,44.79796261261956]]}},{"type":"Feature","properties":{"name":"Allée des Charmes","distance":7.7465584094030095,"sectionId":"23432-23429","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5872243072582464,44.79794565051813],[-0.5871286171694389,44.797930742521565]]}},{"type":"Feature","properties":{"name":"Avenue de la Paillère","distance":12.745380366165517,"sectionId":"25669-15961","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6095368093002356,44.79629306465444],[-0.6095466807126192,44.796278968639925],[-0.6095582185245817,44.79626319823893],[-0.6095648681782163,44.79624614166186],[-0.6095662902799633,44.79622844026168],[-0.6095644165390834,44.79621669886626],[-0.6095572807265902,44.796199719513616],[-0.6095480015968218,44.796184880097506]]}},{"type":"Feature","properties":{"name":"Avenue de la Paillère","distance":12.843042317034536,"sectionId":"25669-25670","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6095480015968218,44.796184880097506],[-0.6095292750744494,44.7961707008747],[-0.6095022319277369,44.79615705586726],[-0.6094791801326748,44.79615058088907],[-0.6094628380449446,44.79614821692646],[-0.6094297058440028,44.79614845777674],[-0.609403328369066,44.796153528874584]]}},{"type":"Feature","properties":{"name":"Avenue de Bardanac","distance":147.95723988887255,"sectionId":"25669-16015","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6108716764102907,44.79524851413376],[-0.6096484377248717,44.79614619948864],[-0.6095480015968218,44.796184880097506]]}},{"type":"Feature","properties":{"name":"Avenue de la Paillère","distance":9.825561916494804,"sectionId":"25670-25672","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.609403328369066,44.796153528874584],[-0.6093834161277263,44.7961608270074],[-0.6093700640590616,44.79616782684239],[-0.6093529054355558,44.796180712798815],[-0.6093399336354504,44.796195808026695],[-0.6093339169534729,44.796206808941946],[-0.6093296767989641,44.79621991546355]]}},{"type":"Feature","properties":{"name":"Avenue de la Paillère","distance":12.843042317034536,"sectionId":"25670-25669","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6095480015968218,44.796184880097506],[-0.6095292750744494,44.7961707008747],[-0.6095022319277369,44.79615705586726],[-0.6094791801326748,44.79615058088907],[-0.6094628380449446,44.79614821692646],[-0.6094297058440028,44.79614845777674],[-0.609403328369066,44.796153528874584]]}},{"type":"Feature","properties":{"name":"Avenue de la Paillère","distance":24.238915016940897,"sectionId":"25670-as=125296","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.609403328369066,44.796153528874584],[-0.6092786299538921,44.796134065045536],[-0.6091022239964791,44.79611317928631],[-0.6091022239964791,44.79611317928631]]}},{"type":"Feature","properties":{"name":"Avenue de Candau","distance":268.5383370203862,"sectionId":"16229-16228","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6137095978648442,44.80830933152997],[-0.6114962642955332,44.80822504568887],[-0.6112784149081802,44.808223944986764],[-0.6110810559583879,44.80826309100258],[-0.6107818220617072,44.80833645919468],[-0.6105426687780775,44.80842152201208],[-0.6103927881971604,44.80848330192842]]}},{"type":"Feature","properties":{"name":"Rue du Commandant Lherminier","distance":111.6488920733292,"sectionId":"16229-16439","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6103927881971604,44.80848330192842],[-0.6104009582614842,44.80865212817006],[-0.6103893260190918,44.808692430744564],[-0.6103622018364905,44.80873037918835],[-0.6102890319554364,44.80879797624914],[-0.6101726011162947,44.80885967594491],[-0.6099720337619824,44.80893797220357],[-0.6098690905866834,44.80899961294748],[-0.6097957832122104,44.80904765806693],[-0.6097616398032111,44.80909269234211],[-0.6097235135079464,44.809151149960485],[-0.6096602097524809,44.80926099606958]]}},{"type":"Feature","properties":{"name":"Avenue de Candau","distance":160.6587988033094,"sectionId":"16229-as=125337","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6103927881971604,44.80848330192842],[-0.6101947110652945,44.80847463514907],[-0.6096048369498852,44.808500021867175],[-0.6089962798175784,44.80852816028714],[-0.60836880541367,44.808585631956106],[-0.60836880541367,44.808585631956106]]}},{"type":"Feature","properties":{"name":"Avenue Colonel Robert Jacqui","distance":150.85633094260237,"sectionId":"16432-24367","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.630105762234423,44.8111767311133],[-0.6302392559181363,44.81128696741555],[-0.6303439092502123,44.8113773146495],[-0.630389883473615,44.81139998984562],[-0.6304396422063093,44.811414436693155],[-0.6304983166058676,44.81142175259234],[-0.6305429279038695,44.8114207791762],[-0.6314140812463336,44.81133198471517],[-0.6317246189851098,44.811299549583595],[-0.6318455929708662,44.81126325695497]]}},{"type":"Feature","properties":{"name":"Avenue Colonel Robert Jacqui","distance":19.692088481499226,"sectionId":"16432-16433","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6318455929708662,44.81126325695497],[-0.6320923791784995,44.81123934229949]]}},{"type":"Feature","properties":{"name":"Avenue Colonel Robert Jacqui","distance":145.91589373373117,"sectionId":"16432-27893","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6318455929708662,44.81126325695497],[-0.6317249917245114,44.8112592701739],[-0.6305172785593685,44.81138124024923],[-0.6304681540560341,44.811376862585156],[-0.6304263407523278,44.811361981999944],[-0.6303972042151998,44.81134543564304],[-0.63033557803451,44.811293262062975],[-0.6301628211966482,44.811140317985114]]}},{"type":"Feature","properties":{"name":"Rue du Professeur Esclangon","distance":242.236007409941,"sectionId":"16439-16440","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6082974034579984,44.8099233740803],[-0.6083296572291402,44.80994334021627],[-0.6083542670853637,44.809970575280886],[-0.6085033352425838,44.81021510544721],[-0.6085478765069215,44.810251437121984],[-0.6086281463910928,44.810274293978075],[-0.6087086123223199,44.81027804701107],[-0.6096690928376816,44.810170730948805],[-0.609762277969697,44.810129038191626],[-0.6098173368340993,44.810094861093866],[-0.609868930302305,44.810035660831055],[-0.6098806053932724,44.80997556539293],[-0.6096602097524809,44.80926099606958]]}},{"type":"Feature","properties":{"name":"Rue du Commandant Lherminier","distance":111.6488920733292,"sectionId":"16439-16229","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6103927881971604,44.80848330192842],[-0.6104009582614842,44.80865212817006],[-0.6103893260190918,44.808692430744564],[-0.6103622018364905,44.80873037918835],[-0.6102890319554364,44.80879797624914],[-0.6101726011162947,44.80885967594491],[-0.6099720337619824,44.80893797220357],[-0.6098690905866834,44.80899961294748],[-0.6097957832122104,44.80904765806693],[-0.6097616398032111,44.80909269234211],[-0.6097235135079464,44.809151149960485],[-0.6096602097524809,44.80926099606958]]}},{"type":"Feature","properties":{"name":"Rue du Commandant Lherminier","distance":29.506889440246052,"sectionId":"16439-as=128481","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6096602097524809,44.80926099606958],[-0.6093492987111485,44.80940792618887]]}},{"type":"Feature","properties":{"name":"Rue du Commandant Lherminier","distance":79.44169384378566,"sectionId":"22793-36352","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6091806218940967,44.80948763867637],[-0.6087107356451487,44.80971568292245],[-0.608524361484987,44.80981113784823],[-0.6084380319378276,44.80983297405924],[-0.608323235867677,44.80983473148223]]}},{"type":"Feature","properties":{"name":"Place du Commandant Lherminier","distance":48.6920573569077,"sectionId":"22793-22795","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6091806218940967,44.80948763867637],[-0.6090221208081995,44.80924809294352],[-0.6090463583577566,44.80907535584115]]}},{"type":"Feature","properties":{"name":"Rue du Commandant Lherminier","distance":29.506889440246052,"sectionId":"22793-as=128481","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6093492987111485,44.80940792618887],[-0.6091806218940967,44.80948763867637]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":11.854013157901797,"sectionId":"23169-20139","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5913855063098329,44.810568396335654],[-0.5913875190001728,44.81054383050787],[-0.591381533154683,44.81051681475529],[-0.5913672956651731,44.81049141075643],[-0.5913453901569167,44.81046886122681]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":6.9384110597453885,"sectionId":"23169-23170","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5913453901569167,44.81046886122681],[-0.591317031740075,44.81045038894703],[-0.5912835394086535,44.81043685308885],[-0.591273267525887,44.81043447493098]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":138.78422329076022,"sectionId":"23169-629","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5913453901569167,44.81046886122681],[-0.5913836861716776,44.810033457263316],[-0.5914137225703756,44.80976811846953],[-0.5914187093093916,44.80950897546958],[-0.5914292510220244,44.809221191179155]]}},{"type":"Feature","properties":{"name":"Avenue des Deux Ponts","distance":95.17811794039058,"sectionId":"16490-16343","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6221211395213243,44.801523791125014],[-0.6209176256124728,44.80151418988168]]}},{"type":"Feature","properties":{"name":"Avenue de la Source","distance":127.66600414386548,"sectionId":"16490-15939","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6221211395213243,44.801523791125014],[-0.6221299012503636,44.80037440640367]]}},{"type":"Feature","properties":{"name":"Avenue des Deux Ponts","distance":112.74533439743833,"sectionId":"16490-16489","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6235468187345438,44.80153305782432],[-0.6221211395213243,44.801523791125014]]}},{"type":"Feature","properties":{"name":"Rue de Chenevière","distance":50.27994616459696,"sectionId":"16005-16165","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6285498687749147,44.80061567178153],[-0.6286027052433694,44.800164557580324]]}},{"type":"Feature","properties":{"name":"Avenue Azam","distance":96.62610137949541,"sectionId":"16005-16004","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6297668851998197,44.80069322459682],[-0.6285498687749147,44.80061567178153]]}},{"type":"Feature","properties":{"name":"Rue de Chenevière","distance":58.09403963222864,"sectionId":"16005-16340","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.628473035099161,44.801135835085994],[-0.6285498687749147,44.80061567178153]]}},{"type":"Feature","properties":{"name":"Résidence Clément Thomas","distance":97.41550465537406,"sectionId":"19798-19864","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5807791026423318,44.8020140742784],[-0.5808780202711453,44.80204420000512],[-0.5811193211162401,44.802168661960984],[-0.5818440451069568,44.802451306972245]]}},{"type":"Feature","properties":{"name":"Rue Clément Thomas","distance":68.72812654131779,"sectionId":"19798-19611","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5807791026423318,44.8020140742784],[-0.5809830269145462,44.80141257539398]]}},{"type":"Feature","properties":{"name":"Rue Clément Thomas","distance":79.83801410528439,"sectionId":"19798-19797","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5806009916716915,44.80272159659935],[-0.5807228930412999,44.802233570901166],[-0.5807791026423318,44.8020140742784]]}},{"type":"Feature","properties":{"name":"Rue Michel Montaigne","distance":26.543259259799758,"sectionId":"19611-20223","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5813093901470782,44.80146841891647],[-0.5809830269145462,44.80141257539398]]}},{"type":"Feature","properties":{"name":"Rue Clément Thomas","distance":68.72812654131779,"sectionId":"19611-19798","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5807791026423318,44.8020140742784],[-0.5809830269145462,44.80141257539398]]}},{"type":"Feature","properties":{"name":"Rue Clément Thomas","distance":52.772397785416814,"sectionId":"19611-19799","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5809830269145462,44.80141257539398],[-0.5811691452983703,44.80095630755851]]}},{"type":"Feature","properties":{"name":"Rue Clément Thomas","distance":270.12961887838844,"sectionId":"19799-48660","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5811691452983703,44.80095630755851],[-0.5812278188338076,44.80071745555957],[-0.5813280798233417,44.80021524677312],[-0.5814058414903404,44.80008001787614],[-0.5818333323795117,44.799525615444004],[-0.5826554480804653,44.79883708007676]]}},{"type":"Feature","properties":{"name":"Rue Clément Thomas","distance":52.772397785416814,"sectionId":"19799-19611","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5809830269145462,44.80141257539398],[-0.5811691452983703,44.80095630755851]]}},{"type":"Feature","properties":{"name":"Rond-point Crespy","distance":18.32348562710419,"sectionId":"58724-19816","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5859312438765092,44.80662709269295],[-0.5859313826052069,44.80662698477916],[-0.5859627641181854,44.80661152830284],[-0.5859981865173716,44.80660143039401],[-0.5860358718281484,44.80659719751367],[-0.5860739352224983,44.806599042222686],[-0.5861104728531408,44.806606871409166],[-0.5861456236711587,44.80662154869525]]}},{"type":"Feature","properties":{"name":"Rue Frédéric Sevene","distance":80.33783118491654,"sectionId":"58724-19683","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5850986212444692,44.80621552009868],[-0.5856885106011497,44.80648770921924],[-0.5858690067682033,44.80658001760952],[-0.5859312438765092,44.80662709269295]]}},{"type":"Feature","properties":{"name":"Rond-point Crespy","distance":13.684651915372697,"sectionId":"58724-19814","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5858764711911255,44.80673826182572],[-0.5858731840266255,44.80672374765225],[-0.5858757748189329,44.80669664146815],[-0.5858867725761041,44.80667063047827],[-0.5859056258139903,44.80664702023356],[-0.5859312438765092,44.80662709269295]]}},{"type":"Feature","properties":{"name":"Rue Georges Pompidou","distance":300.45778553688336,"sectionId":"17231-30758","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6314303730376181,44.80188679333691],[-0.6317942235850258,44.80183175458292],[-0.6318613026678508,44.80181195605702],[-0.6319174453304689,44.8017812462328],[-0.6319441479387236,44.80174517065194],[-0.6319605095374122,44.80171365924802],[-0.6319516566111693,44.801607282476205],[-0.6319660973756419,44.801573400142665],[-0.632006852774727,44.801541470054566],[-0.6326379737337389,44.801436904643296],[-0.6327094448633475,44.801428586152106],[-0.6327626334814607,44.80142931949511],[-0.633370389361369,44.80141179682576],[-0.633410583765787,44.80141916079589],[-0.6334535441094192,44.80143427370291],[-0.6334762915225891,44.80145390597681],[-0.6334876053757905,44.801480840003684],[-0.633551475932883,44.80202443885787],[-0.63357142696817,44.80205992517739],[-0.6336094064987315,44.802102402569886],[-0.6337264819578062,44.802205321666236],[-0.6339034211751292,44.802374701785695]]}},{"type":"Feature","properties":{"name":"Avenue Roger Chaumet","distance":207.21630953462147,"sectionId":"17231-17297","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.631872080810827,44.80354356705513],[-0.6319944365127904,44.80350335597874],[-0.63209749388263,44.8034641213908],[-0.6324070040624621,44.80326343884925],[-0.632587308411469,44.80313282373228],[-0.6336087762934078,44.80254608690036],[-0.6339034211751292,44.802374701785695]]}},{"type":"Feature","properties":{"name":"Avenue Pierre Wiehn","distance":48.848733177817294,"sectionId":"17161-16003","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6312700013020841,44.80121295081171],[-0.6311618754544944,44.800779946141475]]}},{"type":"Feature","properties":{"name":"Avenue Pierre Wiehn","distance":52.010928852695656,"sectionId":"17161-25409","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6313066635366836,44.801680487252156],[-0.6312700013020841,44.80121295081171]]}},{"type":"Feature","properties":{"name":"Avenue Montaigne","distance":229.1381039179972,"sectionId":"17161-17162","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6312700013020841,44.80121295081171],[-0.6329148018499081,44.80098484856403],[-0.6330841604695993,44.80089349833166],[-0.6331554289449359,44.80075348306539],[-0.6330550263178062,44.80018825982236]]}},{"type":"Feature","properties":{"name":"Avenue Pierre Wiehn","distance":15.531237812456,"sectionId":"17297-30757","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.631872080810827,44.80354356705513],[-0.6317138802751466,44.803460696747564]]}},{"type":"Feature","properties":{"name":"Avenue Roger Chaumet","distance":207.21630953462147,"sectionId":"17297-17231","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.631872080810827,44.80354356705513],[-0.6319944365127904,44.80350335597874],[-0.63209749388263,44.8034641213908],[-0.6324070040624621,44.80326343884925],[-0.632587308411469,44.80313282373228],[-0.6336087762934078,44.80254608690036],[-0.6339034211751292,44.802374701785695]]}},{"type":"Feature","properties":{"name":"Avenue Roger Chaumet","distance":10.179800880491051,"sectionId":"17297-as=3835","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.631872080810827,44.80354356705513],[-0.631872080810827,44.80354356705513]]}},{"type":"Feature","properties":{"name":"Rue des Poilus","distance":66.42579061494557,"sectionId":"17303-16714","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.63286743820531,44.80497780590039],[-0.633645900316175,44.804753042016685]]}},{"type":"Feature","properties":{"name":"Rue de Carles","distance":110.83360288201442,"sectionId":"16261-16260","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6180778051564332,44.81154192413539],[-0.6175045797927119,44.81063130724919]]}},{"type":"Feature","properties":{"name":"Rue du Chêne Vert","distance":84.66684574732206,"sectionId":"16261-16019","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6175045797927119,44.81063130724919],[-0.6184989583193068,44.81034843710847]]}},{"type":"Feature","properties":{"name":"Rue du Chêne Vert","distance":144.56465982821655,"sectionId":"16261-19846","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6175045797927119,44.81063130724919],[-0.6160376727461415,44.81109395275266],[-0.6158251967616085,44.81114439730288]]}},{"type":"Feature","properties":{"name":"Place Chambrelent","distance":26.563748172572964,"sectionId":"16294-16291","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6157785186711434,44.80542352907227],[-0.6157824111233696,44.805433134314846],[-0.6157974823048867,44.805455536328],[-0.6158173545638234,44.805475803881514],[-0.6158415058467568,44.805493683320215],[-0.6158695121804675,44.80550846745477],[-0.6159003463623518,44.80551991868744],[-0.6159334750486757,44.80552760355621],[-0.6159678823114828,44.80553146427341],[-0.6160026728643501,44.80553134913436],[-0.6160451960339756,44.80552540298936]]}},{"type":"Feature","properties":{"name":"Place Chambrelent","distance":26.410343565176614,"sectionId":"16294-16293","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.615914663117892,44.80523173783854],[-0.6158830300495386,44.805241841893476],[-0.6158536261824958,44.80525520814961],[-0.6158277087252438,44.805271706556645],[-0.6158057602588184,44.805290961444776],[-0.615788510297553,44.805312499206494],[-0.6157762982267275,44.80533567847554],[-0.6157694690720027,44.80535994778347],[-0.6157682415733241,44.80538475968095],[-0.615772570626146,44.80540939493484],[-0.6157785186711434,44.80542352907227]]}},{"type":"Feature","properties":{"name":"Avenue du Rond Point","distance":15.668589679459423,"sectionId":"16294-as=124624","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6157785186711434,44.80542352907227],[-0.6155903790794491,44.80546780660766]]}},{"type":"Feature","properties":{"name":"Avenue Pey Berland","distance":250.36012429637316,"sectionId":"17007-17280","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6124529785310876,44.80122124830705],[-0.6123028988161515,44.801027111820794],[-0.61214151397942,44.80090495024424],[-0.6119314358582492,44.800787127481435],[-0.6116782422348132,44.800694005068],[-0.611404100780211,44.80064821030148],[-0.6110793868824909,44.80065149438209],[-0.6099727350021602,44.800784006281695],[-0.60963791548459,44.800817874852086]]}},{"type":"Feature","properties":{"name":"Allée de la Boétie","distance":170.073447997066,"sectionId":"17007-17008","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6124529785310876,44.80122124830705],[-0.6136317936961506,44.80089355155994],[-0.6136891609441237,44.80084389463964],[-0.6136993430699275,44.8007842964138],[-0.6134612050310447,44.800307666080954]]}},{"type":"Feature","properties":{"name":"Avenue Pey Berland","distance":185.8576723025923,"sectionId":"17007-16529","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6131457210272049,44.80282019760035],[-0.6125998138991972,44.801573583455145],[-0.6124529785310876,44.80122124830705]]}},{"type":"Feature","properties":{"name":"Avenue Raymond Boivin","distance":139.10239640167063,"sectionId":"17288-16770","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6255429995479178,44.80249765613825],[-0.6237854723855056,44.80244520763538]]}},{"type":"Feature","properties":{"name":"Avenue Pierre Corneille","distance":99.65012386027917,"sectionId":"17288-16653","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6237420017448931,44.80334184354475],[-0.6237854723855056,44.80244520763538]]}},{"type":"Feature","properties":{"name":"Avenue Raymond Boivin","distance":238.172381560311,"sectionId":"17288-16342","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6237854723855056,44.80244520763538],[-0.6223787240079985,44.8023952530901],[-0.6218535242761636,44.802397746195254],[-0.6207756796871756,44.802417021304976]]}},{"type":"Feature","properties":{"name":"Avenue Pierre Corneille","distance":28.891734789861058,"sectionId":"17288-as=3903","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6237854723855056,44.80244520763538],[-0.6237185655562585,44.80218948838196]]}},{"type":"Feature","properties":{"name":"Allée Pierre de Coubertin","distance":73.34893495666715,"sectionId":"17289-17283","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6067595134788911,44.80015574212107],[-0.6064220529332797,44.800236347919316],[-0.605885215623023,44.800376062741314]]}},{"type":"Feature","properties":{"name":"Allée Pierre de Coubertin","distance":588.0367225947772,"sectionId":"17289-20035","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.605885215623023,44.800376062741314],[-0.6056357485057866,44.800445498507415],[-0.6024543102625495,44.80131886466178],[-0.6020799340283943,44.80141837272509],[-0.6017307026211157,44.80151735346658],[-0.6013436960531953,44.801617259009255],[-0.6005203244586219,44.80184529300874],[-0.5999089678915647,44.80201391208004],[-0.5992047248805338,44.802551201774975]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":18.703529675161523,"sectionId":"16509-16508","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.615239654429878,44.802825724109816],[-0.6152738974569812,44.802800763587854],[-0.6153002569799403,44.80277317098744],[-0.6153202539984124,44.80274298804989],[-0.6153330440311194,44.80271087220388],[-0.6153385571934318,44.80267772650684]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":19.180002768736834,"sectionId":"16509-16510","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6150150402426817,44.802875833309585],[-0.6150252384660432,44.80287704057554],[-0.6150720465516963,44.802876904026824],[-0.6151183957190242,44.802871467139155],[-0.6151627649602274,44.80286068817538],[-0.615204172218471,44.802845048769846],[-0.615239654429878,44.802825724109816]]}},{"type":"Feature","properties":{"name":"Avenue Marc Desbats","distance":110.2466275822656,"sectionId":"16509-16185","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.615239654429878,44.802825724109816],[-0.6153253922776348,44.802909658776635],[-0.6154169921340998,44.802982146643814],[-0.6155701253983191,44.803037093951346],[-0.6161896625291661,44.80318089852451],[-0.616276575552105,44.8032008360743],[-0.6163431484066114,44.80321925830456],[-0.6164543226763436,44.803260855030295]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Nancel Pénard","distance":64.33912267051146,"sectionId":"16538-16537","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6222925693597104,44.810466415289795],[-0.6230681813424483,44.8102911840886]]}},{"type":"Feature","properties":{"name":"Avenue Maurice Faye","distance":211.27948704539767,"sectionId":"16538-16939","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6230681813424483,44.8102911840886],[-0.6238502063826362,44.812110102232744]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Nancel Pénard","distance":21.17503637001509,"sectionId":"16538-as=126172","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6230681813424483,44.8102911840886],[-0.6233231538386813,44.8102328589191]]}},{"type":"Feature","properties":{"name":"Place du Commandant Lherminier","distance":48.6920573569077,"sectionId":"22795-22793","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6091806218940967,44.80948763867637],[-0.6090221208081995,44.80924809294352],[-0.6090463583577566,44.80907535584115]]}},{"type":"Feature","properties":{"name":"Rue du Général Chanzy","distance":168.97657599105867,"sectionId":"19992-19996","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5867477686237127,44.800852667230565],[-0.5862241014385443,44.80232760458696]]}},{"type":"Feature","properties":{"name":"Rue du Général Bordas","distance":76.68431550718005,"sectionId":"19992-19991","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5877041787751051,44.80096663185932],[-0.5867477686237127,44.800852667230565]]}},{"type":"Feature","properties":{"name":"Rue du Général Bordas","distance":59.95195591522515,"sectionId":"19992-19993","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5867477686237127,44.800852667230565],[-0.58600702822517,44.8007377500221]]}},{"type":"Feature","properties":{"name":"Rue du Général Chanzy","distance":"Unknown","sectionId":"19992-as=124551","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5873847952942227,44.79908733010081],[-0.5867477686237127,44.800852667230565]]}},{"type":"Feature","properties":{"name":"Rue Léon Jouhaux","distance":131.01751669840388,"sectionId":"20127-20061","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5813456481642605,44.795235165102824],[-0.5814070565054914,44.79515449987575],[-0.5814590044536805,44.79513538803406],[-0.5815268367652134,44.7951337021418],[-0.5816037171448818,44.79510659847528],[-0.5823002342521046,44.79475135758907],[-0.5823949811105213,44.79467585719096],[-0.5825727753321275,44.79448928213151]]}},{"type":"Feature","properties":{"name":"Avenue Jean Cordier","distance":175.90692936225122,"sectionId":"30970-16540","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6254496151827686,44.810692299541095],[-0.6266777308436225,44.80959944136287],[-0.6268000100219724,44.80943708538574]]}},{"type":"Feature","properties":{"name":"Place du Souvenir Français","distance":38.58184277534855,"sectionId":"30970-30971","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6254496151827686,44.810692299541095],[-0.6255984636296466,44.81088384750102],[-0.6254341233497007,44.81093691986639]]}},{"type":"Feature","properties":{"name":"Avenue Jean Cordier","distance":83.87520296489441,"sectionId":"30970-as=126161","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6252858666250618,44.810838008755574],[-0.6254496151827686,44.810692299541095]]}},{"type":"Feature","properties":{"name":"Place du Souvenir Français","distance":38.58184277534855,"sectionId":"30971-30970","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6254496151827686,44.810692299541095],[-0.6255984636296466,44.81088384750102],[-0.6254341233497007,44.81093691986639]]}},{"type":"Feature","properties":{"name":"Avenue de Saige","distance":115.7390503043501,"sectionId":"15932-24278","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6306944067410274,44.79700575772121],[-0.630562884029604,44.795967954910736]]}},{"type":"Feature","properties":{"name":"Avenue de Saige","distance":157.77958299762128,"sectionId":"15932-17403","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.630562884029604,44.795967954910736],[-0.6304475859348369,44.79508728104028],[-0.6303931736083461,44.79455265789623]]}},{"type":"Feature","properties":{"name":"Rond-point de la Médaille Militaire","distance":16.74557718950475,"sectionId":"26549-30099","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6309071398690205,44.7941820380093],[-0.6310172467659032,44.794148524309634],[-0.6310433213428046,44.794138683327134],[-0.6310669363967286,44.79412594809952],[-0.6310904512217805,44.79410961270501]]}},{"type":"Feature","properties":{"name":"Avenue du Maréchal Lyautey","distance":26.613009807414038,"sectionId":"26549-26552","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6310904512217805,44.79410961270501],[-0.631252066276045,44.79413463019979],[-0.6314170497640901,44.79416692679618]]}},{"type":"Feature","properties":{"name":"Rond-point de la Médaille Militaire","distance":12.608815266022384,"sectionId":"26549-23693","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6310904512217805,44.79410961270501],[-0.6311039745522418,44.794093326093915],[-0.6311165647959391,44.79407427667028],[-0.6311246510243362,44.79405401980375],[-0.6311281409546257,44.794033098946954],[-0.6311268160436277,44.79401206158276],[-0.6311241504282005,44.7940018771171]]}},{"type":"Feature","properties":{"name":"Rond-point de la Médaille Militaire","distance":12.608815266022384,"sectionId":"23693-26549","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6310904512217805,44.79410961270501],[-0.6311039745522418,44.794093326093915],[-0.6311165647959391,44.79407427667028],[-0.6311246510243362,44.79405401980375],[-0.6311281409546257,44.794033098946954],[-0.6311268160436277,44.79401206158276],[-0.6311241504282005,44.7940018771171]]}},{"type":"Feature","properties":{"name":"Rond-point de la Médaille Militaire","distance":8.217273546333542,"sectionId":"23693-17128","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6311241504282005,44.7940018771171],[-0.6311207102705464,44.79399144713084],[-0.63111011012968,44.793971786946905],[-0.6311077542307001,44.79396852906377],[-0.6310951758557466,44.79395361641694],[-0.6310763088773275,44.79393728305864]]}},{"type":"Feature","properties":{"name":"Résidence Crespy I","distance":28.29673249588687,"sectionId":"22371-20477","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5890468881739451,44.804019571503474],[-0.5889352992729378,44.80426162947189]]}},{"type":"Feature","properties":{"name":"Résidence Crespy I","distance":81.98339124553628,"sectionId":"22371-8849","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5890468881739451,44.804019571503474],[-0.5892255924368786,44.80407509786336],[-0.589012285757549,44.80452061776749],[-0.5888401723316949,44.80448154821921]]}},{"type":"Feature","properties":{"name":"Résidence Crespy I","distance":27.212061090518603,"sectionId":"22371-22367","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5891628548496484,44.80378890572265],[-0.5890468881739451,44.804019571503474]]}},{"type":"Feature","properties":{"name":"Esplanade du 8 Mai 1945","distance":13.158386226861902,"sectionId":"20315-20482","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5883272668548667,44.808966779621706],[-0.5881797231688719,44.80891198002606]]}},{"type":"Feature","properties":{"name":"Rue du Professeur Arnozan","distance":9.652703947999425,"sectionId":"20315-13285","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5881797231688719,44.80891198002606],[-0.5881961450309104,44.80887696067266],[-0.5882001763737262,44.808840080136335],[-0.5881968501730691,44.80882730336783]]}},{"type":"Feature","properties":{"name":"Rue du Professeur Arnozan","distance":31.73240214800459,"sectionId":"20315-20313","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5878411980233785,44.808960402602814],[-0.5878699478536283,44.80897706171185],[-0.5879169880987768,44.80899278355843],[-0.5879680545444791,44.80900000078214],[-0.5880199618127187,44.8089983634471],[-0.5880699313891591,44.80898795919719],[-0.5881148338577947,44.808969337159716],[-0.5881522048686085,44.808943565977096],[-0.5881797231688719,44.80891198002606]]}},{"type":"Feature","properties":{"name":"Avenue de Bardanac","distance":123.78916336200672,"sectionId":"16015-16014","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6119745595212183,44.79445778236543],[-0.6118649377906765,44.7945416183104],[-0.6108716764102907,44.79524851413376]]}},{"type":"Feature","properties":{"name":"Rue de Compostelle","distance":100.26459479246871,"sectionId":"16015-17773","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6105819573232397,44.79443030040655],[-0.6106522588520107,44.794478154455625],[-0.6107679436214124,44.79457393297544],[-0.6108433791667772,44.79465729678706],[-0.6109014663267107,44.79474040067302],[-0.610927642188038,44.79482100458504],[-0.6109431460304375,44.794894830803685],[-0.6109314692934735,44.79500735497405],[-0.6109058110921812,44.79512086359016],[-0.6108716764102907,44.79524851413376]]}},{"type":"Feature","properties":{"name":"Avenue de Bardanac","distance":147.95723988887255,"sectionId":"16015-25669","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6108716764102907,44.79524851413376],[-0.6096484377248717,44.79614619948864],[-0.6095480015968218,44.796184880097506]]}},{"type":"Feature","properties":{"name":"Avenue Roger Chaumet","distance":54.94334749047144,"sectionId":"32755-24285","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6311606805048848,44.804346679159686],[-0.6315243641467698,44.80392518549436]]}},{"type":"Feature","properties":{"name":"Avenue Georges Lasserre","distance":40.2740626116692,"sectionId":"20041-20043","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5889610944976797,44.80472886989087],[-0.5886542831473074,44.80465369256098],[-0.5885823663057871,44.80463601009954],[-0.5885264449924408,44.80462131677126],[-0.5884806678820967,44.80460857465829]]}},{"type":"Feature","properties":{"name":"Résidence Crespy II","distance":202.79712116928295,"sectionId":"20041-20479","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5889610944976797,44.80472886989087],[-0.5886829980587841,44.80541417034074],[-0.5876994344868887,44.805222967194084],[-0.5878582517449966,44.804853216293985]]}},{"type":"Feature","properties":{"name":"Avenue Georges Lasserre","distance":76.66029991695004,"sectionId":"20041-20040","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5898878302914718,44.80493116959223],[-0.5892744946297488,44.80480337757599],[-0.5889610944976797,44.80472886989087]]}},{"type":"Feature","properties":{"name":"Impasse des Mésanges","distance":8.469857553105458,"sectionId":"20218-20216","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5829114531768446,44.796488604084416],[-0.5828373192713951,44.7965436374562]]}},{"type":"Feature","properties":{"name":"Rue du Professeur Jeanneney","distance":20.906589058547613,"sectionId":"20220-25679","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5821407023838101,44.80162375322326],[-0.5823120971842611,44.801480439965296]]}},{"type":"Feature","properties":{"name":"Rue Michel Montaigne","distance":11.739405561386475,"sectionId":"20220-20221","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5821407023838101,44.80162375322326],[-0.581996432624606,44.80159884038343]]}},{"type":"Feature","properties":{"name":"Rue Michel Montaigne","distance":24.256966734887612,"sectionId":"20220-19867","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5824356880312024,44.80168364462371],[-0.5821407023838101,44.80162375322326]]}},{"type":"Feature","properties":{"name":"Avenue de Villemejan","distance":256.5698737182701,"sectionId":"23216-25671","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6093915158581251,44.79630839606761],[-0.6089633352782533,44.79677248997531],[-0.6086748268046032,44.79707693717378],[-0.6084836211205795,44.79728253800702],[-0.6084264316418591,44.797326961844696],[-0.6083631987544722,44.797375901382935],[-0.6077348722450214,44.798054701993905],[-0.6075668450194411,44.79821632599034]]}},{"type":"Feature","properties":{"name":"Avenue de Villemejan","distance":23.52851409841158,"sectionId":"23216-20356","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6075668450194411,44.79821632599034],[-0.6075071420906382,44.79831361758771],[-0.6074446916455576,44.798409464890945]]}},{"type":"Feature","properties":{"name":"Allée des Jacquets","distance":80.56847817354829,"sectionId":"23216-30029","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6075668450194411,44.79821632599034],[-0.6082861705142739,44.79856086345614],[-0.6083205954746773,44.798666159103746]]}},{"type":"Feature","properties":{"name":"Avenue de Villemejan","distance":48.043998598457335,"sectionId":"20356-19965","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6074446916455576,44.798409464890945],[-0.6071072432096107,44.79876914928914]]}},{"type":"Feature","properties":{"name":"Avenue de Villemejan","distance":23.52851409841158,"sectionId":"20356-23216","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6075668450194411,44.79821632599034],[-0.6075071420906382,44.79831361758771],[-0.6074446916455576,44.798409464890945]]}},{"type":"Feature","properties":{"name":"Rue Montesquieu","distance":23.647978505696972,"sectionId":"59308-20228","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5849821415010599,44.80208259314067],[-0.5850189161934375,44.80204472854534],[-0.5850568615214399,44.80200993198804],[-0.585098889213611,44.80197770918335],[-0.5851729305762308,44.80191907417385]]}},{"type":"Feature","properties":{"name":"Rue Chambrelant","distance":101.32596230019917,"sectionId":"19763-19680","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5853168094815572,44.808167198079275],[-0.5841417671664542,44.80780318649656]]}},{"type":"Feature","properties":{"name":"Rue Peydavant","distance":43.33023570246905,"sectionId":"19763-19598","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5850959289495298,44.808524217323345],[-0.5853168094815572,44.808167198079275]]}},{"type":"Feature","properties":{"name":"Rue Peydavant","distance":60.708740988852604,"sectionId":"19763-20254","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5853168094815572,44.808167198079275],[-0.585610866426628,44.80766229960811]]}},{"type":"Feature","properties":{"name":"Impasse du Docteur Paul Fournial","distance":144.35268994317926,"sectionId":"31649-15876","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6184503784224944,44.79483267624182],[-0.6190857935197557,44.79605101324716]]}},{"type":"Feature","properties":{"name":"Rue Jules Guesde","distance":130.9284931953083,"sectionId":"22956-19987","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5984066689433065,44.80404866973753],[-0.5997391280946534,44.803545193767775],[-0.5997742485059586,44.80353822685002],[-0.5998136485780937,44.80353697982322],[-0.5998485137892398,44.8035401101894],[-0.5998836905566615,44.80354620340311]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":"Unknown","sectionId":"22956-as=4667","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5999223500980054,44.80356146486022],[-0.5998836905566615,44.80354620340311]]}},{"type":"Feature","properties":{"name":"Rue Jules Valles","distance":61.89488237618031,"sectionId":"20108-19686","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5847905382966339,44.81362056946996],[-0.5840087065161284,44.81364925808745]]}},{"type":"Feature","properties":{"name":"Rue Jules Valles","distance":122.73154650857504,"sectionId":"20108-19685","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5840087065161284,44.81364925808745],[-0.5833944479768912,44.81367212232056],[-0.5833268487018581,44.81366569396263],[-0.5832773479482455,44.81364707496361],[-0.5832460809664701,44.81361436937356],[-0.5832336345599575,44.81356683807355],[-0.5831887578305832,44.8130770372922]]}},{"type":"Feature","properties":{"name":"Impasse des Briques","distance":29.4904440559289,"sectionId":"19732-19731","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5920218479019826,44.81051866672442],[-0.5919607284167003,44.81025674671239]]}},{"type":"Feature","properties":{"name":"Rue Ernest Renan","distance":204.30024517962903,"sectionId":"19616-16133","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6322105865270966,44.79718597537696],[-0.6344272758899904,44.797052365539315],[-0.6347527507738805,44.79694503264647]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":7.832902734413397,"sectionId":"20035-20034","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5992047248805338,44.802551201774975],[-0.5991426121969289,44.802606135801256]]}},{"type":"Feature","properties":{"name":"Allée Pierre de Coubertin","distance":588.0367225947772,"sectionId":"20035-17289","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.605885215623023,44.800376062741314],[-0.6056357485057866,44.800445498507415],[-0.6024543102625495,44.80131886466178],[-0.6020799340283943,44.80141837272509],[-0.6017307026211157,44.80151735346658],[-0.6013436960531953,44.801617259009255],[-0.6005203244586219,44.80184529300874],[-0.5999089678915647,44.80201391208004],[-0.5992047248805338,44.802551201774975]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":216.3863376474554,"sectionId":"20035-25407","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6005624050351719,44.804188356648226],[-0.6002757533293365,44.80358171734711],[-0.6000841805279902,44.80322709131136],[-0.6000106262750843,44.80312312224615],[-0.599842441912155,44.80297278315944],[-0.5995900681935169,44.8028054704204],[-0.5992047248805338,44.802551201774975]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":278.82800959779684,"sectionId":"20035-as=125538","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5992047248805338,44.802551201774975],[-0.5968193140132685,44.80100671505463],[-0.5966519084589246,44.80082806120818],[-0.5966519084589246,44.80082806120818]]}},{"type":"Feature","properties":{"name":"Rue Maurice Ravel","distance":195.43237543994056,"sectionId":"20008-20111","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5863172883442309,44.79475842595066],[-0.5887778931031118,44.79492023813073]]}},{"type":"Feature","properties":{"name":"Rue Georges Bizet","distance":71.9622073453714,"sectionId":"20008-20009","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5887778931031118,44.79492023813073],[-0.5886201223908932,44.795558312862916]]}},{"type":"Feature","properties":{"name":"Place du Muguet","distance":69.08550933829275,"sectionId":"27340-17074","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6192003451272676,44.805816641880824],[-0.6188697461705239,44.80524089870388]]}},{"type":"Feature","properties":{"name":"Avenue des Roses","distance":10.262464826749376,"sectionId":"27340-27341","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6192003451272676,44.805816641880824],[-0.6190762675168572,44.805843741373984]]}},{"type":"Feature","properties":{"name":"Avenue des Roses","distance":37.25998539715828,"sectionId":"27340-17395","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6196479004013254,44.80571168586368],[-0.6192003451272676,44.805816641880824]]}},{"type":"Feature","properties":{"name":"Avenue des Roses","distance":10.262464826749376,"sectionId":"27341-27340","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6192003451272676,44.805816641880824],[-0.6190762675168572,44.805843741373984]]}},{"type":"Feature","properties":{"name":"Avenue Jean Babin","distance":204.41777690072496,"sectionId":"15960-15990","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6141607998750656,44.79618494001125],[-0.6134275723343956,44.79739310400014],[-0.6133825259541782,44.797451557915835],[-0.6132884361869587,44.797530937927014],[-0.61320351519842,44.79757291229289],[-0.6131122312654099,44.79760824243035],[-0.6129888077446444,44.79763342325468],[-0.6128294430135697,44.797650377098066]]}},{"type":"Feature","properties":{"name":"Avenue des Arts","distance":269.2287646340752,"sectionId":"15960-as=125323","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6128294430135697,44.797650377098066],[-0.6127276070434479,44.79763442451352],[-0.6125340938868502,44.7975829185907],[-0.6110890519033626,44.79708705296016],[-0.6107118818609878,44.796945347124755],[-0.6100838541284331,44.79663432044443],[-0.6098558033544615,44.79649787728235],[-0.6098558033544615,44.79649787728235]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":6.935833046561477,"sectionId":"27582-16518","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6229018336977635,44.79433016103196],[-0.6229246857275096,44.79435357540785],[-0.6229576027525034,44.794378110453]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":12.500964577807,"sectionId":"27582-16534","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6228581922887556,44.794223541097814],[-0.6228575381018047,44.79422923720932],[-0.6228634443436628,44.794262830412706],[-0.6228768697262494,44.79429528322983],[-0.6229018336977635,44.79433016103196]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Nancel Pénard","distance":89.8509525841441,"sectionId":"16545-16546","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6318755916354046,44.80876490225784],[-0.6322626407585338,44.80897892416717],[-0.6324363146384291,44.80903598643754],[-0.6328764318135781,44.80911814029118]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Nancel Pénard","distance":93.53742304840249,"sectionId":"16545-16544","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6308268009744906,44.80857434652392],[-0.6310360631124109,44.80852343532635],[-0.6311894296243841,44.80850124324869],[-0.6312670798827145,44.808500475910186],[-0.6313472792120202,44.808506023097124],[-0.6314882678486665,44.808546473775664],[-0.6316046141759817,44.8085995120527],[-0.6318755916354046,44.80876490225784]]}},{"type":"Feature","properties":{"name":"Résidence Antheor","distance":145.66992478621307,"sectionId":"16545-17735","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6318755916354046,44.80876490225784],[-0.6316810128686386,44.80893840083794],[-0.6316642469017522,44.80896352905602],[-0.6316701914566658,44.80899360746052],[-0.6317489890832049,44.809300259656155],[-0.6317338025877063,44.809466949392714],[-0.6317279396063193,44.80958478620214],[-0.6318210605368292,44.810014305949]]}},{"type":"Feature","properties":{"name":"Avenue du Colonel René Fonck","distance":75.65701896293842,"sectionId":"16430-16426","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6301869250232973,44.809594070291],[-0.6301881949740376,44.80953988936505],[-0.6300172199596933,44.80892484828186]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Nancel Pénard","distance":75.15745114866311,"sectionId":"16430-16544","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6300172199596933,44.80892484828186],[-0.6302240382772087,44.80886122472536],[-0.6304729864693318,44.808749232320224],[-0.6308268009744906,44.80857434652392]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Nancel Pénard","distance":47.92153521317158,"sectionId":"16430-30479","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.629420588809221,44.80898163238363],[-0.629652082695442,44.80898028122187],[-0.6298357784740931,44.80896342907721],[-0.6300172199596933,44.80892484828186]]}},{"type":"Feature","properties":{"name":"Cité Duprat Et Durand","distance":39.149759389254605,"sectionId":"19855-19854","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5849219860206252,44.799108507861185],[-0.584624345277576,44.79910545838478],[-0.5845034664131551,44.7992165556342]]}},{"type":"Feature","properties":{"name":"Impasse de la Fauvette","distance":174.465416311103,"sectionId":"19915-19914","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5817200878902408,44.8104187744898],[-0.5818780991626679,44.8088520567097]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":28.558403131101812,"sectionId":"16507-16506","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6171720137256175,44.800471934783396],[-0.617184694104715,44.80047036039925],[-0.617217475548208,44.80046247144449],[-0.6172481259448459,44.80045086676043],[-0.6172757839339125,44.80043593407935],[-0.6172997144347655,44.80041805711452],[-0.6173193142778841,44.80039770547182],[-0.6173339803037736,44.800375348753285],[-0.6173434938134287,44.800351534416315],[-0.6173475267618401,44.80032708364803],[-0.617345975445065,44.80030236007947],[-0.6173385760408895,44.8002771919352]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":11.170325214183489,"sectionId":"16507-16526","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6170348711673813,44.80045800961697],[-0.6170485946892249,44.80046297815326],[-0.6170814680759295,44.80047067072388],[-0.617115746124498,44.800474535112365],[-0.6171504073520003,44.80047442363929],[-0.6171720137256175,44.800471934783396]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":"Unknown","sectionId":"16507-as=125661","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6171282843380691,44.800555391475335],[-0.6171720137256175,44.800471934783396]]}},{"type":"Feature","properties":{"name":"Rue Gustave Courbet","distance":84.98362358250272,"sectionId":"35880-19584","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5846472686524727,44.79564658849234],[-0.5848533112551045,44.7955054213432],[-0.5849910017310761,44.79542270967738],[-0.5850319923870405,44.795365746929185],[-0.5850659103723002,44.79529270233151],[-0.585051126765477,44.795219751746686],[-0.5849855407068508,44.795168040524224],[-0.5848900376167527,44.79514384648763],[-0.584790537238073,44.79517337702367]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":12.567220593090708,"sectionId":"25407-23249","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6005624050351719,44.804188356648226],[-0.6005329387669479,44.80418658697797],[-0.6004878190628526,44.80418945662009],[-0.6004440689953974,44.80419804816299],[-0.6004092627113612,44.80421004994941]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":40.23154623544655,"sectionId":"25407-25408","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6007471674791848,44.80446221351912],[-0.6007656266090102,44.8044376672032],[-0.600779651529618,44.804406955492446],[-0.6007857513570579,44.80437496327611],[-0.6007837353086343,44.8043426875024],[-0.6007736651711555,44.804311117121586],[-0.6007558665292493,44.804281412896984],[-0.6007309006839782,44.80425445787905],[-0.6006994552154997,44.80423113112104],[-0.6006628378897702,44.80421211187704],[-0.600621977611209,44.80419809139395],[-0.6005781652854597,44.80418947921323],[-0.6005624050351719,44.804188356648226]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":216.3863376474554,"sectionId":"25407-20035","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6005624050351719,44.804188356648226],[-0.6002757533293365,44.80358171734711],[-0.6000841805279902,44.80322709131136],[-0.6000106262750843,44.80312312224615],[-0.599842441912155,44.80297278315944],[-0.5995900681935169,44.8028054704204],[-0.5992047248805338,44.802551201774975]]}},{"type":"Feature","properties":{"name":"Rue de Megret","distance":101.48913969585259,"sectionId":"19573-20003","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5907424423278052,44.799292871840485],[-0.5908689969751137,44.799204018804296],[-0.5909787378990278,44.799131641028026],[-0.5913554988771722,44.7988510293862],[-0.5915140667730234,44.79873179787754],[-0.5916468256867602,44.79864509009591]]}},{"type":"Feature","properties":{"name":"Avenue de Thouars","distance":11.608656027403358,"sectionId":"19573-25685","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5916468256867602,44.79864509009591],[-0.5917497936407278,44.798687419707996],[-0.5917724060901783,44.798699046797225]]}},{"type":"Feature","properties":{"name":"Avenue de Thouars","distance":"Unknown","sectionId":"19573-as=126725","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.591749738721691,44.79856265778556],[-0.5916468256867602,44.79864509009591]]}},{"type":"Feature","properties":{"name":"Rue Aldona","distance":45.1928454325558,"sectionId":"19573-as=3946","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5916468256867602,44.79864509009591],[-0.5915421817258038,44.79858803986696],[-0.5911143430914114,44.79851592268685]]}},{"type":"Feature","properties":{"name":"Avenue Paul Lapie","distance":182.54932980577178,"sectionId":"20268-19990","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5879957097363121,44.802660342236095],[-0.5885653989972357,44.80106764762856]]}},{"type":"Feature","properties":{"name":"Avenue Paul Lapie","distance":204.32440434045327,"sectionId":"20268-20213","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5873478577180511,44.80444115657791],[-0.5879957097363121,44.802660342236095]]}},{"type":"Feature","properties":{"name":"Rue de Tremeuge","distance":109.11536202214292,"sectionId":"20268-20209","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5893277101316055,44.80291684525887],[-0.5879957097363121,44.802660342236095]]}},{"type":"Feature","properties":{"name":"Rue de Tremeuge","distance":69.68328827239124,"sectionId":"20268-19998","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5879957097363121,44.802660342236095],[-0.5871427200275997,44.802502850829214]]}},{"type":"Feature","properties":{"name":"Avenue Jean Jaurès","distance":91.3700678712367,"sectionId":"16884-40117","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6295206167811596,44.806458345196894],[-0.6300846702457197,44.806308641964954],[-0.6306234818854873,44.80621829611289]]}},{"type":"Feature","properties":{"name":"Rue Herman Lemoine","distance":71.93448215954267,"sectionId":"16884-16885","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6306234818854873,44.80621829611289],[-0.6306365218612896,44.80626661526872],[-0.6306450702024092,44.80635813790758],[-0.6306486321612742,44.8063745095646],[-0.6306590124033353,44.806398681046375],[-0.6306750517124591,44.806430329018575],[-0.6306803317925543,44.806457906319956],[-0.6306849891099978,44.80664837521006],[-0.6306929410031198,44.80668622687498],[-0.6307440648849332,44.806857015563125]]}},{"type":"Feature","properties":{"name":"Avenue Pasteur","distance":3.4967746394475165,"sectionId":"16884-as=126198","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6306234818854873,44.80621829611289],[-0.630666524961471,44.80621107320266]]}},{"type":"Feature","properties":{"name":"Allée des Charmes","distance":9.605229852797715,"sectionId":"23431-23429","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5872243072582464,44.79794565051813],[-0.5873434046687883,44.79796261261956]]}},{"type":"Feature","properties":{"name":"Allée des Hibiscus","distance":38.976481010108294,"sectionId":"16889-16888","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.619434263251487,44.80508024381205],[-0.6192339446481433,44.804759615665944]]}},{"type":"Feature","properties":{"name":"Place de la Cinquième République","distance":28.60681224036727,"sectionId":"34733-16309","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6307163518160297,44.8053924150303],[-0.6307088981800342,44.80529617307907],[-0.6306521263403831,44.80514015827631]]}},{"type":"Feature","properties":{"name":"Avenue Louis Laugaa","distance":13.056451284638742,"sectionId":"34733-16404","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6308082702318089,44.805101932908464],[-0.6306521263403831,44.80514015827631]]}},{"type":"Feature","properties":{"name":"Avenue Louis Laugaa","distance":76.09166977928622,"sectionId":"34733-16750","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6306521263403831,44.80514015827631],[-0.6299725716897439,44.80531823402517],[-0.6297406522332688,44.805356804530206]]}},{"type":"Feature","properties":{"name":"Rue Frédéric Chopin","distance":100.96471484810158,"sectionId":"19585-19950","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5847781845475827,44.795721463465725],[-0.5860323705535917,44.79589118155161]]}},{"type":"Feature","properties":{"name":"Rue d'Alembert","distance":13.356235869437771,"sectionId":"19585-19584","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5846472686524727,44.79564658849234],[-0.5847300149816487,44.79570163250422],[-0.5847781845475827,44.795721463465725]]}},{"type":"Feature","properties":{"name":"Rue Nelson Paillou","distance":47.63196026621833,"sectionId":"27895-27894","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6309912993060639,44.81066543778118],[-0.6306107064487226,44.810333015277955]]}},{"type":"Feature","properties":{"name":"Impasse du Colonel René Fonck","distance":50.7617195876681,"sectionId":"23489-16427","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6310324710411841,44.80977418478704],[-0.6303966248624713,44.809837360339436]]}},{"type":"Feature","properties":{"name":"Accès Maison de Retraite Mutualiste","distance":67.8140956196328,"sectionId":"17793-16606","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6125250585888145,44.8055516828129],[-0.6117017660984965,44.80572268210356]]}},{"type":"Feature","properties":{"name":"Rue Marc Sangnier","distance":51.76872809811886,"sectionId":"17118-17119","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6082347158446524,44.80920497076243],[-0.6079744244836235,44.8092536744586],[-0.6075898372026082,44.809273619724856]]}},{"type":"Feature","properties":{"name":"Place du Professeur Piéchaud","distance":24.33876973180703,"sectionId":"17118-17036","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6075898372026082,44.809273619724856],[-0.607652215883496,44.809384695151834],[-0.6077160928261833,44.809473202346354]]}},{"type":"Feature","properties":{"name":"Rue Marc Sangnier","distance":67.71469107757473,"sectionId":"17118-16436","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6067367308739857,44.809327157783876],[-0.6075898372026082,44.809273619724856]]}},{"type":"Feature","properties":{"name":"Esplanade des Antilles","distance":155.28047351841127,"sectionId":"15882-15883","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6195693809825837,44.79434475553062],[-0.6214063507691692,44.793851257111]]}},{"type":"Feature","properties":{"name":"Esplanade des Antilles","distance":18.833312371296387,"sectionId":"15882-15874","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6214063507691692,44.793851257111],[-0.6214998958983052,44.794007185475536]]}},{"type":"Feature","properties":{"name":"Esplanade des Antilles","distance":158.56586929686023,"sectionId":"15882-15880","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6214063507691692,44.793851257111],[-0.6232763658724012,44.79333649635493]]}},{"type":"Feature","properties":{"name":"Avenue Pierre Wiehn","distance":25.047920075001585,"sectionId":"25409-30758","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6314303730376181,44.80188679333691],[-0.6313587518996446,44.80174008123639],[-0.6313066635366836,44.801680487252156]]}},{"type":"Feature","properties":{"name":"Avenue Pierre Wiehn","distance":24.809391328640157,"sectionId":"25409-17230","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6313066635366836,44.801680487252156],[-0.6312995222207741,44.8017559353992],[-0.6313345077378727,44.801901565174525]]}},{"type":"Feature","properties":{"name":"Avenue Pierre Wiehn","distance":52.010928852695656,"sectionId":"25409-17161","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6313066635366836,44.801680487252156],[-0.6312700013020841,44.80121295081171]]}},{"type":"Feature","properties":{"name":"Avenue Montesquieu","distance":157.307730056111,"sectionId":"17162-17170","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6311166921227062,44.80050654248247],[-0.6330550263178062,44.80018825982236]]}},{"type":"Feature","properties":{"name":"Avenue Montaigne","distance":229.1381039179972,"sectionId":"17162-17161","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6312700013020841,44.80121295081171],[-0.6329148018499081,44.80098484856403],[-0.6330841604695993,44.80089349833166],[-0.6331554289449359,44.80075348306539],[-0.6330550263178062,44.80018825982236]]}},{"type":"Feature","properties":{"name":"Avenue des Charmilles","distance":139.7925755067286,"sectionId":"16253-16340","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.628473035099161,44.801135835085994],[-0.6267055904211111,44.801112215789686]]}},{"type":"Feature","properties":{"name":"Avenue des Charmilles","distance":149.41060355703632,"sectionId":"16253-16341","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6267055904211111,44.801112215789686],[-0.6248167158546375,44.80108108882604]]}},{"type":"Feature","properties":{"name":"Avenue du Cardinal","distance":84.2090617199777,"sectionId":"16253-16252","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6268196929754306,44.80186600150498],[-0.6267055904211111,44.801112215789686]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Nancel Pénard","distance":13.749656186770721,"sectionId":"23492-16541","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6287238129443788,44.80891305861358],[-0.6287074745382106,44.80892087662859],[-0.6286897093991939,44.80893216333948],[-0.6286747208997054,44.808945343310945],[-0.6286629915694278,44.80896004081721],[-0.628654625064914,44.808975892215436],[-0.6286499776270127,44.80899252580751],[-0.6286491472518573,44.80900948804858],[-0.6286497829100846,44.809017575311366]]}},{"type":"Feature","properties":{"name":"Avenue du Poujeau","distance":59.295558081842785,"sectionId":"23492-16671","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6287238129443788,44.80891305861358],[-0.6286311977843426,44.808848990854706],[-0.6282559941049614,44.80866007291163],[-0.6281220146836525,44.80859624319518]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Nancel Pénard","distance":"Unknown","sectionId":"23492-as=124743","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6287495026144481,44.80890503235491],[-0.6287238129443788,44.80891305861358]]}},{"type":"Feature","properties":{"name":"Allée des Glycines","distance":158.79437446700734,"sectionId":"26058-26709","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6284124019636882,44.793554507407194],[-0.6282294451853828,44.79213080313704]]}},{"type":"Feature","properties":{"name":"Allée des Jacquets","distance":80.56847817354829,"sectionId":"30029-23216","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6075668450194411,44.79821632599034],[-0.6082861705142739,44.79856086345614],[-0.6083205954746773,44.798666159103746]]}},{"type":"Feature","properties":{"name":"Avenue du Maréchal Lyautey","distance":84.75989291496792,"sectionId":"17126-26552","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6314170497640901,44.79416692679618],[-0.6317063869638696,44.794168947249176],[-0.6320306161316701,44.79417859070338],[-0.6324882849617394,44.79416964742149]]}},{"type":"Feature","properties":{"name":"Avenue du Maréchal Lyautey","distance":65.79562579627064,"sectionId":"17126-16135","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6324882849617394,44.79416964742149],[-0.6331204935544414,44.79415791866978],[-0.6333199899073376,44.79415767051185]]}},{"type":"Feature","properties":{"name":"Avenue du Maréchal Lyautey","distance":6.097623169827376,"sectionId":"17126-16726","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6324882849617394,44.79416964742149],[-0.6324854611337549,44.794114786306004]]}},{"type":"Feature","properties":{"name":"Avenue du Maréchal Lyautey","distance":65.79562579627064,"sectionId":"16135-17126","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6324882849617394,44.79416964742149],[-0.6331204935544414,44.79415791866978],[-0.6333199899073376,44.79415767051185]]}},{"type":"Feature","properties":{"name":"Avenue Raymond Poincare","distance":196.98113228021333,"sectionId":"20197-30133","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5897857054238459,44.81339890989978],[-0.5895381796612378,44.81321214406544],[-0.5894544608780478,44.813172447314024],[-0.5893577190473525,44.81314919598265],[-0.5874394502332281,44.81301107708922]]}},{"type":"Feature","properties":{"name":"Rue Maurice Berteaux","distance":77.70074186718841,"sectionId":"20197-20160","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5874394502332281,44.81301107708922],[-0.5876207778322377,44.81232353005264]]}},{"type":"Feature","properties":{"name":"Rue Maurice Berteaux","distance":13.786158477410662,"sectionId":"20197-20071","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5873405205806616,44.81311328679103],[-0.5874394502332281,44.81301107708922]]}},{"type":"Feature","properties":{"name":"Rue Matteoti","distance":120.22192836325372,"sectionId":"20195-20104","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5963748769008166,44.80593403532045],[-0.5963189105283733,44.80485238606977]]}},{"type":"Feature","properties":{"name":"Avenue Roul","distance":86.2284660101008,"sectionId":"20195-19892","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5953226814922169,44.806134221973636],[-0.5960323517262976,44.805982879768784],[-0.5961729812650408,44.805957264236206],[-0.5963748769008166,44.80593403532045]]}},{"type":"Feature","properties":{"name":"Avenue Roul","distance":84.13299478160604,"sectionId":"20195-19838","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5963748769008166,44.80593403532045],[-0.5966193334440264,44.805927746919046],[-0.5970339972000122,44.805931839752795],[-0.5974384797343806,44.80592283083548]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":11.773333959844777,"sectionId":"29241-59021","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.591766336803742,44.8068580488834],[-0.5918101268319217,44.806836178667034],[-0.5918345249577794,44.806821633226996],[-0.5918524526885063,44.80680284983291],[-0.5918630512275317,44.806781595907665]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":6.954320687237656,"sectionId":"29241-59023","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5918630512275317,44.806781595907665],[-0.591864857049954,44.80676016103547],[-0.5918592053241648,44.8067376343106],[-0.5918490500224921,44.80672087229625]]}},{"type":"Feature","properties":{"name":"Avenue Roul","distance":"Unknown","sectionId":"29241-as=126798","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5919754450763087,44.806776336560645],[-0.5918630512275317,44.806781595907665]]}},{"type":"Feature","properties":{"name":"Rue Lamartine","distance":159.11569377356224,"sectionId":"19599-20120","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.586101036755573,44.81007391743919],[-0.5861144545900808,44.80993566947612],[-0.5861563400219824,44.80864203725283]]}},{"type":"Feature","properties":{"name":"Rue Ambroise Pare","distance":66.44806474124479,"sectionId":"19599-19600","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5861563400219824,44.80864203725283],[-0.5869876197288899,44.80872986951243]]}},{"type":"Feature","properties":{"name":"Rue Lamartine","distance":202.71707219923437,"sectionId":"19599-19812","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5861563400219824,44.80864203725283],[-0.5862044440575361,44.80717469710045],[-0.5861920048825989,44.80707162915579],[-0.5861557287428911,44.806995828290184],[-0.5861258770579253,44.80692828887539],[-0.5861240457568794,44.80682526250225]]}},{"type":"Feature","properties":{"name":"Rue Ambroise Pare","distance":79.18251176762708,"sectionId":"19599-as=129242","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5860853898792252,44.808634154471086],[-0.5861563400219824,44.80864203725283]]}},{"type":"Feature","properties":{"name":"Résidence Jocelin","distance":87.13681627840607,"sectionId":"20416-20116","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5861854658165723,44.812315730242524],[-0.585083395922537,44.812322723297065]]}},{"type":"Feature","properties":{"name":"Avenue de Saige","distance":25.896131174923312,"sectionId":"17403-26550","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6304296964116521,44.79432096689277],[-0.6304058027417296,44.79447595354736],[-0.6303931736083461,44.79455265789623]]}},{"type":"Feature","properties":{"name":"Avenue de Saige","distance":157.77958299762128,"sectionId":"17403-15932","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.630562884029604,44.795967954910736],[-0.6304475859348369,44.79508728104028],[-0.6303931736083461,44.79455265789623]]}},{"type":"Feature","properties":{"name":"Avenue des Violettes","distance":224.7607582590603,"sectionId":"17403-16134","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6303931736083461,44.79455265789623],[-0.6315336025557304,44.79460533740075],[-0.633202368626908,44.794832825789584]]}},{"type":"Feature","properties":{"name":"Avenue des Facultes","distance":215.9117404965051,"sectionId":"17751-20396","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6057238322161185,44.8049954861119],[-0.6053676163335752,44.80520964438705],[-0.6051171421916265,44.8053260432795],[-0.6046422978811481,44.80549675584039],[-0.6033032501363998,44.80586050945838]]}},{"type":"Feature","properties":{"name":"Avenue des Facultés","distance":63.65734565222472,"sectionId":"17751-16753","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6062086005106154,44.804538531610724],[-0.6060049440040546,44.80474992676894],[-0.6057238322161185,44.8049954861119]]}},{"type":"Feature","properties":{"name":"Résidence Crespy I","distance":37.497923017054035,"sectionId":"22368-20476","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5895402813859256,44.80334766444167],[-0.589372434552278,44.80333845840935],[-0.5892726378677615,44.80354429207371]]}},{"type":"Feature","properties":{"name":"Résidence Crespy I","distance":72.32199174498545,"sectionId":"22368-22367","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5891628548496484,44.80378890572265],[-0.5893550784513267,44.80383193426334],[-0.5895540975018551,44.80339479164763],[-0.5895402813859256,44.80334766444167]]}},{"type":"Feature","properties":{"name":"Résidence Crespy I","distance":12.110737212705239,"sectionId":"22368-22369","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5896731806453948,44.803293474578275],[-0.5895402813859256,44.80334766444167]]}},{"type":"Feature","properties":{"name":"Avenue Georges Lasserre","distance":76.66029991695004,"sectionId":"20040-20041","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5898878302914718,44.80493116959223],[-0.5892744946297488,44.80480337757599],[-0.5889610944976797,44.80472886989087]]}},{"type":"Feature","properties":{"name":"Avenue Georges Lasserre","distance":81.4187244399355,"sectionId":"20040-42109","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5908768346438454,44.805135111541],[-0.5898878302914718,44.80493116959223]]}},{"type":"Feature","properties":{"name":"Résidence Crespy II","distance":442.63792313643165,"sectionId":"20040-as=128591","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5898878302914718,44.80493116959223],[-0.5893099438875146,44.806364659315726],[-0.5892967260994052,44.80639624474574],[-0.5892766750127097,44.80642579376009],[-0.5892498553294387,44.80645231341251],[-0.5892168481120404,44.80647497462609],[-0.5891791576366742,44.806493549764134],[-0.5891380579988676,44.80650817878141],[-0.5890952693347523,44.80652006854119],[-0.5890509882544411,44.80652831202116],[-0.5890057591057982,44.806533522616334],[-0.5889598624619168,44.806536141881296],[-0.5875250355600304,44.80651961025519],[-0.5874793218971461,44.80651907028844],[-0.5874340494491475,44.806515453606394],[-0.5873893612969355,44.80650902594351],[-0.5873462006249638,44.80649867657264],[-0.5873054514693663,44.80648437761389],[-0.5872668132942509,44.80646739969259],[-0.5872321133087565,44.80644660420395],[-0.5872016544470632,44.80642279233301],[-0.5871764582144867,44.8063961120306],[-0.5871592214412641,44.806367198902755],[-0.5871470786250186,44.806336773896476],[-0.587138289684099,44.80630534229956],[-0.587132482301994,44.806240486421785],[-0.5871271698635787,44.80614291525641],[-0.5871227460915611,44.806077925660745],[-0.5871091648032141,44.806014215767746],[-0.5870953971215871,44.80598411224665],[-0.5870767545543621,44.80595497320072],[-0.5870508176364474,44.80592858648197],[-0.5870200082307858,44.80590523603547],[-0.5869841185172867,44.80588564906566],[-0.5869432715666157,44.805871803485914],[-0.586871380938855,44.80585524351578],[-0.586782444662698,44.80583723923063],[-0.5866938001752457,44.805819856248924],[-0.5866060516017306,44.80581280434881],[-0.5865689008012638,44.80581277243472]]}},{"type":"Feature","properties":{"name":"Résidence les Harmonies","distance":320.44842118736705,"sectionId":"20367-20501","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5849977758770828,44.81191870329469],[-0.5848672651510415,44.812093070520305],[-0.5839582489704639,44.81213360458728],[-0.5838699504622034,44.81207918473009],[-0.5838432510798445,44.81184923701481],[-0.5837501989804931,44.8117610961888],[-0.5835592499224659,44.81173891628214],[-0.5835362690043505,44.811271576651585],[-0.5836686558235081,44.811229121345086],[-0.5840751607237636,44.81129072138431],[-0.5841564041322677,44.811282576505334],[-0.5842346781187469,44.81124092470989],[-0.5843666952442133,44.81101345268009],[-0.5844569755138566,44.81094917224136],[-0.5845266756419456,44.81081239400367]]}},{"type":"Feature","properties":{"name":"Rue de Suzon","distance":105.2953574621651,"sectionId":"20367-19934","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5832376806298483,44.810574383277476],[-0.5839712380041369,44.81070414171307],[-0.5845266756419456,44.81081239400367]]}},{"type":"Feature","properties":{"name":"Rue de Suzon","distance":28.773503461670344,"sectionId":"20367-as=128738","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5845266756419456,44.81081239400367],[-0.5848766551679482,44.81088340802062]]}},{"type":"Feature","properties":{"name":"Rue Edouard Herriot","distance":46.73253979545938,"sectionId":"19866-19867","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5821560683356397,44.80205430950675],[-0.5824356880312024,44.80168364462371]]}},{"type":"Feature","properties":{"name":"Résidence Michel Montaigne","distance":75.59412048168058,"sectionId":"19866-19865","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5821560683356397,44.80205430950675],[-0.5824957689921371,44.8021882808271],[-0.5824133024455259,44.80229870602808],[-0.5820663909934288,44.80216883506007]]}},{"type":"Feature","properties":{"name":"Allée des Cyclades","distance":41.65193375494198,"sectionId":"27478-27475","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6195571001638541,44.800067877994806],[-0.619423815369965,44.80005896769497],[-0.6191154289825405,44.80004013518206],[-0.6190323834630272,44.80003539102069]]}},{"type":"Feature","properties":{"name":"Rue de la Ramée","distance":34.846687565398106,"sectionId":"27664-17370","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6303640321588959,44.79343483472454],[-0.6308029509226473,44.79340748890225]]}},{"type":"Feature","properties":{"name":"Place du Théatre de Verdure","distance":160.08293272369804,"sectionId":"27664-27665","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6308029509226473,44.79340748890225],[-0.630787271331482,44.79322881235479],[-0.6308111164620588,44.793075088275856],[-0.6306669053178622,44.79197228945535]]}},{"type":"Feature","properties":{"name":"Rue de la Ramée","distance":47.69649609562168,"sectionId":"27664-as=125432","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6308029509226473,44.79340748890225],[-0.6314036276194981,44.793369300565004]]}},{"type":"Feature","properties":{"name":"Place du Théatre de Verdure","distance":160.08293272369804,"sectionId":"27665-27664","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6308029509226473,44.79340748890225],[-0.630787271331482,44.79322881235479],[-0.6308111164620588,44.793075088275856],[-0.6306669053178622,44.79197228945535]]}},{"type":"Feature","properties":{"name":"Avenue Maréchal Leclerc","distance":58.31711400300221,"sectionId":"20181-29245","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5878866023049307,44.80723804824538],[-0.5881419074841618,44.80725755977209],[-0.5883793790124525,44.80725484264933],[-0.5884712406536647,44.8072506834324],[-0.5886221785661602,44.80724420989426]]}},{"type":"Feature","properties":{"name":"Rue du Professeur Roux","distance":180.53763845208758,"sectionId":"20181-19600","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5878866023049307,44.80723804824538],[-0.5878531095493886,44.80734441032008],[-0.5870242927718372,44.808660341002444],[-0.5869876197288899,44.80872986951243]]}},{"type":"Feature","properties":{"name":"Avenue Maréchal Leclerc","distance":"Unknown","sectionId":"20181-as=4025","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5875561706922359,44.8071642442764],[-0.5878866023049307,44.80723804824538]]}},{"type":"Feature","properties":{"name":"Avenue Georges Lasserre","distance":5.5693567052878095,"sectionId":"38852-20038","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5923260252980941,44.80541946553582],[-0.5922567476898352,44.805410420472995]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":123.49650665791592,"sectionId":"38852-38853","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5926887131867463,44.804341941868636],[-0.5925756756217709,44.8046214336666],[-0.5923629414503087,44.80515495263081],[-0.5922567476898352,44.805410420472995]]}},{"type":"Feature","properties":{"name":"Avenue Georges Lasserre","distance":113.32484106148098,"sectionId":"38852-42109","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5922567476898352,44.805410420472995],[-0.5920951648995038,44.805381872126084],[-0.5919189780319195,44.80534587141796],[-0.5908768346438454,44.805135111541]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":137.44202852183648,"sectionId":"38852-as=124756","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5922567476898352,44.805410420472995],[-0.5920486432489971,44.80592886448956],[-0.59177833957402,44.80660004681237],[-0.59177833957402,44.80660004681237]]}},{"type":"Feature","properties":{"name":"Rue Michel Slitinsky","distance":182.0501098143617,"sectionId":"42109-42110","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5908768346438454,44.805135111541],[-0.5906837568081132,44.80561703771333],[-0.5905348321161508,44.80598080558536],[-0.5905150214038407,44.80608124173051],[-0.5903879310139973,44.80640756665086],[-0.5903578595570199,44.806450944462185],[-0.5901752386690532,44.80668821935534]]}},{"type":"Feature","properties":{"name":"Avenue Georges Lasserre","distance":81.4187244399355,"sectionId":"42109-20040","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5908768346438454,44.805135111541],[-0.5898878302914718,44.80493116959223]]}},{"type":"Feature","properties":{"name":"Avenue Georges Lasserre","distance":113.32484106148098,"sectionId":"42109-38852","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5922567476898352,44.805410420472995],[-0.5920951648995038,44.805381872126084],[-0.5919189780319195,44.80534587141796],[-0.5908768346438454,44.805135111541]]}},{"type":"Feature","properties":{"name":"Rue du Haut Carre","distance":78.11963270747486,"sectionId":"19614-19746","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5975106500427024,44.81243610629011],[-0.5977875452259982,44.8131112532041]]}},{"type":"Feature","properties":{"name":"Rue André Gide","distance":232.3892498165161,"sectionId":"19614-19615","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6000842403541052,44.812542147747884],[-0.6000637616945013,44.81250198855945],[-0.6000136438664618,44.812445201319136],[-0.5999308361509307,44.81237359410098],[-0.5995044106604542,44.81213936191611],[-0.5994367858293375,44.81210618948996],[-0.5993565927707848,44.81207845931682],[-0.5992699220337789,44.81206048277275],[-0.5991837117250365,44.81205393204763],[-0.5990300202554011,44.812055011327324],[-0.5989753179126946,44.81206259738529],[-0.5989134276417752,44.812078698397514],[-0.598180141040079,44.81229881543261],[-0.5975106500427024,44.81243610629011]]}},{"type":"Feature","properties":{"name":"Rue du Haut Carre","distance":72.88645435938582,"sectionId":"19614-19847","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5972536510442011,44.81180591126048],[-0.5973681622161326,44.812083436514975],[-0.5975106500427024,44.81243610629011]]}},{"type":"Feature","properties":{"name":"Rue Jean Cocteau","distance":73.38936196597737,"sectionId":"19797-19863","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5806009916716915,44.80272159659935],[-0.5811214153243898,44.80289897681461],[-0.5811628656707487,44.80291037317946],[-0.5812126574797136,44.802917543295294],[-0.5814665934575787,44.80293981469017]]}},{"type":"Feature","properties":{"name":"Rue Clément Thomas","distance":79.83801410528439,"sectionId":"19797-19798","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5806009916716915,44.80272159659935],[-0.5807228930412999,44.802233570901166],[-0.5807791026423318,44.8020140742784]]}},{"type":"Feature","properties":{"name":"Avenue de la Marne","distance":84.25886615472552,"sectionId":"23479-20513","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.596962525832824,44.7942880795142],[-0.596718890129175,44.794375688623745],[-0.5965060776399489,44.7944159299597],[-0.5959392521576963,44.79447186994839]]}},{"type":"Feature","properties":{"name":"Avenue du Vallon","distance":272.3664997583884,"sectionId":"16938-17197","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6208364325521509,44.811430275159225],[-0.6220677986690202,44.813720449606464]]}},{"type":"Feature","properties":{"name":"Avenue des Violettes","distance":224.7607582590603,"sectionId":"16134-17403","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6303931736083461,44.79455265789623],[-0.6315336025557304,44.79460533740075],[-0.633202368626908,44.794832825789584]]}},{"type":"Feature","properties":{"name":"Passage du Muguet","distance":39.03082572646891,"sectionId":"20230-19553","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5811476582560566,44.79898500943584],[-0.5812039803335847,44.798997558877595],[-0.5812381930856463,44.79902080355666],[-0.5812579836811633,44.79905017751328],[-0.581399142937162,44.799271566811626]]}},{"type":"Feature","properties":{"name":"Rue Pacaris","distance":151.0456282947014,"sectionId":"20134-23612","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5809334049683368,44.79758882598663],[-0.580551225556099,44.79734484755646],[-0.580068242143265,44.79702386877795],[-0.5796231749395211,44.79672052167198],[-0.5795537033330288,44.79665100351513]]}},{"type":"Feature","properties":{"name":"Rue Camille Pelletan","distance":121.93017871115823,"sectionId":"30033-19741","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5911660667008316,44.8129569095402],[-0.5912935129941872,44.81307891065408],[-0.5914545851507416,44.813240927366664],[-0.5916959773634577,44.813485535309894],[-0.5917562264759109,44.813560833208086],[-0.5918219889374632,44.813653522968245],[-0.591936730460309,44.81381123670087],[-0.5919798225307895,44.81388536468162]]}},{"type":"Feature","properties":{"name":"Rue Frédéric Sevene","distance":275.1984784947636,"sectionId":"19649-19710","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5807488871936071,44.804359125680534],[-0.5806433604767209,44.80442433380759],[-0.5805798037661352,44.804492994910674],[-0.5805073940907326,44.80465543920559],[-0.5804569191870467,44.80483286711872],[-0.5800845142245711,44.80596132892959],[-0.5800319463776891,44.806060271437744],[-0.5799391335305457,44.80617948777433],[-0.5798561249134772,44.80625893979868],[-0.5794287913091821,44.80658262885887]]}},{"type":"Feature","properties":{"name":"Rue Lafontaine","distance":83.2400584945686,"sectionId":"19809-19630","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5840053833237241,44.80295370653722],[-0.5836404782601111,44.80356442762278],[-0.5836002037568148,44.80364523865101]]}},{"type":"Feature","properties":{"name":"Rue Condorcet","distance":133.4710029330703,"sectionId":"19809-19808","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5855319951303288,44.80322276786811],[-0.5855008242930735,44.80324239743687],[-0.5854334023476077,44.803285419965626],[-0.5854024122569524,44.80329981906845],[-0.5853685241823788,44.803310345922064],[-0.5853324343180979,44.80331598767871],[-0.585221360409289,44.803324443518036],[-0.5851842444408011,44.803325793651375],[-0.5851471317467515,44.80332516187252],[-0.5851102525296307,44.80332218059734],[-0.5850738593605325,44.80331684186658],[-0.585038331092779,44.803309133738566],[-0.5849699810954359,44.80328840740146],[-0.5841008354229333,44.802985019746664],[-0.5840053833237241,44.80295370653722]]}},{"type":"Feature","properties":{"name":"Rue Lafontaine","distance":86.02055063145504,"sectionId":"19809-19692","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.583779240354156,44.80225909656631],[-0.5838561565533614,44.80233216131662],[-0.5840214904145854,44.80249639498091],[-0.5840454397181574,44.80252545730956],[-0.5840655525816808,44.80255590167351],[-0.5840818178198008,44.80258754826163],[-0.5840940867889167,44.80262004143532],[-0.5841022220233854,44.802653205362546],[-0.5841060804628767,44.802686774307496],[-0.5841058923088552,44.80272038068938],[-0.5841013993973294,44.8027539425629],[-0.5840928263396867,44.80278700244013],[-0.5840800356669424,44.80281938448854],[-0.5840295974202206,44.80291375799513],[-0.5840053833237241,44.80295370653722]]}},{"type":"Feature","properties":{"name":"Rue Blanqui","distance":78.80942823627964,"sectionId":"19684-19685","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5821933875355502,44.81311505203595],[-0.5831887578305832,44.8130770372922]]}},{"type":"Feature","properties":{"name":"Rue Bourges","distance":77.90621976456902,"sectionId":"19684-19722","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5821933875355502,44.81311505203595],[-0.5822014951453914,44.81306020737292],[-0.582204613199869,44.813002457062105],[-0.582195095432896,44.812837097007254],[-0.5821805715737989,44.81265838237581],[-0.5821412127605833,44.8124160415655]]}},{"type":"Feature","properties":{"name":"Rue Bourges","distance":43.15532706013283,"sectionId":"19722-23182","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5821412127605833,44.8124160415655],[-0.5821412938540521,44.81236847600874],[-0.5821621961695906,44.81220999509623],[-0.5822053501379916,44.81203081536906]]}},{"type":"Feature","properties":{"name":"Rue Bourges","distance":32.13151126266019,"sectionId":"19722-20414","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5821412127605833,44.8124160415655],[-0.5822168541435998,44.812374744402945],[-0.5823742292670113,44.81229448033498],[-0.5824723589146111,44.812248511199655]]}},{"type":"Feature","properties":{"name":"Rue Bourges","distance":77.90621976456902,"sectionId":"19722-19684","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5821933875355502,44.81311505203595],[-0.5822014951453914,44.81306020737292],[-0.582204613199869,44.813002457062105],[-0.582195095432896,44.812837097007254],[-0.5821805715737989,44.81265838237581],[-0.5821412127605833,44.8124160415655]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":10.728894389010321,"sectionId":"22876-20148","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5981196130069676,44.79920231276052],[-0.5981996355267528,44.79928031462285]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":179.0481517770969,"sectionId":"22876-29095","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5965714569927393,44.80037406839496],[-0.5966065505768284,44.80029368618983],[-0.5966421564433161,44.800243825663614],[-0.5966890680479796,44.80019468857001],[-0.5967895070909665,44.80011728434324],[-0.5970630569834293,44.79995513252617],[-0.5981996355267528,44.79928031462285]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":49.111282153708515,"sectionId":"22876-as=124883","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5981996355267528,44.79928031462285],[-0.5983424144731566,44.79920021807931],[-0.5986810940580379,44.79900107428764]]}},{"type":"Feature","properties":{"name":"Avenue Maréchal de Lattre de Tassigny","distance":138.62597467458676,"sectionId":"30058-20160","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5893594529373799,44.81248406737403],[-0.5884670082335232,44.81239448681385],[-0.5876207778322377,44.81232353005264]]}},{"type":"Feature","properties":{"name":"Avenue Maréchal de Lattre de Tassigny","distance":98.32039208555712,"sectionId":"30058-19873","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.590587153787817,44.81261458620894],[-0.5905358480089682,44.812607647851706],[-0.5904893317149522,44.8125922707685],[-0.5893594529373799,44.81248406737403]]}},{"type":"Feature","properties":{"name":"Rue Jacques Chaban Delmas","distance":82.51186263940376,"sectionId":"30058-30059","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5893594529373799,44.81248406737403],[-0.5893886249477766,44.81236928349199],[-0.5894599697557291,44.81182419928541],[-0.5894712877183582,44.81174583129971]]}},{"type":"Feature","properties":{"name":"Rue Etienne Marcel","distance":63.000513736069166,"sectionId":"16589-27888","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6324539626388954,44.80672359754805],[-0.6325920429160863,44.8067159446926],[-0.6327101795127357,44.8067110906548],[-0.6332361872648015,44.80662438438843]]}},{"type":"Feature","properties":{"name":"Rue Etienne Marcel","distance":86.62391639664976,"sectionId":"16589-16590","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6332361872648015,44.80662438438843],[-0.6334931477747833,44.807382520972965]]}},{"type":"Feature","properties":{"name":"Rue Georges Trendel","distance":97.4476042406374,"sectionId":"16589-16712","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6332361872648015,44.80662438438843],[-0.6334527769779731,44.806579450175484],[-0.6335082336786833,44.806535789514335],[-0.6335255720281684,44.80648965310059],[-0.6334240624110101,44.80614598217266],[-0.633397283165561,44.805887755899924]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":50.079469714173804,"sectionId":"16517-30945","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6056351334495721,44.808011833433156],[-0.6056484221922663,44.80801186260178],[-0.6056943918746774,44.808006351660836],[-0.6057385254918778,44.80799576419383],[-0.6057798183241224,44.80798022213372],[-0.605816903650209,44.80796012914219],[-0.6058490630866555,44.80793613857532],[-0.605875440713265,44.80790872798282],[-0.605895197485296,44.80787864463115],[-0.6059080051522441,44.80784670967325],[-0.6059134091792239,44.80781374826475],[-0.6059113338997423,44.807780573551135],[-0.6059018355706497,44.80774808457477],[-0.6058850911107415,44.80771708647018],[-0.6058526999066345,44.807680729014336]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":9.946402213610048,"sectionId":"16517-27556","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6058526999066345,44.807680729014336],[-0.6058319662825128,44.80766282926865],[-0.605796933194583,44.807640878692865],[-0.605757491691602,44.80762330174275]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":232.51845470005603,"sectionId":"16517-as=126353","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6058526999066345,44.807680729014336],[-0.6059872695018079,44.80751575540195],[-0.6061221952362326,44.80737671412465],[-0.6062565548650382,44.80724886086562],[-0.6064437405939739,44.80708555147519],[-0.606603973250565,44.80695057160916],[-0.6068313258916518,44.806769953148645],[-0.6077533522424334,44.80609157500647],[-0.6077533522424334,44.80609157500647]]}},{"type":"Feature","properties":{"name":"Rue Pierre Noailles","distance":30.495438773482356,"sectionId":"23323-23370","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5980889229424843,44.8084150118628],[-0.5981067637449384,44.808431202812514],[-0.5981344554242116,44.80844708214756],[-0.5981666375957528,44.80845786490175],[-0.5982014916404421,44.80846279785972],[-0.5982371063146863,44.80846167123372],[-0.5982712083317555,44.80845455693476],[-0.598301920119451,44.808441784608036],[-0.5983275240803287,44.8084242193312],[-0.5983464289124987,44.80840272218954],[-0.5983574558761621,44.80837868171107],[-0.5983600071891754,44.808352657301484]]}},{"type":"Feature","properties":{"name":"Rue Pierre Noailles","distance":159.0569242406936,"sectionId":"23323-20163","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5983600071891754,44.808352657301484],[-0.5985133829700419,44.80833654485694],[-0.5985687189015938,44.808333082649355],[-0.5987343814282154,44.80834756950181],[-0.5987899755560617,44.80834824280326],[-0.5988454433870515,44.808344866369325],[-0.5989001702869653,44.80833772989387],[-0.5989535079408616,44.80832658364371],[-0.5990050999131776,44.808311799227035],[-0.5990550079434781,44.80829436559926],[-0.5991571898185568,44.80826293662551],[-0.5992105385806428,44.8082519700641],[-0.5992650997585891,44.80824420807641],[-0.5993754289391398,44.80823585241999],[-0.5995421884606948,44.80822940427641],[-0.5999314250111244,44.80822321160716],[-0.6000415579701354,44.80823197716155],[-0.6003365168343558,44.808270294930296]]}},{"type":"Feature","properties":{"name":"Rue Pierre Noailles","distance":20.701310617687064,"sectionId":"23323-23291","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5983600071891754,44.808352657301484],[-0.5983543185804354,44.80832842496084],[-0.5983403395491766,44.80830517554584],[-0.598318830649017,44.80828495688503],[-0.5982911389986774,44.80826907759502],[-0.598258956908695,44.80825829487593],[-0.5982241029818597,44.80825336193469],[-0.5981884884356033,44.80825448855746],[-0.598175104191677,44.80825698384061]]}},{"type":"Feature","properties":{"name":"Rue Pierre Noailles","distance":21.944456829621195,"sectionId":"23291-23370","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.598175104191677,44.80825698384061],[-0.5981543865269713,44.80826160283149],[-0.5981236748031078,44.80827437511933],[-0.5980980708468993,44.80829194035003],[-0.5980791659571215,44.80831343745036],[-0.5980680125969882,44.808337481898235],[-0.5980652899651232,44.80836279105752],[-0.5980711496447659,44.80838773865554],[-0.5980852548808018,44.80841098410915],[-0.5980889229424843,44.8084150118628]]}},{"type":"Feature","properties":{"name":"Voie 1 Faculté des Sciences","distance":30.76724976820844,"sectionId":"23291-57744","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5980661419872498,44.80799106177666],[-0.598175104191677,44.80825698384061]]}},{"type":"Feature","properties":{"name":"Rue Pierre Noailles","distance":20.701310617687064,"sectionId":"23291-23323","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5983600071891754,44.808352657301484],[-0.5983543185804354,44.80832842496084],[-0.5983403395491766,44.80830517554584],[-0.598318830649017,44.80828495688503],[-0.5982911389986774,44.80826907759502],[-0.598258956908695,44.80825829487593],[-0.5982241029818597,44.80825336193469],[-0.5981884884356033,44.80825448855746],[-0.598175104191677,44.80825698384061]]}},{"type":"Feature","properties":{"name":"Rue du Général Gouraud","distance":54.80984500943668,"sectionId":"16723-16722","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6270886859262708,44.794153454899394],[-0.6271397607279103,44.79464557544812]]}},{"type":"Feature","properties":{"name":"Rue du Général Gouraud","distance":92.89070495494751,"sectionId":"16723-19528","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6271397607279103,44.79464557544812],[-0.6266830599784304,44.794669960616694],[-0.6266368958617939,44.794688278550694],[-0.6266070196033975,44.79471814825758],[-0.6266006637778646,44.794751862137645],[-0.626651901013641,44.79515209207201]]}},{"type":"Feature","properties":{"name":"Rue du Général Gouraud","distance":183.00667374713143,"sectionId":"19528-16723","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.626651901013641,44.79515209207201],[-0.6266812867006435,44.795180792495515],[-0.6267205374850893,44.79519134169497],[-0.6267583068312391,44.79519040739846],[-0.6276425572872322,44.79514670866255],[-0.6276818471716424,44.79513978001658],[-0.6277109623352108,44.7951259692284],[-0.6277301061956784,44.79510247721528],[-0.6277350050826055,44.795079799965855],[-0.627689816862455,44.79467126975945],[-0.6276576663209917,44.79464085611041],[-0.6276006070947003,44.79462474962859],[-0.6271397607279103,44.79464557544812]]}},{"type":"Feature","properties":{"name":"Rue du Général Koenig","distance":53.93211159727417,"sectionId":"30143-16727","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6324821773750492,44.79407471367852],[-0.6324424028235368,44.79358998032634]]}},{"type":"Feature","properties":{"name":"Avenue du Maréchal Lyautey","distance":4.458515990870914,"sectionId":"30143-16726","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6324854611337549,44.794114786306004],[-0.6324821773750492,44.79407471367852]]}},{"type":"Feature","properties":{"name":"Rue du Général Koenig","distance":53.93211159727417,"sectionId":"16727-30143","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6324821773750492,44.79407471367852],[-0.6324424028235368,44.79358998032634]]}},{"type":"Feature","properties":{"name":"Rue César Franck","distance":16.99063648591804,"sectionId":"19762-19759","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5839721605433712,44.79625664083094],[-0.5840965601187471,44.796381356983915]]}},{"type":"Feature","properties":{"name":"Rue Georges Bizet","distance":95.39551269712327,"sectionId":"19771-34169","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5880899537441516,44.79708175177864],[-0.587796914409828,44.79791488591274]]}},{"type":"Feature","properties":{"name":"Rue Georges Bizet","distance":101.18509621215271,"sectionId":"19771-19619","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5884126126163992,44.79620020875445],[-0.5880899537441516,44.79708175177864]]}},{"type":"Feature","properties":{"name":"Rue Charles Gounod","distance":325.0818275110984,"sectionId":"19771-19733","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5921843731680444,44.79734083928537],[-0.5880899537441516,44.79708175177864]]}},{"type":"Feature","properties":{"name":"Rue Charles Gounod","distance":84.55735550895919,"sectionId":"19771-19772","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5880899537441516,44.79708175177864],[-0.5870244283657843,44.797018707197054]]}},{"type":"Feature","properties":{"name":"Place du Muguet","distance":71.22036250191067,"sectionId":"17395-17199","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6192984980148553,44.80512068753395],[-0.6196479004013254,44.80571168586368]]}},{"type":"Feature","properties":{"name":"Avenue des Roses","distance":56.93956076179268,"sectionId":"17395-16031","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6203579837622806,44.80579151082335],[-0.6197821167735479,44.805715071577865],[-0.6196479004013254,44.80571168586368]]}},{"type":"Feature","properties":{"name":"Avenue des Roses","distance":37.25998539715828,"sectionId":"17395-27340","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6196479004013254,44.80571168586368],[-0.6192003451272676,44.805816641880824]]}},{"type":"Feature","properties":{"name":"Rue Rossini","distance":93.98710663900548,"sectionId":"17139-16949","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6149636158821615,44.81253617954805],[-0.6154697640153065,44.813301834604765]]}},{"type":"Feature","properties":{"name":"Rue Georges Trendel","distance":97.4476042406374,"sectionId":"16712-16589","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6332361872648015,44.80662438438843],[-0.6334527769779731,44.806579450175484],[-0.6335082336786833,44.806535789514335],[-0.6335255720281684,44.80648965310059],[-0.6334240624110101,44.80614598217266],[-0.633397283165561,44.805887755899924]]}},{"type":"Feature","properties":{"name":"Rue Gambetta","distance":67.10100677019945,"sectionId":"16712-16713","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.633397283165561,44.805887755899924],[-0.6333958559356109,44.805828976606094],[-0.6333763991174778,44.805763206203544],[-0.6333611761235757,44.805728469632705],[-0.6333332032594494,44.80567414168953],[-0.63320172125122,44.805471238509334],[-0.633171993686215,44.805401111792165],[-0.6331285166762349,44.80531962325583]]}},{"type":"Feature","properties":{"name":"Avenue Pasteur","distance":41.034681303756415,"sectionId":"16712-as=126949","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.633397283165561,44.805887755899924],[-0.6328797824686113,44.80591535507432]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":130.1503849186161,"sectionId":"16529-16528","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6147625339756065,44.80263045494609],[-0.614598453051524,44.802679360079466],[-0.613496601667769,44.802763828463895],[-0.6133540134994483,44.80278421322541],[-0.6131457210272049,44.80282019760035]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":298.42966904862527,"sectionId":"16529-16531","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6131457210272049,44.80282019760035],[-0.612865978007332,44.802911330050875],[-0.6127279699885666,44.802970484397314],[-0.6125839031423049,44.80304199222661],[-0.6124376263584324,44.8031327577409],[-0.6122808241948917,44.80324133345106],[-0.6121804089566304,44.803331002343064],[-0.6120377369710926,44.803483359676555],[-0.6119837921032429,44.80355740951318],[-0.6119359879848945,44.803622436171246],[-0.6117246316080097,44.80399128170782],[-0.611609849393684,44.80418491159654],[-0.6115092999059415,44.804327012359145],[-0.6114140580000519,44.8044366947833],[-0.6113277220276336,44.804528978575675],[-0.6112302010882644,44.80461441078422],[-0.6111287609394298,44.804693841691],[-0.6110180428676794,44.804760505029506],[-0.6109513723332212,44.80478496226963],[-0.6108199774483072,44.80481444701006]]}},{"type":"Feature","properties":{"name":"Avenue Pey Berland","distance":185.8576723025923,"sectionId":"16529-17007","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6131457210272049,44.80282019760035],[-0.6125998138991972,44.801573583455145],[-0.6124529785310876,44.80122124830705]]}},{"type":"Feature","properties":{"name":"Rue Edouard Herriot","distance":67.55513392639045,"sectionId":"19862-19694","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5825067725348939,44.803310080280106],[-0.581742359284271,44.803038507850836]]}},{"type":"Feature","properties":{"name":"Rue Edouard Herriot","distance":24.406826628925433,"sectionId":"19862-19863","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.581742359284271,44.803038507850836],[-0.5814665934575787,44.80293981469017]]}},{"type":"Feature","properties":{"name":"Résidence Clément Thomas","distance":73.90398401931904,"sectionId":"19862-20455","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.581742359284271,44.803038507850836],[-0.581979099813943,44.802741259935196],[-0.5822066482409058,44.80246105612574]]}},{"type":"Feature","properties":{"name":"Avenue Eugène Et Marc Dulout","distance":8.297496953834068,"sectionId":"16602-as=126955","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6325905772401907,44.804402042115],[-0.6343271677684411,44.80376746507475]]}},{"type":"Feature","properties":{"name":"Rue Francis Plante","distance":116.10877413905617,"sectionId":"16336-16667","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6180171131666972,44.81246612657396],[-0.6186552030828344,44.813407648599856]]}},{"type":"Feature","properties":{"name":"Rue Edgar Degas","distance":96.15295971493049,"sectionId":"20445-20444","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5840797735570805,44.794989943369195],[-0.5844236606875618,44.79478281654653],[-0.584230838390085,44.79425543008137]]}},{"type":"Feature","properties":{"name":"Voie 1 Faculté des Sciences","distance":256.6868902257629,"sectionId":"53587-57744","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5980661419872498,44.80799106177666],[-0.6000949198921345,44.80744522031754],[-0.6001726211701689,44.80739060327828],[-0.600184254021919,44.80727700151726],[-0.600137809708099,44.80714523969952],[-0.6003041573304841,44.80685873719832],[-0.600306549408043,44.806789658363755],[-0.6002766793537899,44.806733069436376]]}},{"type":"Feature","properties":{"name":"Voie 1 Faculté des Sciences","distance":9.826716204293039,"sectionId":"53587-53588","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6002766793537899,44.806733069436376],[-0.6002329645957412,44.806650251454165]]}},{"type":"Feature","properties":{"name":"Voie 1 Faculté des Sciences","distance":125.8361127275229,"sectionId":"53588-57743","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6002329645957412,44.806650251454165],[-0.6001973295634049,44.80657255031752],[-0.6001536528787481,44.80652470489435],[-0.6001142908939995,44.80650063376368],[-0.6000701011779578,44.80648427779792],[-0.6000239709706738,44.806475164866164],[-0.5999641946606086,44.806472504461425],[-0.5990734619459711,44.806711467022254],[-0.5990160386491407,44.8067127043345],[-0.5989766255742842,44.80669367847544],[-0.5989634588475646,44.80667510042032],[-0.5989344322699931,44.8066063743094]]}},{"type":"Feature","properties":{"name":"Voie 1 Faculté des Sciences","distance":9.826716204293039,"sectionId":"53588-53587","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6002766793537899,44.806733069436376],[-0.6002329645957412,44.806650251454165]]}},{"type":"Feature","properties":{"name":"Chemin de Leysotte","distance":117.44808001109698,"sectionId":"20135-20136","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5806814180138815,44.79511636493524],[-0.5806043656541814,44.795242563083505],[-0.5799400704288935,44.796031422002244]]}},{"type":"Feature","properties":{"name":"Avenue Hector Domecq","distance":250.22726959968978,"sectionId":"16870-16869","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6246231752046867,44.811427684732095],[-0.6255499929281934,44.81358177457588]]}},{"type":"Feature","properties":{"name":"Avenue de la Paillère","distance":37.993026986657206,"sectionId":"17210-17209","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6085877055614487,44.79609131192823],[-0.6081092980994777,44.79606018908337]]}},{"type":"Feature","properties":{"name":"Rue du Relais","distance":59.607783028044814,"sectionId":"17210-17557","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6083034349545852,44.79554163781109],[-0.6081092980994777,44.79606018908337]]}},{"type":"Feature","properties":{"name":"Avenue de la Paillère","distance":144.5297094211631,"sectionId":"17210-15975","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6081092980994777,44.79606018908337],[-0.6073937712994234,44.79600433658666],[-0.6063096567689085,44.795842520704404]]}},{"type":"Feature","properties":{"name":"Avenue de la Paillère","distance":144.5297094211631,"sectionId":"15975-17210","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6081092980994777,44.79606018908337],[-0.6073937712994234,44.79600433658666],[-0.6063096567689085,44.795842520704404]]}},{"type":"Feature","properties":{"name":"Rue Auguste Renoir","distance":34.32542775660573,"sectionId":"15975-15976","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6063096567689085,44.795842520704404],[-0.6062165705893053,44.79614436735729]]}},{"type":"Feature","properties":{"name":"Avenue de la Paillère","distance":79.53685692033753,"sectionId":"15975-as=128440","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6063096567689085,44.795842520704404],[-0.6053275826400447,44.7956882415242]]}},{"type":"Feature","properties":{"name":"Avenue de Candau","distance":55.36448802283957,"sectionId":"24401-16030","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6198157907617171,44.80774853275552],[-0.6191155935746175,44.80774793270232]]}},{"type":"Feature","properties":{"name":"Impasse Candau","distance":70.77973540433364,"sectionId":"24401-24402","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6191155935746175,44.80774793270232],[-0.6193821098394551,44.807139587390644]]}},{"type":"Feature","properties":{"name":"Avenue de Candau","distance":11.023824111941686,"sectionId":"24401-as=4007","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6191155935746175,44.80774793270232],[-0.6189762294657988,44.80774515046019]]}},{"type":"Feature","properties":{"name":"Rue Graham Bell","distance":23.44648192640334,"sectionId":"28444-28442","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6184440781769963,44.80100764276105],[-0.6184499042469171,44.800943227963295],[-0.6184777365899734,44.80079802889875]]}},{"type":"Feature","properties":{"name":"Rue Chateaubriand","distance":11.927777421518083,"sectionId":"57261-16375","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6276774713309989,44.806494623383934],[-0.6276840654164638,44.80648388856143],[-0.6276878142604473,44.806475412319465],[-0.6276904398259062,44.806463691563344],[-0.6276902463456826,44.806451538755084],[-0.627687401165344,44.80644029034312],[-0.6276831877805137,44.80643121913035],[-0.6276725314982629,44.80641760560021],[-0.6276611944043453,44.806408075452836],[-0.6276472320417161,44.80639863800813]]}},{"type":"Feature","properties":{"name":"Rue Chateaubriand","distance":8.100474640385087,"sectionId":"57261-22796","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6275920194000862,44.80652960157727],[-0.6276184584627973,44.80652674852308],[-0.6276386435663601,44.8065206495224],[-0.6276562573550565,44.80651214417997],[-0.6276774713309989,44.806494623383934]]}},{"type":"Feature","properties":{"name":"Rue Chateaubriand","distance":53.80320351523915,"sectionId":"57261-15823","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.628077623263275,44.80687588042583],[-0.6280748824696294,44.80684652016259],[-0.6280619371304181,44.806819406628655],[-0.6277380396005221,44.806568765394],[-0.6276774713309989,44.806494623383934]]}},{"type":"Feature","properties":{"name":"Rue Clément Thomas","distance":83.91328747504457,"sectionId":"19796-19793","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.581043175686349,44.80386170890745],[-0.5809750774084989,44.803755394867444],[-0.5808904299093264,44.803669870160576],[-0.5804100776007701,44.8032597179412]]}},{"type":"Feature","properties":{"name":"Rond-point Crespy","distance":11.476779735154537,"sectionId":"19812-58723","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5862094348735556,44.806745356618016],[-0.586200048323218,44.80676612222467],[-0.5861811951663501,44.80678973251775],[-0.586155438948151,44.80680977701848],[-0.5861240457568794,44.80682526250225]]}},{"type":"Feature","properties":{"name":"Rond-point Crespy","distance":9.13809684300382,"sectionId":"19812-19813","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5861240457568794,44.80682526250225],[-0.5860886343059274,44.80683532250555],[-0.5860509488432163,44.806839555403144],[-0.5860118123630705,44.80683708913506]]}},{"type":"Feature","properties":{"name":"Rue Lamartine","distance":202.71707219923437,"sectionId":"19812-19599","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5861563400219824,44.80864203725283],[-0.5862044440575361,44.80717469710045],[-0.5861920048825989,44.80707162915579],[-0.5861557287428911,44.806995828290184],[-0.5861258770579253,44.80692828887539],[-0.5861240457568794,44.80682526250225]]}},{"type":"Feature","properties":{"name":"Avenue Jean Jaurès","distance":34.890826003994604,"sectionId":"15808-16460","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6290203614854815,44.80660240666163],[-0.6294283912792256,44.80648281815557]]}},{"type":"Feature","properties":{"name":"Rue Adrien Ducourt","distance":108.57421027281528,"sectionId":"15808-34718","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6292068035750316,44.805857500152804],[-0.6288126939101333,44.80598105799353],[-0.628784496817115,44.80598943456038],[-0.6287643105293776,44.80600043822628],[-0.628760187260216,44.80601534352154],[-0.6287655184404249,44.80602967693025],[-0.6289597013617284,44.80649110669704],[-0.6290203614854815,44.80660240666163]]}},{"type":"Feature","properties":{"name":"Avenue Jean Jaurès","distance":80.49469412119308,"sectionId":"15808-15823","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.628077623263275,44.80687588042583],[-0.6283175187347362,44.80680688869197],[-0.6290203614854815,44.80660240666163]]}},{"type":"Feature","properties":{"name":"Avenue Roger Cohé","distance":38.86964309877126,"sectionId":"17388-as=125501","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.633654882118616,44.811401236942395],[-0.6346531266442413,44.81261582828942]]}},{"type":"Feature","properties":{"name":"Rue de la Ramée","distance":47.69649609562168,"sectionId":"17371-as=125432","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6314036276194981,44.793369300565004],[-0.6314036276194981,44.793369300565004]]}},{"type":"Feature","properties":{"name":"Esplanade des Antilles","distance":158.56586929686023,"sectionId":"15880-15882","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6214063507691692,44.793851257111],[-0.6232763658724012,44.79333649635493]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":21.73599211056958,"sectionId":"15880-15873","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6232295293179418,44.79352932641312],[-0.6232763658724012,44.79333649635493]]}},{"type":"Feature","properties":{"name":"Avenue du Maréchal Lyautey","distance":6.097623169827376,"sectionId":"16726-17126","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6324882849617394,44.79416964742149],[-0.6324854611337549,44.794114786306004]]}},{"type":"Feature","properties":{"name":"Avenue du Maréchal Lyautey","distance":4.458515990870914,"sectionId":"16726-30143","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6324854611337549,44.794114786306004],[-0.6324821773750492,44.79407471367852]]}},{"type":"Feature","properties":{"name":"Rue Edgar Degas","distance":59.32593569894702,"sectionId":"17643-15982","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6062731049713567,44.796886388278814],[-0.6064614523655365,44.79674421021824],[-0.6065516739068227,44.7967383762709],[-0.6067464333318602,44.796872638699845],[-0.6066713039284501,44.79693366533655]]}},{"type":"Feature","properties":{"name":"Rue Edgar Degas","distance":94.19150816619624,"sectionId":"20524-20444","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5840797735570805,44.794989943369195],[-0.5838780242684416,44.79482568689926],[-0.5835818955947589,44.79467359260721],[-0.5837163456751022,44.79452450428282],[-0.5837273810790584,44.79445983817431],[-0.5836897762684092,44.794335179095135]]}},{"type":"Feature","properties":{"name":"Voie 1 Faculté des Sciences","distance":64.48583899542464,"sectionId":"27615-20530","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5977172695857862,44.80742792452227],[-0.5974342271774864,44.806883431617564]]}},{"type":"Feature","properties":{"name":"Voie 2 Faculté des Sciences","distance":108.7059924381715,"sectionId":"27615-20534","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5986420259585337,44.80668658521703],[-0.5986085122932912,44.80660098221495],[-0.5985102987368742,44.80659255893835],[-0.5974342271774864,44.806883431617564]]}},{"type":"Feature","properties":{"name":"Voie 2 Faculté des Sciences","distance":208.14407121200617,"sectionId":"27615-20536","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5974342271774864,44.806883431617564],[-0.5958860300252984,44.80730270564037],[-0.5953256108039215,44.80773119586228],[-0.5952249709914197,44.80781373927588]]}},{"type":"Feature","properties":{"name":"Rue Robespierre","distance":87.31619990921129,"sectionId":"19648-20334","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.580958284944962,44.80802947790924],[-0.5803759554584518,44.80790331877033],[-0.5802005205473478,44.80789028403128],[-0.5800638644317188,44.807898548845024],[-0.5798826958981265,44.80791136727445]]}},{"type":"Feature","properties":{"name":"Rue du Docteur Dupeux","distance":163.2595424852332,"sectionId":"19838-19839","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5974384797343806,44.80592283083548],[-0.5973690746633866,44.80445380231567]]}},{"type":"Feature","properties":{"name":"Avenue Roul","distance":84.13299478160604,"sectionId":"19838-20195","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5963748769008166,44.80593403532045],[-0.5966193334440264,44.805927746919046],[-0.5970339972000122,44.805931839752795],[-0.5974384797343806,44.80592283083548]]}},{"type":"Feature","properties":{"name":"Avenue Roul","distance":67.66794171046003,"sectionId":"19838-as=2846","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5974384797343806,44.80592283083548],[-0.5982942181184648,44.80592826231086]]}},{"type":"Feature","properties":{"name":"Avenue de Saige","distance":356.58829244345793,"sectionId":"17127-23684","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6312288707516215,44.79381052774058],[-0.6312674803386352,44.79377875633229],[-0.6313436484821172,44.793702545180565],[-0.6334080384075472,44.79128477499163],[-0.6335081160316466,44.79105006073519]]}},{"type":"Feature","properties":{"name":"Avenue de Saige","distance":18.548893534687696,"sectionId":"17127-17128","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6312288707516215,44.79381052774058],[-0.6311403000456135,44.793880648788274],[-0.6310763088773275,44.79393728305864]]}},{"type":"Feature","properties":{"name":"Avenue du Maréchal Lyautey","distance":59.55041810076342,"sectionId":"17127-26547","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6319064118916216,44.794038513165184],[-0.6313033925421753,44.79385481159717],[-0.6312288707516215,44.79381052774058]]}},{"type":"Feature","properties":{"name":"Avenue de Saige","distance":356.58829244345793,"sectionId":"23684-17127","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6312288707516215,44.79381052774058],[-0.6312674803386352,44.79377875633229],[-0.6313436484821172,44.793702545180565],[-0.6334080384075472,44.79128477499163],[-0.6335081160316466,44.79105006073519]]}},{"type":"Feature","properties":{"name":"Rond-point de la Médaille Militaire","distance":8.217273546333542,"sectionId":"17128-23693","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6311241504282005,44.7940018771171],[-0.6311207102705464,44.79399144713084],[-0.63111011012968,44.793971786946905],[-0.6311077542307001,44.79396852906377],[-0.6310951758557466,44.79395361641694],[-0.6310763088773275,44.79393728305864]]}},{"type":"Feature","properties":{"name":"Avenue de Saige","distance":18.548893534687696,"sectionId":"17128-17127","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6312288707516215,44.79381052774058],[-0.6311403000456135,44.793880648788274],[-0.6310763088773275,44.79393728305864]]}},{"type":"Feature","properties":{"name":"Rond-point de la Médaille Militaire","distance":69.30273235865262,"sectionId":"17128-17122","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6310763088773275,44.79393728305864],[-0.6310541857856857,44.793923485938],[-0.6310291910194082,44.793912302861],[-0.6310018579217356,44.793904167217434],[-0.6309732078862519,44.79389922655864],[-0.6309436310068466,44.79389764859816],[-0.6309142636098519,44.793899397050225],[-0.6308854901317049,44.79390454972601],[-0.6308584355721827,44.79391289053619],[-0.6304006651069844,44.794060830216736],[-0.6303726116505446,44.794069382964906],[-0.6303470346451828,44.79408109967004],[-0.6303242845628143,44.794095518726834],[-0.6303051019762096,44.794112346241484],[-0.6302978682609254,44.79412203599371]]}},{"type":"Feature","properties":{"name":"Résidence Clément Thomas","distance":73.90398401931904,"sectionId":"20455-19862","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.581742359284271,44.803038507850836],[-0.581979099813943,44.802741259935196],[-0.5822066482409058,44.80246105612574]]}},{"type":"Feature","properties":{"name":"Rue du Haut Carre","distance":176.1877883999633,"sectionId":"20054-19848","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5957016899524444,44.81082479978316],[-0.5958060278811761,44.81085014770082],[-0.5959376042354896,44.81087598569019],[-0.5968088279811378,44.81102716396431],[-0.5968638291658955,44.81104263051395],[-0.5969074745628412,44.81106268998081],[-0.5969620455177489,44.8111057352392],[-0.5969860945557242,44.811140286994984],[-0.597010833216417,44.811202111843194],[-0.5972166531379761,44.811713936264894]]}},{"type":"Feature","properties":{"name":"Rue du Haut Carre","distance":10.626337942777024,"sectionId":"20054-19847","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5972166531379761,44.811713936264894],[-0.5972536510442011,44.81180591126048]]}},{"type":"Feature","properties":{"name":"Rue Lamartine","distance":83.81537874627423,"sectionId":"20049-20107","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.586804278974005,44.813557993963954],[-0.5868288775389746,44.81361162768098],[-0.5868430232988615,44.813653880363304],[-0.5868851074284233,44.813860371809284],[-0.5869103158812776,44.814306111755855]]}},{"type":"Feature","properties":{"name":"Rue Gambetta","distance":19.257729856409963,"sectionId":"16713-35012","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6331285166762349,44.80531962325583],[-0.6330096504694444,44.80516829540005]]}},{"type":"Feature","properties":{"name":"Rue Gambetta","distance":67.10100677019945,"sectionId":"16713-16712","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.633397283165561,44.805887755899924],[-0.6333958559356109,44.805828976606094],[-0.6333763991174778,44.805763206203544],[-0.6333611761235757,44.805728469632705],[-0.6333332032594494,44.80567414168953],[-0.63320172125122,44.805471238509334],[-0.633171993686215,44.805401111792165],[-0.6331285166762349,44.80531962325583]]}},{"type":"Feature","properties":{"name":"Esplanade des Antilles","distance":146.73181283342635,"sectionId":"15873-15874","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6214998958983052,44.794007185475536],[-0.6232295293179418,44.79352932641312]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":53.91653228059629,"sectionId":"15873-16775","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6231370346267664,44.79401025740016],[-0.6232295293179418,44.79352932641312]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":21.73599211056958,"sectionId":"15873-15880","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6232295293179418,44.79352932641312],[-0.6232763658724012,44.79333649635493]]}},{"type":"Feature","properties":{"name":"Rue Auguste Renoir","distance":27.88406659025956,"sectionId":"15976-15977","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6062165705893053,44.79614436735729],[-0.6061403033668107,44.796389468898305]]}},{"type":"Feature","properties":{"name":"Rue Auguste Renoir","distance":34.32542775660573,"sectionId":"15976-15975","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6063096567689085,44.795842520704404],[-0.6062165705893053,44.79614436735729]]}},{"type":"Feature","properties":{"name":"Allée Edouard Manet","distance":75.29719914444225,"sectionId":"15976-16572","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6062165705893053,44.79614436735729],[-0.6067772826860622,44.79622918958117],[-0.6069505704167555,44.79628720187755],[-0.6069750399804364,44.7964194781173]]}},{"type":"Feature","properties":{"name":"Allée Edouard Manet","distance":75.29719914444225,"sectionId":"16572-15976","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6062165705893053,44.79614436735729],[-0.6067772826860622,44.79622918958117],[-0.6069505704167555,44.79628720187755],[-0.6069750399804364,44.7964194781173]]}},{"type":"Feature","properties":{"name":"Rue Edmond Michelet","distance":53.526586463421125,"sectionId":"19859-19550","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.58038085195626,44.79839272485266],[-0.5802604971016735,44.79855514735146],[-0.5801201979851714,44.79874684345496],[-0.5800742667089831,44.79882215617057]]}},{"type":"Feature","properties":{"name":"Avenue Roger Cohé","distance":32.76940641056105,"sectionId":"35397-27887","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6319839823463206,44.80700867766565],[-0.6321437358089756,44.80698348760759],[-0.6321551389995546,44.80697970027553],[-0.6321645022481974,44.80697165405251],[-0.6321691078827614,44.80696240849734],[-0.6321689445737956,44.80695178380184],[-0.6321219936157869,44.80681716620748]]}},{"type":"Feature","properties":{"name":"Rue de Suzon","distance":99.70263831911069,"sectionId":"20193-19723","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5822195256664939,44.81197586969005],[-0.5820505428775261,44.81195894088225],[-0.5819462040872896,44.81195997437604],[-0.5814038097285079,44.81206172884313],[-0.5812389422249887,44.812088628990395],[-0.5809830832725752,44.812082901277265]]}},{"type":"Feature","properties":{"name":"Impasse Suzon","distance":58.719482047683194,"sectionId":"20194-19914","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5817200878902408,44.8104187744898],[-0.5812918061196057,44.810424061772686],[-0.5809781861309301,44.81040916286215]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":20.073356934828386,"sectionId":"59024-38841","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5917228175241306,44.80668043065457],[-0.5917093553724799,44.80668234980004],[-0.5916813407291034,44.80669151141458],[-0.5916256576879978,44.806721440014826],[-0.5916010487437976,44.80673593325577],[-0.5915833878840339,44.806753594050186],[-0.5915727415861389,44.80677438339978],[-0.5915698063875107,44.806796070418244],[-0.5915715782126126,44.806807000539166]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":11.677950190821043,"sectionId":"59024-59023","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5918490500224921,44.80672087229625],[-0.5918265519465282,44.806700934867294],[-0.5918009511338614,44.80668781444307],[-0.5917711448063439,44.806680296953935],[-0.591740451227781,44.80667862393789],[-0.5917228175241306,44.80668043065457]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":"Unknown","sectionId":"59024-as=124756","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.59177833957402,44.80660004681237],[-0.5917228175241306,44.80668043065457]]}},{"type":"Feature","properties":{"name":"Rue du Pont de Chiquet","distance":16.02069916425035,"sectionId":"54608-54609","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6243411479644546,44.807293675486406],[-0.6242393931306023,44.80716894678864]]}},{"type":"Feature","properties":{"name":"Rue du Pont de Chiquet","distance":155.43629871840645,"sectionId":"54608-16952","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6261384776787635,44.80778442185393],[-0.6249092925072115,44.80740696481559],[-0.6248520460804974,44.807394105576876],[-0.6247876652228975,44.807386518354136],[-0.624455380481736,44.80737467638733],[-0.62441545453202,44.807365589021266],[-0.6243864593343019,44.80734921690008],[-0.6243411479644546,44.807293675486406]]}},{"type":"Feature","properties":{"name":"Place du Cardinal","distance":33.73328729303415,"sectionId":"16254-57282","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6260456600254464,44.80406568709261],[-0.6256255858329896,44.804118601845786]]}},{"type":"Feature","properties":{"name":"Avenue de Gradignan","distance":16.728672044395452,"sectionId":"16254-57281","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6256255858329896,44.804118601845786],[-0.6256309069148038,44.80426916582181]]}},{"type":"Feature","properties":{"name":"Avenue de Gradignan","distance":19.69989504871931,"sectionId":"16254-as=125253","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6256572364531846,44.80357776485027],[-0.6256255858329896,44.804118601845786]]}},{"type":"Feature","properties":{"name":"Passage Françoise Dolto","distance":69.17021986131952,"sectionId":"31678-as=125502","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6319981444093928,44.810183684844965],[-0.632822504502535,44.809975210079436]]}},{"type":"Feature","properties":{"name":"Passage Françoise Dolto","distance":69.17021986131952,"sectionId":"31677-as=125502","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.632822504502535,44.809975210079436],[-0.632822504502535,44.809975210079436]]}},{"type":"Feature","properties":{"name":"Rue du Bas-Brion","distance":108.65142573083772,"sectionId":"16019-16018","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6193323930943462,44.811126185161505],[-0.6192838733498268,44.81108304764549],[-0.6184989583193068,44.81034843710847]]}},{"type":"Feature","properties":{"name":"Rue du Bas-Brion","distance":139.51796715911942,"sectionId":"16019-16020","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6177472367798235,44.8092290114272],[-0.6178290677973141,44.80954485299855],[-0.6179463556914555,44.80970984842017],[-0.6184989583193068,44.81034843710847]]}},{"type":"Feature","properties":{"name":"Rue du Chêne Vert","distance":84.66684574732206,"sectionId":"16019-16261","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6175045797927119,44.81063130724919],[-0.6184989583193068,44.81034843710847]]}},{"type":"Feature","properties":{"name":"Rue du Chêne Vert","distance":144.56465982821655,"sectionId":"19846-16261","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6175045797927119,44.81063130724919],[-0.6160376727461415,44.81109395275266],[-0.6158251967616085,44.81114439730288]]}},{"type":"Feature","properties":{"name":"Avenue Bougnard","distance":138.07569673176107,"sectionId":"15931-16133","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6322105865270966,44.79718597537696],[-0.6322505699848869,44.79705749959577],[-0.6327736574192151,44.79601022880757]]}},{"type":"Feature","properties":{"name":"Rue Paul Doumer","distance":45.74990410621882,"sectionId":"17251-17232","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6112758976534942,44.812906173888436],[-0.610887609474551,44.81260077766566]]}},{"type":"Feature","properties":{"name":"Avenue de Gradignan","distance":14.074580431265884,"sectionId":"57281-22272","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6254961069676005,44.80434026530025],[-0.6255111828394053,44.804318929105925],[-0.6255265575605203,44.80430387726369],[-0.6255408110952814,44.80429388318724],[-0.6255568796378143,44.80428539862231],[-0.6255725350617136,44.804279270471646],[-0.6255900706352978,44.804274329765185],[-0.6256127082144118,44.80427048785866],[-0.6256309069148038,44.80426916582181]]}},{"type":"Feature","properties":{"name":"Place du Cardinal","distance":40.30655702708203,"sectionId":"57281-57282","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6260456600254464,44.80406568709261],[-0.6258774818792617,44.804124254980074],[-0.625843488718329,44.80413950309265],[-0.625806609998064,44.80415991928146],[-0.6257720261608137,44.80418312606181],[-0.6257178324680197,44.80422772977319],[-0.6256920152543619,44.80424470067365],[-0.6256309069148038,44.80426916582181]]}},{"type":"Feature","properties":{"name":"Avenue de Gradignan","distance":11.097661212943857,"sectionId":"57281-16255","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6256309069148038,44.80426916582181],[-0.6256426564041526,44.80426953318824],[-0.6256692271731027,44.80427252168953],[-0.6256910946650486,44.804277771560514],[-0.6257044756993364,44.80428257653887],[-0.6257172027943432,44.80428826028153],[-0.6257371603933585,44.804300564940576],[-0.6257521823861885,44.80431219554282]]}},{"type":"Feature","properties":{"name":"Avenue de Gradignan","distance":16.728672044395452,"sectionId":"57281-16254","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6256255858329896,44.804118601845786],[-0.6256309069148038,44.80426916582181]]}},{"type":"Feature","properties":{"name":"Avenue du Maréchal Lyautey","distance":59.55041810076342,"sectionId":"26547-17127","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6319064118916216,44.794038513165184],[-0.6313033925421753,44.79385481159717],[-0.6312288707516215,44.79381052774058]]}},{"type":"Feature","properties":{"name":"Allée René Laroumagne","distance":66.23232471137628,"sectionId":"20521-20520","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6021666254435213,44.80564680328958],[-0.6018719681467807,44.80508861502246]]}},{"type":"Feature","properties":{"name":"Parking Eglise Notre Dame","distance":16.272237569613658,"sectionId":"20543-20542","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5921025824436333,44.81289446071338],[-0.5920974094795683,44.81304091711586]]}},{"type":"Feature","properties":{"name":"Rond-point de la Médaille Militaire","distance":10.748588668661977,"sectionId":"17122-26551","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6302978682609254,44.79412203599371],[-0.6302899692820373,44.79413120648],[-0.6302793575573499,44.79415154390092],[-0.6302733591019212,44.794172815055575],[-0.6302723187342687,44.794194468432394],[-0.6302761572107939,44.79421524538567]]}},{"type":"Feature","properties":{"name":"Rond-point de la Médaille Militaire","distance":69.30273235865262,"sectionId":"17122-17128","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6310763088773275,44.79393728305864],[-0.6310541857856857,44.793923485938],[-0.6310291910194082,44.793912302861],[-0.6310018579217356,44.793904167217434],[-0.6309732078862519,44.79389922655864],[-0.6309436310068466,44.79389764859816],[-0.6309142636098519,44.793899397050225],[-0.6308854901317049,44.79390454972601],[-0.6308584355721827,44.79391289053619],[-0.6304006651069844,44.794060830216736],[-0.6303726116505446,44.794069382964906],[-0.6303470346451828,44.79408109967004],[-0.6303242845628143,44.794095518726834],[-0.6303051019762096,44.794112346241484],[-0.6302978682609254,44.79412203599371]]}},{"type":"Feature","properties":{"name":"Résidence Michel Montaigne","distance":50.56254232387431,"sectionId":"20452-20450","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.582654089070662,44.80271207266947],[-0.5825764361023581,44.8026780356692],[-0.5823824907116107,44.802592892016165],[-0.5822225659064574,44.802790523505124]]}},{"type":"Feature","properties":{"name":"Résidence le Prado","distance":63.512063082665755,"sectionId":"20443-19584","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5846472686524727,44.79564658849234],[-0.5852664622881532,44.795726519264385],[-0.5853450185170811,44.795716205499474],[-0.5853964467092139,44.7956602647751]]}},{"type":"Feature","properties":{"name":"Résidence Antheor","distance":145.66992478621307,"sectionId":"17735-16545","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6318755916354046,44.80876490225784],[-0.6316810128686386,44.80893840083794],[-0.6316642469017522,44.80896352905602],[-0.6316701914566658,44.80899360746052],[-0.6317489890832049,44.809300259656155],[-0.6317338025877063,44.809466949392714],[-0.6317279396063193,44.80958478620214],[-0.6318210605368292,44.810014305949]]}},{"type":"Feature","properties":{"name":"Avenue de la Marne","distance":84.67000126342548,"sectionId":"25664-20513","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5959392521576963,44.79447186994839],[-0.5959390680250395,44.794393864488775],[-0.5959447113890358,44.794376840644354],[-0.595963724452301,44.79436119567471],[-0.5960224204527539,44.79434285452892],[-0.5965393705192873,44.794300652609074],[-0.59683847161794,44.79421390194165]]}},{"type":"Feature","properties":{"name":"Impasse Candau","distance":70.77973540433364,"sectionId":"24402-24401","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6191155935746175,44.80774793270232],[-0.6193821098394551,44.807139587390644]]}},{"type":"Feature","properties":{"name":"Rue Camille Saint-Saëns","distance":94.93605559858712,"sectionId":"19581-19748","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5836461685000797,44.794846686020186],[-0.583580832285504,44.79489666840283],[-0.5828446280968299,44.7953684722123],[-0.5827995422326325,44.79544303896483]]}},{"type":"Feature","properties":{"name":"Rue d'Alembert","distance":36.78571522459203,"sectionId":"19581-19582","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5836461685000797,44.794846686020186],[-0.5837668100483687,44.794906932276966],[-0.5839761420156613,44.795077165607054]]}},{"type":"Feature","properties":{"name":"Passage Joguet","distance":47.4522032486924,"sectionId":"20099-20098","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.587769795632363,44.81130198763022],[-0.5883677434567133,44.811338707097136]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":6.954320687237656,"sectionId":"59023-29241","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5918630512275317,44.806781595907665],[-0.591864857049954,44.80676016103547],[-0.5918592053241648,44.8067376343106],[-0.5918490500224921,44.80672087229625]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":11.677950190821043,"sectionId":"59023-59024","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5918490500224921,44.80672087229625],[-0.5918265519465282,44.806700934867294],[-0.5918009511338614,44.80668781444307],[-0.5917711448063439,44.806680296953935],[-0.591740451227781,44.80667862393789],[-0.5917228175241306,44.80668043065457]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":104.50514211484835,"sectionId":"59023-as=1608","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5918490500224921,44.80672087229625],[-0.5918412828058065,44.806614135599126],[-0.5919700774147114,44.80629257444009],[-0.5921660507144769,44.80581282433813],[-0.5921660507144769,44.80581282433813]]}},{"type":"Feature","properties":{"name":"Place Bitaly","distance":85.7824870823579,"sectionId":"33320-33319","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6309221672473588,44.79752646843733],[-0.6320032309721466,44.79746330061289]]}},{"type":"Feature","properties":{"name":"Place Bitaly","distance":85.7824870823579,"sectionId":"33319-33320","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6309221672473588,44.79752646843733],[-0.6320032309721466,44.79746330061289]]}},{"type":"Feature","properties":{"name":"Allée Jeanne Chanay","distance":11.31495893500349,"sectionId":"24281-as=2791","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6225458868614242,44.796423242951676],[-0.6225458868614242,44.796423242951676]]}},{"type":"Feature","properties":{"name":"Avenue de Gradignan","distance":11.364577307353548,"sectionId":"25024-57283","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6257186658929844,44.80445471683499],[-0.6256929405630863,44.804464628936145],[-0.6256731164123094,44.80447004616434],[-0.6256533803629942,44.8044725894132],[-0.6256292429478596,44.80447355026168],[-0.6256116815454894,44.80447219595927],[-0.6255972920101133,44.80446997489925],[-0.6255814707323305,44.80446636389337]]}},{"type":"Feature","properties":{"name":"Avenue de Gradignan","distance":17.65980251588187,"sectionId":"25024-16255","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6257521823861885,44.80431219554282],[-0.6257664823442374,44.804332265321975],[-0.6257750286646305,44.80435272191227],[-0.6257773155487234,44.80436687117453],[-0.6257768141566817,44.804381109323394],[-0.6257708702113112,44.80440202784385],[-0.6257589470606139,44.804421609435856],[-0.6257479237046967,44.804433494912594],[-0.6257186658929844,44.80445471683499]]}},{"type":"Feature","properties":{"name":"Rue Chateaubriand","distance":26.6119113980076,"sectionId":"25024-57284","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.6257186658929844,44.80445471683499],[-0.6257009824525093,44.80452409285669],[-0.6256986116441727,44.804580443310535],[-0.6256970738426726,44.80463293898663],[-0.625695584062968,44.80466054968195],[-0.6256792607284879,44.804690975514546]]}},{"type":"Feature","properties":{"name":"Place Peydavant","distance":25.568717288314957,"sectionId":"59311-20228","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5849821415010599,44.80208259314067],[-0.5852927989512563,44.80214642503167]]}},{"type":"Feature","properties":{"name":"Rue Blumerel","distance":79.61806735510142,"sectionId":"19690-22360","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5842133684977429,44.80200895198547],[-0.584341590760821,44.80194411950809],[-0.5844760048016592,44.801872033368106],[-0.5845646978369996,44.80183098220742],[-0.5846658913618529,44.80179531144972],[-0.584750823944423,44.80177531110105],[-0.5848536747407324,44.80176629484492],[-0.5849531948594707,44.801768932415065],[-0.5850656636308562,44.80178415428938],[-0.5851201875665865,44.80179119926634]]}},{"type":"Feature","properties":{"name":"Résidence Santillane","distance":95.57981284617065,"sectionId":"59321-20387","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5910668377371494,44.803253624036394],[-0.5907270103192183,44.804079438664374]]}},{"type":"Feature","properties":{"name":"Résidence Santillane","distance":47.186477107858714,"sectionId":"59321-59328","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5907270103192183,44.804079438664374],[-0.5901538950581474,44.80396110844472]]}},{"type":"Feature","properties":{"name":"Résidence Santillane","distance":47.186477107858714,"sectionId":"59328-59321","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5907270103192183,44.804079438664374],[-0.5901538950581474,44.80396110844472]]}},{"type":"Feature","properties":{"name":"Résidence Santillane","distance":33.768900458387925,"sectionId":"59328-59325","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5901538950581474,44.80396110844472],[-0.5901096215239574,44.80409676265784],[-0.590060846646444,44.80425782228568]]}},{"type":"Feature","properties":{"name":"Résidence Santillane","distance":16.391885765099623,"sectionId":"59328-59326","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5901538950581474,44.80396110844472],[-0.590171096602116,44.80381403797354]]}},{"type":"Feature","properties":{"name":"Résidence Santillane","distance":33.768900458387925,"sectionId":"59325-59328","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5901538950581474,44.80396110844472],[-0.5901096215239574,44.80409676265784],[-0.590060846646444,44.80425782228568]]}},{"type":"Feature","properties":{"name":"Place Peydavant","distance":33.07993998255419,"sectionId":"59312-20228","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5849821415010599,44.80208259314067],[-0.5845809853481179,44.80199815396006]]}},{"type":"Feature","properties":{"name":"Résidence Santillane","distance":79.60858858184373,"sectionId":"59326-59322","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5905249464257029,44.80314674222542],[-0.5904664136725409,44.80331388463563],[-0.5903815669251798,44.80351433914252],[-0.5902925021536,44.80364707653377],[-0.5902159882306977,44.80375343248929],[-0.590171096602116,44.80381403797354]]}},{"type":"Feature","properties":{"name":"Résidence Santillane","distance":16.391885765099623,"sectionId":"59326-59328","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5901538950581474,44.80396110844472],[-0.590171096602116,44.80381403797354]]}},{"type":"Feature","properties":{"name":"Résidence Santillane","distance":21.764423905133356,"sectionId":"59326-59327","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.590171096602116,44.80381403797354],[-0.5899055471763629,44.80376250960788]]}},{"type":"Feature","properties":{"name":"Résidence Santillane","distance":21.764423905133356,"sectionId":"59327-59326","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.590171096602116,44.80381403797354],[-0.5899055471763629,44.80376250960788]]}},{"type":"Feature","properties":{"name":"Résidence Santillane","distance":36.21930856547054,"sectionId":"59327-59324","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5899055471763629,44.80376250960788],[-0.5900176331889045,44.803482518418],[-0.5899712909915953,44.80347098858278]]}},{"type":"Feature","properties":{"name":"Résidence Santillane","distance":45.7758619073027,"sectionId":"59327-59323","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5899055471763629,44.80376250960788],[-0.5897418357629141,44.80415781513457]]}},{"type":"Feature","properties":{"name":"Résidence Santillane","distance":36.21930856547054,"sectionId":"59324-59327","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5899055471763629,44.80376250960788],[-0.5900176331889045,44.803482518418],[-0.5899712909915953,44.80347098858278]]}},{"type":"Feature","properties":{"name":"Résidence Santillane","distance":45.7758619073027,"sectionId":"59323-59327","stroke":"#5a5a5a"},"geometry":{"type":"LineString","coordinates":[[-0.5899055471763629,44.80376250960788],[-0.5897418357629141,44.80415781513457]]}},{"type":"Feature","properties":{"name":"Rue Maurice Berteaux","distance":92.4473378481852,"sectionId":"as=129212-20098","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.587769795632363,44.81130198763022],[-0.5878775393091816,44.81047320487493]]}},{"type":"Feature","properties":{"name":"Rue Maurice Berteaux","distance":92.4473378481852,"sectionId":"as=129212-20198","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5878775393091816,44.81047320487493],[-0.5878802718810091,44.8104521851498]]}},{"type":"Feature","properties":{"name":"Rue de Suzon","distance":54.49078689022828,"sectionId":"as=129213-20296","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5887035242411404,44.810498010601194],[-0.5885996266639701,44.81047966877779],[-0.5880578329857499,44.81046261899177],[-0.5880181543569623,44.810460287421996]]}},{"type":"Feature","properties":{"name":"Rue de Suzon","distance":3.147900149868857,"sectionId":"as=129213-20198","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5880181543569623,44.810460287421996],[-0.5878802718810091,44.8104521851498]]}},{"type":"Feature","properties":{"name":"Rue Ambroise Pare","distance":79.18251176762708,"sectionId":"as=129242-19598","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5850959289495298,44.808524217323345],[-0.5860853898792252,44.808634154471086]]}},{"type":"Feature","properties":{"name":"Rue Ambroise Pare","distance":79.18251176762708,"sectionId":"as=129242-19599","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5860853898792252,44.808634154471086],[-0.5861563400219824,44.80864203725283]]}},{"type":"Feature","properties":{"name":"Rue Chateaubriand","distance":13.899623907224552,"sectionId":"as=129224-16376","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.626032587655328,44.80521828645975],[-0.6264257207198175,44.80572872752301]]}},{"type":"Feature","properties":{"name":"Rue Chateaubriand","distance":13.899623907224552,"sectionId":"as=129224-16039","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6259480769330436,44.805108556981914],[-0.626032587655328,44.80521828645975]]}},{"type":"Feature","properties":{"name":"Impasse Roul","distance":57.28443135316896,"sectionId":"as=129186-20348","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5943365232877257,44.806354562138054],[-0.5942781595498954,44.8063033480999],[-0.5941898322559428,44.806282988130604],[-0.5938749719654605,44.80632707823243],[-0.5936575716898786,44.80631475967341]]}},{"type":"Feature","properties":{"name":"Impasse Roul","distance":17.244597636034413,"sectionId":"as=129186-20418","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5936575716898786,44.80631475967341],[-0.5936575716898786,44.80631475967341]]}},{"type":"Feature","properties":{"name":"Rue de la Vieille Tour","distance":149.03986333512012,"sectionId":"as=128764-20232","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6001605108446603,44.810093998251546],[-0.6002637299224294,44.80892227291324],[-0.6002824056991044,44.80875498884317]]}},{"type":"Feature","properties":{"name":"Rue de la Vieille Tour","distance":18.639063547460367,"sectionId":"as=128764-20163","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6002824056991044,44.80875498884317],[-0.6003365168343558,44.808270294930296]]}},{"type":"Feature","properties":{"name":"Rue de Suzon","distance":28.773503461670344,"sectionId":"as=128738-20366","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5848766551679482,44.81088340802062],[-0.5849697393399184,44.81090229542672]]}},{"type":"Feature","properties":{"name":"Rue de Suzon","distance":28.773503461670344,"sectionId":"as=128738-20367","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5845266756419456,44.81081239400367],[-0.5848766551679482,44.81088340802062]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":108.3525881084446,"sectionId":"as=126002-16523","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6197420186573377,44.79791674542534],[-0.619674985431359,44.79806220178395],[-0.6196534263183395,44.79814603499814],[-0.6195621258338636,44.79854783037248],[-0.61954823353056,44.79862682528336],[-0.6195334642132676,44.798693867006456],[-0.6195059889727553,44.79877617687853],[-0.6194440544979725,44.798863817364484],[-0.6194440544979725,44.798863817364484]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":"Unknown","sectionId":"as=126002-16524","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6194440544979725,44.798863817364484],[-0.6193705422846755,44.79893633192673]]}},{"type":"Feature","properties":{"name":"Accès Maison de Retraite Mutualiste","distance":97.09281480881747,"sectionId":"as=126003-30017","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6107277124972792,44.80517572599702],[-0.6108150033848274,44.80530672801345],[-0.6108135071079033,44.805371725311815],[-0.610790529885136,44.8054048846083],[-0.610758030528832,44.80543753544147],[-0.6107024923740417,44.80546398125446],[-0.6100281494112885,44.805710327171916]]}},{"type":"Feature","properties":{"name":"Accès Maison de Retraite Mutualiste","distance":59.93277999103447,"sectionId":"as=126003-30018","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6100281494112885,44.805710327171916],[-0.6100281494112885,44.805710327171916]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":16.888184647908474,"sectionId":"as=126047-25955","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6035977134475037,44.807921114835146],[-0.6032483547232231,44.80789937519473]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":139.44414832145853,"sectionId":"as=126047-25956","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6053373108555657,44.807834712668125],[-0.6051873145541915,44.80787649092929],[-0.6048086836417823,44.8079348837127],[-0.6043747780243471,44.80796331771077],[-0.6038104886308437,44.80793435470706],[-0.6035977134475037,44.807921114835146]]}},{"type":"Feature","properties":{"name":"Rue du Bois Gentil","distance":13.862195185210712,"sectionId":"as=126024-19697","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.583594741220704,44.799262579054854],[-0.5836314252312519,44.79924007378001],[-0.58366202783672,44.79920929244566],[-0.5836843096349736,44.79917084611297],[-0.5836878231762777,44.79916011024313]]}},{"type":"Feature","properties":{"name":"Rue du Bois Gentil","distance":1.2243965021096705,"sectionId":"as=126024-19698","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5836878231762777,44.79916011024313],[-0.5838850510735177,44.79855745999362]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":"Unknown","sectionId":"as=126001-16515","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6102919756124691,44.80512001392482],[-0.610457696199699,44.805133490765726]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":208.86201113338512,"sectionId":"as=126001-16516","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6079458835492219,44.80595719005264],[-0.6082688621229223,44.805782183011985],[-0.6086387028655863,44.80560992209255],[-0.6090136710331437,44.80546704437491],[-0.6094089157991988,44.805352979001576],[-0.6102919756124691,44.80512001392482],[-0.6102919756124691,44.80512001392482]]}},{"type":"Feature","properties":{"name":"Rue Peydavant","distance":13.99979854709641,"sectionId":"as=128588-22359","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5852274849938373,44.80170782441463],[-0.5851741241733962,44.80158764319367]]}},{"type":"Feature","properties":{"name":"Rue Peydavant","distance":13.99979854709641,"sectionId":"as=128588-19689","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5851741241733962,44.80158764319367],[-0.5851495033491008,44.80153219107884]]}},{"type":"Feature","properties":{"name":"Rue Peydavant","distance":96.51838968797838,"sectionId":"as=128589-19995","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5859945919392777,44.80275327348517],[-0.5857791225853631,44.80255170517815],[-0.5857474342805559,44.80251622112827],[-0.5857175619396152,44.80247941867424],[-0.585631840212864,44.8023319549606],[-0.5854061515207823,44.8019969743337]]}},{"type":"Feature","properties":{"name":"Rue Peydavant","distance":41.265760812466624,"sectionId":"as=128589-22362","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5854061515207823,44.8019969743337],[-0.5853664302049465,44.80193801712926]]}},{"type":"Feature","properties":{"name":"Rue Peydavant","distance":86.66547231056929,"sectionId":"as=128590-19816","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5861456236711587,44.80662154869525],[-0.586211031012847,44.80655967750731],[-0.5864038006426242,44.80620662323543],[-0.5864346295520101,44.80611232650015],[-0.5864736482133087,44.80588680315619]]}},{"type":"Feature","properties":{"name":"Rue Peydavant","distance":25.23851171417042,"sectionId":"as=128590-20287","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5864736482133087,44.80588680315619],[-0.5864864687442536,44.80581270157772]]}},{"type":"Feature","properties":{"name":"Résidence Crespy II","distance":2.9376094501562036,"sectionId":"as=128591-20287","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5865689008012638,44.80581277243472],[-0.5864864687442536,44.80581270157772]]}},{"type":"Feature","properties":{"name":"Résidence Crespy II","distance":442.63792313643165,"sectionId":"as=128591-20040","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5898878302914718,44.80493116959223],[-0.5893099438875146,44.806364659315726],[-0.5892967260994052,44.80639624474574],[-0.5892766750127097,44.80642579376009],[-0.5892498553294387,44.80645231341251],[-0.5892168481120404,44.80647497462609],[-0.5891791576366742,44.806493549764134],[-0.5891380579988676,44.80650817878141],[-0.5890952693347523,44.80652006854119],[-0.5890509882544411,44.80652831202116],[-0.5890057591057982,44.806533522616334],[-0.5889598624619168,44.806536141881296],[-0.5875250355600304,44.80651961025519],[-0.5874793218971461,44.80651907028844],[-0.5874340494491475,44.806515453606394],[-0.5873893612969355,44.80650902594351],[-0.5873462006249638,44.80649867657264],[-0.5873054514693663,44.80648437761389],[-0.5872668132942509,44.80646739969259],[-0.5872321133087565,44.80644660420395],[-0.5872016544470632,44.80642279233301],[-0.5871764582144867,44.8063961120306],[-0.5871592214412641,44.806367198902755],[-0.5871470786250186,44.806336773896476],[-0.587138289684099,44.80630534229956],[-0.587132482301994,44.806240486421785],[-0.5871271698635787,44.80614291525641],[-0.5871227460915611,44.806077925660745],[-0.5871091648032141,44.806014215767746],[-0.5870953971215871,44.80598411224665],[-0.5870767545543621,44.80595497320072],[-0.5870508176364474,44.80592858648197],[-0.5870200082307858,44.80590523603547],[-0.5869841185172867,44.80588564906566],[-0.5869432715666157,44.805871803485914],[-0.586871380938855,44.80585524351578],[-0.586782444662698,44.80583723923063],[-0.5866938001752457,44.805819856248924],[-0.5866060516017306,44.80581280434881],[-0.5865689008012638,44.80581277243472]]}},{"type":"Feature","properties":{"name":"Avenue du Rond Point","distance":39.36168912296518,"sectionId":"as=124591-16183","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.617199029463869,44.805092888259615],[-0.6167260840569179,44.80520343908164]]}},{"type":"Feature","properties":{"name":"Avenue du Rond Point","distance":39.36168912296518,"sectionId":"as=124591-16292","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6167260840569179,44.80520343908164],[-0.6161900184432482,44.80532874127065]]}},{"type":"Feature","properties":{"name":"Rue de Suzon","distance":20.74240674914018,"sectionId":"as=124566-19933","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5823728634221069,44.811295159599865],[-0.5823728634221069,44.811295159599865]]}},{"type":"Feature","properties":{"name":"Rue de Suzon","distance":86.89080199938766,"sectionId":"as=124566-19841","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.582596396707485,44.81053449802052],[-0.5825102298295658,44.81067719844516],[-0.5824756769460262,44.81075854925551],[-0.5824512659663289,44.81083408567679],[-0.5824004241989866,44.8111094444553],[-0.5823728634221069,44.811295159599865]]}},{"type":"Feature","properties":{"name":"Avenue de la Paillère","distance":14.4582020421248,"sectionId":"as=124587-15980","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6048339085700761,44.795610684071555],[-0.6046553414757291,44.795582789032636]]}},{"type":"Feature","properties":{"name":"Avenue de la Paillère","distance":14.4582020421248,"sectionId":"as=124587-17057","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6046553414757291,44.795582789032636],[-0.6039887601312252,44.7954786555727]]}},{"type":"Feature","properties":{"name":"Rue du Général Chanzy","distance":17.508726536717763,"sectionId":"as=124551-19578","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5874301042376504,44.79893303199433],[-0.5873847952942227,44.79908733010081],[-0.5873847952942227,44.79908733010081]]}},{"type":"Feature","properties":{"name":"Rue du Général Chanzy","distance":"Unknown","sectionId":"as=124551-19992","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5873847952942227,44.79908733010081],[-0.5867477686237127,44.800852667230565]]}},{"type":"Feature","properties":{"name":"Avenue de Gradignan","distance":"Unknown","sectionId":"as=124854-15937","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6242505867429745,44.7998889472887],[-0.6243497290246917,44.79999677088432]]}},{"type":"Feature","properties":{"name":"Avenue de Gradignan","distance":230.2695236738108,"sectionId":"as=124854-16773","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6230278625711209,44.79802290803133],[-0.6232016659512233,44.79816727002914],[-0.6232568515883903,44.79824613668069],[-0.6233380145767139,44.79842831233607],[-0.62351715536543,44.7988306835563],[-0.6236262062981425,44.7990317888845],[-0.6237362428375728,44.799200252445544],[-0.6238378786593499,44.799355831389505],[-0.6242505867429745,44.7998889472887],[-0.6242505867429745,44.7998889472887]]}},{"type":"Feature","properties":{"name":"Avenue Jean Jaurès","distance":98.59625577629868,"sectionId":"as=124715-16949","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6149636158821615,44.81253617954805],[-0.6161061910203061,44.812180504220024]]}},{"type":"Feature","properties":{"name":"Avenue Jean Jaurès","distance":98.59625577629868,"sectionId":"as=124715-16950","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6161061910203061,44.812180504220024],[-0.6162453655944039,44.812137179078924]]}},{"type":"Feature","properties":{"name":"Rue Pierre Curie","distance":39.007641473679726,"sectionId":"as=124799-16460","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6294283912792256,44.80648281815557],[-0.6296508692524806,44.80679627089548]]}},{"type":"Feature","properties":{"name":"Rue Pierre Curie","distance":39.007641473679726,"sectionId":"as=124799-16461","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6296508692524806,44.80679627089548],[-0.6298909344003979,44.80713449809973]]}},{"type":"Feature","properties":{"name":"Allée Miguel de Cervantes","distance":122.24059895474625,"sectionId":"as=124808-31835","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.61475110339749,44.79739329170675],[-0.6144349318392345,44.7968040173848],[-0.6144513877847124,44.79669719618234],[-0.6142608325506955,44.79636128142778]]}},{"type":"Feature","properties":{"name":"Allée Miguel de Cervantes","distance":40.239246725839145,"sectionId":"as=124808-15990","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6142608325506955,44.79636128142778],[-0.6141607998750656,44.79618494001125]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":2.3123826473800824,"sectionId":"as=124811-20148","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5985415793187204,44.79895998147994],[-0.5981196130069676,44.79920231276052]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":153.0098586553278,"sectionId":"as=124811-22866","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.600032246774405,44.798081784266614],[-0.5998593535718492,44.79818202390513],[-0.5985643386194901,44.79894691092332],[-0.5985415793187204,44.79895998147994]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Nancel Pénard","distance":60.26340626305801,"sectionId":"as=124743-30479","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.629420588809221,44.80898163238363],[-0.6294196565290228,44.80896481645575],[-0.6294148261779847,44.8089483951602],[-0.6294063729855621,44.80893272004912],[-0.6293945778425069,44.80891823257752],[-0.6293795896871496,44.8089052883294],[-0.6293618100380457,44.80889423482468],[-0.6293417610440407,44.808885325654884],[-0.6293200911471531,44.80887881038025],[-0.6292971905398143,44.80887485671662],[-0.6292736963422004,44.80887353441843],[-0.6287725252732359,44.80890087469299],[-0.6287495026144481,44.80890503235491],[-0.6287495026144481,44.80890503235491]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Nancel Pénard","distance":"Unknown","sectionId":"as=124743-23492","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6287495026144481,44.80890503235491],[-0.6287238129443788,44.80891305861358]]}},{"type":"Feature","properties":{"name":"Rue du Jasmin","distance":"Unknown","sectionId":"as=124815-16921","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6198124150619269,44.80396081435652],[-0.6198124150619269,44.80396081435652]]}},{"type":"Feature","properties":{"name":"Rue du Jasmin","distance":"Unknown","sectionId":"as=124815-16922","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6198124150619269,44.80396081435652],[-0.6197940289716289,44.804594956016665]]}},{"type":"Feature","properties":{"name":"Avenue du Rond Point","distance":15.668589679459423,"sectionId":"as=124624-17285","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6155903790794491,44.80546780660766],[-0.6145145899145501,44.80572097974112]]}},{"type":"Feature","properties":{"name":"Avenue du Rond Point","distance":15.668589679459423,"sectionId":"as=124624-16294","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6157785186711434,44.80542352907227],[-0.6155903790794491,44.80546780660766]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":137.44202852183648,"sectionId":"as=124756-38852","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5922567476898352,44.805410420472995],[-0.5920486432489971,44.80592886448956],[-0.59177833957402,44.80660004681237],[-0.59177833957402,44.80660004681237]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":"Unknown","sectionId":"as=124756-59024","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.59177833957402,44.80660004681237],[-0.5917228175241306,44.80668043065457]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":47.73120500416763,"sectionId":"as=124830-19963","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6026178012516087,44.79654680953026],[-0.6030959881292656,44.796167611720165]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":47.73120500416763,"sectionId":"as=124830-20149","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6022145735222436,44.796866559883405],[-0.6026178012516087,44.79654680953026]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":65.55382682099903,"sectionId":"as=125061-27462","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6024211081568865,44.796556538702916],[-0.6021125593266066,44.796799076337216]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":65.55382682099903,"sectionId":"as=125061-23330","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6029775749561365,44.79611911546831],[-0.6024211081568865,44.796556538702916]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":34.7363550426505,"sectionId":"as=124883-19939","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5986810940580379,44.79900107428764],[-0.6001156711618988,44.798157515156575]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":49.111282153708515,"sectionId":"as=124883-22876","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5981996355267528,44.79928031462285],[-0.5983424144731566,44.79920021807931],[-0.5986810940580379,44.79900107428764]]}},{"type":"Feature","properties":{"name":"Avenue du Poujeau","distance":61.481581297743915,"sectionId":"as=125356-16268","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6270343374935502,44.80807700681343],[-0.6263950892679818,44.807761871107175]]}},{"type":"Feature","properties":{"name":"Avenue du Poujeau","distance":61.481581297743915,"sectionId":"as=125356-16953","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6263950892679818,44.807761871107175],[-0.6262970044470864,44.80771351675207]]}},{"type":"Feature","properties":{"name":"Rue de la Ramée","distance":47.69649609562168,"sectionId":"as=125432-27664","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6308029509226473,44.79340748890225],[-0.6314036276194981,44.793369300565004]]}},{"type":"Feature","properties":{"name":"Rue de la Ramée","distance":47.69649609562168,"sectionId":"as=125432-17371","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6314036276194981,44.793369300565004],[-0.6314036276194981,44.793369300565004]]}},{"type":"Feature","properties":{"name":"Avenue de la Paillère","distance":"Unknown","sectionId":"as=125296-17208","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6091022239964791,44.79611317928631],[-0.6086453402267731,44.796098491349674]]}},{"type":"Feature","properties":{"name":"Avenue de la Paillère","distance":24.238915016940897,"sectionId":"as=125296-25670","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.609403328369066,44.796153528874584],[-0.6092786299538921,44.796134065045536],[-0.6091022239964791,44.79611317928631],[-0.6091022239964791,44.79611317928631]]}},{"type":"Feature","properties":{"name":"Avenue Marc Desbats","distance":"Unknown","sectionId":"as=125302-17072","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.618345051263509,44.803812475306586],[-0.618594700473303,44.80386687048051]]}},{"type":"Feature","properties":{"name":"Avenue Marc Desbats","distance":48.08885250136549,"sectionId":"as=125302-16872","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6177762813257962,44.80365923002183],[-0.618345051263509,44.803812475306586],[-0.618345051263509,44.803812475306586]]}},{"type":"Feature","properties":{"name":"Place du Président Wilson","distance":81.76784419738173,"sectionId":"as=125236-19574","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5910056690595032,44.7984976041222],[-0.59081552314347,44.79905238759902],[-0.5908214358577824,44.799110754220074],[-0.5908372662186695,44.79916178130587],[-0.5908153296507723,44.79921382067324],[-0.5908153296507723,44.79921382067324]]}},{"type":"Feature","properties":{"name":"Place du Président Wilson","distance":"Unknown","sectionId":"as=125236-20003","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5908153296507723,44.79921382067324],[-0.5907424423278052,44.799292871840485]]}},{"type":"Feature","properties":{"name":"Rue Henry de Montherlant","distance":"Unknown","sectionId":"as=125304-20060","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5814783761385266,44.79643501556176],[-0.5816756531470041,44.795922453916624]]}},{"type":"Feature","properties":{"name":"Rue Henry de Montherlant","distance":130.4486175800037,"sectionId":"as=125304-30634","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.581049012358213,44.797567980156245],[-0.5811042401309843,44.79736535923975],[-0.5811276450833788,44.797281837287144],[-0.5813185214704116,44.796827040175025],[-0.5814783761385266,44.79643501556176],[-0.5814783761385266,44.79643501556176]]}},{"type":"Feature","properties":{"name":"Avenue de Gradignan","distance":19.69989504871931,"sectionId":"as=125253-16652","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6256676068307824,44.803400556478046],[-0.6256572364531846,44.80357776485027]]}},{"type":"Feature","properties":{"name":"Avenue de Gradignan","distance":19.69989504871931,"sectionId":"as=125253-16254","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6256572364531846,44.80357776485027],[-0.6256255858329896,44.804118601845786]]}},{"type":"Feature","properties":{"name":"Avenue Jean Jaurès","distance":46.97525994355878,"sectionId":"as=125389-16950","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6162453655944039,44.812137179078924],[-0.6167864017679299,44.81196240066467]]}},{"type":"Feature","properties":{"name":"Avenue Jean Jaurès","distance":46.97525994355878,"sectionId":"as=125389-16666","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6167864017679299,44.81196240066467],[-0.6174973955855689,44.811732712827244]]}},{"type":"Feature","properties":{"name":"Avenue des Arts","distance":"Unknown","sectionId":"as=125323-15961","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6098558033544615,44.79649787728235],[-0.6095368093002356,44.79629306465444]]}},{"type":"Feature","properties":{"name":"Avenue des Arts","distance":269.2287646340752,"sectionId":"as=125323-15960","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6128294430135697,44.797650377098066],[-0.6127276070434479,44.79763442451352],[-0.6125340938868502,44.7975829185907],[-0.6110890519033626,44.79708705296016],[-0.6107118818609878,44.796945347124755],[-0.6100838541284331,44.79663432044443],[-0.6098558033544615,44.79649787728235],[-0.6098558033544615,44.79649787728235]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Nancel Pénard","distance":39.58350928841526,"sectionId":"as=125263-16541","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6286497829100846,44.809017575311366],[-0.6286521056448674,44.80902632942319],[-0.6286588245100269,44.809042600414614],[-0.6286691492622496,44.80905785553454],[-0.6286826783866089,44.80907174725648],[-0.6286992629531496,44.80908391999414],[-0.6287183751534566,44.80909403025061],[-0.6287394984983771,44.809101914333915],[-0.6287620995157397,44.809107138841654],[-0.6287856786949662,44.80910980979316],[-0.6288094669567306,44.80910977155664],[-0.6290822743254396,44.809092819047784]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Nancel Pénard","distance":21.652331272528006,"sectionId":"as=125263-24369","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6290822743254396,44.809092819047784],[-0.629184852615813,44.80908644455927]]}},{"type":"Feature","properties":{"name":"Avenue de Candau","distance":"Unknown","sectionId":"as=125337-16016","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.60836880541367,44.808585631956106],[-0.6081571627327063,44.80861901020956]]}},{"type":"Feature","properties":{"name":"Avenue de Candau","distance":160.6587988033094,"sectionId":"as=125337-16229","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6103927881971604,44.80848330192842],[-0.6101947110652945,44.80847463514907],[-0.6096048369498852,44.808500021867175],[-0.6089962798175784,44.80852816028714],[-0.60836880541367,44.808585631956106],[-0.60836880541367,44.808585631956106]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":"Unknown","sectionId":"as=125538-29089","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5966519084589246,44.80082806120818],[-0.5965703030351481,44.8006820962064]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":278.82800959779684,"sectionId":"as=125538-20035","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5992047248805338,44.802551201774975],[-0.5968193140132685,44.80100671505463],[-0.5966519084589246,44.80082806120818],[-0.5966519084589246,44.80082806120818]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":32.661571759293246,"sectionId":"as=125539-38856","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5933681929699226,44.802659092840265],[-0.5932533999645394,44.80294156638243]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":32.661571759293246,"sectionId":"as=125539-38854","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5932533999645394,44.80294156638243],[-0.5929742433737365,44.803628480598185]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":"Unknown","sectionId":"as=125540-24223","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5912955110226233,44.81083616858027],[-0.5913207195900397,44.8106456601919]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":194.2910124716901,"sectionId":"as=125540-30130","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.590891021962493,44.81256004356215],[-0.5911431977987415,44.8116209964151],[-0.5911505427980376,44.81151545879639],[-0.5911646091488846,44.81141421307799],[-0.5912376563349585,44.811148597543365],[-0.5912955110226233,44.81083616858027],[-0.5912955110226233,44.81083616858027]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":"Unknown","sectionId":"as=125550-20034","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5979988960069387,44.80186392163605],[-0.5991426121969289,44.802606135801256]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":176.35619959982787,"sectionId":"as=125550-29090","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5964472687166597,44.8007340007718],[-0.5965582160638913,44.8008513827091],[-0.5967604728489094,44.80105731044049],[-0.5979988960069387,44.80186392163605],[-0.5979988960069387,44.80186392163605]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":169.32003023287675,"sectionId":"as=125623-16513","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6117154585853717,44.80410741972833],[-0.6119918161579154,44.80363498641018],[-0.612038098281536,44.80356586424403],[-0.6120943476023514,44.80349426351782],[-0.6122070209454944,44.80336799202706],[-0.6123054077384538,44.803280279280585],[-0.6124588637336369,44.803166765170374],[-0.6126697869678392,44.80304755188783],[-0.6128054005550593,44.802984510025624],[-0.6129673496982034,44.80292981987449],[-0.6129673496982034,44.80292981987449]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":"Unknown","sectionId":"as=125623-16512","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6129673496982034,44.80292981987449],[-0.6132006267363936,44.80286043204193]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":149.60143332969923,"sectionId":"as=125624-16508","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6153385571934318,44.80267772650684],[-0.6154575479359946,44.80263214540256],[-0.6156542235918762,44.80256832999024],[-0.6159017594379852,44.80247821444909],[-0.6160638040894652,44.80240090582401],[-0.6161682410152266,44.80234722875872],[-0.6162824796343164,44.802274322454544],[-0.6163707939225889,44.80220971725499],[-0.6164873226050801,44.8021208832577],[-0.6165456603077095,44.802064527845275],[-0.616637048825239,44.80197027735285],[-0.6167556010158722,44.80183102215729]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":18.08662029773066,"sectionId":"as=125624-27338","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6167556010158722,44.80183102215729],[-0.6167556010158722,44.80183102215729]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":83.89035841554184,"sectionId":"as=125560-20145","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5938418315239782,44.80177681685403],[-0.5938869217759313,44.80173899885876],[-0.5939783800105355,44.80168386116087],[-0.5946487832190162,44.80128760236258]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":68.90354421244162,"sectionId":"as=125560-19728","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5946487832190162,44.80128760236258],[-0.595003061518976,44.80107819332798]]}},{"type":"Feature","properties":{"name":"Avenue Roger Cohé","distance":38.86964309877126,"sectionId":"as=125501-16434","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6334066349679124,44.81109917839348],[-0.633654882118616,44.811401236942395]]}},{"type":"Feature","properties":{"name":"Avenue Roger Cohé","distance":38.86964309877126,"sectionId":"as=125501-17388","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.633654882118616,44.811401236942395],[-0.6346531266442413,44.81261582828942]]}},{"type":"Feature","properties":{"name":"Passage Françoise Dolto","distance":69.17021986131952,"sectionId":"as=125502-31678","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6319981444093928,44.810183684844965],[-0.632822504502535,44.809975210079436]]}},{"type":"Feature","properties":{"name":"Passage Françoise Dolto","distance":69.17021986131952,"sectionId":"as=125502-31677","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.632822504502535,44.809975210079436],[-0.632822504502535,44.809975210079436]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":145.4806585010489,"sectionId":"as=125661-27338","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6167556010158722,44.80183102215729],[-0.6168169825126848,44.80174655389446],[-0.6168934612424188,44.801582061939314],[-0.6169483635547244,44.801428615680656],[-0.6170028382115869,44.80118365836639],[-0.6170516024396403,44.80089609305333],[-0.6171022081499608,44.80062981886935],[-0.6171282843380691,44.800555391475335],[-0.6171282843380691,44.800555391475335]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":"Unknown","sectionId":"as=125661-16507","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6171282843380691,44.800555391475335],[-0.6171720137256175,44.800471934783396]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":85.2966918405012,"sectionId":"as=125525-20143","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5930434137916174,44.803644041633945],[-0.5933419432009441,44.80290609458723]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":85.2966918405012,"sectionId":"as=125525-20144","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5933419432009441,44.80290609458723],[-0.5934361361385686,44.80267325106588]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":303.620466664412,"sectionId":"as=126826-16518","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6229576027525034,44.794378110453],[-0.6230065329894773,44.7944702385557],[-0.623007881833746,44.79452190359879],[-0.622998499584751,44.7945497681119],[-0.6229446771716683,44.79470192255521],[-0.6228279547226726,44.7950268794269],[-0.6226888175547365,44.79540587968823],[-0.6226282527213566,44.79555545611212],[-0.6225514224920026,44.79569987535973],[-0.6224591750543634,44.7958345161116],[-0.6223705393675297,44.79594408856817],[-0.6222797711924088,44.79603382039288],[-0.6222142800053897,44.796092929349115],[-0.6221148692430387,44.796175999870194],[-0.6214402181527549,44.79664231874026],[-0.6213139958518566,44.7967215579503],[-0.6213139958518566,44.7967215579503]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":"Unknown","sectionId":"as=126826-16519","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6213139958518566,44.7967215579503],[-0.6212349465970253,44.796764252395086]]}},{"type":"Feature","properties":{"name":"Rue Gambetta","distance":34.77171792164629,"sectionId":"as=126957-16714","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.63286743820531,44.80497780590039],[-0.6327029084058575,44.80475442771743],[-0.6326781083125196,44.80469621477551],[-0.6326781083125196,44.80469621477551]]}},{"type":"Feature","properties":{"name":"Rue Gambetta","distance":"Unknown","sectionId":"as=126957-16601","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6326781083125196,44.80469621477551],[-0.6324972230262332,44.80443615401674]]}},{"type":"Feature","properties":{"name":"Avenue du Maréchal Juin","distance":27.155852529963504,"sectionId":"as=126835-17060","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6292324178976736,44.79411329562805],[-0.6293204244529603,44.79411999485734]]}},{"type":"Feature","properties":{"name":"Avenue du Maréchal Juin","distance":109.14089292562147,"sectionId":"as=126835-25908","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6278565756756521,44.794040137058424],[-0.6280772120147169,44.794048141962],[-0.6284686254573436,44.79406393973606],[-0.6288910052258898,44.79408730595882],[-0.6292324178976736,44.79411329562805]]}},{"type":"Feature","properties":{"name":"Avenue Roul","distance":192.95901701186682,"sectionId":"as=126798-20348","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5943365232877257,44.806354562138054],[-0.5940634620328182,44.8064257077243],[-0.593749511142539,44.8064904875932],[-0.5933108051042018,44.80656154999093],[-0.592899132447576,44.80660347097803],[-0.5926728544520203,44.80664566032003],[-0.5923547711049446,44.80672335842478],[-0.5921605825632146,44.80675410074487],[-0.5919754450763087,44.806776336560645],[-0.5919754450763087,44.806776336560645]]}},{"type":"Feature","properties":{"name":"Avenue Roul","distance":"Unknown","sectionId":"as=126798-29241","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5919754450763087,44.806776336560645],[-0.5918630512275317,44.806781595907665]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":124.36462490710926,"sectionId":"as=126843-20140","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.591431092111132,44.809155283153466],[-0.5914839063504418,44.80826441673125],[-0.5915018630781435,44.80803675315485],[-0.5915018630781435,44.80803675315485]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":"Unknown","sectionId":"as=126843-20141","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5915018630781435,44.80803675315485],[-0.5914934469368046,44.80787730359128]]}},{"type":"Feature","properties":{"name":"Avenue Pasteur","distance":41.034681303756415,"sectionId":"as=126949-17246","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6328797824686113,44.80591535507432],[-0.6324496511934334,44.80593829283401]]}},{"type":"Feature","properties":{"name":"Avenue Pasteur","distance":41.034681303756415,"sectionId":"as=126949-16712","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.633397283165561,44.805887755899924],[-0.6328797824686113,44.80591535507432]]}},{"type":"Feature","properties":{"name":"Avenue Eugène Et Marc Dulout","distance":8.297496953834068,"sectionId":"as=126955-16601","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6324972230262332,44.80443615401674],[-0.6325905772401907,44.804402042115]]}},{"type":"Feature","properties":{"name":"Avenue Eugène Et Marc Dulout","distance":8.297496953834068,"sectionId":"as=126955-16602","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6325905772401907,44.804402042115],[-0.6343271677684411,44.80376746507475]]}},{"type":"Feature","properties":{"name":"Avenue Eugène Et Marc Dulout","distance":48.52527129235806,"sectionId":"as=126956-28692","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6315426422940877,44.80483886296448],[-0.631700007696165,44.80477699651276]]}},{"type":"Feature","properties":{"name":"Avenue Eugène Et Marc Dulout","distance":48.52527129235806,"sectionId":"as=126956-36295","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6310054379205055,44.80505005617093],[-0.6315426422940877,44.80483886296448]]}},{"type":"Feature","properties":{"name":"Avenue de Thouars","distance":140.4029716539044,"sectionId":"as=126725-19733","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5921843731680444,44.79734083928537],[-0.5921674174069451,44.79743217761519],[-0.592075271313752,44.79777469763343],[-0.5919795209869134,44.7980715696703],[-0.5919150812532874,44.798257732715236],[-0.591749738721691,44.79856265778556],[-0.591749738721691,44.79856265778556]]}},{"type":"Feature","properties":{"name":"Avenue de Thouars","distance":"Unknown","sectionId":"as=126725-19573","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.591749738721691,44.79856265778556],[-0.5916468256867602,44.79864509009591]]}},{"type":"Feature","properties":{"name":"Avenue de Thouars","distance":52.52533019587334,"sectionId":"as=126726-20269","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5925596857402758,44.79896524744904],[-0.5928693700846391,44.799062920016524]]}},{"type":"Feature","properties":{"name":"Avenue de Thouars","distance":69.00061398894486,"sectionId":"as=126726-25685","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5917724060901783,44.798699046797225],[-0.5919524158719314,44.79877371472242],[-0.5925596857402758,44.79896524744904]]}},{"type":"Feature","properties":{"name":"Avenue de Thouars","distance":38.571951460659655,"sectionId":"as=126727-20377","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5924129675978201,44.79487752946063],[-0.5924227244326273,44.794971176905655],[-0.592417404659201,44.7951477257731],[-0.5924099536308922,44.79522431798344]]}},{"type":"Feature","properties":{"name":"Avenue de Thouars","distance":8.527629133649059,"sectionId":"as=126727-20376","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5924099536308922,44.79522431798344],[-0.5923415956072579,44.79592698879076]]}},{"type":"Feature","properties":{"name":"Rue Camille Pelletan","distance":39.53393653615774,"sectionId":"as=126612-19615","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6000842403541052,44.812542147747884],[-0.6003481849213284,44.81248677115931],[-0.6005709443936075,44.81246494703294]]}},{"type":"Feature","properties":{"name":"Rue Camille Pelletan","distance":17.77809751901286,"sectionId":"as=126612-19747","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6005709443936075,44.81246494703294],[-0.6005709443936075,44.81246494703294]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":145.45098074425906,"sectionId":"as=126637-27598","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6004523068258636,44.8045365874173],[-0.600509179884899,44.80463477855403],[-0.6005733752040296,44.80519864421006],[-0.6005184813348118,44.80542793014191],[-0.6003524924280303,44.805815314116046],[-0.6003524924280303,44.805815314116046]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":"Unknown","sectionId":"as=126637-20350","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6003524924280303,44.805815314116046],[-0.6002739308007025,44.805937160069774]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":153.7858142268606,"sectionId":"as=126638-22873","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6004152790420273,44.805991960079176],[-0.6004194219007658,44.80591444814489],[-0.6005805773055457,44.80550235433324],[-0.6006272799907852,44.80538502988931],[-0.6006545461952569,44.80528471572321],[-0.6006640080685695,44.80507560510431],[-0.6006119587252647,44.8046312546883],[-0.6006119587252647,44.8046312546883]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":"Unknown","sectionId":"as=126638-23255","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6006119587252647,44.8046312546883],[-0.6006221089494935,44.80453445507072]]}},{"type":"Feature","properties":{"name":"Rue Pacaris","distance":10.736569687467808,"sectionId":"as=126275-19697","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.583594741220704,44.799262579054854],[-0.583594741220704,44.799262579054854]]}},{"type":"Feature","properties":{"name":"Rue Pacaris","distance":108.65787609562342,"sectionId":"as=126275-20249","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5846706106451018,44.799865821105186],[-0.5845446748750324,44.79982438925881],[-0.5842750151742157,44.79966704773293],[-0.584055863863987,44.79953045415536],[-0.5838172528492933,44.79939627503608],[-0.5836954339824488,44.799327417824934],[-0.583594741220704,44.799262579054854]]}},{"type":"Feature","properties":{"name":"Avenue Pasteur","distance":3.4967746394475165,"sectionId":"as=126198-37643","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.630666524961471,44.80621107320266],[-0.6309973778869389,44.806155553294545]]}},{"type":"Feature","properties":{"name":"Avenue Pasteur","distance":3.4967746394475165,"sectionId":"as=126198-16884","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6306234818854873,44.80621829611289],[-0.630666524961471,44.80621107320266]]}},{"type":"Feature","properties":{"name":"Avenue Jean Jaurès","distance":436.0878464555881,"sectionId":"as=126199-54611","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6199400407258951,44.810830217920476],[-0.6244699455687088,44.80859043076008],[-0.6244699455687088,44.80859043076008]]}},{"type":"Feature","properties":{"name":"Avenue Jean Jaurès","distance":"Unknown","sectionId":"as=126199-16951","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6244699455687088,44.80859043076008],[-0.6257873812750893,44.80795235979245]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Nancel Pénard","distance":26.378629663078833,"sectionId":"as=126200-16535","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6202000052487621,44.81094462359676],[-0.6205187955250818,44.8108745794685]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Nancel Pénard","distance":26.378629663078833,"sectionId":"as=126200-16536","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6205187955250818,44.8108745794685],[-0.6205284245130067,44.81087246378458]]}},{"type":"Feature","properties":{"name":"Rue du Parc Haut-Brion","distance":199.5260238404179,"sectionId":"as=126201-17232","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6112758976534942,44.812906173888436],[-0.6124513569495835,44.8124584335045],[-0.612483879645363,44.812452356036964],[-0.6125095873130819,44.81245667436025],[-0.6125343644315607,44.81246633712406],[-0.6125570029779188,44.812488319078504],[-0.6131319346018702,44.81312550824983]]}},{"type":"Feature","properties":{"name":"Rue du Parc Haut-Brion","distance":84.11355348902423,"sectionId":"as=126201-16948","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6131319346018702,44.81312550824983],[-0.6131783922998356,44.81317699595155]]}},{"type":"Feature","properties":{"name":"Avenue de Candau","distance":73.28731638063891,"sectionId":"as=126208-16228","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6137095978648442,44.80830933152997],[-0.6137095978648442,44.80830933152997]]}},{"type":"Feature","properties":{"name":"Avenue de Candau","distance":155.7820063749196,"sectionId":"as=126208-16227","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6156386765922829,44.808168934866266],[-0.6152163161768321,44.80829063968172],[-0.6149407433761301,44.80833362959324],[-0.6146353778205642,44.80834144227298],[-0.6137095978648442,44.80830933152997]]}},{"type":"Feature","properties":{"name":"Avenue Marc Desbats","distance":242.97818208737084,"sectionId":"as=126209-16921","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6198124150619269,44.80396081435652],[-0.620246204442297,44.803864581263305],[-0.6203792673335272,44.80384160840961],[-0.620543049862054,44.803824233598675],[-0.6206963139697018,44.80382070591095],[-0.6208521062902216,44.80383124063021],[-0.621023654175631,44.80385892988657],[-0.6217801419272814,44.8040674385863],[-0.622785430389558,44.80418577153616],[-0.622785430389558,44.80418577153616]]}},{"type":"Feature","properties":{"name":"Avenue Marc Desbats","distance":"Unknown","sectionId":"as=126209-16391","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.622785430389558,44.80418577153616],[-0.6234301620012386,44.80417829556763]]}},{"type":"Feature","properties":{"name":"Avenue de Candau","distance":7.593622285944763,"sectionId":"as=126237-16226","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.615993843363658,44.808079542423435],[-0.6159032985453854,44.80810233191559]]}},{"type":"Feature","properties":{"name":"Avenue de Candau","distance":7.593622285944763,"sectionId":"as=126237-16227","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6159032985453854,44.80810233191559],[-0.6156386765922829,44.808168934866266]]}},{"type":"Feature","properties":{"name":"Avenue Fanning Lafontaine","distance":14.642688064771098,"sectionId":"as=126238-16228","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6137095978648442,44.80830933152997],[-0.6137000929088473,44.80821423555608],[-0.613684708854579,44.808179422634716]]}},{"type":"Feature","properties":{"name":"Avenue Fanning Lafontaine","distance":4.053538230475189,"sectionId":"as=126238-16605","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.613684708854579,44.808179422634716],[-0.6127699290240495,44.80610926622104]]}},{"type":"Feature","properties":{"name":"Avenue Jean Cordier","distance":83.87520296489441,"sectionId":"as=126161-16869","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6246231752046867,44.811427684732095],[-0.6252858666250618,44.810838008755574]]}},{"type":"Feature","properties":{"name":"Avenue Jean Cordier","distance":83.87520296489441,"sectionId":"as=126161-30970","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6252858666250618,44.810838008755574],[-0.6254496151827686,44.810692299541095]]}},{"type":"Feature","properties":{"name":"Boulevard Saint Martin","distance":57.2918303465836,"sectionId":"as=126249-17229","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6307358512522636,44.8037873977151],[-0.6314561092610305,44.80373152224987],[-0.6314561092610305,44.80373152224987]]}},{"type":"Feature","properties":{"name":"Boulevard Saint Martin","distance":"Unknown","sectionId":"as=126249-23042","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6314561092610305,44.80373152224987],[-0.6316085245585873,44.80376674305387]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Nancel Pénard","distance":21.17503637001509,"sectionId":"as=126172-16539","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6233231538386813,44.8102328589191],[-0.624018432989894,44.81007380965053]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Nancel Pénard","distance":21.17503637001509,"sectionId":"as=126172-16538","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6230681813424483,44.8102911840886],[-0.6233231538386813,44.8102328589191]]}},{"type":"Feature","properties":{"name":"Avenue Pasteur","distance":79.42129283404606,"sectionId":"as=126174-17246","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6324496511934334,44.80593829283401],[-0.6322783750644018,44.805949257790886],[-0.6319962683258628,44.80598862481973],[-0.6315741973873511,44.806051918242034],[-0.631467218957927,44.806079206126995],[-0.631467218957927,44.806079206126995]]}},{"type":"Feature","properties":{"name":"Avenue Pasteur","distance":"Unknown","sectionId":"as=126174-17247","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.631467218957927,44.806079206126995],[-0.6313232630557205,44.80610605296365]]}},{"type":"Feature","properties":{"name":"Avenue Camille Jullian","distance":22.91535055457348,"sectionId":"as=129160-24466","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6155333858256525,44.793975887879235],[-0.6154316421681246,44.79378271545963]]}},{"type":"Feature","properties":{"name":"Avenue Camille Jullian","distance":22.91535055457348,"sectionId":"as=129160-16211","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6154316421681246,44.79378271545963],[-0.6150382268229753,44.793035756445974]]}},{"type":"Feature","properties":{"name":"Rue Ambroise Pare","distance":31.141710877522698,"sectionId":"as=129078-19601","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5873770289998756,44.808771890909945],[-0.5877737931600661,44.80881470450807]]}},{"type":"Feature","properties":{"name":"Rue Ambroise Pare","distance":31.141710877522698,"sectionId":"as=129078-19600","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5869876197288899,44.80872986951243],[-0.5873770289998756,44.808771890909945]]}},{"type":"Feature","properties":{"name":"Parking Eglise Notre Dame","distance":18.382092718490775,"sectionId":"as=129005-19741","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5911660667008316,44.8129569095402],[-0.5912914430355238,44.81289538911248],[-0.5913689948605365,44.81288077969289],[-0.5913689948605365,44.81288077969289]]}},{"type":"Feature","properties":{"name":"Parking Eglise Notre Dame","distance":"Unknown","sectionId":"as=129005-20542","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5913689948605365,44.81288077969289],[-0.5921025824436333,44.81289446071338]]}},{"type":"Feature","properties":{"name":"Résidence les Harmonies","distance":"Unknown","sectionId":"as=129006-20118","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5861690395503226,44.81189917006904],[-0.5861690395503226,44.81189917006904]]}},{"type":"Feature","properties":{"name":"Résidence les Harmonies","distance":"Unknown","sectionId":"as=129006-20501","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5861690395503226,44.81189917006904],[-0.5849977758770828,44.81191870329469]]}},{"type":"Feature","properties":{"name":"Avenue Maréchal Leclerc","distance":92.92016041657902,"sectionId":"as=129010-42110","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5901752386690532,44.80668821935534],[-0.5900668502588153,44.80669722554523],[-0.5898059115588464,44.80676806815446],[-0.5896115332989635,44.80685113260901],[-0.5891428865667643,44.80706941649979],[-0.5891428865667643,44.80706941649979]]}},{"type":"Feature","properties":{"name":"Avenue Maréchal Leclerc","distance":"Unknown","sectionId":"as=129010-29246","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5891428865667643,44.80706941649979],[-0.5889215836520356,44.807171255589246]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Nancel Pénard","distance":22.01956833232724,"sectionId":"as=125781-16537","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6207934155278639,44.8108114736739],[-0.6222925693597104,44.810466415289795]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Nancel Pénard","distance":22.01956833232724,"sectionId":"as=125781-16536","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6205284245130067,44.81087246378458],[-0.6207934155278639,44.8108114736739]]}},{"type":"Feature","properties":{"name":"Avenue de la Paillère","distance":79.53685692033753,"sectionId":"as=128440-15980","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6053275826400447,44.7956882415242],[-0.6048339085700761,44.795610684071555]]}},{"type":"Feature","properties":{"name":"Avenue de la Paillère","distance":79.53685692033753,"sectionId":"as=128440-15975","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6063096567689085,44.795842520704404],[-0.6053275826400447,44.7956882415242]]}},{"type":"Feature","properties":{"name":"Rue Dourout","distance":45.37496411529443,"sectionId":"as=128441-19842","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5829533291412462,44.808775800980634],[-0.582926096946988,44.80891678917791]]}},{"type":"Feature","properties":{"name":"Rue Dourout","distance":45.37496411529443,"sectionId":"as=128441-19843","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5830314995900483,44.808371088178305],[-0.5829533291412462,44.808775800980634]]}},{"type":"Feature","properties":{"name":"Rue du Commandant Lherminier","distance":29.506889440246052,"sectionId":"as=128481-16439","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6096602097524809,44.80926099606958],[-0.6093492987111485,44.80940792618887]]}},{"type":"Feature","properties":{"name":"Rue du Commandant Lherminier","distance":29.506889440246052,"sectionId":"as=128481-22793","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6093492987111485,44.80940792618887],[-0.6091806218940967,44.80948763867637]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":82.52406198147352,"sectionId":"as=126515-15955","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6204169498377229,44.79735773276919],[-0.6199205615843131,44.79770954571217],[-0.6198341319574392,44.79778787682651],[-0.6197786949287285,44.797860086636454],[-0.6197420186573377,44.79791674542534]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":6.929442102040447,"sectionId":"as=126515-16523","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6197420186573377,44.79791674542534],[-0.6197420186573377,44.79791674542534]]}},{"type":"Feature","properties":{"name":"Avenue Roger Cohé","distance":72.26758823229832,"sectionId":"as=126520-16608","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6324014687974893,44.808087433957105],[-0.6326941613131767,44.808703809879916],[-0.6326941613131767,44.808703809879916]]}},{"type":"Feature","properties":{"name":"Avenue Roger Cohé","distance":"Unknown","sectionId":"as=126520-16546","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6326941613131767,44.808703809879916],[-0.6328764318135781,44.80911814029118]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":"Unknown","sectionId":"as=126353-16516","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6077533522424334,44.80609157500647],[-0.6079458835492219,44.80595719005264]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":232.51845470005603,"sectionId":"as=126353-16517","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6058526999066345,44.807680729014336],[-0.6059872695018079,44.80751575540195],[-0.6061221952362326,44.80737671412465],[-0.6062565548650382,44.80724886086562],[-0.6064437405939739,44.80708555147519],[-0.606603973250565,44.80695057160916],[-0.6068313258916518,44.806769953148645],[-0.6077533522424334,44.80609157500647],[-0.6077533522424334,44.80609157500647]]}},{"type":"Feature","properties":{"name":"Rue Lafitte","distance":54.775026959426775,"sectionId":"as=126415-19854","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5849099847830717,44.799275276226325],[-0.5849219860206252,44.799108507861185]]}},{"type":"Feature","properties":{"name":"Rue Lafitte","distance":64.7676950263024,"sectionId":"as=126415-20109","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5848152076639289,44.79984721067967],[-0.5848745420644292,44.79976778005969],[-0.5849099847830717,44.799275276226325]]}},{"type":"Feature","properties":{"name":"Rue Frédéric Sevene","distance":21.52273066632323,"sectionId":"as=126423-19954","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5828735045100534,44.80483162648224],[-0.5826322515009865,44.80474190899295]]}},{"type":"Feature","properties":{"name":"Rue Frédéric Sevene","distance":21.52273066632323,"sectionId":"as=126423-19955","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5826322515009865,44.80474190899295],[-0.5824016378533508,44.8046561473278]]}},{"type":"Feature","properties":{"name":"Rue de Suzon","distance":25.718627158907925,"sectionId":"as=126494-24951","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5823237210808098,44.81155307906197],[-0.5822675146941628,44.81178114683718]]}},{"type":"Feature","properties":{"name":"Rue de Suzon","distance":25.718627158907925,"sectionId":"as=126494-19723","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5822675146941628,44.81178114683718],[-0.5822195256664939,44.81197586969005]]}},{"type":"Feature","properties":{"name":"Avenue Pey Berland","distance":1.0303369267916327,"sectionId":"as=2847-29759","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6095170708821552,44.80091872951914],[-0.6095170708821552,44.80091872951914]]}},{"type":"Feature","properties":{"name":"Avenue Pey Berland","distance":11.430022845846054,"sectionId":"as=2847-17750","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6093768517601454,44.800910207684005],[-0.609392227574084,44.800915304854115],[-0.6094194483680796,44.80092164759661],[-0.6094477405449926,44.800924893510945],[-0.6094764558320666,44.800924792922395],[-0.6095045840201877,44.80092137789173],[-0.6095170708821552,44.80091872951914]]}},{"type":"Feature","properties":{"name":"Allée Jeanne Chanay","distance":188.04999371511542,"sectionId":"as=2791-16773","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6230278625711209,44.79802290803133],[-0.6230766380044211,44.797979645418174],[-0.6230977354875343,44.79795095727731],[-0.6231147149730231,44.797925192918854],[-0.6231194732177401,44.797890178964],[-0.6229419063962776,44.797400015667755],[-0.62276837826354,44.79670226093422],[-0.6227195929221027,44.796584274090556],[-0.6226420968425924,44.796498641008384],[-0.6225458868614242,44.796423242951676]]}},{"type":"Feature","properties":{"name":"Allée Jeanne Chanay","distance":11.31495893500349,"sectionId":"as=2791-24281","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6225458868614242,44.796423242951676],[-0.6225458868614242,44.796423242951676]]}},{"type":"Feature","properties":{"name":"Avenue Eugène Et Marc Dulout","distance":6.922457625431717,"sectionId":"as=2793-28692","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.631700007696165,44.80477699651276],[-0.6317753874490736,44.80474530328229]]}},{"type":"Feature","properties":{"name":"Avenue Eugène Et Marc Dulout","distance":6.922457625431717,"sectionId":"as=2793-36294","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6317753874490736,44.80474530328229],[-0.6322121990324753,44.804561645228155]]}},{"type":"Feature","properties":{"name":"Avenue du Maréchal Juin","distance":7.4728868448321535,"sectionId":"as=2848-25910","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6278541662325295,44.793963642612205],[-0.6278562848933282,44.79403090537901]]}},{"type":"Feature","properties":{"name":"Avenue du Maréchal Juin","distance":7.4728868448321535,"sectionId":"as=2848-25908","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6278562848933282,44.79403090537901],[-0.6278565756756521,44.794040137058424]]}},{"type":"Feature","properties":{"name":"Avenue Roul","distance":67.66794171046003,"sectionId":"as=2846-19986","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5982942181184648,44.80592826231086],[-0.598503457195701,44.805929589372]]}},{"type":"Feature","properties":{"name":"Avenue Roul","distance":67.66794171046003,"sectionId":"as=2846-19838","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5974384797343806,44.80592283083548],[-0.5982942181184648,44.80592826231086]]}},{"type":"Feature","properties":{"name":"Esplanade Michel Montaigne","distance":"Unknown","sectionId":"as=128118-27672","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6171929150616469,44.79703612275271],[-0.6171929150616469,44.79703612275271]]}},{"type":"Feature","properties":{"name":"Esplanade Michel Montaigne","distance":"Unknown","sectionId":"as=128118-17043","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6171929150616469,44.79703612275271],[-0.6178180737614022,44.79822614617144]]}},{"type":"Feature","properties":{"name":"Avenue Léon Duguit","distance":382.0752658794313,"sectionId":"as=127941-17010","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6130188090616121,44.79948701121046],[-0.6121891942954869,44.79974956201924],[-0.6120769482267334,44.799787628886115],[-0.6120152747744724,44.79979481247025],[-0.6119466999963092,44.79978473909176],[-0.6119155669364443,44.79976239634537],[-0.6116085694985325,44.79923245844444],[-0.6115908033336732,44.79921545644587],[-0.6115625504020434,44.79920878668436],[-0.6115382273318947,44.79920829793205],[-0.6115097414434093,44.799214067013764],[-0.6114853060383519,44.79922592319244],[-0.6103173890921755,44.80012933307853],[-0.6098102949794868,44.80054386642339],[-0.6096747182570297,44.80062564089148],[-0.6096747182570297,44.80062564089148]]}},{"type":"Feature","properties":{"name":"Avenue Léon Duguit","distance":"Unknown","sectionId":"as=127941-17749","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6096747182570297,44.80062564089148],[-0.6095588933797128,44.80069147420939]]}},{"type":"Feature","properties":{"name":"Avenue des Facultés","distance":115.32597461883752,"sectionId":"as=127943-16753","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6068476869041276,44.80355291536525],[-0.6062086005106154,44.804538531610724]]}},{"type":"Feature","properties":{"name":"Avenue des Facultés","distance":358.6712957056328,"sectionId":"as=127943-17750","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6093768517601454,44.800910207684005],[-0.6090330171219099,44.801145695808486],[-0.6087463550228671,44.80134657854071],[-0.6083970771729191,44.80163466550279],[-0.6081599651827935,44.801836857162016],[-0.6078710582825699,44.802133386560165],[-0.6075601838193506,44.80248331036001],[-0.6074589290933775,44.80261020572636],[-0.6068476869041276,44.80355291536525]]}},{"type":"Feature","properties":{"name":"Allée René Laroumagne","distance":"Unknown","sectionId":"as=127945-20520","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6022917175528385,44.80588894695939],[-0.6021666254435213,44.80564680328958]]}},{"type":"Feature","properties":{"name":"Allée René Laroumagne","distance":"Unknown","sectionId":"as=127945-30378","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6022917175528385,44.80588894695939],[-0.6022917175528385,44.80588894695939]]}},{"type":"Feature","properties":{"name":"Avenue des Facultes","distance":0.41428521499304705,"sectionId":"as=127946-20397","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6024013038858907,44.80610770975058],[-0.6023964071705596,44.806109036414746]]}},{"type":"Feature","properties":{"name":"Avenue des Facultes","distance":0.41428521499304705,"sectionId":"as=127946-20398","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6023964071705596,44.806109036414746],[-0.6018331508031505,44.80626163727018]]}},{"type":"Feature","properties":{"name":"Esplanade d'Alcala de Henares","distance":27.234089291123645,"sectionId":"as=127951-30496","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5903439306842265,44.811647667559505],[-0.5902987171722328,44.811890740754194]]}},{"type":"Feature","properties":{"name":"Esplanade d'Alcala de Henares","distance":27.234089291123645,"sectionId":"as=127951-30495","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5902987171722328,44.811890740754194],[-0.5902507396256396,44.81214867142865]]}},{"type":"Feature","properties":{"name":"Rue du Professeur Arnozan","distance":148.19059833554357,"sectionId":"as=4653-20316","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5880525730551078,44.80870096572785],[-0.5881691368308702,44.80848577673915],[-0.5883137467476924,44.80818448546386],[-0.5887617020151555,44.80746699421062],[-0.5887617020151555,44.80746699421062]]}},{"type":"Feature","properties":{"name":"Rue du Professeur Arnozan","distance":"Unknown","sectionId":"as=4653-29242","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5887617020151555,44.80746699421062],[-0.5888287887820327,44.80734741083005]]}},{"type":"Feature","properties":{"name":"Avenue Pierre Corneille","distance":28.891734789861058,"sectionId":"as=3903-16489","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6237185655562585,44.80218948838196],[-0.6235468187345438,44.80153305782432]]}},{"type":"Feature","properties":{"name":"Avenue Pierre Corneille","distance":28.891734789861058,"sectionId":"as=3903-17288","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6237854723855056,44.80244520763538],[-0.6237185655562585,44.80218948838196]]}},{"type":"Feature","properties":{"name":"Avenue Marc Desbats","distance":25.858874372526277,"sectionId":"as=3996-16186","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6167453060802395,44.80336708893274],[-0.6167453060802395,44.80336708893274]]}},{"type":"Feature","properties":{"name":"Avenue Marc Desbats","distance":25.858874372526277,"sectionId":"as=3996-16185","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6164543226763436,44.803260855030295],[-0.6167453060802395,44.80336708893274]]}},{"type":"Feature","properties":{"name":"Avenue Roger Chaumet","distance":32.548405747736865,"sectionId":"as=3835-23042","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6316085245585873,44.80376674305387],[-0.6317755599815049,44.803604212865146],[-0.631872080810827,44.80354356705513]]}},{"type":"Feature","properties":{"name":"Avenue Roger Chaumet","distance":10.179800880491051,"sectionId":"as=3835-17297","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.631872080810827,44.80354356705513],[-0.631872080810827,44.80354356705513]]}},{"type":"Feature","properties":{"name":"Avenue de l'Armistice","distance":54.62908165645241,"sectionId":"as=3800-15937","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6243497290246917,44.79999677088432],[-0.623721398906139,44.80020115921167]]}},{"type":"Feature","properties":{"name":"Avenue de l'Armistice","distance":54.62908165645241,"sectionId":"as=3800-15938","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.623721398906139,44.80020115921167],[-0.6232012006720995,44.8003703697135]]}},{"type":"Feature","properties":{"name":"Avenue des Echoppes","distance":256.7650562877589,"sectionId":"as=3979-16293","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.615914663117892,44.80523173783854],[-0.6149722993800102,44.80301952321189],[-0.6149722993800102,44.80301952321189]]}},{"type":"Feature","properties":{"name":"Avenue des Echoppes","distance":"Unknown","sectionId":"as=3979-16510","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6149722993800102,44.80301952321189],[-0.6150150402426817,44.802875833309585]]}},{"type":"Feature","properties":{"name":"Rue Robespierre","distance":32.805673458179434,"sectionId":"as=4624-20102","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5826167316320662,44.80836364546584],[-0.5825067803575857,44.808361672208974]]}},{"type":"Feature","properties":{"name":"Rue Robespierre","distance":32.805673458179434,"sectionId":"as=4624-19843","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5830314995900483,44.808371088178305],[-0.5826167316320662,44.80836364546584]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":"Unknown","sectionId":"as=3829-20354","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6031165359859968,44.80796273513895],[-0.6032398452665743,44.80796972897076]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":188.93204001304417,"sectionId":"as=3829-25654","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6008795044312589,44.807547040725375],[-0.601083801841782,44.8076999287757],[-0.6013702754122733,44.80781715441462],[-0.6016425013496721,44.80787240336805],[-0.602132299432441,44.807904096450656],[-0.6024593348230423,44.80792112432897],[-0.6031165359859968,44.80796273513895],[-0.6031165359859968,44.80796273513895]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":29.423142854320123,"sectionId":"as=4633-16522","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6209525813577348,44.796990254580784],[-0.6206846693570309,44.79717406062051]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":29.423142854320123,"sectionId":"as=4633-15955","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6206846693570309,44.79717406062051],[-0.6204169498377229,44.79735773276919]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":31.884455643552787,"sectionId":"as=4702-16502","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6207581543563427,44.79717472074531],[-0.6209883616111087,44.797016050297394]]}},{"type":"Feature","properties":{"name":"Avenue du Docteur Albert Schweitzer","distance":31.884455643552787,"sectionId":"as=4702-16503","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6204684765805153,44.7973743793357],[-0.6207581543563427,44.79717472074531]]}},{"type":"Feature","properties":{"name":"Rue de Tremeuge","distance":30.101086637502526,"sectionId":"as=3825-20388","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.590157115142759,44.803076982358874],[-0.5900930684965086,44.803064835654624]]}},{"type":"Feature","properties":{"name":"Rue de Tremeuge","distance":30.101086637502526,"sectionId":"as=3825-59322","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5905249464257029,44.80314674222542],[-0.590157115142759,44.803076982358874]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":"Unknown","sectionId":"as=1608-20038","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5921660507144769,44.80581282433813],[-0.5923260252980941,44.80541946553582]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":104.50514211484835,"sectionId":"as=1608-59023","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5918490500224921,44.80672087229625],[-0.5918412828058065,44.806614135599126],[-0.5919700774147114,44.80629257444009],[-0.5921660507144769,44.80581282433813],[-0.5921660507144769,44.80581282433813]]}},{"type":"Feature","properties":{"name":"Rond-point Crespy","distance":15.471541935866556,"sectionId":"as=3811-19816","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5861456236711587,44.80662154869525],[-0.5861717946848317,44.80663862858331],[-0.5861935059276961,44.80666095992945],[-0.5862076905591813,44.80668617698043],[-0.586213624511145,44.80671301440007],[-0.5862110459478397,44.806740111203695],[-0.5862094348735556,44.806745356618016]]}},{"type":"Feature","properties":{"name":"Rond-point Crespy","distance":0.596380329754069,"sectionId":"as=3811-58723","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5862094348735556,44.806745356618016],[-0.5862094348735556,44.806745356618016]]}},{"type":"Feature","properties":{"name":"Avenue Maréchal Leclerc","distance":116.68357482601732,"sectionId":"as=4025-58723","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5862094348735556,44.806745356618016],[-0.5863008390895252,44.80675851632417],[-0.5866327237521493,44.80683138086207],[-0.5870359638241108,44.80697301231156],[-0.5875561706922359,44.8071642442764],[-0.5875561706922359,44.8071642442764]]}},{"type":"Feature","properties":{"name":"Avenue Maréchal Leclerc","distance":"Unknown","sectionId":"as=4025-20181","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5875561706922359,44.8071642442764],[-0.5878866023049307,44.80723804824538]]}},{"type":"Feature","properties":{"name":"Avenue de Candau","distance":37.302716990741175,"sectionId":"as=4723-16182","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6182176013896765,44.80773911700815],[-0.6182176013896765,44.80773911700815]]}},{"type":"Feature","properties":{"name":"Avenue de Candau","distance":37.302716990741175,"sectionId":"as=4723-16225","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6186893706113094,44.80773942310523],[-0.6182176013896765,44.80773911700815]]}},{"type":"Feature","properties":{"name":"Place du Cardinal","distance":"Unknown","sectionId":"as=3961-16129","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6265227405338982,44.80412582527825],[-0.627149054686297,44.80405002871358]]}},{"type":"Feature","properties":{"name":"Place du Cardinal","distance":69.22481645579504,"sectionId":"as=3961-16255","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6257521823861885,44.80431219554282],[-0.6258347801976771,44.80421172903405],[-0.6258604745204708,44.80419403393842],[-0.6258877998187484,44.804181706008556],[-0.6259179820150542,44.80416881860744],[-0.625959449590928,44.804160064447714],[-0.6261942637967857,44.80414362359268],[-0.6265227405338982,44.80412582527825],[-0.6265227405338982,44.80412582527825]]}},{"type":"Feature","properties":{"name":"Rue Aldona","distance":34.769906967460734,"sectionId":"as=3946-19574","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5911143430914114,44.79851592268685],[-0.5910056690595032,44.7984976041222]]}},{"type":"Feature","properties":{"name":"Rue Aldona","distance":45.1928454325558,"sectionId":"as=3946-19573","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5916468256867602,44.79864509009591],[-0.5915421817258038,44.79858803986696],[-0.5911143430914114,44.79851592268685]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":346.50498247484956,"sectionId":"as=3852-59022","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5916084990576307,44.806855428560446],[-0.5916465437470868,44.80692239687728],[-0.591541951911806,44.807203670542116],[-0.591434871456327,44.80749162052985],[-0.5914020637957571,44.807645435404126],[-0.5913832404552399,44.80773530094656],[-0.5913609287638117,44.80797634404888],[-0.5913598799122404,44.80823166939641],[-0.5913142621860418,44.8089740336309],[-0.59129860866703,44.809352421551786],[-0.5912978182357062,44.809603775083744],[-0.5912922195264352,44.80981654518834],[-0.5912749521066185,44.8099454334626]]}},{"type":"Feature","properties":{"name":"Cours de la Libération","distance":14.380752818501296,"sectionId":"as=3852-19895","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5912749521066185,44.8099454334626],[-0.5912520546581699,44.81011634475008]]}},{"type":"Feature","properties":{"name":"Rue Lamartine","distance":30.566795377472573,"sectionId":"as=4740-20118","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5861746180764528,44.812040638802586],[-0.5861690395503226,44.81189917006904]]}},{"type":"Feature","properties":{"name":"Rue Lamartine","distance":30.566795377472573,"sectionId":"as=4740-20116","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5861854658165723,44.812315730242524],[-0.5861746180764528,44.812040638802586]]}},{"type":"Feature","properties":{"name":"Avenue Marc Desbats","distance":"Unknown","sectionId":"as=2141-22272","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6252798683845749,44.80426933817362],[-0.6254961069676005,44.80434026530025]]}},{"type":"Feature","properties":{"name":"Avenue Marc Desbats","distance":146.76883846933134,"sectionId":"as=2141-16391","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6234301620012386,44.80417829556763],[-0.624980290765997,44.804237624535524],[-0.6251384912586874,44.80424626573726],[-0.6252798683845749,44.80426933817362],[-0.6252798683845749,44.80426933817362]]}},{"type":"Feature","properties":{"name":"Avenue de Candau","distance":11.023824111941686,"sectionId":"as=4007-16225","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6189762294657988,44.80774515046019],[-0.6186893706113094,44.80773942310523]]}},{"type":"Feature","properties":{"name":"Avenue de Candau","distance":11.023824111941686,"sectionId":"as=4007-24401","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6191155935746175,44.80774793270232],[-0.6189762294657988,44.80774515046019]]}},{"type":"Feature","properties":{"name":"Avenue de Gradignan","distance":50.78400965254912,"sectionId":"as=3949-17022","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6242857966554964,44.80616683431997],[-0.6239720212718814,44.80653986900685],[-0.623954917132629,44.8065586919272]]}},{"type":"Feature","properties":{"name":"Avenue de Gradignan","distance":2.4900009049792162,"sectionId":"as=3949-16223","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.623954917132629,44.8065586919272],[-0.6236435928320284,44.806901298311644]]}},{"type":"Feature","properties":{"name":"Boulevard Saint Martin","distance":47.63160036012414,"sectionId":"as=4745-16129","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.627149054686297,44.80405002871358],[-0.6277485516591668,44.80400827027071]]}},{"type":"Feature","properties":{"name":"Boulevard Saint Martin","distance":47.63160036012414,"sectionId":"as=4745-15830","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6277485516591668,44.80400827027071],[-0.6288499444519569,44.80393154326636]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":93.10096248731578,"sectionId":"as=4667-23353","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.6000852811907536,44.8043813726086],[-0.6000579938504631,44.8041835145103],[-0.5999881139459997,44.8036379351872],[-0.5999744803870597,44.80360602712762],[-0.5999527060266195,44.80358356514508],[-0.5999223500980054,44.80356146486022],[-0.5999223500980054,44.80356146486022]]}},{"type":"Feature","properties":{"name":"Avenue de l'Université","distance":"Unknown","sectionId":"as=4667-22956","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5999223500980054,44.80356146486022],[-0.5998836905566615,44.80354620340311]]}},{"type":"Feature","properties":{"name":"Cours Gambetta","distance":90.23533846747159,"sectionId":"as=130301-19976","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.5898720404281652,44.81345825178031],[-0.5901832032794003,44.813250522037926],[-0.5905276978511486,44.81301516516125],[-0.59069381739304,44.81289461693631],[-0.59069381739304,44.81289461693631]]}},{"type":"Feature","properties":{"name":"Cours Gambetta","distance":"Unknown","sectionId":"as=130301-19740","stroke":"#e60000"},"geometry":{"type":"LineString","coordinates":[[-0.59069381739304,44.81289461693631],[-0.5907714977003081,44.812804875596846]]}}]} \ No newline at end of file diff --git a/out-2.geojson b/out-2.geojson deleted file mode 100644 index 1c239b75..00000000 --- a/out-2.geojson +++ /dev/null @@ -1 +0,0 @@ -{"type":"FeatureCollection","features":[{"type":"Feature","properties":{"id":19986,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.598503457195701,44.805929589372]}},{"type":"Feature","properties":{"id":649,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5999951036373583,44.806025258018686]}},{"type":"Feature","properties":{"id":20477,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5889352992729378,44.80426162947189]}},{"type":"Feature","properties":{"id":8849,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5888401723316949,44.80448154821921]}},{"type":"Feature","properties":{"id":565,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5923014576779416,44.80911464724327]}},{"type":"Feature","properties":{"id":20529,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.595118792724725,44.80826399273431]}},{"type":"Feature","properties":{"id":37644,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6312988395560757,44.806953711851584]}},{"type":"Feature","properties":{"id":25322,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6309171201956937,44.80701688540854]}},{"type":"Feature","properties":{"id":16751,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6192614171451878,44.802438103692516]}},{"type":"Feature","properties":{"id":16491,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6193901306760591,44.8013866079945]}},{"type":"Feature","properties":{"id":16648,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6195375283914707,44.800241821394124]}},{"type":"Feature","properties":{"id":27475,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6195571001638541,44.800067877994806]}},{"type":"Feature","properties":{"id":16492,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6317468675861465,44.80689859927188]}},{"type":"Feature","properties":{"id":19473,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6077811541581584,44.80684108265683]}},{"type":"Feature","properties":{"id":16917,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.607715901583938,44.806967106259115]}},{"type":"Feature","properties":{"id":16627,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6197644570798326,44.8049764093837]}},{"type":"Feature","properties":{"id":16888,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.619434263251487,44.80508024381205]}},{"type":"Feature","properties":{"id":17199,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6192984980148553,44.80512068753395]}},{"type":"Feature","properties":{"id":17074,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6188697461705239,44.80524089870388]}},{"type":"Feature","properties":{"id":16769,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6252738215622851,44.8018510579183]}},{"type":"Feature","properties":{"id":16770,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6255429995479178,44.80249765613825]}},{"type":"Feature","properties":{"id":16652,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6256676068307824,44.803400556478046]}},{"type":"Feature","properties":{"id":22272,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6254961069676005,44.80434026530025]}},{"type":"Feature","properties":{"id":57283,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6255814707323305,44.80446636389337]}},{"type":"Feature","properties":{"id":25688,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5924389591219411,44.796194159508005]}},{"type":"Feature","properties":{"id":19946,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5923109617560379,44.79619270781825]}},{"type":"Feature","properties":{"id":16429,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.629585442485553,44.809839194970834]}},{"type":"Feature","properties":{"id":16426,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6301869250232973,44.809594070291]}},{"type":"Feature","properties":{"id":31584,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6058105533287731,44.80886602147036]}},{"type":"Feature","properties":{"id":25589,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6063400223491766,44.810836189241876]}},{"type":"Feature","properties":{"id":19899,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5912290658125761,44.81024498686175]}},{"type":"Feature","properties":{"id":20137,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5911565152469914,44.810435278298364]}},{"type":"Feature","properties":{"id":29050,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5912464814650292,44.810668722841385]}},{"type":"Feature","properties":{"id":24223,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5913207195900397,44.8106456601919]}},{"type":"Feature","properties":{"id":27350,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5909511668127475,44.812623544396445]}},{"type":"Feature","properties":{"id":30130,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.590891021962493,44.81256004356215]}},{"type":"Feature","properties":{"id":16186,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6167453060802395,44.80336708893274]}},{"type":"Feature","properties":{"id":16183,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.617199029463869,44.805092888259615]}},{"type":"Feature","properties":{"id":16375,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6276472320417161,44.80639863800813]}},{"type":"Feature","properties":{"id":57263,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6275035249587216,44.80642437225543]}},{"type":"Feature","properties":{"id":16460,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6294283912792256,44.80648281815557]}},{"type":"Feature","properties":{"id":16461,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6298909344003979,44.80713449809973]}},{"type":"Feature","properties":{"id":25671,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6093915158581251,44.79630839606761]}},{"type":"Feature","properties":{"id":15961,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6095368093002356,44.79629306465444]}},{"type":"Feature","properties":{"id":15979,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6050567334529893,44.796471117352944]}},{"type":"Feature","properties":{"id":15980,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6048339085700761,44.795610684071555]}},{"type":"Feature","properties":{"id":19802,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5953333058379465,44.810684745640245]}},{"type":"Feature","properties":{"id":19803,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.595254869181587,44.81137085787207]}},{"type":"Feature","properties":{"id":19816,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5861456236711587,44.80662154869525]}},{"type":"Feature","properties":{"id":58723,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5862094348735556,44.806745356618016]}},{"type":"Feature","properties":{"id":17232,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6112758976534942,44.812906173888436]}},{"type":"Feature","properties":{"id":16948,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6131783922998356,44.81317699595155]}},{"type":"Feature","properties":{"id":17246,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6324496511934334,44.80593829283401]}},{"type":"Feature","properties":{"id":17247,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6313232630557205,44.80610605296365]}},{"type":"Feature","properties":{"id":22264,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6288534679758239,44.80246991038936]}},{"type":"Feature","properties":{"id":22265,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6293327530723806,44.80245758969772]}},{"type":"Feature","properties":{"id":15878,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6162816263743869,44.79540521177599]}},{"type":"Feature","properties":{"id":15877,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6168956162527585,44.795241569770326]}},{"type":"Feature","properties":{"id":16624,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6311324422268266,44.79922387400509]}},{"type":"Feature","properties":{"id":24283,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6308623117393518,44.79828166195963]}},{"type":"Feature","properties":{"id":17421,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6310068594694284,44.79942967178872]}},{"type":"Feature","properties":{"id":17298,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6309711873600478,44.79967890203219]}},{"type":"Feature","properties":{"id":16540,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6268000100219724,44.80943708538574]}},{"type":"Feature","properties":{"id":16428,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6271167540555563,44.81045664227241]}},{"type":"Feature","properties":{"id":16431,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6274574680346562,44.81176640446349]}},{"type":"Feature","properties":{"id":27672,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6171929150616469,44.79703612275271]}},{"type":"Feature","properties":{"id":17043,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6178180737614022,44.79822614617144]}},{"type":"Feature","properties":{"id":16030,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6198157907617171,44.80774853275552]}},{"type":"Feature","properties":{"id":16031,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6203579837622806,44.80579151082335]}},{"type":"Feature","properties":{"id":16608,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6324014687974893,44.808087433957105]}},{"type":"Feature","properties":{"id":16546,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6328764318135781,44.80911814029118]}},{"type":"Feature","properties":{"id":27886,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6318478280770993,44.80695050696602]}},{"type":"Feature","properties":{"id":17129,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6321402210686764,44.8075884236563]}},{"type":"Feature","properties":{"id":16128,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6276631170427468,44.80521949652113]}},{"type":"Feature","properties":{"id":15831,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6292569572675963,44.805162794691796]}},{"type":"Feature","properties":{"id":17022,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6242857966554964,44.80616683431997]}},{"type":"Feature","properties":{"id":16376,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6264257207198175,44.80572872752301]}},{"type":"Feature","properties":{"id":16251,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6271324783500616,44.803995137202875]}},{"type":"Feature","properties":{"id":57282,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6260456600254464,44.80406568709261]}},{"type":"Feature","properties":{"id":16291,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6160451960339756,44.80552540298936]}},{"type":"Feature","properties":{"id":16292,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6161900184432482,44.80532874127065]}},{"type":"Feature","properties":{"id":31835,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.61475110339749,44.79739329170675]}},{"type":"Feature","properties":{"id":15990,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6141607998750656,44.79618494001125]}},{"type":"Feature","properties":{"id":17059,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6292460675686923,44.79350349109471]}},{"type":"Feature","properties":{"id":17370,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6303640321588959,44.79343483472454]}},{"type":"Feature","properties":{"id":26709,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6284124019636882,44.793554507407194]}},{"type":"Feature","properties":{"id":16435,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6070114019224195,44.80985200795313]}},{"type":"Feature","properties":{"id":17037,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6067216609943213,44.810010552473784]}},{"type":"Feature","properties":{"id":29759,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6095170708821552,44.80091872951914]}},{"type":"Feature","properties":{"id":17280,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.60963791548459,44.800817874852086]}},{"type":"Feature","properties":{"id":17119,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6082347158446524,44.80920497076243]}},{"type":"Feature","properties":{"id":36352,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.608323235867677,44.80983473148223]}},{"type":"Feature","properties":{"id":16440,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6082974034579984,44.8099233740803]}},{"type":"Feature","properties":{"id":16284,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6070065521135677,44.81079775978465]}},{"type":"Feature","properties":{"id":15885,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6168116988168031,44.79508163835017]}},{"type":"Feature","properties":{"id":15884,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6183588167645683,44.79466389064747]}},{"type":"Feature","properties":{"id":15886,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6162000239246755,44.79524135064804]}},{"type":"Feature","properties":{"id":16921,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6198124150619269,44.80396081435652]}},{"type":"Feature","properties":{"id":16391,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6234301620012386,44.80417829556763]}},{"type":"Feature","properties":{"id":25910,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6278541662325295,44.793963642612205]}},{"type":"Feature","properties":{"id":30140,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6278533162913976,44.79391394341432]}},{"type":"Feature","properties":{"id":30099,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6309071398690205,44.7941820380093]}},{"type":"Feature","properties":{"id":26552,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6314170497640901,44.79416692679618]}},{"type":"Feature","properties":{"id":19987,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5984066689433065,44.80404866973753]}},{"type":"Feature","properties":{"id":19995,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5859945919392777,44.80275327348517]}},{"type":"Feature","properties":{"id":19996,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5862241014385443,44.80232760458696]}},{"type":"Feature","properties":{"id":20004,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5892437059848279,44.799063900248946]}},{"type":"Feature","properties":{"id":37097,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5883960860467061,44.79893904008061]}},{"type":"Feature","properties":{"id":24279,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6275361969122202,44.79722248075931]}},{"type":"Feature","properties":{"id":24276,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6252628069394983,44.79941635645798]}},{"type":"Feature","properties":{"id":19741,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5911660667008316,44.8129569095402]}},{"type":"Feature","properties":{"id":20542,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5921025824436333,44.81289446071338]}},{"type":"Feature","properties":{"id":19552,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.581117210519938,44.79888183393539]}},{"type":"Feature","properties":{"id":19553,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5811476582560566,44.79898500943584]}},{"type":"Feature","properties":{"id":26647,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5814737141394966,44.8081419763692]}},{"type":"Feature","properties":{"id":20334,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.580958284944962,44.80802947790924]}},{"type":"Feature","properties":{"id":20328,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6004554726115798,44.79519916794754]}},{"type":"Feature","properties":{"id":19941,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5986010282207422,44.79711248291793]}},{"type":"Feature","properties":{"id":25911,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5826588270171792,44.81231056002393]}},{"type":"Feature","properties":{"id":24950,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5836514704914351,44.81236324867341]}},{"type":"Feature","properties":{"id":27580,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5850304000323213,44.80045316333416]}},{"type":"Feature","properties":{"id":20438,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5859920373070406,44.80070218999017]}},{"type":"Feature","properties":{"id":16092,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.630737406271222,44.797443454373465]}},{"type":"Feature","properties":{"id":24278,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6306944067410274,44.79700575772121]}},{"type":"Feature","properties":{"id":30945,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6056351334495721,44.808011833433156]}},{"type":"Feature","properties":{"id":16230,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6057286659423373,44.80862305200351]}},{"type":"Feature","properties":{"id":20210,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5890841607714429,44.8035065501129]}},{"type":"Feature","properties":{"id":20476,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5892726378677615,44.80354429207371]}},{"type":"Feature","properties":{"id":20388,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5900930684965086,44.803064835654624]}},{"type":"Feature","properties":{"id":22370,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5900259725883658,44.80322072338686]}},{"type":"Feature","properties":{"id":20485,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.587919333101578,44.80914837087973]}},{"type":"Feature","properties":{"id":20482,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5883272668548667,44.808966779621706]}},{"type":"Feature","properties":{"id":20118,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5861690395503226,44.81189917006904]}},{"type":"Feature","properties":{"id":20501,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5849977758770828,44.81191870329469]}},{"type":"Feature","properties":{"id":20366,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5849697393399184,44.81090229542672]}},{"type":"Feature","properties":{"id":24285,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6315243641467698,44.80392518549436]}},{"type":"Feature","properties":{"id":17302,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6322151558794488,44.80515079027539]}},{"type":"Feature","properties":{"id":20222,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5817347652098784,44.80154978936739]}},{"type":"Feature","properties":{"id":25679,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5823120971842611,44.801480439965296]}},{"type":"Feature","properties":{"id":20221,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.581996432624606,44.80159884038343]}},{"type":"Feature","properties":{"id":20223,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5813093901470782,44.80146841891647]}},{"type":"Feature","properties":{"id":23187,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.630181560447226,44.792005531352444]}},{"type":"Feature","properties":{"id":19630,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5836002037568148,44.80364523865101]}},{"type":"Feature","properties":{"id":19631,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5826711868171895,44.80315617672418]}},{"type":"Feature","properties":{"id":17553,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6067089864241451,44.79436691118033]}},{"type":"Feature","properties":{"id":17552,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6068156243160784,44.79400067523964]}},{"type":"Feature","properties":{"id":20038,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5923260252980941,44.80541946553582]}},{"type":"Feature","properties":{"id":19894,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5945591266873305,44.804573269848255]}},{"type":"Feature","properties":{"id":19730,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5979900250654584,44.80311454502185]}},{"type":"Feature","properties":{"id":20034,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5991426121969289,44.802606135801256]}},{"type":"Feature","properties":{"id":19848,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5957016899524444,44.81082479978316]}},{"type":"Feature","properties":{"id":20216,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5829114531768446,44.796488604084416]}},{"type":"Feature","properties":{"id":20217,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5828224141858932,44.796421866246604]}},{"type":"Feature","properties":{"id":19672,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5836766845477668,44.79691508101888]}},{"type":"Feature","properties":{"id":19691,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5839626726056485,44.80214458791417]}},{"type":"Feature","properties":{"id":20123,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.582923523265462,44.8017866446877]}},{"type":"Feature","properties":{"id":19867,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5824356880312024,44.80168364462371]}},{"type":"Feature","properties":{"id":20148,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5981196130069676,44.79920231276052]}},{"type":"Feature","properties":{"id":20188,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5964093157695478,44.798490890947136]}},{"type":"Feature","properties":{"id":20189,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.595370898235511,44.79809223046674]}},{"type":"Feature","properties":{"id":19808,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5855319951303288,44.80322276786811]}},{"type":"Feature","properties":{"id":20228,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5849821415010599,44.80208259314067]}},{"type":"Feature","properties":{"id":22361,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5851729305762308,44.80191907417385]}},{"type":"Feature","properties":{"id":22362,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5853664302049465,44.80193801712926]}},{"type":"Feature","properties":{"id":23614,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5854651696709479,44.801834416894806]}},{"type":"Feature","properties":{"id":22359,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5852274849938373,44.80170782441463]}},{"type":"Feature","properties":{"id":19574,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5910056690595032,44.7984976041222]}},{"type":"Feature","properties":{"id":19575,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5895145995675709,44.798263440100435]}},{"type":"Feature","properties":{"id":19577,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5874940924930621,44.79876580341441]}},{"type":"Feature","properties":{"id":19578,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5874301042376504,44.79893303199433]}},{"type":"Feature","properties":{"id":19964,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6058602084364522,44.79786435749591]}},{"type":"Feature","properties":{"id":19965,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6071072432096107,44.79876914928914]}},{"type":"Feature","properties":{"id":19746,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5977875452259982,44.8131112532041]}},{"type":"Feature","properties":{"id":19615,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6000842403541052,44.812542147747884]}},{"type":"Feature","properties":{"id":19795,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5810666445856678,44.80424561790561]}},{"type":"Feature","properties":{"id":19710,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5807488871936071,44.804359125680534]}},{"type":"Feature","properties":{"id":20104,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5963189105283733,44.80485238606977]}},{"type":"Feature","properties":{"id":19839,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5973690746633866,44.80445380231567]}},{"type":"Feature","properties":{"id":19823,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6051360946018491,44.79834322327829]}},{"type":"Feature","properties":{"id":20107,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.586804278974005,44.813557993963954]}},{"type":"Feature","properties":{"id":19686,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5847905382966339,44.81362056946996]}},{"type":"Feature","properties":{"id":19854,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5849219860206252,44.799108507861185]}},{"type":"Feature","properties":{"id":19579,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.585015235590998,44.79884406116928]}},{"type":"Feature","properties":{"id":19620,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5859913165365825,44.79604678625102]}},{"type":"Feature","properties":{"id":19950,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5860323705535917,44.79589118155161]}},{"type":"Feature","properties":{"id":20111,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5863172883442309,44.79475842595066]}},{"type":"Feature","properties":{"id":20112,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5865401267186039,44.79406776702903]}},{"type":"Feature","properties":{"id":16653,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6237420017448931,44.80334184354475]}},{"type":"Feature","properties":{"id":20280,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5933378311746387,44.800416106713314]}},{"type":"Feature","properties":{"id":19680,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5841417671664542,44.80780318649656]}},{"type":"Feature","properties":{"id":19679,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5838043431839468,44.80837808926339]}},{"type":"Feature","properties":{"id":19683,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5850986212444692,44.80621552009868]}},{"type":"Feature","properties":{"id":19682,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5847038209642228,44.80686249834282]}},{"type":"Feature","properties":{"id":19694,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5825067725348939,44.803310080280106]}},{"type":"Feature","properties":{"id":19695,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5823466062177725,44.80347330833263]}},{"type":"Feature","properties":{"id":19696,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5813624680708289,44.80427602942861]}},{"type":"Feature","properties":{"id":29092,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5960955461028271,44.80064098746413]}},{"type":"Feature","properties":{"id":29090,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5964472687166597,44.8007340007718]}},{"type":"Feature","properties":{"id":22866,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.600032246774405,44.798081784266614]}},{"type":"Feature","properties":{"id":25955,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6032483547232231,44.80789937519473]}},{"type":"Feature","properties":{"id":20352,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6008390553247239,44.80732491684311]}},{"type":"Feature","properties":{"id":20354,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6032398452665743,44.80796972897076]}},{"type":"Feature","properties":{"id":20392,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6004399085619743,44.807585639041214]}},{"type":"Feature","properties":{"id":25654,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6008795044312589,44.807547040725375]}},{"type":"Feature","properties":{"id":19942,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5957169283102807,44.79632937035617]}},{"type":"Feature","properties":{"id":20307,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5952346629585121,44.798058162349264]}},{"type":"Feature","properties":{"id":19976,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5898720404281652,44.81345825178031]}},{"type":"Feature","properties":{"id":19740,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5907714977003081,44.812804875596846]}},{"type":"Feature","properties":{"id":30133,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5897857054238459,44.81339890989978]}},{"type":"Feature","properties":{"id":30127,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5887850089633541,44.81407096556667]}},{"type":"Feature","properties":{"id":23469,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5908991722573637,44.81276805557285]}},{"type":"Feature","properties":{"id":26434,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.590615027273328,44.81275324319808]}},{"type":"Feature","properties":{"id":30131,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5906896860220451,44.81279376557689]}},{"type":"Feature","properties":{"id":19824,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6065470639244804,44.79939101050488]}},{"type":"Feature","properties":{"id":19844,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5958535522035362,44.81201358750806]}},{"type":"Feature","properties":{"id":20139,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5913855063098329,44.810568396335654]}},{"type":"Feature","properties":{"id":19731,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5920218479019826,44.81051866672442]}},{"type":"Feature","properties":{"id":28642,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5944228342264861,44.81006231609056]}},{"type":"Feature","properties":{"id":23370,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5980889229424843,44.8084150118628]}},{"type":"Feature","properties":{"id":19953,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5839926048931097,44.805442794196125]}},{"type":"Feature","properties":{"id":19629,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5848800257630388,44.80408206975226]}},{"type":"Feature","properties":{"id":19735,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.594898196507284,44.7982785100566]}},{"type":"Feature","properties":{"id":20126,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5950341181897741,44.7983501527892]}},{"type":"Feature","properties":{"id":20308,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5816715327550772,44.79859323230218]}},{"type":"Feature","properties":{"id":20316,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5880525730551078,44.80870096572785]}},{"type":"Feature","properties":{"id":29242,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5888287887820327,44.80734741083005]}},{"type":"Feature","properties":{"id":19761,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5833254041750363,44.79571293010645]}},{"type":"Feature","properties":{"id":19748,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5827995422326325,44.79544303896483]}},{"type":"Feature","properties":{"id":16094,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6328870155811008,44.79910027617863]}},{"type":"Feature","properties":{"id":20160,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5876207778322377,44.81232353005264]}},{"type":"Feature","properties":{"id":20098,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.587769795632363,44.81130198763022]}},{"type":"Feature","properties":{"id":19988,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5899764767772134,44.80123120461399]}},{"type":"Feature","properties":{"id":20003,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5907424423278052,44.799292871840485]}},{"type":"Feature","properties":{"id":16768,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.628875764665801,44.807471374277796]}},{"type":"Feature","properties":{"id":16647,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6208754813095524,44.80034561747293]}},{"type":"Feature","properties":{"id":16344,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6210805999159307,44.80051916368715]}},{"type":"Feature","properties":{"id":16089,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6307665484608452,44.797685210289806]}},{"type":"Feature","properties":{"id":16954,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6160580420874954,44.79373137093818]}},{"type":"Feature","properties":{"id":24465,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6156768201359397,44.79399961355941]}},{"type":"Feature","properties":{"id":16525,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6172610122507112,44.800198493889766]}},{"type":"Feature","properties":{"id":15986,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6169246743947955,44.80027864516549]}},{"type":"Feature","properties":{"id":16508,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6153385571934318,44.80267772650684]}},{"type":"Feature","properties":{"id":27338,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6167556010158722,44.80183102215729]}},{"type":"Feature","properties":{"id":16506,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6173385760408895,44.8002771919352]}},{"type":"Feature","properties":{"id":28446,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6177700580488659,44.80001150404143]}},{"type":"Feature","properties":{"id":16515,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.610457696199699,44.805133490765726]}},{"type":"Feature","properties":{"id":30017,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6107277124972792,44.80517572599702]}},{"type":"Feature","properties":{"id":16539,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.624018432989894,44.81007380965053]}},{"type":"Feature","properties":{"id":16541,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6286497829100846,44.809017575311366]}},{"type":"Feature","properties":{"id":24368,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6295164631937994,44.809867159990326]}},{"type":"Feature","properties":{"id":24367,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.630105762234423,44.8111767311133]}},{"type":"Feature","properties":{"id":24369,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.629184852615813,44.80908644455927]}},{"type":"Feature","properties":{"id":16293,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.615914663117892,44.80523173783854]}},{"type":"Feature","properties":{"id":16510,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6150150402426817,44.802875833309585]}},{"type":"Feature","properties":{"id":19864,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5818440451069568,44.802451306972245]}},{"type":"Feature","properties":{"id":19865,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5820663909934288,44.80216883506007]}},{"type":"Feature","properties":{"id":19897,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5898432957757949,44.81017036133909]}},{"type":"Feature","properties":{"id":16522,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6209525813577348,44.796990254580784]}},{"type":"Feature","properties":{"id":16502,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6209883616111087,44.797016050297394]}},{"type":"Feature","properties":{"id":16516,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6079458835492219,44.80595719005264]}},{"type":"Feature","properties":{"id":16418,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6078964088953601,44.80591678083899]}},{"type":"Feature","properties":{"id":19933,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5823728634221069,44.811295159599865]}},{"type":"Feature","properties":{"id":24951,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5823237210808098,44.81155307906197]}},{"type":"Feature","properties":{"id":27869,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5891885489291463,44.810515857685246]}},{"type":"Feature","properties":{"id":20296,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5887035242411404,44.810498010601194]}},{"type":"Feature","properties":{"id":19841,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.582596396707485,44.81053449802052]}},{"type":"Feature","properties":{"id":19914,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5817200878902408,44.8104187744898]}},{"type":"Feature","properties":{"id":23249,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6004092627113612,44.80421004994941]}},{"type":"Feature","properties":{"id":20286,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5851117818471763,44.81090727732481]}},{"type":"Feature","properties":{"id":19617,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5922783509610803,44.796444976952124]}},{"type":"Feature","properties":{"id":20377,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5924129675978201,44.79487752946063]}},{"type":"Feature","properties":{"id":20376,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5923415956072579,44.79592698879076]}},{"type":"Feature","properties":{"id":58725,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5857400198724079,44.802234706479176]}},{"type":"Feature","properties":{"id":27870,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5892150208258056,44.810245948030406]}},{"type":"Feature","properties":{"id":36388,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5885996140983818,44.81021726093555]}},{"type":"Feature","properties":{"id":40117,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6295206167811596,44.806458345196894]}},{"type":"Feature","properties":{"id":34718,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6292068035750316,44.805857500152804]}},{"type":"Feature","properties":{"id":20143,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5930434137916174,44.803644041633945]}},{"type":"Feature","properties":{"id":20144,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5934361361385686,44.80267325106588]}},{"type":"Feature","properties":{"id":38841,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5915715782126126,44.806807000539166]}},{"type":"Feature","properties":{"id":59022,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5916084990576307,44.806855428560446]}},{"type":"Feature","properties":{"id":38856,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5933681929699226,44.802659092840265]}},{"type":"Feature","properties":{"id":38854,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5929742433737365,44.803628480598185]}},{"type":"Feature","properties":{"id":19947,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.587860065877693,44.79886460859568]}},{"type":"Feature","properties":{"id":52048,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6324753154092333,44.79809439571101]}},{"type":"Feature","properties":{"id":16090,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6321897311485453,44.79761003666069]}},{"type":"Feature","properties":{"id":54609,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6242393931306023,44.80716894678864]}},{"type":"Feature","properties":{"id":16223,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6236435928320284,44.806901298311644]}},{"type":"Feature","properties":{"id":42838,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6012665955153395,44.80519957824972]}},{"type":"Feature","properties":{"id":42839,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6037883598926465,44.803629468683006]}},{"type":"Feature","properties":{"id":622,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5951234192899467,44.80810890524155]}},{"type":"Feature","properties":{"id":633,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5952993982979592,44.80805550937134]}},{"type":"Feature","properties":{"id":652,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5921882974571633,44.80894562386988]}},{"type":"Feature","properties":{"id":20528,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.592062101007606,44.808997893070945]}},{"type":"Feature","properties":{"id":13302,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.588214814102791,44.809443166299296]}},{"type":"Feature","properties":{"id":20309,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.587258968721268,44.80943205713267]}},{"type":"Feature","properties":{"id":13285,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5881968501730691,44.80882730336783]}},{"type":"Feature","properties":{"id":13289,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.58832341738245,44.80933182236562]}},{"type":"Feature","properties":{"id":20136,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5806814180138815,44.79511636493524]}},{"type":"Feature","properties":{"id":20061,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5813456481642605,44.795235165102824]}},{"type":"Feature","properties":{"id":37643,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6309973778869389,44.806155553294545]}},{"type":"Feature","properties":{"id":16402,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6311754385788592,44.80612572631919]}},{"type":"Feature","properties":{"id":16343,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6209176256124728,44.80151418988168]}},{"type":"Feature","properties":{"id":16874,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6182464372634308,44.80245301211074]}},{"type":"Feature","properties":{"id":19488,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6173187328141713,44.802632780677655]}},{"type":"Feature","properties":{"id":16493,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6308833205895168,44.80716534165337]}},{"type":"Feature","properties":{"id":16674,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.631075393174946,44.807574857356464]}},{"type":"Feature","properties":{"id":16463,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6306339972617606,44.808185392863834]}},{"type":"Feature","properties":{"id":16544,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6308268009744906,44.80857434652392]}},{"type":"Feature","properties":{"id":31145,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6311664048647538,44.8079710236816]}},{"type":"Feature","properties":{"id":19516,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6081304002606294,44.8076860611186]}},{"type":"Feature","properties":{"id":16759,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6083608681400925,44.807601729324546]}},{"type":"Feature","properties":{"id":17072,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.618594700473303,44.80386687048051]}},{"type":"Feature","properties":{"id":17073,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6187065175775098,44.80437219367516]}},{"type":"Feature","properties":{"id":16873,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6181716384499761,44.802999044575934]}},{"type":"Feature","properties":{"id":19424,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6191935018189553,44.803440280460485]}},{"type":"Feature","properties":{"id":15989,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6155228591083164,44.798835583950826]}},{"type":"Feature","properties":{"id":17010,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6130188090616121,44.79948701121046]}},{"type":"Feature","properties":{"id":17197,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6208364325521509,44.811430275159225]}},{"type":"Feature","properties":{"id":16937,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6217658448298949,44.81397031605175]}},{"type":"Feature","properties":{"id":17208,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6086453402267731,44.796098491349674]}},{"type":"Feature","properties":{"id":17209,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6085877055614487,44.79609131192823]}},{"type":"Feature","properties":{"id":15937,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6243497290246917,44.79999677088432]}},{"type":"Feature","properties":{"id":16166,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6243970870013743,44.80008390397228]}},{"type":"Feature","properties":{"id":19917,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5978580732608683,44.79681376542394]}},{"type":"Feature","properties":{"id":19954,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5828735045100534,44.80483162648224]}},{"type":"Feature","properties":{"id":19955,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5824016378533508,44.8046561473278]}},{"type":"Feature","properties":{"id":16182,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6182176013896765,44.80773911700815]}},{"type":"Feature","properties":{"id":16021,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6170217073769195,44.807881198466156]}},{"type":"Feature","properties":{"id":16016,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6081571627327063,44.80861901020956]}},{"type":"Feature","properties":{"id":15929,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6308126080649018,44.79835630695447]}},{"type":"Feature","properties":{"id":15930,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6270247250366625,44.79947566576465]}},{"type":"Feature","properties":{"id":15938,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6232012006720995,44.8003703697135]}},{"type":"Feature","properties":{"id":15939,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6221299012503636,44.80037440640367]}},{"type":"Feature","properties":{"id":15940,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.621319849440657,44.80036588083269]}},{"type":"Feature","properties":{"id":16389,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6226363449300576,44.80618073546984]}},{"type":"Feature","properties":{"id":16309,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6307163518160297,44.8053924150303]}},{"type":"Feature","properties":{"id":16405,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6309416133724075,44.80606804888352]}},{"type":"Feature","properties":{"id":16424,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6124134883332674,44.8052897517341]}},{"type":"Feature","properties":{"id":16425,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.614133694372727,44.80488918499556]}},{"type":"Feature","properties":{"id":16427,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6303966248624713,44.809837360339436]}},{"type":"Feature","properties":{"id":23170,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.591273267525887,44.81043447493098]}},{"type":"Feature","properties":{"id":24225,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5911550088205666,44.81066296284028]}},{"type":"Feature","properties":{"id":30129,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5906903391271844,44.81254016451701]}},{"type":"Feature","properties":{"id":19873,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.590587153787817,44.81261458620894]}},{"type":"Feature","properties":{"id":19781,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5941101284050473,44.803090834537365]}},{"type":"Feature","properties":{"id":19587,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.594810758112071,44.80352351693588]}},{"type":"Feature","properties":{"id":16165,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6286027052433694,44.800164557580324]}},{"type":"Feature","properties":{"id":16004,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6297668851998197,44.80069322459682]}},{"type":"Feature","properties":{"id":16384,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6283827483430332,44.801882537913045]}},{"type":"Feature","properties":{"id":16340,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.628473035099161,44.801135835085994]}},{"type":"Feature","properties":{"id":16091,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6321758318754092,44.79734121927321]}},{"type":"Feature","properties":{"id":16133,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6322105865270966,44.79718597537696]}},{"type":"Feature","properties":{"id":16260,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6180778051564332,44.81154192413539]}},{"type":"Feature","properties":{"id":16018,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6193323930943462,44.811126185161505]}},{"type":"Feature","properties":{"id":16555,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6198349122372658,44.81088219392614]}},{"type":"Feature","properties":{"id":15981,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6060638161924718,44.79663106410612]}},{"type":"Feature","properties":{"id":15982,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6062731049713567,44.796886388278814]}},{"type":"Feature","properties":{"id":15987,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6159351826868764,44.79963016129116]}},{"type":"Feature","properties":{"id":28916,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6226144229930793,44.807611869660086]}},{"type":"Feature","properties":{"id":16224,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6207757593926647,44.80773671572647]}},{"type":"Feature","properties":{"id":19729,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5958868153279412,44.801686235444606]}},{"type":"Feature","properties":{"id":17023,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6309737197054233,44.80456056167586]}},{"type":"Feature","properties":{"id":17229,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6307358512522636,44.8037873977151]}},{"type":"Feature","properties":{"id":16228,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6137095978648442,44.80830933152997]}},{"type":"Feature","properties":{"id":16605,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6127699290240495,44.80610926622104]}},{"type":"Feature","properties":{"id":15879,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6143089022443278,44.795925838115174]}},{"type":"Feature","properties":{"id":31144,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6322953326742453,44.807865072908555]}},{"type":"Feature","properties":{"id":16190,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6299514419578577,44.8049585728237]}},{"type":"Feature","properties":{"id":16268,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6270343374935502,44.80807700681343]}},{"type":"Feature","properties":{"id":16953,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6262970044470864,44.80771351675207]}},{"type":"Feature","properties":{"id":16671,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6281220146836525,44.80859624319518]}},{"type":"Feature","properties":{"id":15841,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6270386649190198,44.803331257509726]}},{"type":"Feature","properties":{"id":15843,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6269081382588043,44.80248142592167]}},{"type":"Feature","properties":{"id":31837,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6195687979613381,44.7969955702812]}},{"type":"Feature","properties":{"id":15955,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6204169498377229,44.79735773276919]}},{"type":"Feature","properties":{"id":17008,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6134612050310447,44.800307666080954]}},{"type":"Feature","properties":{"id":16342,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6207756796871756,44.802417021304976]}},{"type":"Feature","properties":{"id":17282,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6092841275076156,44.80081351866447]}},{"type":"Feature","properties":{"id":22908,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6088896288733325,44.80081369619789]}},{"type":"Feature","properties":{"id":16926,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6137206908151805,44.804021385254835]}},{"type":"Feature","properties":{"id":15883,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6195693809825837,44.79434475553062]}},{"type":"Feature","properties":{"id":15875,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6196800405722029,44.7945013115898]}},{"type":"Feature","properties":{"id":16872,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6177762813257962,44.80365923002183]}},{"type":"Feature","properties":{"id":17060,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6293204244529603,44.79411999485734]}},{"type":"Feature","properties":{"id":23345,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6300986751286143,44.79421550612817]}},{"type":"Feature","properties":{"id":20162,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.602782077306796,44.79565498770984]}},{"type":"Feature","properties":{"id":25687,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5924110577336282,44.796670224070986]}},{"type":"Feature","properties":{"id":17642,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6062007210507739,44.797310901675424]}},{"type":"Feature","properties":{"id":19990,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5885653989972357,44.80106764762856]}},{"type":"Feature","properties":{"id":19991,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5877041787751051,44.80096663185932]}},{"type":"Feature","properties":{"id":20001,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5895090725482314,44.800385584844534]}},{"type":"Feature","properties":{"id":20002,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.58992678783263,44.799169445830465]}},{"type":"Feature","properties":{"id":20530,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5977172695857862,44.80742792452227]}},{"type":"Feature","properties":{"id":20532,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5988915706544438,44.807154774322285]}},{"type":"Feature","properties":{"id":20534,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5986420259585337,44.80668658521703]}},{"type":"Feature","properties":{"id":20535,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5988426315947495,44.807068947301644]}},{"type":"Feature","properties":{"id":20140,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.591431092111132,44.809155283153466]}},{"type":"Feature","properties":{"id":23331,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6000262959420235,44.806251188302866]}},{"type":"Feature","properties":{"id":57743,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5989344322699931,44.8066063743094]}},{"type":"Feature","properties":{"id":20348,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5943365232877257,44.806354562138054]}},{"type":"Feature","properties":{"id":19892,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5953226814922169,44.806134221973636]}},{"type":"Feature","properties":{"id":23042,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6316085245585873,44.80376674305387]}},{"type":"Feature","properties":{"id":17520,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6219974203338794,44.807096603254664]}},{"type":"Feature","properties":{"id":17554,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6065960838034486,44.79514268204756]}},{"type":"Feature","properties":{"id":20430,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5898589085239744,44.79578531672493]}},{"type":"Feature","properties":{"id":26551,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6302761572107939,44.79421524538567]}},{"type":"Feature","properties":{"id":26550,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6304296964116521,44.79432096689277]}},{"type":"Feature","properties":{"id":28691,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6318972150442006,44.80522787563589]}},{"type":"Feature","properties":{"id":28692,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.631700007696165,44.80477699651276]}},{"type":"Feature","properties":{"id":20292,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5848152581641884,44.80002097670167]}},{"type":"Feature","properties":{"id":20109,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5848152076639289,44.79984721067967]}},{"type":"Feature","properties":{"id":16433,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6320923791784995,44.81123934229949]}},{"type":"Feature","properties":{"id":26644,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6318710706919177,44.81019945317003]}},{"type":"Feature","properties":{"id":19842,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.582926096946988,44.80891678917791]}},{"type":"Feature","properties":{"id":20469,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5813256223797156,44.808544619005495]}},{"type":"Feature","properties":{"id":22367,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5891628548496484,44.80378890572265]}},{"type":"Feature","properties":{"id":22369,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5896731806453948,44.803293474578275]}},{"type":"Feature","properties":{"id":19918,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5977397996493297,44.7969742505215]}},{"type":"Feature","properties":{"id":20506,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.598340238553185,44.79720919580894]}},{"type":"Feature","properties":{"id":20375,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5922619312697354,44.79666268358289]}},{"type":"Feature","properties":{"id":17561,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.609292376100524,44.79406793627747]}},{"type":"Feature","properties":{"id":17562,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6096161550702309,44.794183685429104]}},{"type":"Feature","properties":{"id":20410,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6027296980286029,44.80673175962899]}},{"type":"Feature","properties":{"id":20411,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6015473838064842,44.807046746653825]}},{"type":"Feature","properties":{"id":20450,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.582654089070662,44.80271207266947]}},{"type":"Feature","properties":{"id":20453,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5831183975565108,44.802133084830125]}},{"type":"Feature","properties":{"id":20060,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5816756531470041,44.795922453916624]}},{"type":"Feature","properties":{"id":20071,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5873405205806616,44.81311328679103]}},{"type":"Feature","properties":{"id":20481,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5879740703110379,44.80459364035909]}},{"type":"Feature","properties":{"id":20213,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5873478577180511,44.80444115657791]}},{"type":"Feature","properties":{"id":19689,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5851495033491008,44.80153219107884]}},{"type":"Feature","properties":{"id":19598,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5850959289495298,44.808524217323345]}},{"type":"Feature","properties":{"id":20287,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5864864687442536,44.80581270157772]}},{"type":"Feature","properties":{"id":19583,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.584141209074514,44.795217084931785]}},{"type":"Feature","properties":{"id":19584,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5846472686524727,44.79564658849234]}},{"type":"Feature","properties":{"id":26871,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6042882382750667,44.79684094366318]}},{"type":"Feature","properties":{"id":16628,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6201737519763828,44.80505418675388]}},{"type":"Feature","properties":{"id":16629,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6207580646347948,44.80506171139595]}},{"type":"Feature","properties":{"id":20102,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5825067803575857,44.808361672208974]}},{"type":"Feature","properties":{"id":19952,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5841858371471785,44.80558750187525]}},{"type":"Feature","properties":{"id":19670,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5856717428526199,44.79693579087962]}},{"type":"Feature","properties":{"id":20119,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5861018004954792,44.81086318887048]}},{"type":"Feature","properties":{"id":20120,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.586101036755573,44.81007391743919]}},{"type":"Feature","properties":{"id":19671,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5848285086423236,44.796809595995924]}},{"type":"Feature","properties":{"id":19681,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5844384020875807,44.80730298439016]}},{"type":"Feature","properties":{"id":19551,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5807320014946282,44.79863200587201]}},{"type":"Feature","properties":{"id":19688,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5810459800769706,44.79835836100999]}},{"type":"Feature","properties":{"id":19692,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.583779240354156,44.80225909656631]}},{"type":"Feature","properties":{"id":19697,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.583594741220704,44.799262579054854]}},{"type":"Feature","properties":{"id":19698,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5838850510735177,44.79855745999362]}},{"type":"Feature","properties":{"id":19588,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5971281849445176,44.80254005614149]}},{"type":"Feature","properties":{"id":19734,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5942055605025433,44.79804610025062]}},{"type":"Feature","properties":{"id":19586,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5927545423625904,44.80435463593653]}},{"type":"Feature","properties":{"id":19963,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6030959881292656,44.796167611720165]}},{"type":"Feature","properties":{"id":17056,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6034283903360506,44.79591529769285]}},{"type":"Feature","properties":{"id":24224,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5910571820878934,44.810593805537806]}},{"type":"Feature","properties":{"id":27462,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6021125593266066,44.796799076337216]}},{"type":"Feature","properties":{"id":20149,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6022145735222436,44.796866559883405]}},{"type":"Feature","properties":{"id":29095,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5965714569927393,44.80037406839496]}},{"type":"Feature","properties":{"id":29094,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.59644967915179,44.800320356824194]}},{"type":"Feature","properties":{"id":16537,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6222925693597104,44.810466415289795]}},{"type":"Feature","properties":{"id":16583,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6232630403559571,44.81263813827225]}},{"type":"Feature","properties":{"id":30942,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6101889075141375,44.80350458555031]}},{"type":"Feature","properties":{"id":29758,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6106006068118239,44.804776729961674]}},{"type":"Feature","properties":{"id":25389,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5893995354674162,44.81164017740682]}},{"type":"Feature","properties":{"id":30059,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5894712877183582,44.81174583129971]}},{"type":"Feature","properties":{"id":23329,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.600171475528634,44.80630856983659]}},{"type":"Feature","properties":{"id":23317,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6003712714452328,44.80628008541878]}},{"type":"Feature","properties":{"id":25438,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.599956256747319,44.80612656908074]}},{"type":"Feature","properties":{"id":26731,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6007358852897697,44.80735466712789]}},{"type":"Feature","properties":{"id":19999,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5880356658461944,44.80012688090375]}},{"type":"Feature","properties":{"id":20170,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5888327396472829,44.80026468961341]}},{"type":"Feature","properties":{"id":20407,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6029063912671518,44.80705235166629]}},{"type":"Feature","properties":{"id":25046,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.604111969837402,44.79685463755314]}},{"type":"Feature","properties":{"id":19843,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5830314995900483,44.808371088178305]}},{"type":"Feature","properties":{"id":19845,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5946333376497162,44.81235014458704]}},{"type":"Feature","properties":{"id":20314,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5878989934571109,44.80870572007875]}},{"type":"Feature","properties":{"id":20313,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5878411980233785,44.808960402602814]}},{"type":"Feature","properties":{"id":19601,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5877737931600661,44.80881470450807]}},{"type":"Feature","properties":{"id":20209,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5893277101316055,44.80291684525887]}},{"type":"Feature","properties":{"id":16885,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6307440648849332,44.806857015563125]}},{"type":"Feature","properties":{"id":16390,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6225024468729391,44.80605356820456]}},{"type":"Feature","properties":{"id":16345,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6211277020072631,44.80020345272752]}},{"type":"Feature","properties":{"id":16185,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6164543226763436,44.803260855030295]}},{"type":"Feature","properties":{"id":27888,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6324539626388954,44.80672359754805]}},{"type":"Feature","properties":{"id":24466,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6155333858256525,44.793975887879235]}},{"type":"Feature","properties":{"id":24467,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6154612586161684,44.79419555204469]}},{"type":"Feature","properties":{"id":16523,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6197420186573377,44.79791674542534]}},{"type":"Feature","properties":{"id":16524,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6193705422846755,44.79893633192673]}},{"type":"Feature","properties":{"id":16532,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6103603574437853,44.80497740406887]}},{"type":"Feature","properties":{"id":16533,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6234178340187196,44.79431128839112]}},{"type":"Feature","properties":{"id":24049,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6234472882692765,44.79421630251364]}},{"type":"Feature","properties":{"id":16542,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6293560511976012,44.809064046406846]}},{"type":"Feature","properties":{"id":30479,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.629420588809221,44.80898163238363]}},{"type":"Feature","properties":{"id":19863,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5814665934575787,44.80293981469017]}},{"type":"Feature","properties":{"id":24949,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5831112470882293,44.81130090973327]}},{"type":"Feature","properties":{"id":16404,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6308082702318089,44.805101932908464]}},{"type":"Feature","properties":{"id":36295,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6310054379205055,44.80505005617093]}},{"type":"Feature","properties":{"id":16527,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.615303508186988,44.80257281271715]}},{"type":"Feature","properties":{"id":16528,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6147625339756065,44.80263045494609]}},{"type":"Feature","properties":{"id":16511,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6147790223180165,44.802748120007365]}},{"type":"Feature","properties":{"id":16500,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6213182259154546,44.79683321692945]}},{"type":"Feature","properties":{"id":16499,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6231775707522589,44.79442983674528]}},{"type":"Feature","properties":{"id":16672,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6286706524024379,44.80836209049072]}},{"type":"Feature","properties":{"id":16673,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6293441143335687,44.80814088793653]}},{"type":"Feature","properties":{"id":16419,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6071178372245689,44.805933187131934]}},{"type":"Feature","properties":{"id":16677,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6075186009733935,44.80418854536408]}},{"type":"Feature","properties":{"id":36338,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5884052365925718,44.809442744302494]}},{"type":"Feature","properties":{"id":20125,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5933858786547904,44.799536648197865]}},{"type":"Feature","properties":{"id":16750,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6297406522332688,44.805356804530206]}},{"type":"Feature","properties":{"id":15809,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6298412361821026,44.80565600613529]}},{"type":"Feature","properties":{"id":35012,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6330096504694444,44.80516829540005]}},{"type":"Feature","properties":{"id":16714,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.63286743820531,44.80497780590039]}},{"type":"Feature","properties":{"id":20385,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5921218055751118,44.80346029306825]}},{"type":"Feature","properties":{"id":20386,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5915990886301392,44.803357521495506]}},{"type":"Feature","properties":{"id":19993,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.58600702822517,44.8007377500221]}},{"type":"Feature","properties":{"id":25408,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6007471674791848,44.80446221351912]}},{"type":"Feature","properties":{"id":16535,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6202000052487621,44.81094462359676]}},{"type":"Feature","properties":{"id":54610,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.619935245200211,44.810926762624696]}},{"type":"Feature","properties":{"id":48659,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5826367980250649,44.798750738834926]}},{"type":"Feature","properties":{"id":30633,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5811058814962979,44.797695276271334]}},{"type":"Feature","properties":{"id":49410,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5896127506596973,44.80994108199276]}},{"type":"Feature","properties":{"id":20159,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5885014872928597,44.809885072212275]}},{"type":"Feature","properties":{"id":614,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5920620861449233,44.809101217559316]}},{"type":"Feature","properties":{"id":13307,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5884433216987119,44.8093329041959]}},{"type":"Feature","properties":{"id":28940,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5943043354637455,44.81037197922775]}},{"type":"Feature","properties":{"id":16882,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6308228069958516,44.80703232765483]}},{"type":"Feature","properties":{"id":16607,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6120315589483181,44.804418707609955]}},{"type":"Feature","properties":{"id":16757,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6091390095554492,44.80751947833871]}},{"type":"Feature","properties":{"id":16758,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6084853871706092,44.80752697399567]}},{"type":"Feature","properties":{"id":17057,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6039887601312252,44.7954786555727]}},{"type":"Feature","properties":{"id":5936,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6052587178431771,44.79311156322309]}},{"type":"Feature","properties":{"id":16341,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6248167158546375,44.80108108882604]}},{"type":"Feature","properties":{"id":16773,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6230278625711209,44.79802290803133]}},{"type":"Feature","properties":{"id":16501,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6212388052444724,44.79702510154128]}},{"type":"Feature","properties":{"id":16040,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6248421499497538,44.80544780398771]}},{"type":"Feature","properties":{"id":19945,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.593193462358844,44.79621797596893]}},{"type":"Feature","properties":{"id":19951,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5849876235953666,44.80613983686355]}},{"type":"Feature","properties":{"id":16211,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6150382268229753,44.793035756445974]}},{"type":"Feature","properties":{"id":30956,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6183521141724402,44.80048385125475]}},{"type":"Feature","properties":{"id":27894,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6309912993060639,44.81066543778118]}},{"type":"Feature","properties":{"id":27893,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6301628211966482,44.811140317985114]}},{"type":"Feature","properties":{"id":16403,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6309416636166261,44.80546791955571]}},{"type":"Feature","properties":{"id":16421,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6056844644651586,44.806002687415926]}},{"type":"Feature","properties":{"id":23488,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6300299939272938,44.80975663521422]}},{"type":"Feature","properties":{"id":16039,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6259480769330436,44.805108556981914]}},{"type":"Feature","properties":{"id":15842,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6283159846498326,44.80246624911388]}},{"type":"Feature","properties":{"id":16462,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6303581801530276,44.807816474705625]}},{"type":"Feature","properties":{"id":16939,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6238502063826362,44.812110102232744]}},{"type":"Feature","properties":{"id":16869,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6246231752046867,44.811427684732095]}},{"type":"Feature","properties":{"id":16952,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6261384776787635,44.80778442185393]}},{"type":"Feature","properties":{"id":16949,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6149636158821615,44.81253617954805]}},{"type":"Feature","properties":{"id":16950,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6162453655944039,44.812137179078924]}},{"type":"Feature","properties":{"id":15977,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6061403033668107,44.796389468898305]}},{"type":"Feature","properties":{"id":15978,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6059079132524073,44.79656781491607]}},{"type":"Feature","properties":{"id":31834,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6148726813755127,44.797617157607036]}},{"type":"Feature","properties":{"id":30018,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6100281494112885,44.805710327171916]}},{"type":"Feature","properties":{"id":17036,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6077160928261833,44.809473202346354]}},{"type":"Feature","properties":{"id":30757,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6317138802751466,44.803460696747564]}},{"type":"Feature","properties":{"id":30758,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6314303730376181,44.80188679333691]}},{"type":"Feature","properties":{"id":25034,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6125672769128109,44.7940197076383]}},{"type":"Feature","properties":{"id":16014,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6119745595212183,44.79445778236543]}},{"type":"Feature","properties":{"id":16129,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.627149054686297,44.80405002871358]}},{"type":"Feature","properties":{"id":16255,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6257521823861885,44.80431219554282]}},{"type":"Feature","properties":{"id":16252,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6268196929754306,44.80186600150498]}},{"type":"Feature","properties":{"id":17372,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6304017045255174,44.79375586260076]}},{"type":"Feature","properties":{"id":17369,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.627080073458247,44.79361836120969]}},{"type":"Feature","properties":{"id":25437,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.627836075908068,44.793587669035915]}},{"type":"Feature","properties":{"id":26807,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6268444155250309,44.79226335915188]}},{"type":"Feature","properties":{"id":17749,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6095588933797128,44.80069147420939]}},{"type":"Feature","properties":{"id":31586,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6061904248093064,44.80935934252739]}},{"type":"Feature","properties":{"id":16436,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6067367308739857,44.809327157783876]}},{"type":"Feature","properties":{"id":16504,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6199814020393726,44.797727427460025]}},{"type":"Feature","properties":{"id":16347,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6214167578327167,44.79826691178667]}},{"type":"Feature","properties":{"id":25908,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6278565756756521,44.794040137058424]}},{"type":"Feature","properties":{"id":16590,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6334931477747833,44.807382520972965]}},{"type":"Feature","properties":{"id":17039,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6247758361554655,44.81422144580021]}},{"type":"Feature","properties":{"id":19989,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5892428261966974,44.801140946932136]}},{"type":"Feature","properties":{"id":20522,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6033760385970242,44.80532050067225]}},{"type":"Feature","properties":{"id":20520,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6021666254435213,44.80564680328958]}},{"type":"Feature","properties":{"id":30378,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6022917175528385,44.80588894695939]}},{"type":"Feature","properties":{"id":20401,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5996080759009443,44.806864276637434]}},{"type":"Feature","properties":{"id":57744,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5980661419872498,44.80799106177666]}},{"type":"Feature","properties":{"id":34169,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.587796914409828,44.79791488591274]}},{"type":"Feature","properties":{"id":19576,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5877750460731076,44.79799448753065]}},{"type":"Feature","properties":{"id":19554,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5808042810274717,44.79918463227966]}},{"type":"Feature","properties":{"id":20161,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6025536281227533,44.79596940673287]}},{"type":"Feature","properties":{"id":23330,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6029775749561365,44.79611911546831]}},{"type":"Feature","properties":{"id":20073,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5862677591195563,44.81279020825787]}},{"type":"Feature","properties":{"id":20116,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5861854658165723,44.812315730242524]}},{"type":"Feature","properties":{"id":20124,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5839187422932206,44.800933203016335]}},{"type":"Feature","properties":{"id":29726,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6210431820372987,44.807195449262856]}},{"type":"Feature","properties":{"id":17517,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6206160801426124,44.80701978018523]}},{"type":"Feature","properties":{"id":17555,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6075399926453159,44.79530020462924]}},{"type":"Feature","properties":{"id":24953,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.583498074377168,44.81186020148482]}},{"type":"Feature","properties":{"id":24954,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5833320972450592,44.81171859716562]}},{"type":"Feature","properties":{"id":20418,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5936575716898786,44.80631475967341]}},{"type":"Feature","properties":{"id":23612,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5809334049683368,44.79758882598663]}},{"type":"Feature","properties":{"id":30632,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5809358583233416,44.7977036927822]}},{"type":"Feature","properties":{"id":20254,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.585610866426628,44.80766229960811]}},{"type":"Feature","properties":{"id":19944,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5948658704777255,44.79626871633933]}},{"type":"Feature","properties":{"id":21898,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5926451115140102,44.79696865908753]}},{"type":"Feature","properties":{"id":20510,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5924878194613906,44.79667374462788]}},{"type":"Feature","properties":{"id":20412,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.601584876390149,44.80579773715195]}},{"type":"Feature","properties":{"id":20249,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5846706106451018,44.799865821105186]}},{"type":"Feature","properties":{"id":19618,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5897684222230885,44.79628065133203]}},{"type":"Feature","properties":{"id":19619,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5884126126163992,44.79620020875445]}},{"type":"Feature","properties":{"id":20053,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5944407225173641,44.81033496976032]}},{"type":"Feature","properties":{"id":21900,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5984941854509571,44.79876959648253]}},{"type":"Feature","properties":{"id":20186,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5995584697456817,44.797928416799316]}},{"type":"Feature","properties":{"id":20513,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5959392521576963,44.79447186994839]}},{"type":"Feature","properties":{"id":25700,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5941555003119894,44.79425369005078]}},{"type":"Feature","properties":{"id":20033,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5956951221808845,44.80408803249884]}},{"type":"Feature","properties":{"id":19749,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5822565001424345,44.79625673810243]}},{"type":"Feature","properties":{"id":16630,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6209765883858974,44.80501529813661]}},{"type":"Feature","properties":{"id":16631,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6202864288590101,44.80518005017042]}},{"type":"Feature","properties":{"id":19893,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5951509690186139,44.80529017486023]}},{"type":"Feature","properties":{"id":20096,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5862735772825147,44.79490789896886]}},{"type":"Feature","properties":{"id":22360,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5842133684977429,44.80200895198547]}},{"type":"Feature","properties":{"id":19693,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5829773948842143,44.80285700859803]}},{"type":"Feature","properties":{"id":25686,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5923505719694316,44.79740711467132]}},{"type":"Feature","properties":{"id":19733,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5921843731680444,44.79734083928537]}},{"type":"Feature","properties":{"id":20145,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5938418315239782,44.80177681685403]}},{"type":"Feature","properties":{"id":20141,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5914934469368046,44.80787730359128]}},{"type":"Feature","properties":{"id":59021,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.591766336803742,44.8068580488834]}},{"type":"Feature","properties":{"id":29089,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5965703030351481,44.8006820962064]}},{"type":"Feature","properties":{"id":23328,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6039085937317981,44.795420660585705]}},{"type":"Feature","properties":{"id":30496,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5903439306842265,44.811647667559505]}},{"type":"Feature","properties":{"id":30495,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5902507396256396,44.81214867142865]}},{"type":"Feature","properties":{"id":30616,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6294033291781501,44.80882408599701]}},{"type":"Feature","properties":{"id":31147,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6290654939923932,44.808286074605]}},{"type":"Feature","properties":{"id":16591,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6336468350273577,44.807851273265534]}},{"type":"Feature","properties":{"id":27887,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6321219936157869,44.80681716620748]}},{"type":"Feature","properties":{"id":27555,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6053857356036779,44.80792308022486]}},{"type":"Feature","properties":{"id":23133,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6004552821986776,44.80621508908806]}},{"type":"Feature","properties":{"id":27599,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6001917895831032,44.80508794082779]}},{"type":"Feature","properties":{"id":49830,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6001113002571422,44.80457918076215]}},{"type":"Feature","properties":{"id":19747,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6005709443936075,44.81246494703294]}},{"type":"Feature","properties":{"id":20232,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6001605108446603,44.810093998251546]}},{"type":"Feature","properties":{"id":20396,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6033032501363998,44.80586050945838]}},{"type":"Feature","properties":{"id":20397,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6024013038858907,44.80610770975058]}},{"type":"Feature","properties":{"id":19847,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5972536510442011,44.81180591126048]}},{"type":"Feature","properties":{"id":28643,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5941901639134951,44.81028631546872]}},{"type":"Feature","properties":{"id":29243,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5886892546935539,44.80732974323805]}},{"type":"Feature","properties":{"id":20312,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5876967809948078,44.80906765093253]}},{"type":"Feature","properties":{"id":16601,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6324972230262332,44.80443615401674]}},{"type":"Feature","properties":{"id":19759,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5839721605433712,44.79625664083094]}},{"type":"Feature","properties":{"id":20215,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5867244760266841,44.8043076775135]}},{"type":"Feature","properties":{"id":24952,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5836397916982583,44.81212859390735]}},{"type":"Feature","properties":{"id":17285,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6145145899145501,44.80572097974112]}},{"type":"Feature","properties":{"id":15887,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6144286227959143,44.79572258881573]}},{"type":"Feature","properties":{"id":16518,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6229576027525034,44.794378110453]}},{"type":"Feature","properties":{"id":16519,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6212349465970253,44.796764252395086]}},{"type":"Feature","properties":{"id":16526,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6170348711673813,44.80045800961697]}},{"type":"Feature","properties":{"id":16531,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6108199774483072,44.80481444701006]}},{"type":"Feature","properties":{"id":16536,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6205284245130067,44.81087246378458]}},{"type":"Feature","properties":{"id":16547,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6337864428814863,44.80910835023672]}},{"type":"Feature","properties":{"id":22873,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6004152790420273,44.805991960079176]}},{"type":"Feature","properties":{"id":23255,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6006221089494935,44.80453445507072]}},{"type":"Feature","properties":{"id":19550,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.58038085195626,44.79839272485266]}},{"type":"Feature","properties":{"id":19895,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5912520546581699,44.81011634475008]}},{"type":"Feature","properties":{"id":19896,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5898639664009762,44.81006134052601]}},{"type":"Feature","properties":{"id":21901,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5969918950318113,44.798133216314305]}},{"type":"Feature","properties":{"id":19934,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5832376806298483,44.810574383277476]}},{"type":"Feature","properties":{"id":16600,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6054086379978214,44.795921806801715]}},{"type":"Feature","properties":{"id":16514,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6109243507247113,44.804921214813355]}},{"type":"Feature","properties":{"id":16513,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6117154585853717,44.80410741972833]}},{"type":"Feature","properties":{"id":19898,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5896315190587665,44.81053710171911]}},{"type":"Feature","properties":{"id":27598,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6004523068258636,44.8045365874173]}},{"type":"Feature","properties":{"id":35011,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6323132574139818,44.80535818369297]}},{"type":"Feature","properties":{"id":20269,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5928693700846391,44.799062920016524]}},{"type":"Feature","properties":{"id":25685,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5917724060901783,44.798699046797225]}},{"type":"Feature","properties":{"id":42110,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5901752386690532,44.80668821935534]}},{"type":"Feature","properties":{"id":38610,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.594965116161893,44.80104390037088]}},{"type":"Feature","properties":{"id":38858,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5937829356824031,44.80173931199198]}},{"type":"Feature","properties":{"id":20043,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5884806678820967,44.80460857465829]}},{"type":"Feature","properties":{"id":20479,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5878582517449966,44.804853216293985]}},{"type":"Feature","properties":{"id":20441,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5861338372861663,44.80013822103367]}},{"type":"Feature","properties":{"id":20439,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.586027412261367,44.80060982177523]}},{"type":"Feature","properties":{"id":20440,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5854018225157706,44.80007392124822]}},{"type":"Feature","properties":{"id":54607,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6271222134196999,44.80622321408799]}},{"type":"Feature","properties":{"id":54611,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6199400407258951,44.810830217920476]}},{"type":"Feature","properties":{"id":16951,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6257873812750893,44.80795235979245]}},{"type":"Feature","properties":{"id":29245,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5886221785661602,44.80724420989426]}},{"type":"Feature","properties":{"id":29246,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5889215836520356,44.807171255589246]}},{"type":"Feature","properties":{"id":53582,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6009433766419726,44.80649702704205]}},{"type":"Feature","properties":{"id":20398,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6018331508031505,44.80626163727018]}},{"type":"Feature","properties":{"id":53584,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6005427197009086,44.80666105414587]}},{"type":"Feature","properties":{"id":53583,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.600500201452968,44.806578093243665]}},{"type":"Feature","properties":{"id":49829,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6045282040629822,44.8057139575337]}},{"type":"Feature","properties":{"id":20405,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6038053565986792,44.806815962071745]}},{"type":"Feature","properties":{"id":48658,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5827289793055835,44.798831340566984]}},{"type":"Feature","properties":{"id":48661,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5827337220341308,44.79874885656027]}},{"type":"Feature","properties":{"id":48660,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5826554480804653,44.79883708007676]}},{"type":"Feature","properties":{"id":20536,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5952249709914197,44.80781373927588]}},{"type":"Feature","properties":{"id":628,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5949446075557351,44.80787746060429]}},{"type":"Feature","properties":{"id":20350,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6002739308007025,44.805937160069774]}},{"type":"Feature","properties":{"id":20063,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5818017654633052,44.79409946398881]}},{"type":"Feature","properties":{"id":27233,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6240391870529518,44.79383701591695]}},{"type":"Feature","properties":{"id":27232,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6243538295028445,44.79372240086953]}},{"type":"Feature","properties":{"id":27234,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.623379009221982,44.79408605511891]}},{"type":"Feature","properties":{"id":16752,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6196697256676994,44.79906661944379]}},{"type":"Feature","properties":{"id":28441,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6194581803946418,44.80085421141209]}},{"type":"Feature","properties":{"id":16753,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6062086005106154,44.804538531610724]}},{"type":"Feature","properties":{"id":15874,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6214998958983052,44.794007185475536]}},{"type":"Feature","properties":{"id":27481,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6207090517644245,44.796434535973084]}},{"type":"Feature","properties":{"id":30057,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5894924222691592,44.81158734105841]}},{"type":"Feature","properties":{"id":16017,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6080748822995544,44.807963565585]}},{"type":"Feature","properties":{"id":30100,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6077251719231692,44.80789565556416]}},{"type":"Feature","properties":{"id":27482,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6208367372807657,44.79666666959483]}},{"type":"Feature","properties":{"id":16521,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6209334497793274,44.79682060587063]}},{"type":"Feature","properties":{"id":16922,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6197940289716289,44.804594956016665]}},{"type":"Feature","properties":{"id":27339,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6206653246477516,44.804606589408365]}},{"type":"Feature","properties":{"id":25672,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6093296767989641,44.79621991546355]}},{"type":"Feature","properties":{"id":16269,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6282005990874134,44.807691547607696]}},{"type":"Feature","properties":{"id":15824,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6284258411300346,44.80741807490818]}},{"type":"Feature","properties":{"id":29865,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6251557220834865,44.79835525067678]}},{"type":"Feature","properties":{"id":31583,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6054698997467376,44.808677917346344]}},{"type":"Feature","properties":{"id":20163,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6003365168343558,44.808270294930296]}},{"type":"Feature","properties":{"id":16226,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.615993843363658,44.808079542423435]}},{"type":"Feature","properties":{"id":16227,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6156386765922829,44.808168934866266]}},{"type":"Feature","properties":{"id":28915,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6233650667962933,44.80716889130704]}},{"type":"Feature","properties":{"id":28442,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6184777365899734,44.80079802889875]}},{"type":"Feature","properties":{"id":16020,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6177472367798235,44.8092290114272]}},{"type":"Feature","properties":{"id":16225,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6186893706113094,44.80773942310523]}},{"type":"Feature","properties":{"id":16434,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6334066349679124,44.81109917839348]}},{"type":"Feature","properties":{"id":25319,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6309738476311294,44.807133985290996]}},{"type":"Feature","properties":{"id":16503,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6204684765805153,44.7973743793357]}},{"type":"Feature","properties":{"id":30132,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5908003747528613,44.81253101600426]}},{"type":"Feature","properties":{"id":22796,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6275920194000862,44.80652960157727]}},{"type":"Feature","properties":{"id":15823,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.628077623263275,44.80687588042583]}},{"type":"Feature","properties":{"id":16377,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6256155342448166,44.80460184989887]}},{"type":"Feature","properties":{"id":57284,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6256792607284879,44.804690975514546]}},{"type":"Feature","properties":{"id":16666,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6174973955855689,44.811732712827244]}},{"type":"Feature","properties":{"id":16003,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6311618754544944,44.800779946141475]}},{"type":"Feature","properties":{"id":19793,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.581043175686349,44.80386170890745]}},{"type":"Feature","properties":{"id":19794,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5801867371211297,44.8038034536805]}},{"type":"Feature","properties":{"id":19814,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5858764711911255,44.80673826182572]}},{"type":"Feature","properties":{"id":19813,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5860118123630705,44.80683708913506]}},{"type":"Feature","properties":{"id":16038,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6273931098724322,44.80459851259172]}},{"type":"Feature","properties":{"id":17230,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6313345077378727,44.801901565174525]}},{"type":"Feature","properties":{"id":16606,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6125250585888145,44.8055516828129]}},{"type":"Feature","properties":{"id":15830,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6288499444519569,44.80393154326636]}},{"type":"Feature","properties":{"id":15876,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6184503784224944,44.79483267624182]}},{"type":"Feature","properties":{"id":17170,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6311166921227062,44.80050654248247]}},{"type":"Feature","properties":{"id":17040,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6278458495754775,44.813336609117634]}},{"type":"Feature","properties":{"id":17140,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6167264185774021,44.812885880405375]}},{"type":"Feature","properties":{"id":17283,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6067595134788911,44.80015574212107]}},{"type":"Feature","properties":{"id":25611,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6061927458767559,44.79975627139223]}},{"type":"Feature","properties":{"id":16489,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6235468187345438,44.80153305782432]}},{"type":"Feature","properties":{"id":16346,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6213004097149313,44.79914595828795]}},{"type":"Feature","properties":{"id":16722,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6270886859262708,44.794153454899394]}},{"type":"Feature","properties":{"id":26548,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6293356239872048,44.7942267997652]}},{"type":"Feature","properties":{"id":25689,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5919747227009714,44.793750392727745]}},{"type":"Feature","properties":{"id":19998,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5871427200275997,44.802502850829214]}},{"type":"Feature","properties":{"id":19997,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5866414389109001,44.80354045736144]}},{"type":"Feature","properties":{"id":29935,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5912555154959257,44.80751520978357]}},{"type":"Feature","properties":{"id":29248,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5889127340169472,44.807307558385496]}},{"type":"Feature","properties":{"id":20544,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5921067490056824,44.81264047826045]}},{"type":"Feature","properties":{"id":17556,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6082477944066069,44.79542278223798]}},{"type":"Feature","properties":{"id":17557,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6083034349545852,44.79554163781109]}},{"type":"Feature","properties":{"id":24956,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5831128403084147,44.81142832487604]}},{"type":"Feature","properties":{"id":24955,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5831192966936468,44.81155864960264]}},{"type":"Feature","properties":{"id":16191,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6296198397404436,44.803868150264506]}},{"type":"Feature","properties":{"id":20182,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5798295503254133,44.79815136572929]}},{"type":"Feature","properties":{"id":17750,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6093768517601454,44.800910207684005]}},{"type":"Feature","properties":{"id":30634,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.581049012358213,44.797567980156245]}},{"type":"Feature","properties":{"id":17773,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6105819573232397,44.79443030040655]}},{"type":"Feature","properties":{"id":22891,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6017685441052617,44.806145044514714]}},{"type":"Feature","properties":{"id":19600,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5869876197288899,44.80872986951243]}},{"type":"Feature","properties":{"id":19627,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5866746519603945,44.8046721880755]}},{"type":"Feature","properties":{"id":19628,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5861198120682125,44.80449537688717]}},{"type":"Feature","properties":{"id":20009,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5886201223908932,44.795558312862916]}},{"type":"Feature","properties":{"id":20055,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5861596889364554,44.79540171578158]}},{"type":"Feature","properties":{"id":17441,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6206897558564304,44.81118442213069]}},{"type":"Feature","properties":{"id":25245,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.604094233275002,44.79673079546311]}},{"type":"Feature","properties":{"id":16632,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6201678190527815,44.80528814201962]}},{"type":"Feature","properties":{"id":19685,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5831887578305832,44.8130770372922]}},{"type":"Feature","properties":{"id":23182,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5822053501379916,44.81203081536906]}},{"type":"Feature","properties":{"id":19723,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5822195256664939,44.81197586969005]}},{"type":"Feature","properties":{"id":20414,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5824723589146111,44.812248511199655]}},{"type":"Feature","properties":{"id":19728,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.595003061518976,44.80107819332798]}},{"type":"Feature","properties":{"id":38609,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5960516029257379,44.800504460980235]}},{"type":"Feature","properties":{"id":19939,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6001156711618988,44.798157515156575]}},{"type":"Feature","properties":{"id":27556,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.605757491691602,44.80762330174275]}},{"type":"Feature","properties":{"id":25956,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6053373108555657,44.807834712668125]}},{"type":"Feature","properties":{"id":23353,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6000852811907536,44.8043813726086]}},{"type":"Feature","properties":{"id":23254,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6002816167230712,44.80438470667476]}},{"type":"Feature","properties":{"id":49828,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6053620107596795,44.80537088988191]}},{"type":"Feature","properties":{"id":20311,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5873844207319046,44.80931081429517]}},{"type":"Feature","properties":{"id":19772,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5870244283657843,44.797018707197054]}},{"type":"Feature","properties":{"id":20198,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5878802718810091,44.8104521851498]}},{"type":"Feature","properties":{"id":20211,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5887105096135855,44.80420566504319]}},{"type":"Feature","properties":{"id":36294,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6322121990324753,44.804561645228155]}},{"type":"Feature","properties":{"id":20415,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5841520718199863,44.81235053970521]}},{"type":"Feature","properties":{"id":24464,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6156559924187647,44.79421016985492]}},{"type":"Feature","properties":{"id":16775,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6231370346267664,44.79401025740016]}},{"type":"Feature","properties":{"id":16534,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6228581922887556,44.794223541097814]}},{"type":"Feature","properties":{"id":31418,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6219157960357039,44.794463185128066]}},{"type":"Feature","properties":{"id":19773,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5868890728028368,44.797380961659904]}},{"type":"Feature","properties":{"id":19940,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5997444328869818,44.79781866557593]}},{"type":"Feature","properties":{"id":16505,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6194418446698561,44.798961628216425]}},{"type":"Feature","properties":{"id":16512,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6132006267363936,44.80286043204193]}},{"type":"Feature","properties":{"id":16667,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6180171131666972,44.81246612657396]}},{"type":"Feature","properties":{"id":19582,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5839761420156613,44.795077165607054]}},{"type":"Feature","properties":{"id":20444,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5840797735570805,44.794989943369195]}},{"type":"Feature","properties":{"id":20387,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5910668377371494,44.803253624036394]}},{"type":"Feature","properties":{"id":59322,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5905249464257029,44.80314674222542]}},{"type":"Feature","properties":{"id":34720,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6290182849240853,44.80555840129723]}},{"type":"Feature","properties":{"id":38853,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5926887131867463,44.804341941868636]}},{"type":"Feature","properties":{"id":20474,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5912725273716545,44.80418600579809]}},{"type":"Feature","properties":{"id":54606,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6269556598485034,44.80614553903033]}},{"type":"Feature","properties":{"id":53581,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5999683281837823,44.80675796006154]}},{"type":"Feature","properties":{"id":53586,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6003802276684883,44.80660833529063]}},{"type":"Feature","properties":{"id":53585,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6004237858826246,44.806693377047004]}},{"type":"Feature","properties":{"id":629,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5914292510220244,44.809221191179155]}},{"type":"Feature","properties":{"id":13306,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5885482454810009,44.80883927887937]}},{"type":"Feature","properties":{"id":23429,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5872243072582464,44.79794565051813]}},{"type":"Feature","properties":{"id":23432,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5871286171694389,44.797930742521565]}},{"type":"Feature","properties":{"id":25669,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6095480015968218,44.796184880097506]}},{"type":"Feature","properties":{"id":25670,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.609403328369066,44.796153528874584]}},{"type":"Feature","properties":{"id":16229,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6103927881971604,44.80848330192842]}},{"type":"Feature","properties":{"id":16432,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6318455929708662,44.81126325695497]}},{"type":"Feature","properties":{"id":16439,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6096602097524809,44.80926099606958]}},{"type":"Feature","properties":{"id":22793,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6091806218940967,44.80948763867637]}},{"type":"Feature","properties":{"id":23169,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5913453901569167,44.81046886122681]}},{"type":"Feature","properties":{"id":16490,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6221211395213243,44.801523791125014]}},{"type":"Feature","properties":{"id":16005,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6285498687749147,44.80061567178153]}},{"type":"Feature","properties":{"id":19798,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5807791026423318,44.8020140742784]}},{"type":"Feature","properties":{"id":19611,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5809830269145462,44.80141257539398]}},{"type":"Feature","properties":{"id":19799,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5811691452983703,44.80095630755851]}},{"type":"Feature","properties":{"id":58724,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5859312438765092,44.80662709269295]}},{"type":"Feature","properties":{"id":17231,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6339034211751292,44.802374701785695]}},{"type":"Feature","properties":{"id":17161,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6312700013020841,44.80121295081171]}},{"type":"Feature","properties":{"id":17297,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.631872080810827,44.80354356705513]}},{"type":"Feature","properties":{"id":17303,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.633645900316175,44.804753042016685]}},{"type":"Feature","properties":{"id":16261,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6175045797927119,44.81063130724919]}},{"type":"Feature","properties":{"id":16294,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6157785186711434,44.80542352907227]}},{"type":"Feature","properties":{"id":17007,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6124529785310876,44.80122124830705]}},{"type":"Feature","properties":{"id":17288,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6237854723855056,44.80244520763538]}},{"type":"Feature","properties":{"id":17289,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.605885215623023,44.800376062741314]}},{"type":"Feature","properties":{"id":16509,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.615239654429878,44.802825724109816]}},{"type":"Feature","properties":{"id":16538,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6230681813424483,44.8102911840886]}},{"type":"Feature","properties":{"id":22795,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6090463583577566,44.80907535584115]}},{"type":"Feature","properties":{"id":19992,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5867477686237127,44.800852667230565]}},{"type":"Feature","properties":{"id":20127,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5825727753321275,44.79448928213151]}},{"type":"Feature","properties":{"id":30970,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6254496151827686,44.810692299541095]}},{"type":"Feature","properties":{"id":30971,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6254341233497007,44.81093691986639]}},{"type":"Feature","properties":{"id":15932,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.630562884029604,44.795967954910736]}},{"type":"Feature","properties":{"id":26549,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6310904512217805,44.79410961270501]}},{"type":"Feature","properties":{"id":23693,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6311241504282005,44.7940018771171]}},{"type":"Feature","properties":{"id":22371,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5890468881739451,44.804019571503474]}},{"type":"Feature","properties":{"id":20315,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5881797231688719,44.80891198002606]}},{"type":"Feature","properties":{"id":16015,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6108716764102907,44.79524851413376]}},{"type":"Feature","properties":{"id":32755,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6311606805048848,44.804346679159686]}},{"type":"Feature","properties":{"id":20041,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5889610944976797,44.80472886989087]}},{"type":"Feature","properties":{"id":20218,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5828373192713951,44.7965436374562]}},{"type":"Feature","properties":{"id":20220,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5821407023838101,44.80162375322326]}},{"type":"Feature","properties":{"id":23216,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6075668450194411,44.79821632599034]}},{"type":"Feature","properties":{"id":20356,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6074446916455576,44.798409464890945]}},{"type":"Feature","properties":{"id":59308,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5851729305762308,44.80191907417385]}},{"type":"Feature","properties":{"id":19763,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5853168094815572,44.808167198079275]}},{"type":"Feature","properties":{"id":31649,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6190857935197557,44.79605101324716]}},{"type":"Feature","properties":{"id":22956,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5998836905566615,44.80354620340311]}},{"type":"Feature","properties":{"id":20108,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5840087065161284,44.81364925808745]}},{"type":"Feature","properties":{"id":19732,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5919607284167003,44.81025674671239]}},{"type":"Feature","properties":{"id":19616,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6347527507738805,44.79694503264647]}},{"type":"Feature","properties":{"id":20035,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5992047248805338,44.802551201774975]}},{"type":"Feature","properties":{"id":20008,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5887778931031118,44.79492023813073]}},{"type":"Feature","properties":{"id":27340,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6192003451272676,44.805816641880824]}},{"type":"Feature","properties":{"id":27341,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6190762675168572,44.805843741373984]}},{"type":"Feature","properties":{"id":15960,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6128294430135697,44.797650377098066]}},{"type":"Feature","properties":{"id":27582,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6229018336977635,44.79433016103196]}},{"type":"Feature","properties":{"id":16545,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6318755916354046,44.80876490225784]}},{"type":"Feature","properties":{"id":16430,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6300172199596933,44.80892484828186]}},{"type":"Feature","properties":{"id":19855,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5845034664131551,44.7992165556342]}},{"type":"Feature","properties":{"id":19915,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5818780991626679,44.8088520567097]}},{"type":"Feature","properties":{"id":16507,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6171720137256175,44.800471934783396]}},{"type":"Feature","properties":{"id":35880,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.584790537238073,44.79517337702367]}},{"type":"Feature","properties":{"id":25407,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6005624050351719,44.804188356648226]}},{"type":"Feature","properties":{"id":19573,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5916468256867602,44.79864509009591]}},{"type":"Feature","properties":{"id":20268,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5879957097363121,44.802660342236095]}},{"type":"Feature","properties":{"id":16884,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6306234818854873,44.80621829611289]}},{"type":"Feature","properties":{"id":23431,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5873434046687883,44.79796261261956]}},{"type":"Feature","properties":{"id":16889,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6192339446481433,44.804759615665944]}},{"type":"Feature","properties":{"id":34733,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6306521263403831,44.80514015827631]}},{"type":"Feature","properties":{"id":19585,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5847781845475827,44.795721463465725]}},{"type":"Feature","properties":{"id":27895,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6306107064487226,44.810333015277955]}},{"type":"Feature","properties":{"id":23489,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6310324710411841,44.80977418478704]}},{"type":"Feature","properties":{"id":17793,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6117017660984965,44.80572268210356]}},{"type":"Feature","properties":{"id":17118,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6075898372026082,44.809273619724856]}},{"type":"Feature","properties":{"id":15882,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6214063507691692,44.793851257111]}},{"type":"Feature","properties":{"id":25409,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6313066635366836,44.801680487252156]}},{"type":"Feature","properties":{"id":17162,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6330550263178062,44.80018825982236]}},{"type":"Feature","properties":{"id":16253,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6267055904211111,44.801112215789686]}},{"type":"Feature","properties":{"id":23492,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6287238129443788,44.80891305861358]}},{"type":"Feature","properties":{"id":26058,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6282294451853828,44.79213080313704]}},{"type":"Feature","properties":{"id":30029,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6083205954746773,44.798666159103746]}},{"type":"Feature","properties":{"id":17126,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6324882849617394,44.79416964742149]}},{"type":"Feature","properties":{"id":16135,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6333199899073376,44.79415767051185]}},{"type":"Feature","properties":{"id":20197,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5874394502332281,44.81301107708922]}},{"type":"Feature","properties":{"id":20195,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5963748769008166,44.80593403532045]}},{"type":"Feature","properties":{"id":29241,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5918630512275317,44.806781595907665]}},{"type":"Feature","properties":{"id":19599,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5861563400219824,44.80864203725283]}},{"type":"Feature","properties":{"id":20416,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.585083395922537,44.812322723297065]}},{"type":"Feature","properties":{"id":17403,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6303931736083461,44.79455265789623]}},{"type":"Feature","properties":{"id":17751,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6057238322161185,44.8049954861119]}},{"type":"Feature","properties":{"id":22368,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5895402813859256,44.80334766444167]}},{"type":"Feature","properties":{"id":20040,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5898878302914718,44.80493116959223]}},{"type":"Feature","properties":{"id":20367,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5845266756419456,44.81081239400367]}},{"type":"Feature","properties":{"id":19866,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5821560683356397,44.80205430950675]}},{"type":"Feature","properties":{"id":27478,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6190323834630272,44.80003539102069]}},{"type":"Feature","properties":{"id":27664,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6308029509226473,44.79340748890225]}},{"type":"Feature","properties":{"id":27665,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6306669053178622,44.79197228945535]}},{"type":"Feature","properties":{"id":20181,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5878866023049307,44.80723804824538]}},{"type":"Feature","properties":{"id":38852,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5922567476898352,44.805410420472995]}},{"type":"Feature","properties":{"id":42109,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5908768346438454,44.805135111541]}},{"type":"Feature","properties":{"id":19614,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5975106500427024,44.81243610629011]}},{"type":"Feature","properties":{"id":19797,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5806009916716915,44.80272159659935]}},{"type":"Feature","properties":{"id":23479,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.596962525832824,44.7942880795142]}},{"type":"Feature","properties":{"id":16938,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6220677986690202,44.813720449606464]}},{"type":"Feature","properties":{"id":16134,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.633202368626908,44.794832825789584]}},{"type":"Feature","properties":{"id":20230,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.581399142937162,44.799271566811626]}},{"type":"Feature","properties":{"id":20134,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5795537033330288,44.79665100351513]}},{"type":"Feature","properties":{"id":30033,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5919798225307895,44.81388536468162]}},{"type":"Feature","properties":{"id":19649,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5794287913091821,44.80658262885887]}},{"type":"Feature","properties":{"id":19809,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5840053833237241,44.80295370653722]}},{"type":"Feature","properties":{"id":19684,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5821933875355502,44.81311505203595]}},{"type":"Feature","properties":{"id":19722,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5821412127605833,44.8124160415655]}},{"type":"Feature","properties":{"id":22876,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5981996355267528,44.79928031462285]}},{"type":"Feature","properties":{"id":30058,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5893594529373799,44.81248406737403]}},{"type":"Feature","properties":{"id":16589,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6332361872648015,44.80662438438843]}},{"type":"Feature","properties":{"id":16517,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6058526999066345,44.807680729014336]}},{"type":"Feature","properties":{"id":23323,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5983600071891754,44.808352657301484]}},{"type":"Feature","properties":{"id":23291,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.598175104191677,44.80825698384061]}},{"type":"Feature","properties":{"id":16723,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6271397607279103,44.79464557544812]}},{"type":"Feature","properties":{"id":19528,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.626651901013641,44.79515209207201]}},{"type":"Feature","properties":{"id":30143,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6324821773750492,44.79407471367852]}},{"type":"Feature","properties":{"id":16727,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6324424028235368,44.79358998032634]}},{"type":"Feature","properties":{"id":19762,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5840965601187471,44.796381356983915]}},{"type":"Feature","properties":{"id":19771,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5880899537441516,44.79708175177864]}},{"type":"Feature","properties":{"id":17395,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6196479004013254,44.80571168586368]}},{"type":"Feature","properties":{"id":17139,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6154697640153065,44.813301834604765]}},{"type":"Feature","properties":{"id":16712,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.633397283165561,44.805887755899924]}},{"type":"Feature","properties":{"id":16529,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6131457210272049,44.80282019760035]}},{"type":"Feature","properties":{"id":19862,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.581742359284271,44.803038507850836]}},{"type":"Feature","properties":{"id":16602,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6343271677684411,44.80376746507475]}},{"type":"Feature","properties":{"id":16336,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6186552030828344,44.813407648599856]}},{"type":"Feature","properties":{"id":20445,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.584230838390085,44.79425543008137]}},{"type":"Feature","properties":{"id":53587,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6002766793537899,44.806733069436376]}},{"type":"Feature","properties":{"id":53588,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6002329645957412,44.806650251454165]}},{"type":"Feature","properties":{"id":20135,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5799400704288935,44.796031422002244]}},{"type":"Feature","properties":{"id":16870,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6255499929281934,44.81358177457588]}},{"type":"Feature","properties":{"id":17210,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6081092980994777,44.79606018908337]}},{"type":"Feature","properties":{"id":15975,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6063096567689085,44.795842520704404]}},{"type":"Feature","properties":{"id":24401,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6191155935746175,44.80774793270232]}},{"type":"Feature","properties":{"id":28444,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6184440781769963,44.80100764276105]}},{"type":"Feature","properties":{"id":57261,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6276774713309989,44.806494623383934]}},{"type":"Feature","properties":{"id":19796,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5804100776007701,44.8032597179412]}},{"type":"Feature","properties":{"id":19812,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5861240457568794,44.80682526250225]}},{"type":"Feature","properties":{"id":15808,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6290203614854815,44.80660240666163]}},{"type":"Feature","properties":{"id":17388,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6346531266442413,44.81261582828942]}},{"type":"Feature","properties":{"id":17371,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6314036276194981,44.793369300565004]}},{"type":"Feature","properties":{"id":15880,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6232763658724012,44.79333649635493]}},{"type":"Feature","properties":{"id":16726,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6324854611337549,44.794114786306004]}},{"type":"Feature","properties":{"id":17643,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6066713039284501,44.79693366533655]}},{"type":"Feature","properties":{"id":20524,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5836897762684092,44.794335179095135]}},{"type":"Feature","properties":{"id":27615,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5974342271774864,44.806883431617564]}},{"type":"Feature","properties":{"id":19648,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5798826958981265,44.80791136727445]}},{"type":"Feature","properties":{"id":19838,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5974384797343806,44.80592283083548]}},{"type":"Feature","properties":{"id":17127,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6312288707516215,44.79381052774058]}},{"type":"Feature","properties":{"id":23684,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6335081160316466,44.79105006073519]}},{"type":"Feature","properties":{"id":17128,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6310763088773275,44.79393728305864]}},{"type":"Feature","properties":{"id":20455,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5822066482409058,44.80246105612574]}},{"type":"Feature","properties":{"id":20054,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5972166531379761,44.811713936264894]}},{"type":"Feature","properties":{"id":20049,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5869103158812776,44.814306111755855]}},{"type":"Feature","properties":{"id":16713,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6331285166762349,44.80531962325583]}},{"type":"Feature","properties":{"id":15873,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6232295293179418,44.79352932641312]}},{"type":"Feature","properties":{"id":15976,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6062165705893053,44.79614436735729]}},{"type":"Feature","properties":{"id":16572,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6069750399804364,44.7964194781173]}},{"type":"Feature","properties":{"id":19859,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5800742667089831,44.79882215617057]}},{"type":"Feature","properties":{"id":35397,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6319839823463206,44.80700867766565]}},{"type":"Feature","properties":{"id":20193,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5809830832725752,44.812082901277265]}},{"type":"Feature","properties":{"id":20194,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5809781861309301,44.81040916286215]}},{"type":"Feature","properties":{"id":59024,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5917228175241306,44.80668043065457]}},{"type":"Feature","properties":{"id":54608,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6243411479644546,44.807293675486406]}},{"type":"Feature","properties":{"id":16254,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6256255858329896,44.804118601845786]}},{"type":"Feature","properties":{"id":31678,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6319981444093928,44.810183684844965]}},{"type":"Feature","properties":{"id":31677,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.632822504502535,44.809975210079436]}},{"type":"Feature","properties":{"id":16019,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6184989583193068,44.81034843710847]}},{"type":"Feature","properties":{"id":19846,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6158251967616085,44.81114439730288]}},{"type":"Feature","properties":{"id":15931,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6327736574192151,44.79601022880757]}},{"type":"Feature","properties":{"id":17251,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.610887609474551,44.81260077766566]}},{"type":"Feature","properties":{"id":57281,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6256309069148038,44.80426916582181]}},{"type":"Feature","properties":{"id":26547,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6319064118916216,44.794038513165184]}},{"type":"Feature","properties":{"id":20521,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6018719681467807,44.80508861502246]}},{"type":"Feature","properties":{"id":20543,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5920974094795683,44.81304091711586]}},{"type":"Feature","properties":{"id":17122,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6302978682609254,44.79412203599371]}},{"type":"Feature","properties":{"id":20452,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5822225659064574,44.802790523505124]}},{"type":"Feature","properties":{"id":20443,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5853964467092139,44.7956602647751]}},{"type":"Feature","properties":{"id":17735,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6318210605368292,44.810014305949]}},{"type":"Feature","properties":{"id":25664,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.59683847161794,44.79421390194165]}},{"type":"Feature","properties":{"id":24402,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6193821098394551,44.807139587390644]}},{"type":"Feature","properties":{"id":19581,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5836461685000797,44.794846686020186]}},{"type":"Feature","properties":{"id":20099,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5883677434567133,44.811338707097136]}},{"type":"Feature","properties":{"id":59023,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5918490500224921,44.80672087229625]}},{"type":"Feature","properties":{"id":33320,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6309221672473588,44.79752646843733]}},{"type":"Feature","properties":{"id":33319,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6320032309721466,44.79746330061289]}},{"type":"Feature","properties":{"id":24281,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6225458868614242,44.796423242951676]}},{"type":"Feature","properties":{"id":25024,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6257186658929844,44.80445471683499]}},{"type":"Feature","properties":{"id":59311,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5852927989512563,44.80214642503167]}},{"type":"Feature","properties":{"id":19690,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5842133684977429,44.80200895198547]}},{"type":"Feature","properties":{"id":59321,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5907270103192183,44.804079438664374]}},{"type":"Feature","properties":{"id":59328,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5901538950581474,44.80396110844472]}},{"type":"Feature","properties":{"id":59325,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.590060846646444,44.80425782228568]}},{"type":"Feature","properties":{"id":59312,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5845809853481179,44.80199815396006]}},{"type":"Feature","properties":{"id":59326,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.590171096602116,44.80381403797354]}},{"type":"Feature","properties":{"id":59327,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5899055471763629,44.80376250960788]}},{"type":"Feature","properties":{"id":59324,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5899712909915953,44.80347098858278]}},{"type":"Feature","properties":{"id":59323,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5897418357629141,44.80415781513457]}},{"type":"Feature","properties":{"id":"as=129212","name":"Berteaux","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5878775393091816,44.81047320487493]}},{"type":"Feature","properties":{"id":"as=129213","name":"Berteaux","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5880181543569623,44.810460287421996]}},{"type":"Feature","properties":{"id":"as=129242","name":"A. Paré","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5860853898792252,44.808634154471086]}},{"type":"Feature","properties":{"id":"as=129224","name":"Cardinal","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.626032587655328,44.80521828645975]}},{"type":"Feature","properties":{"id":"as=129186","name":"Peixotto","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5936575716898786,44.80631475967341]}},{"type":"Feature","properties":{"id":"as=128764","name":"INRIA","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6002824056991044,44.80875498884317]}},{"type":"Feature","properties":{"id":"as=128738","name":"Les Harmonies","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5848766551679482,44.81088340802062]}},{"type":"Feature","properties":{"id":"as=126002","name":"Facultés Droit et Lettres","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6194440544979725,44.798863817364484]}},{"type":"Feature","properties":{"id":"as=126003","name":"Clinique Mutualiste","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6100281494112885,44.805710327171916]}},{"type":"Feature","properties":{"id":"as=126047","name":"Village 1","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6035977134475037,44.807921114835146]}},{"type":"Feature","properties":{"id":"as=126024","name":"Bénédigues","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5836878231762777,44.79916011024313]}},{"type":"Feature","properties":{"id":"as=126001","name":"Clinique Mutualiste","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6102919756124691,44.80512001392482]}},{"type":"Feature","properties":{"id":"as=128588","name":"Peydavant","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5851741241733962,44.80158764319367]}},{"type":"Feature","properties":{"id":"as=128589","name":"Peydavant","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5854061515207823,44.8019969743337]}},{"type":"Feature","properties":{"id":"as=128590","name":"Résidence Crespy","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5864736482133087,44.80588680315619]}},{"type":"Feature","properties":{"id":"as=128591","name":"Résidence Crespy","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5865689008012638,44.80581277243472]}},{"type":"Feature","properties":{"id":"as=124591","name":"Rond-Point","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6167260840569179,44.80520343908164]}},{"type":"Feature","properties":{"id":"as=124566","name":"Chemin de Suzon","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5823728634221069,44.811295159599865]}},{"type":"Feature","properties":{"id":"as=124587","name":"La Paillère","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6046553414757291,44.795582789032636]}},{"type":"Feature","properties":{"id":"as=124551","name":"Franklin","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5873847952942227,44.79908733010081]}},{"type":"Feature","properties":{"id":"as=124854","name":"Collège Gérard Philipe","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6242505867429745,44.7998889472887]}},{"type":"Feature","properties":{"id":"as=124715","name":"Mozart","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6161061910203061,44.812180504220024]}},{"type":"Feature","properties":{"id":"as=124799","name":"Curie","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6296508692524806,44.80679627089548]}},{"type":"Feature","properties":{"id":"as=124808","name":"Montaigne - Montesquieu","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6142608325506955,44.79636128142778]}},{"type":"Feature","properties":{"id":"as=124811","name":"CREPS","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5985415793187204,44.79895998147994]}},{"type":"Feature","properties":{"id":"as=124743","name":"Le Poujeau","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6287495026144481,44.80890503235491]}},{"type":"Feature","properties":{"id":"as=124815","name":"Le Chiquet","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6198124150619269,44.80396081435652]}},{"type":"Feature","properties":{"id":"as=124624","name":"Rond-Point","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6155903790794491,44.80546780660766]}},{"type":"Feature","properties":{"id":"as=124756","name":"Peixotto","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.59177833957402,44.80660004681237]}},{"type":"Feature","properties":{"id":"as=124830","name":"Ecole de Management","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6026178012516087,44.79654680953026]}},{"type":"Feature","properties":{"id":"as=125061","name":"Ecole de Management","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6024211081568865,44.796556538702916]}},{"type":"Feature","properties":{"id":"as=124883","name":"CREPS","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5986810940580379,44.79900107428764]}},{"type":"Feature","properties":{"id":"as=125356","name":"Jaubert","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6263950892679818,44.807761871107175]}},{"type":"Feature","properties":{"id":"as=125432","name":"Lyautey","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6314036276194981,44.793369300565004]}},{"type":"Feature","properties":{"id":"as=125296","name":"Bardanac","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6091022239964791,44.79611317928631]}},{"type":"Feature","properties":{"id":"as=125302","name":"Desbats","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.618345051263509,44.803812475306586]}},{"type":"Feature","properties":{"id":"as=125236","name":"Collège Victor Louis","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5908153296507723,44.79921382067324]}},{"type":"Feature","properties":{"id":"as=125304","name":"Montherlant","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5814783761385266,44.79643501556176]}},{"type":"Feature","properties":{"id":"as=125253","name":"Cardinal","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6256572364531846,44.80357776485027]}},{"type":"Feature","properties":{"id":"as=125389","name":"Mozart","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6167864017679299,44.81196240066467]}},{"type":"Feature","properties":{"id":"as=125323","name":"Bardanac","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6098558033544615,44.79649787728235]}},{"type":"Feature","properties":{"id":"as=125263","name":"Le Poujeau","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6290822743254396,44.809092819047784]}},{"type":"Feature","properties":{"id":"as=125337","name":"Sarget","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.60836880541367,44.808585631956106]}},{"type":"Feature","properties":{"id":"as=125538","name":"Lycée Kastler","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5966519084589246,44.80082806120818]}},{"type":"Feature","properties":{"id":"as=125539","name":"Lycée Victor Louis","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5932533999645394,44.80294156638243]}},{"type":"Feature","properties":{"id":"as=125540","name":"Talence Centre-Forum","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5912955110226233,44.81083616858027]}},{"type":"Feature","properties":{"id":"as=125550","name":"Lycée Kastler","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5979988960069387,44.80186392163605]}},{"type":"Feature","properties":{"id":"as=125623","name":"Village 2","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6129673496982034,44.80292981987449]}},{"type":"Feature","properties":{"id":"as=125624","name":"Ausone","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6167556010158722,44.80183102215729]}},{"type":"Feature","properties":{"id":"as=125560","name":"Avenue de l'Université","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5946487832190162,44.80128760236258]}},{"type":"Feature","properties":{"id":"as=125501","name":"Colonel Jacqui","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.633654882118616,44.811401236942395]}},{"type":"Feature","properties":{"id":"as=125502","name":"Nancel Pénard","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.632822504502535,44.809975210079436]}},{"type":"Feature","properties":{"id":"as=125661","name":"Ausone","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6171282843380691,44.800555391475335]}},{"type":"Feature","properties":{"id":"as=125525","name":"Lycée Victor Louis","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5933419432009441,44.80290609458723]}},{"type":"Feature","properties":{"id":"as=126826","name":"Unitec","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6213139958518566,44.7967215579503]}},{"type":"Feature","properties":{"id":"as=126957","name":"Pessac Centre","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6326781083125196,44.80469621477551]}},{"type":"Feature","properties":{"id":"as=126835","name":"Saige","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6292324178976736,44.79411329562805]}},{"type":"Feature","properties":{"id":"as=126798","name":"Peixotto","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5919754450763087,44.806776336560645]}},{"type":"Feature","properties":{"id":"as=126843","name":"Peixotto","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5915018630781435,44.80803675315485]}},{"type":"Feature","properties":{"id":"as=126949","name":"Pessac Centre (Trendel)","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6328797824686113,44.80591535507432]}},{"type":"Feature","properties":{"id":"as=126955","name":"Pessac Centre","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6325905772401907,44.804402042115]}},{"type":"Feature","properties":{"id":"as=126956","name":"Pessac Centre","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6315426422940877,44.80483886296448]}},{"type":"Feature","properties":{"id":"as=126725","name":"Collège Victor Louis","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.591749738721691,44.79856265778556]}},{"type":"Feature","properties":{"id":"as=126726","name":"Collège Victor Louis","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5925596857402758,44.79896524744904]}},{"type":"Feature","properties":{"id":"as=126727","name":"Lycée Hôtelier","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5924099536308922,44.79522431798344]}},{"type":"Feature","properties":{"id":"as=126612","name":"Pelletan","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6005709443936075,44.81246494703294]}},{"type":"Feature","properties":{"id":"as=126637","name":"Arts & Métiers","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6003524924280303,44.805815314116046]}},{"type":"Feature","properties":{"id":"as=126638","name":"Arts & Métiers","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6006119587252647,44.8046312546883]}},{"type":"Feature","properties":{"id":"as=126275","name":"Bénédigues","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.583594741220704,44.799262579054854]}},{"type":"Feature","properties":{"id":"as=126198","name":"Pessac Centre","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.630666524961471,44.80621107320266]}},{"type":"Feature","properties":{"id":"as=126199","name":"Avenue Jean Jaurès","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6244699455687088,44.80859043076008]}},{"type":"Feature","properties":{"id":"as=126200","name":"Les Echoppes","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6205187955250818,44.8108745794685]}},{"type":"Feature","properties":{"id":"as=126201","name":"Parc Haut Brion","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6131319346018702,44.81312550824983]}},{"type":"Feature","properties":{"id":"as=126208","name":"Fanning Lafontaine","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6137095978648442,44.80830933152997]}},{"type":"Feature","properties":{"id":"as=126209","name":"Corneille","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.622785430389558,44.80418577153616]}},{"type":"Feature","properties":{"id":"as=126237","name":"Phénix Haut Brion","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6159032985453854,44.80810233191559]}},{"type":"Feature","properties":{"id":"as=126238","name":"Fanning Lafontaine","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.613684708854579,44.808179422634716]}},{"type":"Feature","properties":{"id":"as=126161","name":"Cimetière","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6252858666250618,44.810838008755574]}},{"type":"Feature","properties":{"id":"as=126249","name":"Pessac Gare","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6314561092610305,44.80373152224987]}},{"type":"Feature","properties":{"id":"as=126172","name":"Avenue Jean Jaurès","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6233231538386813,44.8102328589191]}},{"type":"Feature","properties":{"id":"as=126174","name":"Pessac Centre","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.631467218957927,44.806079206126995]}},{"type":"Feature","properties":{"id":"as=129160","name":"STAPS","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6154316421681246,44.79378271545963]}},{"type":"Feature","properties":{"id":"as=129078","name":"Mairie de Talence","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5873770289998756,44.808771890909945]}},{"type":"Feature","properties":{"id":"as=129005","name":"Talence Centre-Forum","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5913689948605365,44.81288077969289]}},{"type":"Feature","properties":{"id":"as=129006","name":"Centre M. Pagnol","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5861690395503226,44.81189917006904]}},{"type":"Feature","properties":{"id":"as=129010","name":"Médiathèque","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5891428865667643,44.80706941649979]}},{"type":"Feature","properties":{"id":"as=125781","name":"Les Echoppes","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6207934155278639,44.8108114736739]}},{"type":"Feature","properties":{"id":"as=128440","name":"La Paillère","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6053275826400447,44.7956882415242]}},{"type":"Feature","properties":{"id":"as=128441","name":"Dourout","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5829533291412462,44.808775800980634]}},{"type":"Feature","properties":{"id":"as=128481","name":"Candau","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6093492987111485,44.80940792618887]}},{"type":"Feature","properties":{"id":"as=126515","name":"Facultés Droit et Lettres","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6197420186573377,44.79791674542534]}},{"type":"Feature","properties":{"id":"as=126520","name":"Nancel Pénard","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6326941613131767,44.808703809879916]}},{"type":"Feature","properties":{"id":"as=126353","name":"Enseirb","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6077533522424334,44.80609157500647]}},{"type":"Feature","properties":{"id":"as=126415","name":"Lafitte","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5849099847830717,44.799275276226325]}},{"type":"Feature","properties":{"id":"as=126423","name":"Résidence Coppélia","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5826322515009865,44.80474190899295]}},{"type":"Feature","properties":{"id":"as=126494","name":"Chemin de Suzon","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5822675146941628,44.81178114683718]}},{"type":"Feature","properties":{"id":"as=2847","name":"Doyen Brus","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6095170708821552,44.80091872951914]}},{"type":"Feature","properties":{"id":"as=2791","name":"Garage Unitec","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6225458868614242,44.796423242951676]}},{"type":"Feature","properties":{"id":"as=2793","name":"Garage Pessac","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6317753874490736,44.80474530328229]}},{"type":"Feature","properties":{"id":"as=2848","name":"Saige","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6278562848933282,44.79403090537901]}},{"type":"Feature","properties":{"id":"as=2846","name":"Béthanie","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5982942181184648,44.80592826231086]}},{"type":"Feature","properties":{"id":"as=128118","name":"Montaigne-Montesquieu","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6171929150616469,44.79703612275271]}},{"type":"Feature","properties":{"id":"as=127941","name":"Doyen Brus","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6096747182570297,44.80062564089148]}},{"type":"Feature","properties":{"id":"as=127943","name":"Francois Bordes","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6068476869041276,44.80355291536525]}},{"type":"Feature","properties":{"id":"as=127945","name":"Arts & Metiers","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6022917175528385,44.80588894695939]}},{"type":"Feature","properties":{"id":"as=127946","name":"Arts & Metiers","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6023964071705596,44.806109036414746]}},{"type":"Feature","properties":{"id":"as=127951","name":"Talence Centre-Forum","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5902987171722328,44.811890740754194]}},{"type":"Feature","properties":{"id":"as=4653","name":"Professeur Arnozan","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5887617020151555,44.80746699421062]}},{"type":"Feature","properties":{"id":"as=3903","name":"Deux Ponts","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6237185655562585,44.80218948838196]}},{"type":"Feature","properties":{"id":"as=3996","name":"Brivazac","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6167453060802395,44.80336708893274]}},{"type":"Feature","properties":{"id":"as=3835","name":"Pessac Gare","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.631872080810827,44.80354356705513]}},{"type":"Feature","properties":{"id":"as=3800","name":"Collège Gérard Philipe","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.623721398906139,44.80020115921167]}},{"type":"Feature","properties":{"id":"as=3979","name":"Les Echoppes","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6149722993800102,44.80301952321189]}},{"type":"Feature","properties":{"id":"as=4624","name":"Dourout","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5826167316320662,44.80836364546584]}},{"type":"Feature","properties":{"id":"as=3829","name":"Village 1","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6031165359859968,44.80796273513895]}},{"type":"Feature","properties":{"id":"as=4633","name":"Unitec","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6206846693570309,44.79717406062051]}},{"type":"Feature","properties":{"id":"as=4702","name":"Unitec","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6207581543563427,44.79717472074531]}},{"type":"Feature","properties":{"id":"as=3825","name":"Lycée Victor Louis","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.590157115142759,44.803076982358874]}},{"type":"Feature","properties":{"id":"as=1608","name":"Peixotto","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5921660507144769,44.80581282433813]}},{"type":"Feature","properties":{"id":"as=3811","name":"Rond-Point Crespy","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5862094348735556,44.806745356618016]}},{"type":"Feature","properties":{"id":"as=4025","name":"Rond-Point Crespy","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5875561706922359,44.8071642442764]}},{"type":"Feature","properties":{"id":"as=4723","name":"Phénix Haut Brion","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6182176013896765,44.80773911700815]}},{"type":"Feature","properties":{"id":"as=3961","name":"Cardinal","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6265227405338982,44.80412582527825]}},{"type":"Feature","properties":{"id":"as=3946","name":"Talence Place Wilson","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5911143430914114,44.79851592268685]}},{"type":"Feature","properties":{"id":"as=3852","name":"Forum","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5912749521066185,44.8099454334626]}},{"type":"Feature","properties":{"id":"as=4740","name":"Centre M. Pagnol","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5861746180764528,44.812040638802586]}},{"type":"Feature","properties":{"id":"as=2141","name":"Cardinal","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6252798683845749,44.80426933817362]}},{"type":"Feature","properties":{"id":"as=4007","name":"Chiquet Brion","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6189762294657988,44.80774515046019]}},{"type":"Feature","properties":{"id":"as=3949","name":"Lamartine","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.623954917132629,44.8065586919272]}},{"type":"Feature","properties":{"id":"as=4745","name":"Cardinal","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6277485516591668,44.80400827027071]}},{"type":"Feature","properties":{"id":"as=4667","name":"Arts & Métiers","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5999223500980054,44.80356146486022]}},{"type":"Feature","properties":{"id":"as=130301","name":"Forum (cours Gambetta)","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.59069381739304,44.81289461693631]}}]} \ No newline at end of file diff --git a/out-3.geojson b/out-3.geojson deleted file mode 100644 index 1c239b75..00000000 --- a/out-3.geojson +++ /dev/null @@ -1 +0,0 @@ -{"type":"FeatureCollection","features":[{"type":"Feature","properties":{"id":19986,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.598503457195701,44.805929589372]}},{"type":"Feature","properties":{"id":649,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5999951036373583,44.806025258018686]}},{"type":"Feature","properties":{"id":20477,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5889352992729378,44.80426162947189]}},{"type":"Feature","properties":{"id":8849,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5888401723316949,44.80448154821921]}},{"type":"Feature","properties":{"id":565,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5923014576779416,44.80911464724327]}},{"type":"Feature","properties":{"id":20529,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.595118792724725,44.80826399273431]}},{"type":"Feature","properties":{"id":37644,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6312988395560757,44.806953711851584]}},{"type":"Feature","properties":{"id":25322,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6309171201956937,44.80701688540854]}},{"type":"Feature","properties":{"id":16751,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6192614171451878,44.802438103692516]}},{"type":"Feature","properties":{"id":16491,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6193901306760591,44.8013866079945]}},{"type":"Feature","properties":{"id":16648,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6195375283914707,44.800241821394124]}},{"type":"Feature","properties":{"id":27475,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6195571001638541,44.800067877994806]}},{"type":"Feature","properties":{"id":16492,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6317468675861465,44.80689859927188]}},{"type":"Feature","properties":{"id":19473,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6077811541581584,44.80684108265683]}},{"type":"Feature","properties":{"id":16917,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.607715901583938,44.806967106259115]}},{"type":"Feature","properties":{"id":16627,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6197644570798326,44.8049764093837]}},{"type":"Feature","properties":{"id":16888,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.619434263251487,44.80508024381205]}},{"type":"Feature","properties":{"id":17199,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6192984980148553,44.80512068753395]}},{"type":"Feature","properties":{"id":17074,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6188697461705239,44.80524089870388]}},{"type":"Feature","properties":{"id":16769,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6252738215622851,44.8018510579183]}},{"type":"Feature","properties":{"id":16770,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6255429995479178,44.80249765613825]}},{"type":"Feature","properties":{"id":16652,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6256676068307824,44.803400556478046]}},{"type":"Feature","properties":{"id":22272,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6254961069676005,44.80434026530025]}},{"type":"Feature","properties":{"id":57283,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6255814707323305,44.80446636389337]}},{"type":"Feature","properties":{"id":25688,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5924389591219411,44.796194159508005]}},{"type":"Feature","properties":{"id":19946,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5923109617560379,44.79619270781825]}},{"type":"Feature","properties":{"id":16429,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.629585442485553,44.809839194970834]}},{"type":"Feature","properties":{"id":16426,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6301869250232973,44.809594070291]}},{"type":"Feature","properties":{"id":31584,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6058105533287731,44.80886602147036]}},{"type":"Feature","properties":{"id":25589,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6063400223491766,44.810836189241876]}},{"type":"Feature","properties":{"id":19899,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5912290658125761,44.81024498686175]}},{"type":"Feature","properties":{"id":20137,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5911565152469914,44.810435278298364]}},{"type":"Feature","properties":{"id":29050,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5912464814650292,44.810668722841385]}},{"type":"Feature","properties":{"id":24223,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5913207195900397,44.8106456601919]}},{"type":"Feature","properties":{"id":27350,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5909511668127475,44.812623544396445]}},{"type":"Feature","properties":{"id":30130,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.590891021962493,44.81256004356215]}},{"type":"Feature","properties":{"id":16186,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6167453060802395,44.80336708893274]}},{"type":"Feature","properties":{"id":16183,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.617199029463869,44.805092888259615]}},{"type":"Feature","properties":{"id":16375,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6276472320417161,44.80639863800813]}},{"type":"Feature","properties":{"id":57263,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6275035249587216,44.80642437225543]}},{"type":"Feature","properties":{"id":16460,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6294283912792256,44.80648281815557]}},{"type":"Feature","properties":{"id":16461,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6298909344003979,44.80713449809973]}},{"type":"Feature","properties":{"id":25671,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6093915158581251,44.79630839606761]}},{"type":"Feature","properties":{"id":15961,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6095368093002356,44.79629306465444]}},{"type":"Feature","properties":{"id":15979,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6050567334529893,44.796471117352944]}},{"type":"Feature","properties":{"id":15980,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6048339085700761,44.795610684071555]}},{"type":"Feature","properties":{"id":19802,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5953333058379465,44.810684745640245]}},{"type":"Feature","properties":{"id":19803,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.595254869181587,44.81137085787207]}},{"type":"Feature","properties":{"id":19816,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5861456236711587,44.80662154869525]}},{"type":"Feature","properties":{"id":58723,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5862094348735556,44.806745356618016]}},{"type":"Feature","properties":{"id":17232,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6112758976534942,44.812906173888436]}},{"type":"Feature","properties":{"id":16948,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6131783922998356,44.81317699595155]}},{"type":"Feature","properties":{"id":17246,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6324496511934334,44.80593829283401]}},{"type":"Feature","properties":{"id":17247,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6313232630557205,44.80610605296365]}},{"type":"Feature","properties":{"id":22264,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6288534679758239,44.80246991038936]}},{"type":"Feature","properties":{"id":22265,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6293327530723806,44.80245758969772]}},{"type":"Feature","properties":{"id":15878,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6162816263743869,44.79540521177599]}},{"type":"Feature","properties":{"id":15877,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6168956162527585,44.795241569770326]}},{"type":"Feature","properties":{"id":16624,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6311324422268266,44.79922387400509]}},{"type":"Feature","properties":{"id":24283,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6308623117393518,44.79828166195963]}},{"type":"Feature","properties":{"id":17421,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6310068594694284,44.79942967178872]}},{"type":"Feature","properties":{"id":17298,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6309711873600478,44.79967890203219]}},{"type":"Feature","properties":{"id":16540,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6268000100219724,44.80943708538574]}},{"type":"Feature","properties":{"id":16428,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6271167540555563,44.81045664227241]}},{"type":"Feature","properties":{"id":16431,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6274574680346562,44.81176640446349]}},{"type":"Feature","properties":{"id":27672,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6171929150616469,44.79703612275271]}},{"type":"Feature","properties":{"id":17043,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6178180737614022,44.79822614617144]}},{"type":"Feature","properties":{"id":16030,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6198157907617171,44.80774853275552]}},{"type":"Feature","properties":{"id":16031,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6203579837622806,44.80579151082335]}},{"type":"Feature","properties":{"id":16608,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6324014687974893,44.808087433957105]}},{"type":"Feature","properties":{"id":16546,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6328764318135781,44.80911814029118]}},{"type":"Feature","properties":{"id":27886,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6318478280770993,44.80695050696602]}},{"type":"Feature","properties":{"id":17129,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6321402210686764,44.8075884236563]}},{"type":"Feature","properties":{"id":16128,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6276631170427468,44.80521949652113]}},{"type":"Feature","properties":{"id":15831,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6292569572675963,44.805162794691796]}},{"type":"Feature","properties":{"id":17022,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6242857966554964,44.80616683431997]}},{"type":"Feature","properties":{"id":16376,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6264257207198175,44.80572872752301]}},{"type":"Feature","properties":{"id":16251,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6271324783500616,44.803995137202875]}},{"type":"Feature","properties":{"id":57282,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6260456600254464,44.80406568709261]}},{"type":"Feature","properties":{"id":16291,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6160451960339756,44.80552540298936]}},{"type":"Feature","properties":{"id":16292,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6161900184432482,44.80532874127065]}},{"type":"Feature","properties":{"id":31835,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.61475110339749,44.79739329170675]}},{"type":"Feature","properties":{"id":15990,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6141607998750656,44.79618494001125]}},{"type":"Feature","properties":{"id":17059,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6292460675686923,44.79350349109471]}},{"type":"Feature","properties":{"id":17370,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6303640321588959,44.79343483472454]}},{"type":"Feature","properties":{"id":26709,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6284124019636882,44.793554507407194]}},{"type":"Feature","properties":{"id":16435,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6070114019224195,44.80985200795313]}},{"type":"Feature","properties":{"id":17037,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6067216609943213,44.810010552473784]}},{"type":"Feature","properties":{"id":29759,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6095170708821552,44.80091872951914]}},{"type":"Feature","properties":{"id":17280,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.60963791548459,44.800817874852086]}},{"type":"Feature","properties":{"id":17119,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6082347158446524,44.80920497076243]}},{"type":"Feature","properties":{"id":36352,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.608323235867677,44.80983473148223]}},{"type":"Feature","properties":{"id":16440,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6082974034579984,44.8099233740803]}},{"type":"Feature","properties":{"id":16284,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6070065521135677,44.81079775978465]}},{"type":"Feature","properties":{"id":15885,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6168116988168031,44.79508163835017]}},{"type":"Feature","properties":{"id":15884,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6183588167645683,44.79466389064747]}},{"type":"Feature","properties":{"id":15886,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6162000239246755,44.79524135064804]}},{"type":"Feature","properties":{"id":16921,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6198124150619269,44.80396081435652]}},{"type":"Feature","properties":{"id":16391,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6234301620012386,44.80417829556763]}},{"type":"Feature","properties":{"id":25910,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6278541662325295,44.793963642612205]}},{"type":"Feature","properties":{"id":30140,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6278533162913976,44.79391394341432]}},{"type":"Feature","properties":{"id":30099,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6309071398690205,44.7941820380093]}},{"type":"Feature","properties":{"id":26552,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6314170497640901,44.79416692679618]}},{"type":"Feature","properties":{"id":19987,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5984066689433065,44.80404866973753]}},{"type":"Feature","properties":{"id":19995,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5859945919392777,44.80275327348517]}},{"type":"Feature","properties":{"id":19996,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5862241014385443,44.80232760458696]}},{"type":"Feature","properties":{"id":20004,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5892437059848279,44.799063900248946]}},{"type":"Feature","properties":{"id":37097,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5883960860467061,44.79893904008061]}},{"type":"Feature","properties":{"id":24279,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6275361969122202,44.79722248075931]}},{"type":"Feature","properties":{"id":24276,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6252628069394983,44.79941635645798]}},{"type":"Feature","properties":{"id":19741,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5911660667008316,44.8129569095402]}},{"type":"Feature","properties":{"id":20542,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5921025824436333,44.81289446071338]}},{"type":"Feature","properties":{"id":19552,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.581117210519938,44.79888183393539]}},{"type":"Feature","properties":{"id":19553,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5811476582560566,44.79898500943584]}},{"type":"Feature","properties":{"id":26647,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5814737141394966,44.8081419763692]}},{"type":"Feature","properties":{"id":20334,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.580958284944962,44.80802947790924]}},{"type":"Feature","properties":{"id":20328,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6004554726115798,44.79519916794754]}},{"type":"Feature","properties":{"id":19941,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5986010282207422,44.79711248291793]}},{"type":"Feature","properties":{"id":25911,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5826588270171792,44.81231056002393]}},{"type":"Feature","properties":{"id":24950,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5836514704914351,44.81236324867341]}},{"type":"Feature","properties":{"id":27580,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5850304000323213,44.80045316333416]}},{"type":"Feature","properties":{"id":20438,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5859920373070406,44.80070218999017]}},{"type":"Feature","properties":{"id":16092,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.630737406271222,44.797443454373465]}},{"type":"Feature","properties":{"id":24278,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6306944067410274,44.79700575772121]}},{"type":"Feature","properties":{"id":30945,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6056351334495721,44.808011833433156]}},{"type":"Feature","properties":{"id":16230,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6057286659423373,44.80862305200351]}},{"type":"Feature","properties":{"id":20210,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5890841607714429,44.8035065501129]}},{"type":"Feature","properties":{"id":20476,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5892726378677615,44.80354429207371]}},{"type":"Feature","properties":{"id":20388,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5900930684965086,44.803064835654624]}},{"type":"Feature","properties":{"id":22370,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5900259725883658,44.80322072338686]}},{"type":"Feature","properties":{"id":20485,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.587919333101578,44.80914837087973]}},{"type":"Feature","properties":{"id":20482,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5883272668548667,44.808966779621706]}},{"type":"Feature","properties":{"id":20118,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5861690395503226,44.81189917006904]}},{"type":"Feature","properties":{"id":20501,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5849977758770828,44.81191870329469]}},{"type":"Feature","properties":{"id":20366,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5849697393399184,44.81090229542672]}},{"type":"Feature","properties":{"id":24285,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6315243641467698,44.80392518549436]}},{"type":"Feature","properties":{"id":17302,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6322151558794488,44.80515079027539]}},{"type":"Feature","properties":{"id":20222,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5817347652098784,44.80154978936739]}},{"type":"Feature","properties":{"id":25679,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5823120971842611,44.801480439965296]}},{"type":"Feature","properties":{"id":20221,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.581996432624606,44.80159884038343]}},{"type":"Feature","properties":{"id":20223,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5813093901470782,44.80146841891647]}},{"type":"Feature","properties":{"id":23187,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.630181560447226,44.792005531352444]}},{"type":"Feature","properties":{"id":19630,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5836002037568148,44.80364523865101]}},{"type":"Feature","properties":{"id":19631,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5826711868171895,44.80315617672418]}},{"type":"Feature","properties":{"id":17553,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6067089864241451,44.79436691118033]}},{"type":"Feature","properties":{"id":17552,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6068156243160784,44.79400067523964]}},{"type":"Feature","properties":{"id":20038,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5923260252980941,44.80541946553582]}},{"type":"Feature","properties":{"id":19894,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5945591266873305,44.804573269848255]}},{"type":"Feature","properties":{"id":19730,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5979900250654584,44.80311454502185]}},{"type":"Feature","properties":{"id":20034,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5991426121969289,44.802606135801256]}},{"type":"Feature","properties":{"id":19848,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5957016899524444,44.81082479978316]}},{"type":"Feature","properties":{"id":20216,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5829114531768446,44.796488604084416]}},{"type":"Feature","properties":{"id":20217,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5828224141858932,44.796421866246604]}},{"type":"Feature","properties":{"id":19672,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5836766845477668,44.79691508101888]}},{"type":"Feature","properties":{"id":19691,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5839626726056485,44.80214458791417]}},{"type":"Feature","properties":{"id":20123,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.582923523265462,44.8017866446877]}},{"type":"Feature","properties":{"id":19867,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5824356880312024,44.80168364462371]}},{"type":"Feature","properties":{"id":20148,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5981196130069676,44.79920231276052]}},{"type":"Feature","properties":{"id":20188,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5964093157695478,44.798490890947136]}},{"type":"Feature","properties":{"id":20189,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.595370898235511,44.79809223046674]}},{"type":"Feature","properties":{"id":19808,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5855319951303288,44.80322276786811]}},{"type":"Feature","properties":{"id":20228,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5849821415010599,44.80208259314067]}},{"type":"Feature","properties":{"id":22361,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5851729305762308,44.80191907417385]}},{"type":"Feature","properties":{"id":22362,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5853664302049465,44.80193801712926]}},{"type":"Feature","properties":{"id":23614,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5854651696709479,44.801834416894806]}},{"type":"Feature","properties":{"id":22359,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5852274849938373,44.80170782441463]}},{"type":"Feature","properties":{"id":19574,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5910056690595032,44.7984976041222]}},{"type":"Feature","properties":{"id":19575,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5895145995675709,44.798263440100435]}},{"type":"Feature","properties":{"id":19577,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5874940924930621,44.79876580341441]}},{"type":"Feature","properties":{"id":19578,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5874301042376504,44.79893303199433]}},{"type":"Feature","properties":{"id":19964,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6058602084364522,44.79786435749591]}},{"type":"Feature","properties":{"id":19965,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6071072432096107,44.79876914928914]}},{"type":"Feature","properties":{"id":19746,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5977875452259982,44.8131112532041]}},{"type":"Feature","properties":{"id":19615,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6000842403541052,44.812542147747884]}},{"type":"Feature","properties":{"id":19795,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5810666445856678,44.80424561790561]}},{"type":"Feature","properties":{"id":19710,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5807488871936071,44.804359125680534]}},{"type":"Feature","properties":{"id":20104,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5963189105283733,44.80485238606977]}},{"type":"Feature","properties":{"id":19839,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5973690746633866,44.80445380231567]}},{"type":"Feature","properties":{"id":19823,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6051360946018491,44.79834322327829]}},{"type":"Feature","properties":{"id":20107,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.586804278974005,44.813557993963954]}},{"type":"Feature","properties":{"id":19686,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5847905382966339,44.81362056946996]}},{"type":"Feature","properties":{"id":19854,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5849219860206252,44.799108507861185]}},{"type":"Feature","properties":{"id":19579,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.585015235590998,44.79884406116928]}},{"type":"Feature","properties":{"id":19620,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5859913165365825,44.79604678625102]}},{"type":"Feature","properties":{"id":19950,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5860323705535917,44.79589118155161]}},{"type":"Feature","properties":{"id":20111,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5863172883442309,44.79475842595066]}},{"type":"Feature","properties":{"id":20112,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5865401267186039,44.79406776702903]}},{"type":"Feature","properties":{"id":16653,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6237420017448931,44.80334184354475]}},{"type":"Feature","properties":{"id":20280,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5933378311746387,44.800416106713314]}},{"type":"Feature","properties":{"id":19680,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5841417671664542,44.80780318649656]}},{"type":"Feature","properties":{"id":19679,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5838043431839468,44.80837808926339]}},{"type":"Feature","properties":{"id":19683,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5850986212444692,44.80621552009868]}},{"type":"Feature","properties":{"id":19682,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5847038209642228,44.80686249834282]}},{"type":"Feature","properties":{"id":19694,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5825067725348939,44.803310080280106]}},{"type":"Feature","properties":{"id":19695,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5823466062177725,44.80347330833263]}},{"type":"Feature","properties":{"id":19696,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5813624680708289,44.80427602942861]}},{"type":"Feature","properties":{"id":29092,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5960955461028271,44.80064098746413]}},{"type":"Feature","properties":{"id":29090,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5964472687166597,44.8007340007718]}},{"type":"Feature","properties":{"id":22866,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.600032246774405,44.798081784266614]}},{"type":"Feature","properties":{"id":25955,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6032483547232231,44.80789937519473]}},{"type":"Feature","properties":{"id":20352,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6008390553247239,44.80732491684311]}},{"type":"Feature","properties":{"id":20354,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6032398452665743,44.80796972897076]}},{"type":"Feature","properties":{"id":20392,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6004399085619743,44.807585639041214]}},{"type":"Feature","properties":{"id":25654,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6008795044312589,44.807547040725375]}},{"type":"Feature","properties":{"id":19942,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5957169283102807,44.79632937035617]}},{"type":"Feature","properties":{"id":20307,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5952346629585121,44.798058162349264]}},{"type":"Feature","properties":{"id":19976,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5898720404281652,44.81345825178031]}},{"type":"Feature","properties":{"id":19740,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5907714977003081,44.812804875596846]}},{"type":"Feature","properties":{"id":30133,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5897857054238459,44.81339890989978]}},{"type":"Feature","properties":{"id":30127,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5887850089633541,44.81407096556667]}},{"type":"Feature","properties":{"id":23469,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5908991722573637,44.81276805557285]}},{"type":"Feature","properties":{"id":26434,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.590615027273328,44.81275324319808]}},{"type":"Feature","properties":{"id":30131,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5906896860220451,44.81279376557689]}},{"type":"Feature","properties":{"id":19824,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6065470639244804,44.79939101050488]}},{"type":"Feature","properties":{"id":19844,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5958535522035362,44.81201358750806]}},{"type":"Feature","properties":{"id":20139,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5913855063098329,44.810568396335654]}},{"type":"Feature","properties":{"id":19731,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5920218479019826,44.81051866672442]}},{"type":"Feature","properties":{"id":28642,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5944228342264861,44.81006231609056]}},{"type":"Feature","properties":{"id":23370,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5980889229424843,44.8084150118628]}},{"type":"Feature","properties":{"id":19953,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5839926048931097,44.805442794196125]}},{"type":"Feature","properties":{"id":19629,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5848800257630388,44.80408206975226]}},{"type":"Feature","properties":{"id":19735,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.594898196507284,44.7982785100566]}},{"type":"Feature","properties":{"id":20126,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5950341181897741,44.7983501527892]}},{"type":"Feature","properties":{"id":20308,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5816715327550772,44.79859323230218]}},{"type":"Feature","properties":{"id":20316,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5880525730551078,44.80870096572785]}},{"type":"Feature","properties":{"id":29242,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5888287887820327,44.80734741083005]}},{"type":"Feature","properties":{"id":19761,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5833254041750363,44.79571293010645]}},{"type":"Feature","properties":{"id":19748,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5827995422326325,44.79544303896483]}},{"type":"Feature","properties":{"id":16094,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6328870155811008,44.79910027617863]}},{"type":"Feature","properties":{"id":20160,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5876207778322377,44.81232353005264]}},{"type":"Feature","properties":{"id":20098,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.587769795632363,44.81130198763022]}},{"type":"Feature","properties":{"id":19988,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5899764767772134,44.80123120461399]}},{"type":"Feature","properties":{"id":20003,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5907424423278052,44.799292871840485]}},{"type":"Feature","properties":{"id":16768,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.628875764665801,44.807471374277796]}},{"type":"Feature","properties":{"id":16647,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6208754813095524,44.80034561747293]}},{"type":"Feature","properties":{"id":16344,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6210805999159307,44.80051916368715]}},{"type":"Feature","properties":{"id":16089,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6307665484608452,44.797685210289806]}},{"type":"Feature","properties":{"id":16954,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6160580420874954,44.79373137093818]}},{"type":"Feature","properties":{"id":24465,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6156768201359397,44.79399961355941]}},{"type":"Feature","properties":{"id":16525,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6172610122507112,44.800198493889766]}},{"type":"Feature","properties":{"id":15986,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6169246743947955,44.80027864516549]}},{"type":"Feature","properties":{"id":16508,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6153385571934318,44.80267772650684]}},{"type":"Feature","properties":{"id":27338,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6167556010158722,44.80183102215729]}},{"type":"Feature","properties":{"id":16506,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6173385760408895,44.8002771919352]}},{"type":"Feature","properties":{"id":28446,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6177700580488659,44.80001150404143]}},{"type":"Feature","properties":{"id":16515,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.610457696199699,44.805133490765726]}},{"type":"Feature","properties":{"id":30017,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6107277124972792,44.80517572599702]}},{"type":"Feature","properties":{"id":16539,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.624018432989894,44.81007380965053]}},{"type":"Feature","properties":{"id":16541,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6286497829100846,44.809017575311366]}},{"type":"Feature","properties":{"id":24368,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6295164631937994,44.809867159990326]}},{"type":"Feature","properties":{"id":24367,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.630105762234423,44.8111767311133]}},{"type":"Feature","properties":{"id":24369,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.629184852615813,44.80908644455927]}},{"type":"Feature","properties":{"id":16293,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.615914663117892,44.80523173783854]}},{"type":"Feature","properties":{"id":16510,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6150150402426817,44.802875833309585]}},{"type":"Feature","properties":{"id":19864,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5818440451069568,44.802451306972245]}},{"type":"Feature","properties":{"id":19865,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5820663909934288,44.80216883506007]}},{"type":"Feature","properties":{"id":19897,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5898432957757949,44.81017036133909]}},{"type":"Feature","properties":{"id":16522,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6209525813577348,44.796990254580784]}},{"type":"Feature","properties":{"id":16502,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6209883616111087,44.797016050297394]}},{"type":"Feature","properties":{"id":16516,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6079458835492219,44.80595719005264]}},{"type":"Feature","properties":{"id":16418,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6078964088953601,44.80591678083899]}},{"type":"Feature","properties":{"id":19933,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5823728634221069,44.811295159599865]}},{"type":"Feature","properties":{"id":24951,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5823237210808098,44.81155307906197]}},{"type":"Feature","properties":{"id":27869,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5891885489291463,44.810515857685246]}},{"type":"Feature","properties":{"id":20296,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5887035242411404,44.810498010601194]}},{"type":"Feature","properties":{"id":19841,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.582596396707485,44.81053449802052]}},{"type":"Feature","properties":{"id":19914,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5817200878902408,44.8104187744898]}},{"type":"Feature","properties":{"id":23249,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6004092627113612,44.80421004994941]}},{"type":"Feature","properties":{"id":20286,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5851117818471763,44.81090727732481]}},{"type":"Feature","properties":{"id":19617,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5922783509610803,44.796444976952124]}},{"type":"Feature","properties":{"id":20377,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5924129675978201,44.79487752946063]}},{"type":"Feature","properties":{"id":20376,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5923415956072579,44.79592698879076]}},{"type":"Feature","properties":{"id":58725,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5857400198724079,44.802234706479176]}},{"type":"Feature","properties":{"id":27870,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5892150208258056,44.810245948030406]}},{"type":"Feature","properties":{"id":36388,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5885996140983818,44.81021726093555]}},{"type":"Feature","properties":{"id":40117,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6295206167811596,44.806458345196894]}},{"type":"Feature","properties":{"id":34718,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6292068035750316,44.805857500152804]}},{"type":"Feature","properties":{"id":20143,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5930434137916174,44.803644041633945]}},{"type":"Feature","properties":{"id":20144,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5934361361385686,44.80267325106588]}},{"type":"Feature","properties":{"id":38841,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5915715782126126,44.806807000539166]}},{"type":"Feature","properties":{"id":59022,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5916084990576307,44.806855428560446]}},{"type":"Feature","properties":{"id":38856,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5933681929699226,44.802659092840265]}},{"type":"Feature","properties":{"id":38854,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5929742433737365,44.803628480598185]}},{"type":"Feature","properties":{"id":19947,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.587860065877693,44.79886460859568]}},{"type":"Feature","properties":{"id":52048,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6324753154092333,44.79809439571101]}},{"type":"Feature","properties":{"id":16090,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6321897311485453,44.79761003666069]}},{"type":"Feature","properties":{"id":54609,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6242393931306023,44.80716894678864]}},{"type":"Feature","properties":{"id":16223,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6236435928320284,44.806901298311644]}},{"type":"Feature","properties":{"id":42838,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6012665955153395,44.80519957824972]}},{"type":"Feature","properties":{"id":42839,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6037883598926465,44.803629468683006]}},{"type":"Feature","properties":{"id":622,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5951234192899467,44.80810890524155]}},{"type":"Feature","properties":{"id":633,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5952993982979592,44.80805550937134]}},{"type":"Feature","properties":{"id":652,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5921882974571633,44.80894562386988]}},{"type":"Feature","properties":{"id":20528,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.592062101007606,44.808997893070945]}},{"type":"Feature","properties":{"id":13302,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.588214814102791,44.809443166299296]}},{"type":"Feature","properties":{"id":20309,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.587258968721268,44.80943205713267]}},{"type":"Feature","properties":{"id":13285,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5881968501730691,44.80882730336783]}},{"type":"Feature","properties":{"id":13289,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.58832341738245,44.80933182236562]}},{"type":"Feature","properties":{"id":20136,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5806814180138815,44.79511636493524]}},{"type":"Feature","properties":{"id":20061,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5813456481642605,44.795235165102824]}},{"type":"Feature","properties":{"id":37643,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6309973778869389,44.806155553294545]}},{"type":"Feature","properties":{"id":16402,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6311754385788592,44.80612572631919]}},{"type":"Feature","properties":{"id":16343,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6209176256124728,44.80151418988168]}},{"type":"Feature","properties":{"id":16874,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6182464372634308,44.80245301211074]}},{"type":"Feature","properties":{"id":19488,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6173187328141713,44.802632780677655]}},{"type":"Feature","properties":{"id":16493,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6308833205895168,44.80716534165337]}},{"type":"Feature","properties":{"id":16674,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.631075393174946,44.807574857356464]}},{"type":"Feature","properties":{"id":16463,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6306339972617606,44.808185392863834]}},{"type":"Feature","properties":{"id":16544,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6308268009744906,44.80857434652392]}},{"type":"Feature","properties":{"id":31145,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6311664048647538,44.8079710236816]}},{"type":"Feature","properties":{"id":19516,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6081304002606294,44.8076860611186]}},{"type":"Feature","properties":{"id":16759,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6083608681400925,44.807601729324546]}},{"type":"Feature","properties":{"id":17072,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.618594700473303,44.80386687048051]}},{"type":"Feature","properties":{"id":17073,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6187065175775098,44.80437219367516]}},{"type":"Feature","properties":{"id":16873,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6181716384499761,44.802999044575934]}},{"type":"Feature","properties":{"id":19424,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6191935018189553,44.803440280460485]}},{"type":"Feature","properties":{"id":15989,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6155228591083164,44.798835583950826]}},{"type":"Feature","properties":{"id":17010,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6130188090616121,44.79948701121046]}},{"type":"Feature","properties":{"id":17197,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6208364325521509,44.811430275159225]}},{"type":"Feature","properties":{"id":16937,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6217658448298949,44.81397031605175]}},{"type":"Feature","properties":{"id":17208,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6086453402267731,44.796098491349674]}},{"type":"Feature","properties":{"id":17209,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6085877055614487,44.79609131192823]}},{"type":"Feature","properties":{"id":15937,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6243497290246917,44.79999677088432]}},{"type":"Feature","properties":{"id":16166,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6243970870013743,44.80008390397228]}},{"type":"Feature","properties":{"id":19917,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5978580732608683,44.79681376542394]}},{"type":"Feature","properties":{"id":19954,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5828735045100534,44.80483162648224]}},{"type":"Feature","properties":{"id":19955,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5824016378533508,44.8046561473278]}},{"type":"Feature","properties":{"id":16182,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6182176013896765,44.80773911700815]}},{"type":"Feature","properties":{"id":16021,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6170217073769195,44.807881198466156]}},{"type":"Feature","properties":{"id":16016,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6081571627327063,44.80861901020956]}},{"type":"Feature","properties":{"id":15929,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6308126080649018,44.79835630695447]}},{"type":"Feature","properties":{"id":15930,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6270247250366625,44.79947566576465]}},{"type":"Feature","properties":{"id":15938,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6232012006720995,44.8003703697135]}},{"type":"Feature","properties":{"id":15939,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6221299012503636,44.80037440640367]}},{"type":"Feature","properties":{"id":15940,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.621319849440657,44.80036588083269]}},{"type":"Feature","properties":{"id":16389,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6226363449300576,44.80618073546984]}},{"type":"Feature","properties":{"id":16309,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6307163518160297,44.8053924150303]}},{"type":"Feature","properties":{"id":16405,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6309416133724075,44.80606804888352]}},{"type":"Feature","properties":{"id":16424,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6124134883332674,44.8052897517341]}},{"type":"Feature","properties":{"id":16425,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.614133694372727,44.80488918499556]}},{"type":"Feature","properties":{"id":16427,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6303966248624713,44.809837360339436]}},{"type":"Feature","properties":{"id":23170,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.591273267525887,44.81043447493098]}},{"type":"Feature","properties":{"id":24225,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5911550088205666,44.81066296284028]}},{"type":"Feature","properties":{"id":30129,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5906903391271844,44.81254016451701]}},{"type":"Feature","properties":{"id":19873,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.590587153787817,44.81261458620894]}},{"type":"Feature","properties":{"id":19781,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5941101284050473,44.803090834537365]}},{"type":"Feature","properties":{"id":19587,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.594810758112071,44.80352351693588]}},{"type":"Feature","properties":{"id":16165,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6286027052433694,44.800164557580324]}},{"type":"Feature","properties":{"id":16004,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6297668851998197,44.80069322459682]}},{"type":"Feature","properties":{"id":16384,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6283827483430332,44.801882537913045]}},{"type":"Feature","properties":{"id":16340,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.628473035099161,44.801135835085994]}},{"type":"Feature","properties":{"id":16091,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6321758318754092,44.79734121927321]}},{"type":"Feature","properties":{"id":16133,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6322105865270966,44.79718597537696]}},{"type":"Feature","properties":{"id":16260,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6180778051564332,44.81154192413539]}},{"type":"Feature","properties":{"id":16018,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6193323930943462,44.811126185161505]}},{"type":"Feature","properties":{"id":16555,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6198349122372658,44.81088219392614]}},{"type":"Feature","properties":{"id":15981,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6060638161924718,44.79663106410612]}},{"type":"Feature","properties":{"id":15982,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6062731049713567,44.796886388278814]}},{"type":"Feature","properties":{"id":15987,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6159351826868764,44.79963016129116]}},{"type":"Feature","properties":{"id":28916,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6226144229930793,44.807611869660086]}},{"type":"Feature","properties":{"id":16224,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6207757593926647,44.80773671572647]}},{"type":"Feature","properties":{"id":19729,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5958868153279412,44.801686235444606]}},{"type":"Feature","properties":{"id":17023,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6309737197054233,44.80456056167586]}},{"type":"Feature","properties":{"id":17229,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6307358512522636,44.8037873977151]}},{"type":"Feature","properties":{"id":16228,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6137095978648442,44.80830933152997]}},{"type":"Feature","properties":{"id":16605,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6127699290240495,44.80610926622104]}},{"type":"Feature","properties":{"id":15879,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6143089022443278,44.795925838115174]}},{"type":"Feature","properties":{"id":31144,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6322953326742453,44.807865072908555]}},{"type":"Feature","properties":{"id":16190,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6299514419578577,44.8049585728237]}},{"type":"Feature","properties":{"id":16268,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6270343374935502,44.80807700681343]}},{"type":"Feature","properties":{"id":16953,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6262970044470864,44.80771351675207]}},{"type":"Feature","properties":{"id":16671,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6281220146836525,44.80859624319518]}},{"type":"Feature","properties":{"id":15841,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6270386649190198,44.803331257509726]}},{"type":"Feature","properties":{"id":15843,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6269081382588043,44.80248142592167]}},{"type":"Feature","properties":{"id":31837,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6195687979613381,44.7969955702812]}},{"type":"Feature","properties":{"id":15955,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6204169498377229,44.79735773276919]}},{"type":"Feature","properties":{"id":17008,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6134612050310447,44.800307666080954]}},{"type":"Feature","properties":{"id":16342,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6207756796871756,44.802417021304976]}},{"type":"Feature","properties":{"id":17282,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6092841275076156,44.80081351866447]}},{"type":"Feature","properties":{"id":22908,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6088896288733325,44.80081369619789]}},{"type":"Feature","properties":{"id":16926,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6137206908151805,44.804021385254835]}},{"type":"Feature","properties":{"id":15883,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6195693809825837,44.79434475553062]}},{"type":"Feature","properties":{"id":15875,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6196800405722029,44.7945013115898]}},{"type":"Feature","properties":{"id":16872,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6177762813257962,44.80365923002183]}},{"type":"Feature","properties":{"id":17060,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6293204244529603,44.79411999485734]}},{"type":"Feature","properties":{"id":23345,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6300986751286143,44.79421550612817]}},{"type":"Feature","properties":{"id":20162,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.602782077306796,44.79565498770984]}},{"type":"Feature","properties":{"id":25687,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5924110577336282,44.796670224070986]}},{"type":"Feature","properties":{"id":17642,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6062007210507739,44.797310901675424]}},{"type":"Feature","properties":{"id":19990,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5885653989972357,44.80106764762856]}},{"type":"Feature","properties":{"id":19991,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5877041787751051,44.80096663185932]}},{"type":"Feature","properties":{"id":20001,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5895090725482314,44.800385584844534]}},{"type":"Feature","properties":{"id":20002,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.58992678783263,44.799169445830465]}},{"type":"Feature","properties":{"id":20530,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5977172695857862,44.80742792452227]}},{"type":"Feature","properties":{"id":20532,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5988915706544438,44.807154774322285]}},{"type":"Feature","properties":{"id":20534,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5986420259585337,44.80668658521703]}},{"type":"Feature","properties":{"id":20535,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5988426315947495,44.807068947301644]}},{"type":"Feature","properties":{"id":20140,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.591431092111132,44.809155283153466]}},{"type":"Feature","properties":{"id":23331,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6000262959420235,44.806251188302866]}},{"type":"Feature","properties":{"id":57743,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5989344322699931,44.8066063743094]}},{"type":"Feature","properties":{"id":20348,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5943365232877257,44.806354562138054]}},{"type":"Feature","properties":{"id":19892,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5953226814922169,44.806134221973636]}},{"type":"Feature","properties":{"id":23042,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6316085245585873,44.80376674305387]}},{"type":"Feature","properties":{"id":17520,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6219974203338794,44.807096603254664]}},{"type":"Feature","properties":{"id":17554,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6065960838034486,44.79514268204756]}},{"type":"Feature","properties":{"id":20430,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5898589085239744,44.79578531672493]}},{"type":"Feature","properties":{"id":26551,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6302761572107939,44.79421524538567]}},{"type":"Feature","properties":{"id":26550,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6304296964116521,44.79432096689277]}},{"type":"Feature","properties":{"id":28691,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6318972150442006,44.80522787563589]}},{"type":"Feature","properties":{"id":28692,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.631700007696165,44.80477699651276]}},{"type":"Feature","properties":{"id":20292,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5848152581641884,44.80002097670167]}},{"type":"Feature","properties":{"id":20109,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5848152076639289,44.79984721067967]}},{"type":"Feature","properties":{"id":16433,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6320923791784995,44.81123934229949]}},{"type":"Feature","properties":{"id":26644,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6318710706919177,44.81019945317003]}},{"type":"Feature","properties":{"id":19842,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.582926096946988,44.80891678917791]}},{"type":"Feature","properties":{"id":20469,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5813256223797156,44.808544619005495]}},{"type":"Feature","properties":{"id":22367,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5891628548496484,44.80378890572265]}},{"type":"Feature","properties":{"id":22369,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5896731806453948,44.803293474578275]}},{"type":"Feature","properties":{"id":19918,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5977397996493297,44.7969742505215]}},{"type":"Feature","properties":{"id":20506,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.598340238553185,44.79720919580894]}},{"type":"Feature","properties":{"id":20375,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5922619312697354,44.79666268358289]}},{"type":"Feature","properties":{"id":17561,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.609292376100524,44.79406793627747]}},{"type":"Feature","properties":{"id":17562,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6096161550702309,44.794183685429104]}},{"type":"Feature","properties":{"id":20410,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6027296980286029,44.80673175962899]}},{"type":"Feature","properties":{"id":20411,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6015473838064842,44.807046746653825]}},{"type":"Feature","properties":{"id":20450,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.582654089070662,44.80271207266947]}},{"type":"Feature","properties":{"id":20453,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5831183975565108,44.802133084830125]}},{"type":"Feature","properties":{"id":20060,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5816756531470041,44.795922453916624]}},{"type":"Feature","properties":{"id":20071,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5873405205806616,44.81311328679103]}},{"type":"Feature","properties":{"id":20481,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5879740703110379,44.80459364035909]}},{"type":"Feature","properties":{"id":20213,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5873478577180511,44.80444115657791]}},{"type":"Feature","properties":{"id":19689,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5851495033491008,44.80153219107884]}},{"type":"Feature","properties":{"id":19598,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5850959289495298,44.808524217323345]}},{"type":"Feature","properties":{"id":20287,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5864864687442536,44.80581270157772]}},{"type":"Feature","properties":{"id":19583,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.584141209074514,44.795217084931785]}},{"type":"Feature","properties":{"id":19584,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5846472686524727,44.79564658849234]}},{"type":"Feature","properties":{"id":26871,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6042882382750667,44.79684094366318]}},{"type":"Feature","properties":{"id":16628,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6201737519763828,44.80505418675388]}},{"type":"Feature","properties":{"id":16629,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6207580646347948,44.80506171139595]}},{"type":"Feature","properties":{"id":20102,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5825067803575857,44.808361672208974]}},{"type":"Feature","properties":{"id":19952,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5841858371471785,44.80558750187525]}},{"type":"Feature","properties":{"id":19670,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5856717428526199,44.79693579087962]}},{"type":"Feature","properties":{"id":20119,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5861018004954792,44.81086318887048]}},{"type":"Feature","properties":{"id":20120,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.586101036755573,44.81007391743919]}},{"type":"Feature","properties":{"id":19671,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5848285086423236,44.796809595995924]}},{"type":"Feature","properties":{"id":19681,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5844384020875807,44.80730298439016]}},{"type":"Feature","properties":{"id":19551,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5807320014946282,44.79863200587201]}},{"type":"Feature","properties":{"id":19688,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5810459800769706,44.79835836100999]}},{"type":"Feature","properties":{"id":19692,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.583779240354156,44.80225909656631]}},{"type":"Feature","properties":{"id":19697,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.583594741220704,44.799262579054854]}},{"type":"Feature","properties":{"id":19698,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5838850510735177,44.79855745999362]}},{"type":"Feature","properties":{"id":19588,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5971281849445176,44.80254005614149]}},{"type":"Feature","properties":{"id":19734,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5942055605025433,44.79804610025062]}},{"type":"Feature","properties":{"id":19586,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5927545423625904,44.80435463593653]}},{"type":"Feature","properties":{"id":19963,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6030959881292656,44.796167611720165]}},{"type":"Feature","properties":{"id":17056,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6034283903360506,44.79591529769285]}},{"type":"Feature","properties":{"id":24224,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5910571820878934,44.810593805537806]}},{"type":"Feature","properties":{"id":27462,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6021125593266066,44.796799076337216]}},{"type":"Feature","properties":{"id":20149,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6022145735222436,44.796866559883405]}},{"type":"Feature","properties":{"id":29095,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5965714569927393,44.80037406839496]}},{"type":"Feature","properties":{"id":29094,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.59644967915179,44.800320356824194]}},{"type":"Feature","properties":{"id":16537,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6222925693597104,44.810466415289795]}},{"type":"Feature","properties":{"id":16583,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6232630403559571,44.81263813827225]}},{"type":"Feature","properties":{"id":30942,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6101889075141375,44.80350458555031]}},{"type":"Feature","properties":{"id":29758,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6106006068118239,44.804776729961674]}},{"type":"Feature","properties":{"id":25389,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5893995354674162,44.81164017740682]}},{"type":"Feature","properties":{"id":30059,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5894712877183582,44.81174583129971]}},{"type":"Feature","properties":{"id":23329,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.600171475528634,44.80630856983659]}},{"type":"Feature","properties":{"id":23317,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6003712714452328,44.80628008541878]}},{"type":"Feature","properties":{"id":25438,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.599956256747319,44.80612656908074]}},{"type":"Feature","properties":{"id":26731,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6007358852897697,44.80735466712789]}},{"type":"Feature","properties":{"id":19999,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5880356658461944,44.80012688090375]}},{"type":"Feature","properties":{"id":20170,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5888327396472829,44.80026468961341]}},{"type":"Feature","properties":{"id":20407,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6029063912671518,44.80705235166629]}},{"type":"Feature","properties":{"id":25046,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.604111969837402,44.79685463755314]}},{"type":"Feature","properties":{"id":19843,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5830314995900483,44.808371088178305]}},{"type":"Feature","properties":{"id":19845,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5946333376497162,44.81235014458704]}},{"type":"Feature","properties":{"id":20314,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5878989934571109,44.80870572007875]}},{"type":"Feature","properties":{"id":20313,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5878411980233785,44.808960402602814]}},{"type":"Feature","properties":{"id":19601,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5877737931600661,44.80881470450807]}},{"type":"Feature","properties":{"id":20209,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5893277101316055,44.80291684525887]}},{"type":"Feature","properties":{"id":16885,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6307440648849332,44.806857015563125]}},{"type":"Feature","properties":{"id":16390,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6225024468729391,44.80605356820456]}},{"type":"Feature","properties":{"id":16345,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6211277020072631,44.80020345272752]}},{"type":"Feature","properties":{"id":16185,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6164543226763436,44.803260855030295]}},{"type":"Feature","properties":{"id":27888,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6324539626388954,44.80672359754805]}},{"type":"Feature","properties":{"id":24466,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6155333858256525,44.793975887879235]}},{"type":"Feature","properties":{"id":24467,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6154612586161684,44.79419555204469]}},{"type":"Feature","properties":{"id":16523,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6197420186573377,44.79791674542534]}},{"type":"Feature","properties":{"id":16524,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6193705422846755,44.79893633192673]}},{"type":"Feature","properties":{"id":16532,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6103603574437853,44.80497740406887]}},{"type":"Feature","properties":{"id":16533,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6234178340187196,44.79431128839112]}},{"type":"Feature","properties":{"id":24049,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6234472882692765,44.79421630251364]}},{"type":"Feature","properties":{"id":16542,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6293560511976012,44.809064046406846]}},{"type":"Feature","properties":{"id":30479,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.629420588809221,44.80898163238363]}},{"type":"Feature","properties":{"id":19863,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5814665934575787,44.80293981469017]}},{"type":"Feature","properties":{"id":24949,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5831112470882293,44.81130090973327]}},{"type":"Feature","properties":{"id":16404,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6308082702318089,44.805101932908464]}},{"type":"Feature","properties":{"id":36295,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6310054379205055,44.80505005617093]}},{"type":"Feature","properties":{"id":16527,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.615303508186988,44.80257281271715]}},{"type":"Feature","properties":{"id":16528,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6147625339756065,44.80263045494609]}},{"type":"Feature","properties":{"id":16511,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6147790223180165,44.802748120007365]}},{"type":"Feature","properties":{"id":16500,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6213182259154546,44.79683321692945]}},{"type":"Feature","properties":{"id":16499,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6231775707522589,44.79442983674528]}},{"type":"Feature","properties":{"id":16672,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6286706524024379,44.80836209049072]}},{"type":"Feature","properties":{"id":16673,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6293441143335687,44.80814088793653]}},{"type":"Feature","properties":{"id":16419,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6071178372245689,44.805933187131934]}},{"type":"Feature","properties":{"id":16677,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6075186009733935,44.80418854536408]}},{"type":"Feature","properties":{"id":36338,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5884052365925718,44.809442744302494]}},{"type":"Feature","properties":{"id":20125,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5933858786547904,44.799536648197865]}},{"type":"Feature","properties":{"id":16750,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6297406522332688,44.805356804530206]}},{"type":"Feature","properties":{"id":15809,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6298412361821026,44.80565600613529]}},{"type":"Feature","properties":{"id":35012,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6330096504694444,44.80516829540005]}},{"type":"Feature","properties":{"id":16714,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.63286743820531,44.80497780590039]}},{"type":"Feature","properties":{"id":20385,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5921218055751118,44.80346029306825]}},{"type":"Feature","properties":{"id":20386,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5915990886301392,44.803357521495506]}},{"type":"Feature","properties":{"id":19993,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.58600702822517,44.8007377500221]}},{"type":"Feature","properties":{"id":25408,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6007471674791848,44.80446221351912]}},{"type":"Feature","properties":{"id":16535,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6202000052487621,44.81094462359676]}},{"type":"Feature","properties":{"id":54610,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.619935245200211,44.810926762624696]}},{"type":"Feature","properties":{"id":48659,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5826367980250649,44.798750738834926]}},{"type":"Feature","properties":{"id":30633,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5811058814962979,44.797695276271334]}},{"type":"Feature","properties":{"id":49410,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5896127506596973,44.80994108199276]}},{"type":"Feature","properties":{"id":20159,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5885014872928597,44.809885072212275]}},{"type":"Feature","properties":{"id":614,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5920620861449233,44.809101217559316]}},{"type":"Feature","properties":{"id":13307,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5884433216987119,44.8093329041959]}},{"type":"Feature","properties":{"id":28940,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5943043354637455,44.81037197922775]}},{"type":"Feature","properties":{"id":16882,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6308228069958516,44.80703232765483]}},{"type":"Feature","properties":{"id":16607,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6120315589483181,44.804418707609955]}},{"type":"Feature","properties":{"id":16757,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6091390095554492,44.80751947833871]}},{"type":"Feature","properties":{"id":16758,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6084853871706092,44.80752697399567]}},{"type":"Feature","properties":{"id":17057,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6039887601312252,44.7954786555727]}},{"type":"Feature","properties":{"id":5936,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6052587178431771,44.79311156322309]}},{"type":"Feature","properties":{"id":16341,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6248167158546375,44.80108108882604]}},{"type":"Feature","properties":{"id":16773,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6230278625711209,44.79802290803133]}},{"type":"Feature","properties":{"id":16501,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6212388052444724,44.79702510154128]}},{"type":"Feature","properties":{"id":16040,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6248421499497538,44.80544780398771]}},{"type":"Feature","properties":{"id":19945,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.593193462358844,44.79621797596893]}},{"type":"Feature","properties":{"id":19951,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5849876235953666,44.80613983686355]}},{"type":"Feature","properties":{"id":16211,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6150382268229753,44.793035756445974]}},{"type":"Feature","properties":{"id":30956,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6183521141724402,44.80048385125475]}},{"type":"Feature","properties":{"id":27894,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6309912993060639,44.81066543778118]}},{"type":"Feature","properties":{"id":27893,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6301628211966482,44.811140317985114]}},{"type":"Feature","properties":{"id":16403,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6309416636166261,44.80546791955571]}},{"type":"Feature","properties":{"id":16421,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6056844644651586,44.806002687415926]}},{"type":"Feature","properties":{"id":23488,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6300299939272938,44.80975663521422]}},{"type":"Feature","properties":{"id":16039,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6259480769330436,44.805108556981914]}},{"type":"Feature","properties":{"id":15842,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6283159846498326,44.80246624911388]}},{"type":"Feature","properties":{"id":16462,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6303581801530276,44.807816474705625]}},{"type":"Feature","properties":{"id":16939,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6238502063826362,44.812110102232744]}},{"type":"Feature","properties":{"id":16869,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6246231752046867,44.811427684732095]}},{"type":"Feature","properties":{"id":16952,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6261384776787635,44.80778442185393]}},{"type":"Feature","properties":{"id":16949,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6149636158821615,44.81253617954805]}},{"type":"Feature","properties":{"id":16950,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6162453655944039,44.812137179078924]}},{"type":"Feature","properties":{"id":15977,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6061403033668107,44.796389468898305]}},{"type":"Feature","properties":{"id":15978,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6059079132524073,44.79656781491607]}},{"type":"Feature","properties":{"id":31834,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6148726813755127,44.797617157607036]}},{"type":"Feature","properties":{"id":30018,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6100281494112885,44.805710327171916]}},{"type":"Feature","properties":{"id":17036,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6077160928261833,44.809473202346354]}},{"type":"Feature","properties":{"id":30757,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6317138802751466,44.803460696747564]}},{"type":"Feature","properties":{"id":30758,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6314303730376181,44.80188679333691]}},{"type":"Feature","properties":{"id":25034,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6125672769128109,44.7940197076383]}},{"type":"Feature","properties":{"id":16014,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6119745595212183,44.79445778236543]}},{"type":"Feature","properties":{"id":16129,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.627149054686297,44.80405002871358]}},{"type":"Feature","properties":{"id":16255,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6257521823861885,44.80431219554282]}},{"type":"Feature","properties":{"id":16252,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6268196929754306,44.80186600150498]}},{"type":"Feature","properties":{"id":17372,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6304017045255174,44.79375586260076]}},{"type":"Feature","properties":{"id":17369,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.627080073458247,44.79361836120969]}},{"type":"Feature","properties":{"id":25437,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.627836075908068,44.793587669035915]}},{"type":"Feature","properties":{"id":26807,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6268444155250309,44.79226335915188]}},{"type":"Feature","properties":{"id":17749,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6095588933797128,44.80069147420939]}},{"type":"Feature","properties":{"id":31586,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6061904248093064,44.80935934252739]}},{"type":"Feature","properties":{"id":16436,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6067367308739857,44.809327157783876]}},{"type":"Feature","properties":{"id":16504,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6199814020393726,44.797727427460025]}},{"type":"Feature","properties":{"id":16347,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6214167578327167,44.79826691178667]}},{"type":"Feature","properties":{"id":25908,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6278565756756521,44.794040137058424]}},{"type":"Feature","properties":{"id":16590,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6334931477747833,44.807382520972965]}},{"type":"Feature","properties":{"id":17039,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6247758361554655,44.81422144580021]}},{"type":"Feature","properties":{"id":19989,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5892428261966974,44.801140946932136]}},{"type":"Feature","properties":{"id":20522,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6033760385970242,44.80532050067225]}},{"type":"Feature","properties":{"id":20520,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6021666254435213,44.80564680328958]}},{"type":"Feature","properties":{"id":30378,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6022917175528385,44.80588894695939]}},{"type":"Feature","properties":{"id":20401,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5996080759009443,44.806864276637434]}},{"type":"Feature","properties":{"id":57744,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5980661419872498,44.80799106177666]}},{"type":"Feature","properties":{"id":34169,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.587796914409828,44.79791488591274]}},{"type":"Feature","properties":{"id":19576,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5877750460731076,44.79799448753065]}},{"type":"Feature","properties":{"id":19554,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5808042810274717,44.79918463227966]}},{"type":"Feature","properties":{"id":20161,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6025536281227533,44.79596940673287]}},{"type":"Feature","properties":{"id":23330,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6029775749561365,44.79611911546831]}},{"type":"Feature","properties":{"id":20073,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5862677591195563,44.81279020825787]}},{"type":"Feature","properties":{"id":20116,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5861854658165723,44.812315730242524]}},{"type":"Feature","properties":{"id":20124,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5839187422932206,44.800933203016335]}},{"type":"Feature","properties":{"id":29726,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6210431820372987,44.807195449262856]}},{"type":"Feature","properties":{"id":17517,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6206160801426124,44.80701978018523]}},{"type":"Feature","properties":{"id":17555,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6075399926453159,44.79530020462924]}},{"type":"Feature","properties":{"id":24953,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.583498074377168,44.81186020148482]}},{"type":"Feature","properties":{"id":24954,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5833320972450592,44.81171859716562]}},{"type":"Feature","properties":{"id":20418,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5936575716898786,44.80631475967341]}},{"type":"Feature","properties":{"id":23612,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5809334049683368,44.79758882598663]}},{"type":"Feature","properties":{"id":30632,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5809358583233416,44.7977036927822]}},{"type":"Feature","properties":{"id":20254,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.585610866426628,44.80766229960811]}},{"type":"Feature","properties":{"id":19944,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5948658704777255,44.79626871633933]}},{"type":"Feature","properties":{"id":21898,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5926451115140102,44.79696865908753]}},{"type":"Feature","properties":{"id":20510,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5924878194613906,44.79667374462788]}},{"type":"Feature","properties":{"id":20412,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.601584876390149,44.80579773715195]}},{"type":"Feature","properties":{"id":20249,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5846706106451018,44.799865821105186]}},{"type":"Feature","properties":{"id":19618,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5897684222230885,44.79628065133203]}},{"type":"Feature","properties":{"id":19619,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5884126126163992,44.79620020875445]}},{"type":"Feature","properties":{"id":20053,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5944407225173641,44.81033496976032]}},{"type":"Feature","properties":{"id":21900,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5984941854509571,44.79876959648253]}},{"type":"Feature","properties":{"id":20186,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5995584697456817,44.797928416799316]}},{"type":"Feature","properties":{"id":20513,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5959392521576963,44.79447186994839]}},{"type":"Feature","properties":{"id":25700,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5941555003119894,44.79425369005078]}},{"type":"Feature","properties":{"id":20033,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5956951221808845,44.80408803249884]}},{"type":"Feature","properties":{"id":19749,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5822565001424345,44.79625673810243]}},{"type":"Feature","properties":{"id":16630,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6209765883858974,44.80501529813661]}},{"type":"Feature","properties":{"id":16631,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6202864288590101,44.80518005017042]}},{"type":"Feature","properties":{"id":19893,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5951509690186139,44.80529017486023]}},{"type":"Feature","properties":{"id":20096,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5862735772825147,44.79490789896886]}},{"type":"Feature","properties":{"id":22360,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5842133684977429,44.80200895198547]}},{"type":"Feature","properties":{"id":19693,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5829773948842143,44.80285700859803]}},{"type":"Feature","properties":{"id":25686,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5923505719694316,44.79740711467132]}},{"type":"Feature","properties":{"id":19733,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5921843731680444,44.79734083928537]}},{"type":"Feature","properties":{"id":20145,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5938418315239782,44.80177681685403]}},{"type":"Feature","properties":{"id":20141,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5914934469368046,44.80787730359128]}},{"type":"Feature","properties":{"id":59021,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.591766336803742,44.8068580488834]}},{"type":"Feature","properties":{"id":29089,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5965703030351481,44.8006820962064]}},{"type":"Feature","properties":{"id":23328,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6039085937317981,44.795420660585705]}},{"type":"Feature","properties":{"id":30496,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5903439306842265,44.811647667559505]}},{"type":"Feature","properties":{"id":30495,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5902507396256396,44.81214867142865]}},{"type":"Feature","properties":{"id":30616,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6294033291781501,44.80882408599701]}},{"type":"Feature","properties":{"id":31147,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6290654939923932,44.808286074605]}},{"type":"Feature","properties":{"id":16591,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6336468350273577,44.807851273265534]}},{"type":"Feature","properties":{"id":27887,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6321219936157869,44.80681716620748]}},{"type":"Feature","properties":{"id":27555,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6053857356036779,44.80792308022486]}},{"type":"Feature","properties":{"id":23133,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6004552821986776,44.80621508908806]}},{"type":"Feature","properties":{"id":27599,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6001917895831032,44.80508794082779]}},{"type":"Feature","properties":{"id":49830,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6001113002571422,44.80457918076215]}},{"type":"Feature","properties":{"id":19747,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6005709443936075,44.81246494703294]}},{"type":"Feature","properties":{"id":20232,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6001605108446603,44.810093998251546]}},{"type":"Feature","properties":{"id":20396,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6033032501363998,44.80586050945838]}},{"type":"Feature","properties":{"id":20397,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6024013038858907,44.80610770975058]}},{"type":"Feature","properties":{"id":19847,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5972536510442011,44.81180591126048]}},{"type":"Feature","properties":{"id":28643,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5941901639134951,44.81028631546872]}},{"type":"Feature","properties":{"id":29243,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5886892546935539,44.80732974323805]}},{"type":"Feature","properties":{"id":20312,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5876967809948078,44.80906765093253]}},{"type":"Feature","properties":{"id":16601,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6324972230262332,44.80443615401674]}},{"type":"Feature","properties":{"id":19759,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5839721605433712,44.79625664083094]}},{"type":"Feature","properties":{"id":20215,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5867244760266841,44.8043076775135]}},{"type":"Feature","properties":{"id":24952,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5836397916982583,44.81212859390735]}},{"type":"Feature","properties":{"id":17285,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6145145899145501,44.80572097974112]}},{"type":"Feature","properties":{"id":15887,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6144286227959143,44.79572258881573]}},{"type":"Feature","properties":{"id":16518,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6229576027525034,44.794378110453]}},{"type":"Feature","properties":{"id":16519,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6212349465970253,44.796764252395086]}},{"type":"Feature","properties":{"id":16526,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6170348711673813,44.80045800961697]}},{"type":"Feature","properties":{"id":16531,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6108199774483072,44.80481444701006]}},{"type":"Feature","properties":{"id":16536,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6205284245130067,44.81087246378458]}},{"type":"Feature","properties":{"id":16547,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6337864428814863,44.80910835023672]}},{"type":"Feature","properties":{"id":22873,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6004152790420273,44.805991960079176]}},{"type":"Feature","properties":{"id":23255,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6006221089494935,44.80453445507072]}},{"type":"Feature","properties":{"id":19550,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.58038085195626,44.79839272485266]}},{"type":"Feature","properties":{"id":19895,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5912520546581699,44.81011634475008]}},{"type":"Feature","properties":{"id":19896,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5898639664009762,44.81006134052601]}},{"type":"Feature","properties":{"id":21901,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5969918950318113,44.798133216314305]}},{"type":"Feature","properties":{"id":19934,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5832376806298483,44.810574383277476]}},{"type":"Feature","properties":{"id":16600,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6054086379978214,44.795921806801715]}},{"type":"Feature","properties":{"id":16514,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6109243507247113,44.804921214813355]}},{"type":"Feature","properties":{"id":16513,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6117154585853717,44.80410741972833]}},{"type":"Feature","properties":{"id":19898,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5896315190587665,44.81053710171911]}},{"type":"Feature","properties":{"id":27598,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6004523068258636,44.8045365874173]}},{"type":"Feature","properties":{"id":35011,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6323132574139818,44.80535818369297]}},{"type":"Feature","properties":{"id":20269,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5928693700846391,44.799062920016524]}},{"type":"Feature","properties":{"id":25685,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5917724060901783,44.798699046797225]}},{"type":"Feature","properties":{"id":42110,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5901752386690532,44.80668821935534]}},{"type":"Feature","properties":{"id":38610,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.594965116161893,44.80104390037088]}},{"type":"Feature","properties":{"id":38858,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5937829356824031,44.80173931199198]}},{"type":"Feature","properties":{"id":20043,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5884806678820967,44.80460857465829]}},{"type":"Feature","properties":{"id":20479,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5878582517449966,44.804853216293985]}},{"type":"Feature","properties":{"id":20441,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5861338372861663,44.80013822103367]}},{"type":"Feature","properties":{"id":20439,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.586027412261367,44.80060982177523]}},{"type":"Feature","properties":{"id":20440,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5854018225157706,44.80007392124822]}},{"type":"Feature","properties":{"id":54607,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6271222134196999,44.80622321408799]}},{"type":"Feature","properties":{"id":54611,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6199400407258951,44.810830217920476]}},{"type":"Feature","properties":{"id":16951,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6257873812750893,44.80795235979245]}},{"type":"Feature","properties":{"id":29245,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5886221785661602,44.80724420989426]}},{"type":"Feature","properties":{"id":29246,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5889215836520356,44.807171255589246]}},{"type":"Feature","properties":{"id":53582,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6009433766419726,44.80649702704205]}},{"type":"Feature","properties":{"id":20398,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6018331508031505,44.80626163727018]}},{"type":"Feature","properties":{"id":53584,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6005427197009086,44.80666105414587]}},{"type":"Feature","properties":{"id":53583,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.600500201452968,44.806578093243665]}},{"type":"Feature","properties":{"id":49829,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6045282040629822,44.8057139575337]}},{"type":"Feature","properties":{"id":20405,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6038053565986792,44.806815962071745]}},{"type":"Feature","properties":{"id":48658,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5827289793055835,44.798831340566984]}},{"type":"Feature","properties":{"id":48661,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5827337220341308,44.79874885656027]}},{"type":"Feature","properties":{"id":48660,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5826554480804653,44.79883708007676]}},{"type":"Feature","properties":{"id":20536,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5952249709914197,44.80781373927588]}},{"type":"Feature","properties":{"id":628,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5949446075557351,44.80787746060429]}},{"type":"Feature","properties":{"id":20350,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6002739308007025,44.805937160069774]}},{"type":"Feature","properties":{"id":20063,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5818017654633052,44.79409946398881]}},{"type":"Feature","properties":{"id":27233,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6240391870529518,44.79383701591695]}},{"type":"Feature","properties":{"id":27232,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6243538295028445,44.79372240086953]}},{"type":"Feature","properties":{"id":27234,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.623379009221982,44.79408605511891]}},{"type":"Feature","properties":{"id":16752,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6196697256676994,44.79906661944379]}},{"type":"Feature","properties":{"id":28441,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6194581803946418,44.80085421141209]}},{"type":"Feature","properties":{"id":16753,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6062086005106154,44.804538531610724]}},{"type":"Feature","properties":{"id":15874,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6214998958983052,44.794007185475536]}},{"type":"Feature","properties":{"id":27481,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6207090517644245,44.796434535973084]}},{"type":"Feature","properties":{"id":30057,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5894924222691592,44.81158734105841]}},{"type":"Feature","properties":{"id":16017,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6080748822995544,44.807963565585]}},{"type":"Feature","properties":{"id":30100,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6077251719231692,44.80789565556416]}},{"type":"Feature","properties":{"id":27482,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6208367372807657,44.79666666959483]}},{"type":"Feature","properties":{"id":16521,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6209334497793274,44.79682060587063]}},{"type":"Feature","properties":{"id":16922,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6197940289716289,44.804594956016665]}},{"type":"Feature","properties":{"id":27339,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6206653246477516,44.804606589408365]}},{"type":"Feature","properties":{"id":25672,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6093296767989641,44.79621991546355]}},{"type":"Feature","properties":{"id":16269,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6282005990874134,44.807691547607696]}},{"type":"Feature","properties":{"id":15824,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6284258411300346,44.80741807490818]}},{"type":"Feature","properties":{"id":29865,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6251557220834865,44.79835525067678]}},{"type":"Feature","properties":{"id":31583,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6054698997467376,44.808677917346344]}},{"type":"Feature","properties":{"id":20163,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6003365168343558,44.808270294930296]}},{"type":"Feature","properties":{"id":16226,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.615993843363658,44.808079542423435]}},{"type":"Feature","properties":{"id":16227,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6156386765922829,44.808168934866266]}},{"type":"Feature","properties":{"id":28915,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6233650667962933,44.80716889130704]}},{"type":"Feature","properties":{"id":28442,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6184777365899734,44.80079802889875]}},{"type":"Feature","properties":{"id":16020,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6177472367798235,44.8092290114272]}},{"type":"Feature","properties":{"id":16225,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6186893706113094,44.80773942310523]}},{"type":"Feature","properties":{"id":16434,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6334066349679124,44.81109917839348]}},{"type":"Feature","properties":{"id":25319,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6309738476311294,44.807133985290996]}},{"type":"Feature","properties":{"id":16503,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6204684765805153,44.7973743793357]}},{"type":"Feature","properties":{"id":30132,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5908003747528613,44.81253101600426]}},{"type":"Feature","properties":{"id":22796,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6275920194000862,44.80652960157727]}},{"type":"Feature","properties":{"id":15823,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.628077623263275,44.80687588042583]}},{"type":"Feature","properties":{"id":16377,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6256155342448166,44.80460184989887]}},{"type":"Feature","properties":{"id":57284,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6256792607284879,44.804690975514546]}},{"type":"Feature","properties":{"id":16666,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6174973955855689,44.811732712827244]}},{"type":"Feature","properties":{"id":16003,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6311618754544944,44.800779946141475]}},{"type":"Feature","properties":{"id":19793,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.581043175686349,44.80386170890745]}},{"type":"Feature","properties":{"id":19794,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5801867371211297,44.8038034536805]}},{"type":"Feature","properties":{"id":19814,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5858764711911255,44.80673826182572]}},{"type":"Feature","properties":{"id":19813,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5860118123630705,44.80683708913506]}},{"type":"Feature","properties":{"id":16038,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6273931098724322,44.80459851259172]}},{"type":"Feature","properties":{"id":17230,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6313345077378727,44.801901565174525]}},{"type":"Feature","properties":{"id":16606,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6125250585888145,44.8055516828129]}},{"type":"Feature","properties":{"id":15830,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6288499444519569,44.80393154326636]}},{"type":"Feature","properties":{"id":15876,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6184503784224944,44.79483267624182]}},{"type":"Feature","properties":{"id":17170,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6311166921227062,44.80050654248247]}},{"type":"Feature","properties":{"id":17040,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6278458495754775,44.813336609117634]}},{"type":"Feature","properties":{"id":17140,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6167264185774021,44.812885880405375]}},{"type":"Feature","properties":{"id":17283,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6067595134788911,44.80015574212107]}},{"type":"Feature","properties":{"id":25611,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6061927458767559,44.79975627139223]}},{"type":"Feature","properties":{"id":16489,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6235468187345438,44.80153305782432]}},{"type":"Feature","properties":{"id":16346,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6213004097149313,44.79914595828795]}},{"type":"Feature","properties":{"id":16722,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6270886859262708,44.794153454899394]}},{"type":"Feature","properties":{"id":26548,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6293356239872048,44.7942267997652]}},{"type":"Feature","properties":{"id":25689,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5919747227009714,44.793750392727745]}},{"type":"Feature","properties":{"id":19998,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5871427200275997,44.802502850829214]}},{"type":"Feature","properties":{"id":19997,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5866414389109001,44.80354045736144]}},{"type":"Feature","properties":{"id":29935,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5912555154959257,44.80751520978357]}},{"type":"Feature","properties":{"id":29248,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5889127340169472,44.807307558385496]}},{"type":"Feature","properties":{"id":20544,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5921067490056824,44.81264047826045]}},{"type":"Feature","properties":{"id":17556,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6082477944066069,44.79542278223798]}},{"type":"Feature","properties":{"id":17557,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6083034349545852,44.79554163781109]}},{"type":"Feature","properties":{"id":24956,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5831128403084147,44.81142832487604]}},{"type":"Feature","properties":{"id":24955,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5831192966936468,44.81155864960264]}},{"type":"Feature","properties":{"id":16191,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6296198397404436,44.803868150264506]}},{"type":"Feature","properties":{"id":20182,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5798295503254133,44.79815136572929]}},{"type":"Feature","properties":{"id":17750,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6093768517601454,44.800910207684005]}},{"type":"Feature","properties":{"id":30634,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.581049012358213,44.797567980156245]}},{"type":"Feature","properties":{"id":17773,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6105819573232397,44.79443030040655]}},{"type":"Feature","properties":{"id":22891,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6017685441052617,44.806145044514714]}},{"type":"Feature","properties":{"id":19600,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5869876197288899,44.80872986951243]}},{"type":"Feature","properties":{"id":19627,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5866746519603945,44.8046721880755]}},{"type":"Feature","properties":{"id":19628,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5861198120682125,44.80449537688717]}},{"type":"Feature","properties":{"id":20009,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5886201223908932,44.795558312862916]}},{"type":"Feature","properties":{"id":20055,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5861596889364554,44.79540171578158]}},{"type":"Feature","properties":{"id":17441,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6206897558564304,44.81118442213069]}},{"type":"Feature","properties":{"id":25245,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.604094233275002,44.79673079546311]}},{"type":"Feature","properties":{"id":16632,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6201678190527815,44.80528814201962]}},{"type":"Feature","properties":{"id":19685,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5831887578305832,44.8130770372922]}},{"type":"Feature","properties":{"id":23182,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5822053501379916,44.81203081536906]}},{"type":"Feature","properties":{"id":19723,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5822195256664939,44.81197586969005]}},{"type":"Feature","properties":{"id":20414,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5824723589146111,44.812248511199655]}},{"type":"Feature","properties":{"id":19728,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.595003061518976,44.80107819332798]}},{"type":"Feature","properties":{"id":38609,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5960516029257379,44.800504460980235]}},{"type":"Feature","properties":{"id":19939,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6001156711618988,44.798157515156575]}},{"type":"Feature","properties":{"id":27556,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.605757491691602,44.80762330174275]}},{"type":"Feature","properties":{"id":25956,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6053373108555657,44.807834712668125]}},{"type":"Feature","properties":{"id":23353,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6000852811907536,44.8043813726086]}},{"type":"Feature","properties":{"id":23254,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6002816167230712,44.80438470667476]}},{"type":"Feature","properties":{"id":49828,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6053620107596795,44.80537088988191]}},{"type":"Feature","properties":{"id":20311,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5873844207319046,44.80931081429517]}},{"type":"Feature","properties":{"id":19772,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5870244283657843,44.797018707197054]}},{"type":"Feature","properties":{"id":20198,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5878802718810091,44.8104521851498]}},{"type":"Feature","properties":{"id":20211,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5887105096135855,44.80420566504319]}},{"type":"Feature","properties":{"id":36294,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6322121990324753,44.804561645228155]}},{"type":"Feature","properties":{"id":20415,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5841520718199863,44.81235053970521]}},{"type":"Feature","properties":{"id":24464,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6156559924187647,44.79421016985492]}},{"type":"Feature","properties":{"id":16775,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6231370346267664,44.79401025740016]}},{"type":"Feature","properties":{"id":16534,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6228581922887556,44.794223541097814]}},{"type":"Feature","properties":{"id":31418,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6219157960357039,44.794463185128066]}},{"type":"Feature","properties":{"id":19773,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5868890728028368,44.797380961659904]}},{"type":"Feature","properties":{"id":19940,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5997444328869818,44.79781866557593]}},{"type":"Feature","properties":{"id":16505,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6194418446698561,44.798961628216425]}},{"type":"Feature","properties":{"id":16512,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6132006267363936,44.80286043204193]}},{"type":"Feature","properties":{"id":16667,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6180171131666972,44.81246612657396]}},{"type":"Feature","properties":{"id":19582,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5839761420156613,44.795077165607054]}},{"type":"Feature","properties":{"id":20444,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5840797735570805,44.794989943369195]}},{"type":"Feature","properties":{"id":20387,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5910668377371494,44.803253624036394]}},{"type":"Feature","properties":{"id":59322,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5905249464257029,44.80314674222542]}},{"type":"Feature","properties":{"id":34720,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6290182849240853,44.80555840129723]}},{"type":"Feature","properties":{"id":38853,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5926887131867463,44.804341941868636]}},{"type":"Feature","properties":{"id":20474,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5912725273716545,44.80418600579809]}},{"type":"Feature","properties":{"id":54606,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6269556598485034,44.80614553903033]}},{"type":"Feature","properties":{"id":53581,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5999683281837823,44.80675796006154]}},{"type":"Feature","properties":{"id":53586,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6003802276684883,44.80660833529063]}},{"type":"Feature","properties":{"id":53585,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6004237858826246,44.806693377047004]}},{"type":"Feature","properties":{"id":629,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5914292510220244,44.809221191179155]}},{"type":"Feature","properties":{"id":13306,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5885482454810009,44.80883927887937]}},{"type":"Feature","properties":{"id":23429,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5872243072582464,44.79794565051813]}},{"type":"Feature","properties":{"id":23432,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5871286171694389,44.797930742521565]}},{"type":"Feature","properties":{"id":25669,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6095480015968218,44.796184880097506]}},{"type":"Feature","properties":{"id":25670,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.609403328369066,44.796153528874584]}},{"type":"Feature","properties":{"id":16229,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6103927881971604,44.80848330192842]}},{"type":"Feature","properties":{"id":16432,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6318455929708662,44.81126325695497]}},{"type":"Feature","properties":{"id":16439,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6096602097524809,44.80926099606958]}},{"type":"Feature","properties":{"id":22793,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6091806218940967,44.80948763867637]}},{"type":"Feature","properties":{"id":23169,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5913453901569167,44.81046886122681]}},{"type":"Feature","properties":{"id":16490,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6221211395213243,44.801523791125014]}},{"type":"Feature","properties":{"id":16005,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6285498687749147,44.80061567178153]}},{"type":"Feature","properties":{"id":19798,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5807791026423318,44.8020140742784]}},{"type":"Feature","properties":{"id":19611,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5809830269145462,44.80141257539398]}},{"type":"Feature","properties":{"id":19799,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5811691452983703,44.80095630755851]}},{"type":"Feature","properties":{"id":58724,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5859312438765092,44.80662709269295]}},{"type":"Feature","properties":{"id":17231,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6339034211751292,44.802374701785695]}},{"type":"Feature","properties":{"id":17161,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6312700013020841,44.80121295081171]}},{"type":"Feature","properties":{"id":17297,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.631872080810827,44.80354356705513]}},{"type":"Feature","properties":{"id":17303,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.633645900316175,44.804753042016685]}},{"type":"Feature","properties":{"id":16261,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6175045797927119,44.81063130724919]}},{"type":"Feature","properties":{"id":16294,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6157785186711434,44.80542352907227]}},{"type":"Feature","properties":{"id":17007,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6124529785310876,44.80122124830705]}},{"type":"Feature","properties":{"id":17288,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6237854723855056,44.80244520763538]}},{"type":"Feature","properties":{"id":17289,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.605885215623023,44.800376062741314]}},{"type":"Feature","properties":{"id":16509,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.615239654429878,44.802825724109816]}},{"type":"Feature","properties":{"id":16538,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6230681813424483,44.8102911840886]}},{"type":"Feature","properties":{"id":22795,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6090463583577566,44.80907535584115]}},{"type":"Feature","properties":{"id":19992,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5867477686237127,44.800852667230565]}},{"type":"Feature","properties":{"id":20127,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5825727753321275,44.79448928213151]}},{"type":"Feature","properties":{"id":30970,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6254496151827686,44.810692299541095]}},{"type":"Feature","properties":{"id":30971,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6254341233497007,44.81093691986639]}},{"type":"Feature","properties":{"id":15932,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.630562884029604,44.795967954910736]}},{"type":"Feature","properties":{"id":26549,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6310904512217805,44.79410961270501]}},{"type":"Feature","properties":{"id":23693,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6311241504282005,44.7940018771171]}},{"type":"Feature","properties":{"id":22371,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5890468881739451,44.804019571503474]}},{"type":"Feature","properties":{"id":20315,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5881797231688719,44.80891198002606]}},{"type":"Feature","properties":{"id":16015,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6108716764102907,44.79524851413376]}},{"type":"Feature","properties":{"id":32755,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6311606805048848,44.804346679159686]}},{"type":"Feature","properties":{"id":20041,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5889610944976797,44.80472886989087]}},{"type":"Feature","properties":{"id":20218,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5828373192713951,44.7965436374562]}},{"type":"Feature","properties":{"id":20220,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5821407023838101,44.80162375322326]}},{"type":"Feature","properties":{"id":23216,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6075668450194411,44.79821632599034]}},{"type":"Feature","properties":{"id":20356,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6074446916455576,44.798409464890945]}},{"type":"Feature","properties":{"id":59308,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5851729305762308,44.80191907417385]}},{"type":"Feature","properties":{"id":19763,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5853168094815572,44.808167198079275]}},{"type":"Feature","properties":{"id":31649,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6190857935197557,44.79605101324716]}},{"type":"Feature","properties":{"id":22956,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5998836905566615,44.80354620340311]}},{"type":"Feature","properties":{"id":20108,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5840087065161284,44.81364925808745]}},{"type":"Feature","properties":{"id":19732,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5919607284167003,44.81025674671239]}},{"type":"Feature","properties":{"id":19616,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6347527507738805,44.79694503264647]}},{"type":"Feature","properties":{"id":20035,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5992047248805338,44.802551201774975]}},{"type":"Feature","properties":{"id":20008,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5887778931031118,44.79492023813073]}},{"type":"Feature","properties":{"id":27340,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6192003451272676,44.805816641880824]}},{"type":"Feature","properties":{"id":27341,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6190762675168572,44.805843741373984]}},{"type":"Feature","properties":{"id":15960,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6128294430135697,44.797650377098066]}},{"type":"Feature","properties":{"id":27582,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6229018336977635,44.79433016103196]}},{"type":"Feature","properties":{"id":16545,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6318755916354046,44.80876490225784]}},{"type":"Feature","properties":{"id":16430,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6300172199596933,44.80892484828186]}},{"type":"Feature","properties":{"id":19855,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5845034664131551,44.7992165556342]}},{"type":"Feature","properties":{"id":19915,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5818780991626679,44.8088520567097]}},{"type":"Feature","properties":{"id":16507,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6171720137256175,44.800471934783396]}},{"type":"Feature","properties":{"id":35880,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.584790537238073,44.79517337702367]}},{"type":"Feature","properties":{"id":25407,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6005624050351719,44.804188356648226]}},{"type":"Feature","properties":{"id":19573,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5916468256867602,44.79864509009591]}},{"type":"Feature","properties":{"id":20268,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5879957097363121,44.802660342236095]}},{"type":"Feature","properties":{"id":16884,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6306234818854873,44.80621829611289]}},{"type":"Feature","properties":{"id":23431,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5873434046687883,44.79796261261956]}},{"type":"Feature","properties":{"id":16889,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6192339446481433,44.804759615665944]}},{"type":"Feature","properties":{"id":34733,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6306521263403831,44.80514015827631]}},{"type":"Feature","properties":{"id":19585,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5847781845475827,44.795721463465725]}},{"type":"Feature","properties":{"id":27895,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6306107064487226,44.810333015277955]}},{"type":"Feature","properties":{"id":23489,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6310324710411841,44.80977418478704]}},{"type":"Feature","properties":{"id":17793,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6117017660984965,44.80572268210356]}},{"type":"Feature","properties":{"id":17118,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6075898372026082,44.809273619724856]}},{"type":"Feature","properties":{"id":15882,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6214063507691692,44.793851257111]}},{"type":"Feature","properties":{"id":25409,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6313066635366836,44.801680487252156]}},{"type":"Feature","properties":{"id":17162,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6330550263178062,44.80018825982236]}},{"type":"Feature","properties":{"id":16253,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6267055904211111,44.801112215789686]}},{"type":"Feature","properties":{"id":23492,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6287238129443788,44.80891305861358]}},{"type":"Feature","properties":{"id":26058,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6282294451853828,44.79213080313704]}},{"type":"Feature","properties":{"id":30029,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6083205954746773,44.798666159103746]}},{"type":"Feature","properties":{"id":17126,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6324882849617394,44.79416964742149]}},{"type":"Feature","properties":{"id":16135,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6333199899073376,44.79415767051185]}},{"type":"Feature","properties":{"id":20197,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5874394502332281,44.81301107708922]}},{"type":"Feature","properties":{"id":20195,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5963748769008166,44.80593403532045]}},{"type":"Feature","properties":{"id":29241,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5918630512275317,44.806781595907665]}},{"type":"Feature","properties":{"id":19599,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5861563400219824,44.80864203725283]}},{"type":"Feature","properties":{"id":20416,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.585083395922537,44.812322723297065]}},{"type":"Feature","properties":{"id":17403,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6303931736083461,44.79455265789623]}},{"type":"Feature","properties":{"id":17751,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6057238322161185,44.8049954861119]}},{"type":"Feature","properties":{"id":22368,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5895402813859256,44.80334766444167]}},{"type":"Feature","properties":{"id":20040,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5898878302914718,44.80493116959223]}},{"type":"Feature","properties":{"id":20367,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5845266756419456,44.81081239400367]}},{"type":"Feature","properties":{"id":19866,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5821560683356397,44.80205430950675]}},{"type":"Feature","properties":{"id":27478,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6190323834630272,44.80003539102069]}},{"type":"Feature","properties":{"id":27664,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6308029509226473,44.79340748890225]}},{"type":"Feature","properties":{"id":27665,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6306669053178622,44.79197228945535]}},{"type":"Feature","properties":{"id":20181,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5878866023049307,44.80723804824538]}},{"type":"Feature","properties":{"id":38852,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5922567476898352,44.805410420472995]}},{"type":"Feature","properties":{"id":42109,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5908768346438454,44.805135111541]}},{"type":"Feature","properties":{"id":19614,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5975106500427024,44.81243610629011]}},{"type":"Feature","properties":{"id":19797,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5806009916716915,44.80272159659935]}},{"type":"Feature","properties":{"id":23479,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.596962525832824,44.7942880795142]}},{"type":"Feature","properties":{"id":16938,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6220677986690202,44.813720449606464]}},{"type":"Feature","properties":{"id":16134,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.633202368626908,44.794832825789584]}},{"type":"Feature","properties":{"id":20230,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.581399142937162,44.799271566811626]}},{"type":"Feature","properties":{"id":20134,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5795537033330288,44.79665100351513]}},{"type":"Feature","properties":{"id":30033,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5919798225307895,44.81388536468162]}},{"type":"Feature","properties":{"id":19649,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5794287913091821,44.80658262885887]}},{"type":"Feature","properties":{"id":19809,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5840053833237241,44.80295370653722]}},{"type":"Feature","properties":{"id":19684,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5821933875355502,44.81311505203595]}},{"type":"Feature","properties":{"id":19722,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5821412127605833,44.8124160415655]}},{"type":"Feature","properties":{"id":22876,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5981996355267528,44.79928031462285]}},{"type":"Feature","properties":{"id":30058,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5893594529373799,44.81248406737403]}},{"type":"Feature","properties":{"id":16589,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6332361872648015,44.80662438438843]}},{"type":"Feature","properties":{"id":16517,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6058526999066345,44.807680729014336]}},{"type":"Feature","properties":{"id":23323,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5983600071891754,44.808352657301484]}},{"type":"Feature","properties":{"id":23291,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.598175104191677,44.80825698384061]}},{"type":"Feature","properties":{"id":16723,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6271397607279103,44.79464557544812]}},{"type":"Feature","properties":{"id":19528,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.626651901013641,44.79515209207201]}},{"type":"Feature","properties":{"id":30143,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6324821773750492,44.79407471367852]}},{"type":"Feature","properties":{"id":16727,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6324424028235368,44.79358998032634]}},{"type":"Feature","properties":{"id":19762,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5840965601187471,44.796381356983915]}},{"type":"Feature","properties":{"id":19771,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5880899537441516,44.79708175177864]}},{"type":"Feature","properties":{"id":17395,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6196479004013254,44.80571168586368]}},{"type":"Feature","properties":{"id":17139,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6154697640153065,44.813301834604765]}},{"type":"Feature","properties":{"id":16712,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.633397283165561,44.805887755899924]}},{"type":"Feature","properties":{"id":16529,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6131457210272049,44.80282019760035]}},{"type":"Feature","properties":{"id":19862,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.581742359284271,44.803038507850836]}},{"type":"Feature","properties":{"id":16602,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6343271677684411,44.80376746507475]}},{"type":"Feature","properties":{"id":16336,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6186552030828344,44.813407648599856]}},{"type":"Feature","properties":{"id":20445,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.584230838390085,44.79425543008137]}},{"type":"Feature","properties":{"id":53587,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6002766793537899,44.806733069436376]}},{"type":"Feature","properties":{"id":53588,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6002329645957412,44.806650251454165]}},{"type":"Feature","properties":{"id":20135,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5799400704288935,44.796031422002244]}},{"type":"Feature","properties":{"id":16870,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6255499929281934,44.81358177457588]}},{"type":"Feature","properties":{"id":17210,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6081092980994777,44.79606018908337]}},{"type":"Feature","properties":{"id":15975,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6063096567689085,44.795842520704404]}},{"type":"Feature","properties":{"id":24401,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6191155935746175,44.80774793270232]}},{"type":"Feature","properties":{"id":28444,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6184440781769963,44.80100764276105]}},{"type":"Feature","properties":{"id":57261,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6276774713309989,44.806494623383934]}},{"type":"Feature","properties":{"id":19796,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5804100776007701,44.8032597179412]}},{"type":"Feature","properties":{"id":19812,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5861240457568794,44.80682526250225]}},{"type":"Feature","properties":{"id":15808,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6290203614854815,44.80660240666163]}},{"type":"Feature","properties":{"id":17388,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6346531266442413,44.81261582828942]}},{"type":"Feature","properties":{"id":17371,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6314036276194981,44.793369300565004]}},{"type":"Feature","properties":{"id":15880,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6232763658724012,44.79333649635493]}},{"type":"Feature","properties":{"id":16726,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6324854611337549,44.794114786306004]}},{"type":"Feature","properties":{"id":17643,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6066713039284501,44.79693366533655]}},{"type":"Feature","properties":{"id":20524,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5836897762684092,44.794335179095135]}},{"type":"Feature","properties":{"id":27615,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5974342271774864,44.806883431617564]}},{"type":"Feature","properties":{"id":19648,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5798826958981265,44.80791136727445]}},{"type":"Feature","properties":{"id":19838,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5974384797343806,44.80592283083548]}},{"type":"Feature","properties":{"id":17127,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6312288707516215,44.79381052774058]}},{"type":"Feature","properties":{"id":23684,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6335081160316466,44.79105006073519]}},{"type":"Feature","properties":{"id":17128,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6310763088773275,44.79393728305864]}},{"type":"Feature","properties":{"id":20455,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5822066482409058,44.80246105612574]}},{"type":"Feature","properties":{"id":20054,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5972166531379761,44.811713936264894]}},{"type":"Feature","properties":{"id":20049,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5869103158812776,44.814306111755855]}},{"type":"Feature","properties":{"id":16713,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6331285166762349,44.80531962325583]}},{"type":"Feature","properties":{"id":15873,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6232295293179418,44.79352932641312]}},{"type":"Feature","properties":{"id":15976,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6062165705893053,44.79614436735729]}},{"type":"Feature","properties":{"id":16572,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6069750399804364,44.7964194781173]}},{"type":"Feature","properties":{"id":19859,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5800742667089831,44.79882215617057]}},{"type":"Feature","properties":{"id":35397,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6319839823463206,44.80700867766565]}},{"type":"Feature","properties":{"id":20193,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5809830832725752,44.812082901277265]}},{"type":"Feature","properties":{"id":20194,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5809781861309301,44.81040916286215]}},{"type":"Feature","properties":{"id":59024,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5917228175241306,44.80668043065457]}},{"type":"Feature","properties":{"id":54608,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6243411479644546,44.807293675486406]}},{"type":"Feature","properties":{"id":16254,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6256255858329896,44.804118601845786]}},{"type":"Feature","properties":{"id":31678,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6319981444093928,44.810183684844965]}},{"type":"Feature","properties":{"id":31677,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.632822504502535,44.809975210079436]}},{"type":"Feature","properties":{"id":16019,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6184989583193068,44.81034843710847]}},{"type":"Feature","properties":{"id":19846,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6158251967616085,44.81114439730288]}},{"type":"Feature","properties":{"id":15931,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6327736574192151,44.79601022880757]}},{"type":"Feature","properties":{"id":17251,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.610887609474551,44.81260077766566]}},{"type":"Feature","properties":{"id":57281,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6256309069148038,44.80426916582181]}},{"type":"Feature","properties":{"id":26547,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6319064118916216,44.794038513165184]}},{"type":"Feature","properties":{"id":20521,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6018719681467807,44.80508861502246]}},{"type":"Feature","properties":{"id":20543,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5920974094795683,44.81304091711586]}},{"type":"Feature","properties":{"id":17122,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6302978682609254,44.79412203599371]}},{"type":"Feature","properties":{"id":20452,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5822225659064574,44.802790523505124]}},{"type":"Feature","properties":{"id":20443,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5853964467092139,44.7956602647751]}},{"type":"Feature","properties":{"id":17735,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6318210605368292,44.810014305949]}},{"type":"Feature","properties":{"id":25664,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.59683847161794,44.79421390194165]}},{"type":"Feature","properties":{"id":24402,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6193821098394551,44.807139587390644]}},{"type":"Feature","properties":{"id":19581,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5836461685000797,44.794846686020186]}},{"type":"Feature","properties":{"id":20099,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5883677434567133,44.811338707097136]}},{"type":"Feature","properties":{"id":59023,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5918490500224921,44.80672087229625]}},{"type":"Feature","properties":{"id":33320,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6309221672473588,44.79752646843733]}},{"type":"Feature","properties":{"id":33319,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6320032309721466,44.79746330061289]}},{"type":"Feature","properties":{"id":24281,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6225458868614242,44.796423242951676]}},{"type":"Feature","properties":{"id":25024,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.6257186658929844,44.80445471683499]}},{"type":"Feature","properties":{"id":59311,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5852927989512563,44.80214642503167]}},{"type":"Feature","properties":{"id":19690,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5842133684977429,44.80200895198547]}},{"type":"Feature","properties":{"id":59321,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5907270103192183,44.804079438664374]}},{"type":"Feature","properties":{"id":59328,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5901538950581474,44.80396110844472]}},{"type":"Feature","properties":{"id":59325,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.590060846646444,44.80425782228568]}},{"type":"Feature","properties":{"id":59312,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5845809853481179,44.80199815396006]}},{"type":"Feature","properties":{"id":59326,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.590171096602116,44.80381403797354]}},{"type":"Feature","properties":{"id":59327,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5899055471763629,44.80376250960788]}},{"type":"Feature","properties":{"id":59324,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5899712909915953,44.80347098858278]}},{"type":"Feature","properties":{"id":59323,"name":"Unknown","marker-color":"#5a5a5a","marker-size":"small"},"geometry":{"type":"Point","coordinates":[-0.5897418357629141,44.80415781513457]}},{"type":"Feature","properties":{"id":"as=129212","name":"Berteaux","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5878775393091816,44.81047320487493]}},{"type":"Feature","properties":{"id":"as=129213","name":"Berteaux","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5880181543569623,44.810460287421996]}},{"type":"Feature","properties":{"id":"as=129242","name":"A. Paré","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5860853898792252,44.808634154471086]}},{"type":"Feature","properties":{"id":"as=129224","name":"Cardinal","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.626032587655328,44.80521828645975]}},{"type":"Feature","properties":{"id":"as=129186","name":"Peixotto","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5936575716898786,44.80631475967341]}},{"type":"Feature","properties":{"id":"as=128764","name":"INRIA","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6002824056991044,44.80875498884317]}},{"type":"Feature","properties":{"id":"as=128738","name":"Les Harmonies","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5848766551679482,44.81088340802062]}},{"type":"Feature","properties":{"id":"as=126002","name":"Facultés Droit et Lettres","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6194440544979725,44.798863817364484]}},{"type":"Feature","properties":{"id":"as=126003","name":"Clinique Mutualiste","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6100281494112885,44.805710327171916]}},{"type":"Feature","properties":{"id":"as=126047","name":"Village 1","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6035977134475037,44.807921114835146]}},{"type":"Feature","properties":{"id":"as=126024","name":"Bénédigues","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5836878231762777,44.79916011024313]}},{"type":"Feature","properties":{"id":"as=126001","name":"Clinique Mutualiste","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6102919756124691,44.80512001392482]}},{"type":"Feature","properties":{"id":"as=128588","name":"Peydavant","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5851741241733962,44.80158764319367]}},{"type":"Feature","properties":{"id":"as=128589","name":"Peydavant","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5854061515207823,44.8019969743337]}},{"type":"Feature","properties":{"id":"as=128590","name":"Résidence Crespy","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5864736482133087,44.80588680315619]}},{"type":"Feature","properties":{"id":"as=128591","name":"Résidence Crespy","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5865689008012638,44.80581277243472]}},{"type":"Feature","properties":{"id":"as=124591","name":"Rond-Point","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6167260840569179,44.80520343908164]}},{"type":"Feature","properties":{"id":"as=124566","name":"Chemin de Suzon","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5823728634221069,44.811295159599865]}},{"type":"Feature","properties":{"id":"as=124587","name":"La Paillère","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6046553414757291,44.795582789032636]}},{"type":"Feature","properties":{"id":"as=124551","name":"Franklin","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5873847952942227,44.79908733010081]}},{"type":"Feature","properties":{"id":"as=124854","name":"Collège Gérard Philipe","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6242505867429745,44.7998889472887]}},{"type":"Feature","properties":{"id":"as=124715","name":"Mozart","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6161061910203061,44.812180504220024]}},{"type":"Feature","properties":{"id":"as=124799","name":"Curie","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6296508692524806,44.80679627089548]}},{"type":"Feature","properties":{"id":"as=124808","name":"Montaigne - Montesquieu","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6142608325506955,44.79636128142778]}},{"type":"Feature","properties":{"id":"as=124811","name":"CREPS","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5985415793187204,44.79895998147994]}},{"type":"Feature","properties":{"id":"as=124743","name":"Le Poujeau","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6287495026144481,44.80890503235491]}},{"type":"Feature","properties":{"id":"as=124815","name":"Le Chiquet","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6198124150619269,44.80396081435652]}},{"type":"Feature","properties":{"id":"as=124624","name":"Rond-Point","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6155903790794491,44.80546780660766]}},{"type":"Feature","properties":{"id":"as=124756","name":"Peixotto","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.59177833957402,44.80660004681237]}},{"type":"Feature","properties":{"id":"as=124830","name":"Ecole de Management","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6026178012516087,44.79654680953026]}},{"type":"Feature","properties":{"id":"as=125061","name":"Ecole de Management","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6024211081568865,44.796556538702916]}},{"type":"Feature","properties":{"id":"as=124883","name":"CREPS","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5986810940580379,44.79900107428764]}},{"type":"Feature","properties":{"id":"as=125356","name":"Jaubert","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6263950892679818,44.807761871107175]}},{"type":"Feature","properties":{"id":"as=125432","name":"Lyautey","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6314036276194981,44.793369300565004]}},{"type":"Feature","properties":{"id":"as=125296","name":"Bardanac","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6091022239964791,44.79611317928631]}},{"type":"Feature","properties":{"id":"as=125302","name":"Desbats","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.618345051263509,44.803812475306586]}},{"type":"Feature","properties":{"id":"as=125236","name":"Collège Victor Louis","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5908153296507723,44.79921382067324]}},{"type":"Feature","properties":{"id":"as=125304","name":"Montherlant","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5814783761385266,44.79643501556176]}},{"type":"Feature","properties":{"id":"as=125253","name":"Cardinal","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6256572364531846,44.80357776485027]}},{"type":"Feature","properties":{"id":"as=125389","name":"Mozart","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6167864017679299,44.81196240066467]}},{"type":"Feature","properties":{"id":"as=125323","name":"Bardanac","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6098558033544615,44.79649787728235]}},{"type":"Feature","properties":{"id":"as=125263","name":"Le Poujeau","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6290822743254396,44.809092819047784]}},{"type":"Feature","properties":{"id":"as=125337","name":"Sarget","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.60836880541367,44.808585631956106]}},{"type":"Feature","properties":{"id":"as=125538","name":"Lycée Kastler","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5966519084589246,44.80082806120818]}},{"type":"Feature","properties":{"id":"as=125539","name":"Lycée Victor Louis","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5932533999645394,44.80294156638243]}},{"type":"Feature","properties":{"id":"as=125540","name":"Talence Centre-Forum","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5912955110226233,44.81083616858027]}},{"type":"Feature","properties":{"id":"as=125550","name":"Lycée Kastler","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5979988960069387,44.80186392163605]}},{"type":"Feature","properties":{"id":"as=125623","name":"Village 2","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6129673496982034,44.80292981987449]}},{"type":"Feature","properties":{"id":"as=125624","name":"Ausone","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6167556010158722,44.80183102215729]}},{"type":"Feature","properties":{"id":"as=125560","name":"Avenue de l'Université","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5946487832190162,44.80128760236258]}},{"type":"Feature","properties":{"id":"as=125501","name":"Colonel Jacqui","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.633654882118616,44.811401236942395]}},{"type":"Feature","properties":{"id":"as=125502","name":"Nancel Pénard","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.632822504502535,44.809975210079436]}},{"type":"Feature","properties":{"id":"as=125661","name":"Ausone","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6171282843380691,44.800555391475335]}},{"type":"Feature","properties":{"id":"as=125525","name":"Lycée Victor Louis","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5933419432009441,44.80290609458723]}},{"type":"Feature","properties":{"id":"as=126826","name":"Unitec","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6213139958518566,44.7967215579503]}},{"type":"Feature","properties":{"id":"as=126957","name":"Pessac Centre","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6326781083125196,44.80469621477551]}},{"type":"Feature","properties":{"id":"as=126835","name":"Saige","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6292324178976736,44.79411329562805]}},{"type":"Feature","properties":{"id":"as=126798","name":"Peixotto","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5919754450763087,44.806776336560645]}},{"type":"Feature","properties":{"id":"as=126843","name":"Peixotto","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5915018630781435,44.80803675315485]}},{"type":"Feature","properties":{"id":"as=126949","name":"Pessac Centre (Trendel)","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6328797824686113,44.80591535507432]}},{"type":"Feature","properties":{"id":"as=126955","name":"Pessac Centre","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6325905772401907,44.804402042115]}},{"type":"Feature","properties":{"id":"as=126956","name":"Pessac Centre","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6315426422940877,44.80483886296448]}},{"type":"Feature","properties":{"id":"as=126725","name":"Collège Victor Louis","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.591749738721691,44.79856265778556]}},{"type":"Feature","properties":{"id":"as=126726","name":"Collège Victor Louis","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5925596857402758,44.79896524744904]}},{"type":"Feature","properties":{"id":"as=126727","name":"Lycée Hôtelier","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5924099536308922,44.79522431798344]}},{"type":"Feature","properties":{"id":"as=126612","name":"Pelletan","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6005709443936075,44.81246494703294]}},{"type":"Feature","properties":{"id":"as=126637","name":"Arts & Métiers","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6003524924280303,44.805815314116046]}},{"type":"Feature","properties":{"id":"as=126638","name":"Arts & Métiers","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6006119587252647,44.8046312546883]}},{"type":"Feature","properties":{"id":"as=126275","name":"Bénédigues","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.583594741220704,44.799262579054854]}},{"type":"Feature","properties":{"id":"as=126198","name":"Pessac Centre","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.630666524961471,44.80621107320266]}},{"type":"Feature","properties":{"id":"as=126199","name":"Avenue Jean Jaurès","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6244699455687088,44.80859043076008]}},{"type":"Feature","properties":{"id":"as=126200","name":"Les Echoppes","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6205187955250818,44.8108745794685]}},{"type":"Feature","properties":{"id":"as=126201","name":"Parc Haut Brion","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6131319346018702,44.81312550824983]}},{"type":"Feature","properties":{"id":"as=126208","name":"Fanning Lafontaine","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6137095978648442,44.80830933152997]}},{"type":"Feature","properties":{"id":"as=126209","name":"Corneille","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.622785430389558,44.80418577153616]}},{"type":"Feature","properties":{"id":"as=126237","name":"Phénix Haut Brion","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6159032985453854,44.80810233191559]}},{"type":"Feature","properties":{"id":"as=126238","name":"Fanning Lafontaine","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.613684708854579,44.808179422634716]}},{"type":"Feature","properties":{"id":"as=126161","name":"Cimetière","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6252858666250618,44.810838008755574]}},{"type":"Feature","properties":{"id":"as=126249","name":"Pessac Gare","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6314561092610305,44.80373152224987]}},{"type":"Feature","properties":{"id":"as=126172","name":"Avenue Jean Jaurès","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6233231538386813,44.8102328589191]}},{"type":"Feature","properties":{"id":"as=126174","name":"Pessac Centre","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.631467218957927,44.806079206126995]}},{"type":"Feature","properties":{"id":"as=129160","name":"STAPS","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6154316421681246,44.79378271545963]}},{"type":"Feature","properties":{"id":"as=129078","name":"Mairie de Talence","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5873770289998756,44.808771890909945]}},{"type":"Feature","properties":{"id":"as=129005","name":"Talence Centre-Forum","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5913689948605365,44.81288077969289]}},{"type":"Feature","properties":{"id":"as=129006","name":"Centre M. Pagnol","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5861690395503226,44.81189917006904]}},{"type":"Feature","properties":{"id":"as=129010","name":"Médiathèque","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5891428865667643,44.80706941649979]}},{"type":"Feature","properties":{"id":"as=125781","name":"Les Echoppes","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6207934155278639,44.8108114736739]}},{"type":"Feature","properties":{"id":"as=128440","name":"La Paillère","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6053275826400447,44.7956882415242]}},{"type":"Feature","properties":{"id":"as=128441","name":"Dourout","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5829533291412462,44.808775800980634]}},{"type":"Feature","properties":{"id":"as=128481","name":"Candau","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6093492987111485,44.80940792618887]}},{"type":"Feature","properties":{"id":"as=126515","name":"Facultés Droit et Lettres","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6197420186573377,44.79791674542534]}},{"type":"Feature","properties":{"id":"as=126520","name":"Nancel Pénard","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6326941613131767,44.808703809879916]}},{"type":"Feature","properties":{"id":"as=126353","name":"Enseirb","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6077533522424334,44.80609157500647]}},{"type":"Feature","properties":{"id":"as=126415","name":"Lafitte","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5849099847830717,44.799275276226325]}},{"type":"Feature","properties":{"id":"as=126423","name":"Résidence Coppélia","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5826322515009865,44.80474190899295]}},{"type":"Feature","properties":{"id":"as=126494","name":"Chemin de Suzon","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5822675146941628,44.81178114683718]}},{"type":"Feature","properties":{"id":"as=2847","name":"Doyen Brus","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6095170708821552,44.80091872951914]}},{"type":"Feature","properties":{"id":"as=2791","name":"Garage Unitec","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6225458868614242,44.796423242951676]}},{"type":"Feature","properties":{"id":"as=2793","name":"Garage Pessac","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6317753874490736,44.80474530328229]}},{"type":"Feature","properties":{"id":"as=2848","name":"Saige","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6278562848933282,44.79403090537901]}},{"type":"Feature","properties":{"id":"as=2846","name":"Béthanie","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5982942181184648,44.80592826231086]}},{"type":"Feature","properties":{"id":"as=128118","name":"Montaigne-Montesquieu","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6171929150616469,44.79703612275271]}},{"type":"Feature","properties":{"id":"as=127941","name":"Doyen Brus","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6096747182570297,44.80062564089148]}},{"type":"Feature","properties":{"id":"as=127943","name":"Francois Bordes","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6068476869041276,44.80355291536525]}},{"type":"Feature","properties":{"id":"as=127945","name":"Arts & Metiers","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6022917175528385,44.80588894695939]}},{"type":"Feature","properties":{"id":"as=127946","name":"Arts & Metiers","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6023964071705596,44.806109036414746]}},{"type":"Feature","properties":{"id":"as=127951","name":"Talence Centre-Forum","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5902987171722328,44.811890740754194]}},{"type":"Feature","properties":{"id":"as=4653","name":"Professeur Arnozan","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5887617020151555,44.80746699421062]}},{"type":"Feature","properties":{"id":"as=3903","name":"Deux Ponts","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6237185655562585,44.80218948838196]}},{"type":"Feature","properties":{"id":"as=3996","name":"Brivazac","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6167453060802395,44.80336708893274]}},{"type":"Feature","properties":{"id":"as=3835","name":"Pessac Gare","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.631872080810827,44.80354356705513]}},{"type":"Feature","properties":{"id":"as=3800","name":"Collège Gérard Philipe","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.623721398906139,44.80020115921167]}},{"type":"Feature","properties":{"id":"as=3979","name":"Les Echoppes","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6149722993800102,44.80301952321189]}},{"type":"Feature","properties":{"id":"as=4624","name":"Dourout","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5826167316320662,44.80836364546584]}},{"type":"Feature","properties":{"id":"as=3829","name":"Village 1","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6031165359859968,44.80796273513895]}},{"type":"Feature","properties":{"id":"as=4633","name":"Unitec","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6206846693570309,44.79717406062051]}},{"type":"Feature","properties":{"id":"as=4702","name":"Unitec","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6207581543563427,44.79717472074531]}},{"type":"Feature","properties":{"id":"as=3825","name":"Lycée Victor Louis","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.590157115142759,44.803076982358874]}},{"type":"Feature","properties":{"id":"as=1608","name":"Peixotto","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5921660507144769,44.80581282433813]}},{"type":"Feature","properties":{"id":"as=3811","name":"Rond-Point Crespy","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5862094348735556,44.806745356618016]}},{"type":"Feature","properties":{"id":"as=4025","name":"Rond-Point Crespy","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5875561706922359,44.8071642442764]}},{"type":"Feature","properties":{"id":"as=4723","name":"Phénix Haut Brion","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6182176013896765,44.80773911700815]}},{"type":"Feature","properties":{"id":"as=3961","name":"Cardinal","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6265227405338982,44.80412582527825]}},{"type":"Feature","properties":{"id":"as=3946","name":"Talence Place Wilson","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5911143430914114,44.79851592268685]}},{"type":"Feature","properties":{"id":"as=3852","name":"Forum","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5912749521066185,44.8099454334626]}},{"type":"Feature","properties":{"id":"as=4740","name":"Centre M. Pagnol","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5861746180764528,44.812040638802586]}},{"type":"Feature","properties":{"id":"as=2141","name":"Cardinal","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6252798683845749,44.80426933817362]}},{"type":"Feature","properties":{"id":"as=4007","name":"Chiquet Brion","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6189762294657988,44.80774515046019]}},{"type":"Feature","properties":{"id":"as=3949","name":"Lamartine","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.623954917132629,44.8065586919272]}},{"type":"Feature","properties":{"id":"as=4745","name":"Cardinal","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.6277485516591668,44.80400827027071]}},{"type":"Feature","properties":{"id":"as=4667","name":"Arts & Métiers","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.5999223500980054,44.80356146486022]}},{"type":"Feature","properties":{"id":"as=130301","name":"Forum (cours Gambetta)","marker-color":"#ff0000","marker-size":"medium"},"geometry":{"type":"Point","coordinates":[-0.59069381739304,44.81289461693631]}}]} \ No newline at end of file From 697dd3d9fed9337d3a34c7640086ad174401f445 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Sat, 25 Feb 2023 20:28:16 +0100 Subject: [PATCH 066/251] =?UTF-8?q?=F0=9F=92=A9=20Generic=20removed?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/test.ts b/src/test/test.ts index 9effd5ac..0fa606aa 100644 --- a/src/test/test.ts +++ b/src/test/test.ts @@ -331,7 +331,7 @@ export async function run({ getFullPaths, computeGEOJSONs }: testOptions) { async function computePaths() { //paths> - const paths: Map, Awaited>>> = new Map(); + const paths: Map, Awaited>> = new Map(); const def = new Deferred(); @@ -345,7 +345,7 @@ export async function run({ getFullPaths, computeGEOJSONs }: testOptions) { for (const stopId of stops.keys()) { workerPool - .run>([approachedStopName(stopId), getFullPaths]) + .run([approachedStopName(stopId), getFullPaths]) .then((sourcePaths) => { paths.set(stopId, sourcePaths); if (paths.size === approachedStops.size) def.resolve(paths); From bb039f81c40b08e52d8da837dc0ca7e72b5e82c1 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Sat, 25 Feb 2023 22:51:22 +0100 Subject: [PATCH 067/251] =?UTF-8?q?=F0=9F=9A=A7=20Add=20options?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/test.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/test/test.ts b/src/test/test.ts index 0fa606aa..bca111be 100644 --- a/src/test/test.ts +++ b/src/test/test.ts @@ -9,8 +9,9 @@ import Point from "../utils/Point"; import Segment from "../utils/Segment"; export interface testOptions { - getFullPaths: boolean; - computeGEOJSONs: boolean; + getFullPaths?: boolean; + computeGEOJSONs?: boolean; + dijkstraOptions?: DijkstraOptions; } export type id = number; export type footGraphNodes = number | ReturnType; @@ -40,6 +41,7 @@ import { TemplateCoordinates } from "proj4"; import FootGraphModelInit, { dbFootGraphEdges, dbFootGraphNodes } from "./models/FootGraph.model"; import FootPathsModelInit, { dbFootPaths } from "./models/FootPaths.model"; import { KeyOfMap } from "../utils"; +import { DijkstraOptions } from "../FootPaths"; const sectionProjection = { coords: 1, distance: 1, rg_fv_graph_nd: 1, rg_fv_graph_na: 1, nom_voie: 1 }; export type dbSection = Pick; @@ -54,7 +56,7 @@ export type Section = Omit & SectionOverwri const stopProjection = { _id: 1, coords: 1, libelle: 1 }; export type Stop = Pick; -export async function run({ getFullPaths, computeGEOJSONs }: testOptions) { +export async function run({ getFullPaths = false, computeGEOJSONs = false, dijkstraOptions }: testOptions) { /** Data displaying. * Uses {@link proj4} with crs {@link https://epsg.io/2154}. */ @@ -339,6 +341,7 @@ export async function run({ getFullPaths, computeGEOJSONs }: testOptions) { adj: footGraph.adj, weights: footGraph.weights, stops: Array.from(stops.keys()), + options: dijkstraOptions, }); let rejected = false; From d125e282fcd926858238bdf1f0a7ea2c1db61d06 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Sat, 25 Feb 2023 23:07:37 +0100 Subject: [PATCH 068/251] =?UTF-8?q?=E2=9C=A8=20Use=20command-line=20argume?= =?UTF-8?q?nts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/index.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/test/index.ts b/src/test/index.ts index d8554c8a..9f4678e6 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -1,6 +1,13 @@ import { run } from "./test"; import { benchmark } from "./utils/benchmark"; -benchmark(run, [{ getFullPaths: false, computeGEOJSONs: false }], 5) +const args = process.argv.slice(2); +const getFullPaths = JSON.parse(args[0]); +const times = JSON.parse(args[1]); + +if (typeof getFullPaths !== "boolean") throw new Error(`Type of argument 1 "getFullPaths" invalid (got ${typeof getFullPaths})`); +if (typeof times !== "number") throw new Error(`Type of argument 2 "times" invalid (got ${typeof times})`); + +benchmark(run, [{ getFullPaths, computeGEOJSONs: false, dijkstraOptions: { maxCumulWeight: 5_000 } }], times) .then(console.log) .catch(console.error); From c9822623f2a7cb73eb72c089529df45799c56d2a Mon Sep 17 00:00:00 2001 From: Catatomik Date: Sat, 25 Feb 2023 23:47:07 +0100 Subject: [PATCH 069/251] =?UTF-8?q?=F0=9F=9A=A7=E2=9A=A1=20Remove=20data?= =?UTF-8?q?=20displaying?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/models/FootGraph.model.ts | 1 - src/test/test.ts | 177 +---------------------------- src/test/utils/ultils.ts | 49 -------- 3 files changed, 2 insertions(+), 225 deletions(-) diff --git a/src/test/models/FootGraph.model.ts b/src/test/models/FootGraph.model.ts index df52f190..553d537e 100644 --- a/src/test/models/FootGraph.model.ts +++ b/src/test/models/FootGraph.model.ts @@ -8,7 +8,6 @@ import { deleteModelWithClass, getDiscriminatorModelForClass, getModelForClass, - index, prop, Ref, } from "@typegoose/typegoose"; diff --git a/src/test/test.ts b/src/test/test.ts index bca111be..53f83f76 100644 --- a/src/test/test.ts +++ b/src/test/test.ts @@ -23,27 +23,13 @@ import sectionsModelInit, { dbSections } from "./models/sections.model"; import stopsModelInit, { dbTBM_Stops } from "./models/TBM_stops.model"; import { computePath, initialCallback } from "./computePath"; import { DocumentType } from "@typegoose/typegoose"; -import { - approachedStopName, - euclidianDistance, - computeGEOJSON, - Deferred, - GEOJSON, - sectionId, - toWGS, - unique, - dbIntersectionId, - dbSectionId, - unpackRefType, -} from "./utils/ultils"; -import { writeFile } from "fs/promises"; -import { TemplateCoordinates } from "proj4"; +import { approachedStopName, euclidianDistance, Deferred, sectionId, unique, dbIntersectionId, dbSectionId, unpackRefType } from "./utils/ultils"; import FootGraphModelInit, { dbFootGraphEdges, dbFootGraphNodes } from "./models/FootGraph.model"; import FootPathsModelInit, { dbFootPaths } from "./models/FootPaths.model"; import { KeyOfMap } from "../utils"; import { DijkstraOptions } from "../FootPaths"; -const sectionProjection = { coords: 1, distance: 1, rg_fv_graph_nd: 1, rg_fv_graph_na: 1, nom_voie: 1 }; +const sectionProjection = { coords: 1, distance: 1, rg_fv_graph_nd: 1, rg_fv_graph_na: 1 }; export type dbSection = Pick; type SectionOverwritten = { /** Will never be populated, so force to be RefType */ @@ -57,11 +43,6 @@ const stopProjection = { _id: 1, coords: 1, libelle: 1 }; export type Stop = Pick; export async function run({ getFullPaths = false, computeGEOJSONs = false, dijkstraOptions }: testOptions) { - /** Data displaying. - * Uses {@link proj4} with crs {@link https://epsg.io/2154}. - */ - const GEOJSONs: GEOJSON[] = []; - //Grab required data const db = await initDB(); @@ -173,31 +154,6 @@ export async function run({ getFullPaths = false, computeGEOJSONs = false, dijks if (!b2.lastReturn) throw `b2 return null`; const footGraph = b2.lastReturn; - if (computeGEOJSONs) - GEOJSONs.push( - computeGEOJSON( - // footGraph.nodes, - [], - footGraph.arcs, - () => [], - // (node) => - // toWGS(typeof node === "number" ? validIntersections.get(node)?.coords ?? [0, 0] : stops.get(parseInt(node.split("-")[0]))?.coords ?? [0, 0]), - (arc) => - sections.get(sectionId({ rg_fv_graph_nd: arc[0], rg_fv_graph_na: arc[1] }))?.coords.map((coords) => toWGS(coords)) ?? [ - [0, 0], - [0, 0], - ], - (node) => ({ - id: node, - "marker-color": "#5a5a5a", - "marker-size": "small", - }), - (arc) => ({ - nom: Array.from(sections.values()).find((s) => s.rg_fv_graph_nd === arc[0] && s.rg_fv_graph_na === arc[1])?.nom_voie || "Unknown", - }), - ), - ); - //Compute approached stops function computeApproachedStops() { //Pre-generate segments to fasten the process (and not redundant computing) @@ -275,7 +231,6 @@ export async function run({ getFullPaths = false, computeGEOJSONs = false, dijks const subsectionToApproachedStop: Section = { coords: [...section.coords.slice(0, n + 1), [closestPoint.x, closestPoint.y]], distance: toApproadchedStop, - nom_voie: section.nom_voie, rg_fv_graph_nd: section.rg_fv_graph_nd, rg_fv_graph_na: insertedNode, }; @@ -285,7 +240,6 @@ export async function run({ getFullPaths = false, computeGEOJSONs = false, dijks const subsectionFromApproachedStop: Section = { coords: [[closestPoint.x, closestPoint.y], ...section.coords.slice(n + 1)], distance: fromApproachedStop, - nom_voie: section.nom_voie, rg_fv_graph_nd: insertedNode, rg_fv_graph_na: section.rg_fv_graph_na, }; @@ -296,41 +250,6 @@ export async function run({ getFullPaths = false, computeGEOJSONs = false, dijks const b4 = await benchmark(refreshWithApproachedStops, []); console.log("b4 ended"); - if (computeGEOJSONs) - GEOJSONs.push( - computeGEOJSON( - footGraph.nodes, - footGraph.arcs, - // () => [], - (node) => { - let coords: [number, number] = [0, 0]; - if (typeof node === "number") coords = validIntersections.get(node)?.coords ?? [0, 0]; - else { - const approachedStopPoint = approachedStops.get(node as ReturnType)?.[0]; - if (approachedStopPoint) coords = [approachedStopPoint.x, approachedStopPoint.y]; - } - return toWGS(coords); - }, - (arc) => - getSection(arc[0], arc[1])?.coords.map((coords) => toWGS(coords)) ?? [ - [0, 0], - [0, 0], - ], - (node) => ({ - id: node, - name: stops.get(typeof node === "string" ? parseInt(node.split("=")[1]) : node)?.libelle ?? "Unknown", - "marker-color": typeof node === "string" ? "#ff0000" : "#5a5a5a", - "marker-size": typeof node === "string" ? "medium" : "small", - }), - (arc) => ({ - name: getSection(arc[0], arc[1])?.nom_voie || "Unknown", - distance: getSection(arc[0], arc[1])?.distance || "Unknown", - sectionId: sectionId({ rg_fv_graph_nd: arc[0], rg_fv_graph_na: arc[1] }), - stroke: typeof arc[0] === "string" || typeof arc[1] === "string" ? "#e60000" : "#5a5a5a", - }), - ), - ); - async function computePaths() { //paths> const paths: Map, Awaited>> = new Map(); @@ -367,98 +286,6 @@ export async function run({ getFullPaths = false, computeGEOJSONs = false, dijks if (!b5.lastReturn) throw `b5 return null`; const paths = b5.lastReturn; - // From "Les Harmonies" - if (computeGEOJSONs) - GEOJSONs.push( - computeGEOJSON( - footGraph.nodes, - Array.from(paths.get(128738)!).filter(([_, [path]]) => path.length), - (node) => { - let coords: [number, number] = [0, 0]; - if (typeof node === "number") coords = validIntersections.get(node)?.coords ?? [0, 0]; - else { - const approachedStopPoint = approachedStops.get(node as ReturnType)?.[0]; - if (approachedStopPoint) coords = [approachedStopPoint.x, approachedStopPoint.y]; - } - return toWGS(coords); - }, - ([_, [path]]) => - path.reduce( - (acc, v, i) => - i < path.length - 1 - ? [ - ...acc, - ...(( - sections.get(sectionId({ rg_fv_graph_nd: v, rg_fv_graph_na: path[i + 1] }))?.coords ?? - sections - .get(sectionId({ rg_fv_graph_nd: path[i + 1], rg_fv_graph_na: v })) - ?.coords // Make a copy & reverse to get coords in the right order, tricky - .slice() - .reverse() - )?.map((coords) => toWGS(coords)) ?? [ - [0, 0], - [0, 0], - ]), - ] - : acc, - [], - ), - (node) => ({ - id: node, - name: stops.get(typeof node === "string" ? parseInt(node.split("=")[1]) : node)?.libelle ?? "Unknown", - "marker-color": typeof node === "string" ? "#ff0000" : "#5a5a5a", - "marker-size": typeof node === "string" ? "medium" : "small", - }), - ([dest, [path, distance]]) => ({ - path: `${path[0]}-${dest}`, - distance, - stroke: "#8080ff", - }), - ), - ); - - //From "Les Harmonies" to "Peixotto" - const specificPath = paths.get(128738)!.get(126798)!; - if (computeGEOJSONs) - GEOJSONs.push( - computeGEOJSON( - footGraph.nodes, - specificPath[0].reduce<[node, node][]>((acc, node, i, path) => (i < path.length - 1 ? [...acc, [node, path[i + 1]]] : acc), []), - (node) => { - let coords: [number, number] = [0, 0]; - if (typeof node === "number") coords = validIntersections.get(node)?.coords ?? [0, 0]; - else { - const approachedStopPoint = approachedStops.get(node as ReturnType)?.[0]; - if (approachedStopPoint) coords = [approachedStopPoint.x, approachedStopPoint.y]; - } - return toWGS(coords); - }, - (path) => - path.reduce( - (acc, v, i) => - i === 0 - ? getSection(v, path[i + 1])?.coords.map((coords) => toWGS(coords)) ?? [ - [0, 0], - [0, 0], - ] - : acc, - [], - ), - (node) => ({ - id: node, - name: stops.get(typeof node === "string" ? parseInt(node.split("=")[1]) : node)?.libelle ?? "Unknown", - "marker-color": typeof node === "string" ? "#ff0000" : "#5a5a5a", - "marker-size": typeof node === "string" ? "medium" : "small", - }), - (path) => ({ - path: `${path[0]}-${path[path.length - 1]}`, - totalDistance: specificPath[1], - stroke: "#8080ff", - }), - ), - ); - if (computeGEOJSONs) for (let i = 0; i < GEOJSONs.length; i++) await writeFile(__dirname + `/../../out-${i}.geojson`, JSON.stringify(GEOJSONs[i])); - async function updateDb() { //Empty db await FootGraphModel.deleteMany({}); diff --git a/src/test/utils/ultils.ts b/src/test/utils/ultils.ts index f4eafe1a..f759acc2 100644 --- a/src/test/utils/ultils.ts +++ b/src/test/utils/ultils.ts @@ -1,6 +1,5 @@ import { Ref } from "@typegoose/typegoose"; import { RefType } from "@typegoose/typegoose/lib/types"; -import proj4, { TemplateCoordinates } from "proj4"; import { node } from "../../utils/Graph"; export type resolveCb = (value: T) => void; @@ -54,51 +53,3 @@ export function sectionId(v: T, i: number, arr: T[]): boolean { return arr.indexOf(v) === i; } - -export const toWGS = proj4( - "+proj=lcc +lat_0=46.5 +lon_0=3 +lat_1=49 +lat_2=44 +x_0=700000 +y_0=6600000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs +type=crs", - "+proj=longlat +datum=WGS84 +no_defs +type=crs", -).forward; - -export type cb = (arg: T) => R; -export function computeGEOJSON( - points: P[], - lines: L[], - pointCoords: cb, - lineCoords: cb, - pointProps: cb = () => ({}), - lineProps: cb = () => ({}), -) { - return { - type: "FeatureCollection" as const, - features: [ - ...points.map( - (point) => - ({ - type: "Feature", - properties: { - ...pointProps(point), - }, - geometry: { - type: "Point", - coordinates: pointCoords(point), - }, - } as const), - ), - ...lines.map( - (line) => - ({ - type: "Feature", - properties: { - ...lineProps(line), - }, - geometry: { - type: "LineString", - coordinates: lineCoords(line), - }, - } as const), - ), - ] as const, - }; -} -export type GEOJSON = ReturnType; From da1c7edc5d14e662db67cef6c6b2cde38e2c13dd Mon Sep 17 00:00:00 2001 From: Catatomik Date: Sat, 25 Feb 2023 23:54:56 +0100 Subject: [PATCH 070/251] =?UTF-8?q?=E2=9A=A1=F0=9F=92=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/test.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/test.ts b/src/test/test.ts index 53f83f76..7edbdc94 100644 --- a/src/test/test.ts +++ b/src/test/test.ts @@ -42,7 +42,7 @@ export type Section = Omit & SectionOverwri const stopProjection = { _id: 1, coords: 1, libelle: 1 }; export type Stop = Pick; -export async function run({ getFullPaths = false, computeGEOJSONs = false, dijkstraOptions }: testOptions) { +export async function run({ getFullPaths = false, dijkstraOptions }: testOptions) { //Grab required data const db = await initDB(); @@ -51,8 +51,8 @@ export async function run({ getFullPaths = false, computeGEOJSONs = false, dijks const [FootGraphModel, FootGraphNodesModel, FootGraphEdgesModel] = FootGraphModelInit(db); const FootPathModel = FootPathsModelInit(db); - const limitTop = new Point(44.813926, -0.581271).fromWGSToLambert93(); - const limitBot = new Point(44.793123, -0.632578).fromWGSToLambert93(); + // const limitTop = new Point(44.813926, -0.581271).fromWGSToLambert93(); + // const limitBot = new Point(44.793123, -0.632578).fromWGSToLambert93(); async function queryData() { //Important : sections are oriented => 2 entries per section From 9fc525c1dda8db67b5c71cab0303cfb7df666354 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Tue, 28 Feb 2023 15:25:53 +0100 Subject: [PATCH 071/251] =?UTF-8?q?=F0=9F=90=9B=20Fix=20duration=20display?= =?UTF-8?q?ing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/utils/benchmark.ts | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/test/utils/benchmark.ts b/src/test/utils/benchmark.ts index fdf1c387..c0adfcf6 100644 --- a/src/test/utils/benchmark.ts +++ b/src/test/utils/benchmark.ts @@ -51,12 +51,16 @@ export class Duration { this.time = ms; } + get rMs() { + return this.time % 1000; + } + get totalSeconds() { return Math.floor(this.time / 1000); } get rSeconds() { - return this.time % 1000; + return Math.floor(this.rMinuts / 1000); } get totalMinuts() { @@ -68,8 +72,8 @@ export class Duration { } toString() { - return `${Duration.getLeadingZeros(this.totalMinuts, 2)}${this.totalMinuts}:${Duration.getLeadingZeros(this.totalSeconds, 2)}${ - this.totalSeconds - }:${Duration.getLeadingZeros(Math.floor(this.rSeconds), 3)}${this.rSeconds}`; + return `${Duration.getLeadingZeros(this.totalMinuts, 2)}${this.totalMinuts}:${Duration.getLeadingZeros(this.rSeconds, 2)}${ + this.rSeconds + }:${Duration.getLeadingZeros(Math.floor(this.rMs), 3)}${this.rMs}`; } } From cb3ca7463173b0d5c43dd926aceeae4fdd4f6bba Mon Sep 17 00:00:00 2001 From: Catatomik Date: Tue, 28 Feb 2023 15:28:39 +0100 Subject: [PATCH 072/251] =?UTF-8?q?=F0=9F=9A=A7=20Debug=20worker?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/test.ts | 17 +++++++++++------ src/test/utils/Workers.ts | 18 +++++++----------- 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/src/test/test.ts b/src/test/test.ts index 7edbdc94..64f3bfad 100644 --- a/src/test/test.ts +++ b/src/test/test.ts @@ -256,12 +256,17 @@ export async function run({ getFullPaths = false, dijkstraOptions }: testOptions const def = new Deferred(); - const workerPool = new WorkerPool(__dirname + "/computePath.js", 8, { - adj: footGraph.adj, - weights: footGraph.weights, - stops: Array.from(stops.keys()), - options: dijkstraOptions, - }); + const workerPool = new WorkerPool( + __dirname + "/computePath.js", + 8, + { + adj: footGraph.adj, + weights: footGraph.weights, + stops: Array.from(stops.keys()), + options: dijkstraOptions, + }, + true, + ); let rejected = false; diff --git a/src/test/utils/Workers.ts b/src/test/utils/Workers.ts index 72111054..966bd3be 100644 --- a/src/test/utils/Workers.ts +++ b/src/test/utils/Workers.ts @@ -19,14 +19,10 @@ interface poolWorker { type queued = [any, resolveCb, rejectCb]; export class WorkerPool any> { - readonly script: string; - readonly size: number; readonly pool: poolWorker[]; readonly queue: Queue; - constructor(script: string, size: number, initData?: Parameters[0]) { - this.script = script; - this.size = size; + constructor(readonly script: string, readonly size: number, initData?: Parameters[0], readonly debug = false) { this.pool = new Array(this.size); this.queue = new Queue(); @@ -42,14 +38,14 @@ export class WorkerPool any> { const worker = this.pool[i]; worker.status = Status.Busy; - console.log(`Initializing worker ${worker.id}`); + if (this.debug) console.log(`Initializing worker ${worker.id}`); worker.worker.postMessage({ ...initData }); worker.worker.once("message", (v) => { if (v === true) { worker.status = Status.Idle; - console.log(`Initialized worker ${worker.id}`); + if (this.debug) console.log(`Initialized worker ${worker.id}`); this.runCallback(); } @@ -80,11 +76,11 @@ export class WorkerPool any> { const worker = this.getIdleWorker(); if (!worker) { this.queue.enqueue(job); - console.log(`Delayed, queued (${this.queue.size})`); + if (this.debug) console.log(`Delayed, queued (${this.queue.size})`); return def?.promise; } - console.log(`Running worker ${worker.id} (${this.queue.size})`); + if (this.debug) console.log(`Running worker ${worker.id} (${this.queue.size})`); worker.status = Status.Busy; worker.work = job; @@ -96,7 +92,7 @@ export class WorkerPool any> { const delta = new Duration(Number((process.hrtime.bigint() - startTime) / nsPerMs)); worker.status = Status.Idle; resolve(result); - console.log(`Finished worker ${worker.id} after ${delta} (${this.queue.size})`); + if (this.debug) console.log(`Finished worker ${worker.id} after ${delta} (${this.queue.size})`); this.runCallback(); worker.worker.removeListener("message", onceMessage); worker.worker.removeListener("error", onceError); @@ -104,7 +100,7 @@ export class WorkerPool any> { const onceError = (err: any) => { worker.status = Status.Idle; reject(err); - console.log(`Errored worker ${worker.id} (${this.queue.size})`); + if (this.debug) console.log(`Errored worker ${worker.id} (${this.queue.size})`); this.runCallback(); worker.worker.removeListener("error", onceError); worker.worker.removeListener("message", onceMessage); From 59a08ba65d4c082f296cd63dcc5a8172e28bfc7e Mon Sep 17 00:00:00 2001 From: Catatomik Date: Thu, 2 Mar 2023 14:56:21 +0100 Subject: [PATCH 073/251] =?UTF-8?q?=E2=9C=A8=20Added=20`this`=20argument?= =?UTF-8?q?=20to=20benchmark?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/computePath.ts | 2 -- src/test/utils/benchmark.ts | 12 ++++++++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/test/computePath.ts b/src/test/computePath.ts index 3dcdf953..8673deda 100644 --- a/src/test/computePath.ts +++ b/src/test/computePath.ts @@ -84,8 +84,6 @@ export async function computePathBench(stopId: ReturnType any>(f: F, args: Parameters, times: number = 1, logStats = true) { +export async function benchmark any>( + this: any, + f: F, + args: Parameters, + thisArg: unknown = this, + times: number = 1, + logStats = true, +) { const starts: number[] = new Array(times); const ends: number[] = new Array(times); let lastReturn: Awaited> | null = null; for (let i = 0; i < times; i++) { starts[i] = performance.now(); - lastReturn = await f(...args); + lastReturn = await f.call(thisArg, ...args); ends[i] = performance.now(); } const durations = ends.map((e, i) => new Duration(e - starts[i])); From 793143c28ca4cacd0d382d77aa0cb71be6e5e0af Mon Sep 17 00:00:00 2001 From: Catatomik Date: Thu, 2 Mar 2023 15:47:23 +0100 Subject: [PATCH 074/251] =?UTF-8?q?=E2=9A=A1=20Remove=20useless=20timestam?= =?UTF-8?q?ps?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/models/FootPaths.model.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/test/models/FootPaths.model.ts b/src/test/models/FootPaths.model.ts index 556579a8..3ff0dc96 100644 --- a/src/test/models/FootPaths.model.ts +++ b/src/test/models/FootPaths.model.ts @@ -2,7 +2,6 @@ // // See http://mongoosejs.com/docs/models.html -import { TimeStamps } from "@typegoose/typegoose/lib/defaultClasses"; import { addModelToTypegoose, buildSchema, deleteModelWithClass, getModelForClass, prop, Ref } from "@typegoose/typegoose"; import { modelOptions } from "@typegoose/typegoose/lib/modelOptions"; import { getName } from "@typegoose/typegoose/lib/internal/utils"; @@ -11,7 +10,7 @@ import { dbTBM_Stops } from "./TBM_stops.model"; import { dbFootGraphNodes } from "./FootGraph.model"; @modelOptions({ options: { customName: "footPaths" } }) -export class dbFootPaths extends TimeStamps { +export class dbFootPaths { @prop({ required: true, index: true, ref: () => dbTBM_Stops, type: () => Number }) public from!: Ref; From 0d2018624a01fac38087d0eae9ea9df71817916f Mon Sep 17 00:00:00 2001 From: Catatomik Date: Thu, 2 Mar 2023 15:49:00 +0100 Subject: [PATCH 075/251] =?UTF-8?q?=E2=9A=A1=20(memory)=20Sequential=20foo?= =?UTF-8?q?tPath=20insertion?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/test.ts | 40 ++++++++++++++++++++++------------------ 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/src/test/test.ts b/src/test/test.ts index 64f3bfad..7905b59c 100644 --- a/src/test/test.ts +++ b/src/test/test.ts @@ -251,10 +251,7 @@ export async function run({ getFullPaths = false, dijkstraOptions }: testOptions console.log("b4 ended"); async function computePaths() { - //paths> - const paths: Map, Awaited>> = new Map(); - - const def = new Deferred(); + const def = new Deferred(); const workerPool = new WorkerPool( __dirname + "/computePath.js", @@ -270,14 +267,32 @@ export async function run({ getFullPaths = false, dijkstraOptions }: testOptions let rejected = false; + await FootPathModel.deleteMany({}); + + // Number or done worker jobs + let computed = 0; for (const stopId of stops.keys()) { workerPool .run([approachedStopName(stopId), getFullPaths]) - .then((sourcePaths) => { - paths.set(stopId, sourcePaths); - if (paths.size === approachedStops.size) def.resolve(paths); + .then(async (sourcePaths) => { + await benchmark( + FootPathModel.insertMany, + [ + Array.from(sourcePaths).map(([to, [path, distance]]) => ({ + from: stopId, + to, + path: path.map((node) => (typeof node === "number" ? dbIntersectionId(node) : node)), + distance, + })), + { ordered: false, lean: true }, + ] as unknown as [unknown], // Need to manually overxrite type, Parameters<> not taking right overload https://github.com/microsoft/TypeScript/issues/32164 + FootPathModel, + ); + computed++; + if (computed === approachedStops.size) def.resolve(); }) .catch((r) => { + computed++; if (rejected) return; rejected = true; def.reject(r); @@ -320,17 +335,6 @@ export async function run({ getFullPaths = false, dijkstraOptions }: testOptions ], })), ); - - await FootPathModel.deleteMany({}); - - await FootPathModel.insertMany( - Array.from(paths).map(([from, [[to, [path, distance]]]]) => ({ - from, - to, - path: path.map((node) => (typeof node === "number" ? dbIntersectionId(node) : node)), - distance, - })), - ); } const b6 = await benchmark(updateDb, []); console.log("b6 ended"); From c3b6c41f3f1e673c6ddebf528afd3a5b7083189f Mon Sep 17 00:00:00 2001 From: Catatomik Date: Thu, 2 Mar 2023 17:30:19 +0100 Subject: [PATCH 076/251] =?UTF-8?q?=E2=9C=A8=20unpackQueue?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/utils/Queue.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/test/utils/Queue.ts b/src/test/utils/Queue.ts index d8f5af8f..d9cea9ee 100644 --- a/src/test/utils/Queue.ts +++ b/src/test/utils/Queue.ts @@ -40,3 +40,5 @@ export class Queue { return (this.front as Link).toArray(); } } + +export type unpackQueue = Q extends Queue ? T : never \ No newline at end of file From 546cd985b2ca553a02efe2b39e8a38ac8cffcea4 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Thu, 2 Mar 2023 17:30:36 +0100 Subject: [PATCH 077/251] =?UTF-8?q?=E2=9C=A8=20TypedEventEmitter?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/utils/TypedEmitter.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 src/test/utils/TypedEmitter.ts diff --git a/src/test/utils/TypedEmitter.ts b/src/test/utils/TypedEmitter.ts new file mode 100644 index 00000000..49d88bc1 --- /dev/null +++ b/src/test/utils/TypedEmitter.ts @@ -0,0 +1,13 @@ +import { EventEmitter } from "events"; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +type EmittedEvents = Record any>; + +export declare interface TypedEventEmitter { + on(event: E, listener: Events[E]): this; + + emit(event: E, ...args: Parameters): boolean; +} + +// eslint-disable-next-line @typescript-eslint/no-unused-vars +export class TypedEventEmitter extends EventEmitter {} From fd807a638f6c6dd82ca99956604bd82eb6df0b84 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Thu, 2 Mar 2023 17:30:51 +0100 Subject: [PATCH 078/251] =?UTF-8?q?=E2=9C=A8=20Use=20TypedEventEmitter=20+?= =?UTF-8?q?=20better=20typing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/utils/Workers.ts | 44 +++++++++++++++++++++++++-------------- 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/src/test/utils/Workers.ts b/src/test/utils/Workers.ts index 966bd3be..b450ee47 100644 --- a/src/test/utils/Workers.ts +++ b/src/test/utils/Workers.ts @@ -1,7 +1,8 @@ import { Worker } from "worker_threads"; import { Deferred, rejectCb, resolveCb } from "./ultils"; import { Duration } from "./benchmark"; -import { Queue } from "./Queue"; +import { Queue, unpackQueue } from "./Queue"; +import { TypedEventEmitter } from "./TypedEmitter"; const nsPerMs = BigInt(1e6); enum Status { @@ -9,20 +10,27 @@ enum Status { Busy, } -interface poolWorker { +interface poolWorker { id: number; status: Status; worker: Worker; - work: queued | null; + work: queuedJob | null; } -type queued = [any, resolveCb, rejectCb]; +type queuedJob = [T, resolveCb, rejectCb]; -export class WorkerPool any> { - readonly pool: poolWorker[]; - readonly queue: Queue; +type workerPoolEvents = { + queuedJob: (queueSize: number) => void; + running: (job: queuedJob) => void; + ended: (success: boolean) => void; +}; + +export class WorkerPool any, F extends (...args: any) => any> extends TypedEventEmitter, Awaited>>> { + readonly pool: poolWorker, Awaited>>[]; + readonly queue: Queue, Awaited>>>; constructor(readonly script: string, readonly size: number, initData?: Parameters[0], readonly debug = false) { + super() this.pool = new Array(this.size); this.queue = new Queue(); @@ -55,15 +63,15 @@ export class WorkerPool any> { } } - run any>(data: Parameters, res: resolveCb>, rej: rejectCb): void; - run any>(data: Parameters): Promise>>; - async run any>(data: Parameters, res?: resolveCb>>, rej?: rejectCb) { - let def: Deferred> | null = null; + run(data: Parameters, res: resolveCb>>, rej: rejectCb): void; + run(data: Parameters): Promise>>; + async run(data: Parameters, res?: resolveCb>>, rej?: rejectCb) { + let def: Deferred>> | null = null; let resolve: resolveCb>>; let reject: rejectCb; if (!res || !rej) { - def = new Deferred>(); + def = new Deferred>>(); resolve = def.resolve; reject = def.reject; } else { @@ -71,12 +79,12 @@ export class WorkerPool any> { reject = rej; } - const job: queued = [data, resolve, reject]; + const job: unpackQueue = [data, resolve, reject]; const worker = this.getIdleWorker(); if (!worker) { this.queue.enqueue(job); - if (this.debug) console.log(`Delayed, queued (${this.queue.size})`); + if (this.debug) console.log(`Delayed, queuedJob (${this.queue.size})`); return def?.promise; } @@ -112,7 +120,7 @@ export class WorkerPool any> { if (!res || !rej) return def!.promise; } - protected runCallback(job?: queued) { + protected runCallback(job?: queuedJob, Awaited>>) { if (!job) { if (!this.queue.size) return; job = this.queue.dequeue(); @@ -120,7 +128,11 @@ export class WorkerPool any> { return this.run(...job); } - protected getIdleWorker(): poolWorker | undefined { + protected getIdleWorker(): poolWorker, Awaited>> | undefined { return this.pool.find((w) => w.status === Status.Idle); } + + public get numberRunning(): number { + return this.pool.filter(w => w.status !== Status.Idle).length; + } } From 02ebeb7c59c0daddc53050d73441d3f66f416240 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Thu, 2 Mar 2023 17:37:14 +0100 Subject: [PATCH 079/251] =?UTF-8?q?=F0=9F=8E=A8=20Prettier?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/utils/Queue.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/utils/Queue.ts b/src/test/utils/Queue.ts index d9cea9ee..75077f14 100644 --- a/src/test/utils/Queue.ts +++ b/src/test/utils/Queue.ts @@ -41,4 +41,4 @@ export class Queue { } } -export type unpackQueue = Q extends Queue ? T : never \ No newline at end of file +export type unpackQueue = Q extends Queue ? T : never; From 02974963fc35a66f01e139fa6e3882b8c1fe7ef8 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Thu, 2 Mar 2023 18:05:59 +0100 Subject: [PATCH 080/251] =?UTF-8?q?=E2=9C=A8=F0=9F=9A=A7=F0=9F=8E=A8=20wai?= =?UTF-8?q?tForIdleWorker,=20implements=20events=20&=20Prettier?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/utils/Workers.ts | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/src/test/utils/Workers.ts b/src/test/utils/Workers.ts index b450ee47..2eaa0c2a 100644 --- a/src/test/utils/Workers.ts +++ b/src/test/utils/Workers.ts @@ -21,16 +21,18 @@ type queuedJob = [T, resolveCb, rejectCb]; type workerPoolEvents = { queuedJob: (queueSize: number) => void; - running: (job: queuedJob) => void; - ended: (success: boolean) => void; + runningJob: (job: queuedJob) => void; + jobEnded: (result: R | unknown) => void; }; -export class WorkerPool any, F extends (...args: any) => any> extends TypedEventEmitter, Awaited>>> { +export class WorkerPool any, F extends (...args: any) => any> extends TypedEventEmitter< + workerPoolEvents, Awaited>> +> { readonly pool: poolWorker, Awaited>>[]; readonly queue: Queue, Awaited>>>; constructor(readonly script: string, readonly size: number, initData?: Parameters[0], readonly debug = false) { - super() + super(); this.pool = new Array(this.size); this.queue = new Queue(); @@ -85,10 +87,12 @@ export class WorkerPool any, F extends (...args: if (!worker) { this.queue.enqueue(job); if (this.debug) console.log(`Delayed, queuedJob (${this.queue.size})`); + this.emit("queuedJob", this.queue.size); return def?.promise; } if (this.debug) console.log(`Running worker ${worker.id} (${this.queue.size})`); + this.emit("runningJob", job); worker.status = Status.Busy; worker.work = job; @@ -96,19 +100,21 @@ export class WorkerPool any, F extends (...args: const startTime = process.hrtime.bigint(); worker.worker.postMessage(data); - const onceMessage = (result: any) => { + const onceMessage = (result: Awaited>) => { const delta = new Duration(Number((process.hrtime.bigint() - startTime) / nsPerMs)); worker.status = Status.Idle; resolve(result); if (this.debug) console.log(`Finished worker ${worker.id} after ${delta} (${this.queue.size})`); + this.emit("jobEnded", result); this.runCallback(); worker.worker.removeListener("message", onceMessage); worker.worker.removeListener("error", onceError); }; - const onceError = (err: any) => { + const onceError = (err: unknown) => { worker.status = Status.Idle; reject(err); if (this.debug) console.log(`Errored worker ${worker.id} (${this.queue.size})`); + this.emit("jobEnded", err); this.runCallback(); worker.worker.removeListener("error", onceError); worker.worker.removeListener("message", onceMessage); @@ -132,7 +138,12 @@ export class WorkerPool any, F extends (...args: return this.pool.find((w) => w.status === Status.Idle); } - public get numberRunning(): number { - return this.pool.filter(w => w.status !== Status.Idle).length; + public waitForIdleWorker(): Promise { + const def = new Deferred(); + + if (this.getIdleWorker()) def.resolve(); + else this.on("jobEnded", () => def.resolve()); + + return def.promise; } } From 567316385df7483304881b0f4e435e6a24c06b96 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Thu, 2 Mar 2023 18:11:44 +0100 Subject: [PATCH 081/251] =?UTF-8?q?=E2=9A=A1=F0=9F=8E=A8=20Do=20not=20inse?= =?UTF-8?q?rt=20source=20into=20paths=20&=20Prettier?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/computePath.ts | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/src/test/computePath.ts b/src/test/computePath.ts index 8673deda..f997ece6 100644 --- a/src/test/computePath.ts +++ b/src/test/computePath.ts @@ -32,26 +32,34 @@ let footGraph: WeightedGraph | undefined; let stops: initData["stops"] | undefined; let options: initData["options"] | undefined; -export async function computePath(stopId: ReturnType, returnPaths: boolean) { +export async function computePath( + sourceStopId: ReturnType, + returnPaths: boolean, + computedStops: Set = new Set(), +) { const sourcePaths: Map>, number]> = new Map(); if (!footGraph || !stops) return sourcePaths; const [dist, prev] = options - ? await Dijkstra(footGraph, [stopId], options) - : await Dijkstra(footGraph, [stopId]); + ? await Dijkstra(footGraph, [sourceStopId], options) + : await Dijkstra(footGraph, [sourceStopId]); for (const stopId of stops) { const targetNode = approachedStopName(stopId); - if (dist.get(targetNode) !== undefined && dist.get(targetNode)! < Infinity) + if (dist.get(targetNode) !== undefined && dist.get(targetNode)! < Infinity && sourceStopId !== targetNode && !computedStops.has(stopId)) sourcePaths.set(stopId, [returnPaths ? tracePath(prev, targetNode) : [], dist.get(targetNode)!]); } return sourcePaths; } -export async function computePathBench(stopId: ReturnType, returnPaths: boolean) { +export async function computePathBench( + sourceStopId: ReturnType, + returnPaths: boolean, + computedStops: Set = new Set(), +) { const sourcePaths: Map>, number]> = new Map(); if (!footGraph || !stops) return sourcePaths; @@ -61,16 +69,16 @@ export async function computePathBench(stopId: ReturnType [Map, Map], - [footGraph, [stopId], options], + [footGraph, [sourceStopId], options], ) ).lastReturn! : ( await benchmark( - Dijkstra as (G: typeof footGraph, [s]: [typeof stopId]) => [Map, Map], - [footGraph, [stopId]], + Dijkstra as (G: typeof footGraph, [s]: [typeof sourceStopId]) => [Map, Map], + [footGraph, [sourceStopId]], ) ).lastReturn!; @@ -79,7 +87,7 @@ export async function computePathBench(stopId: ReturnType Date: Thu, 2 Mar 2023 19:32:49 +0100 Subject: [PATCH 082/251] =?UTF-8?q?=E2=9A=A1=F0=9F=90=9B=20Remove=20unused?= =?UTF-8?q?=20option?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/index.ts b/src/test/index.ts index 9f4678e6..71a27a2a 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -8,6 +8,6 @@ const times = JSON.parse(args[1]); if (typeof getFullPaths !== "boolean") throw new Error(`Type of argument 1 "getFullPaths" invalid (got ${typeof getFullPaths})`); if (typeof times !== "number") throw new Error(`Type of argument 2 "times" invalid (got ${typeof times})`); -benchmark(run, [{ getFullPaths, computeGEOJSONs: false, dijkstraOptions: { maxCumulWeight: 5_000 } }], times) +benchmark(run, [{ getFullPaths, dijkstraOptions: { maxCumulWeight: 5_000 } }], this, times) .then(console.log) .catch(console.error); From dbae99f787a4857011897587b3d1d3d94a34bbb5 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Thu, 2 Mar 2023 19:46:23 +0100 Subject: [PATCH 083/251] =?UTF-8?q?=E2=9A=A1=F0=9F=9A=A7=20(memory)=20Avoi?= =?UTF-8?q?d=20storing=20already=20computed=20paths?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/test.ts | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/test/test.ts b/src/test/test.ts index 7905b59c..def23dfa 100644 --- a/src/test/test.ts +++ b/src/test/test.ts @@ -10,7 +10,6 @@ import Segment from "../utils/Segment"; export interface testOptions { getFullPaths?: boolean; - computeGEOJSONs?: boolean; dijkstraOptions?: DijkstraOptions; } export type id = number; @@ -253,7 +252,7 @@ export async function run({ getFullPaths = false, dijkstraOptions }: testOptions async function computePaths() { const def = new Deferred(); - const workerPool = new WorkerPool( + const workerPool = new WorkerPool( __dirname + "/computePath.js", 8, { @@ -271,9 +270,10 @@ export async function run({ getFullPaths = false, dijkstraOptions }: testOptions // Number or done worker jobs let computed = 0; + const computedStops = new Set>(); for (const stopId of stops.keys()) { workerPool - .run([approachedStopName(stopId), getFullPaths]) + .run([approachedStopName(stopId), getFullPaths, computedStops]) .then(async (sourcePaths) => { await benchmark( FootPathModel.insertMany, @@ -285,17 +285,20 @@ export async function run({ getFullPaths = false, dijkstraOptions }: testOptions distance, })), { ordered: false, lean: true }, - ] as unknown as [unknown], // Need to manually overxrite type, Parameters<> not taking right overload https://github.com/microsoft/TypeScript/issues/32164 + ] as unknown as [unknown], // Need to manually overwrite type, Parameters<> not taking right overload https://github.com/microsoft/TypeScript/issues/32164 FootPathModel, ); - computed++; + if (computed === approachedStops.size) def.resolve(); }) .catch((r) => { - computed++; if (rejected) return; rejected = true; def.reject(r); + }) + .finally(() => { + computedStops.add(stopId); + computed++; }); } @@ -303,8 +306,6 @@ export async function run({ getFullPaths = false, dijkstraOptions }: testOptions } const b5 = await benchmark(computePaths, []); console.log("b5 ended"); - if (!b5.lastReturn) throw `b5 return null`; - const paths = b5.lastReturn; async function updateDb() { //Empty db From 90e26fdbb1bebd22a1aa9bef5111d2178aae7ac1 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Mon, 6 Mar 2023 18:24:34 +0100 Subject: [PATCH 084/251] =?UTF-8?q?=F0=9F=92=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/utils/Workers.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/utils/Workers.ts b/src/test/utils/Workers.ts index 2eaa0c2a..e6cea916 100644 --- a/src/test/utils/Workers.ts +++ b/src/test/utils/Workers.ts @@ -86,7 +86,7 @@ export class WorkerPool any, F extends (...args: const worker = this.getIdleWorker(); if (!worker) { this.queue.enqueue(job); - if (this.debug) console.log(`Delayed, queuedJob (${this.queue.size})`); + if (this.debug) console.log(`Delayed, queued (${this.queue.size})`); this.emit("queuedJob", this.queue.size); return def?.promise; } From b83d63492e8d6f726b47659d3359de0d02bdf11f Mon Sep 17 00:00:00 2001 From: Catatomik Date: Tue, 7 Mar 2023 12:51:22 +0100 Subject: [PATCH 085/251] =?UTF-8?q?=F0=9F=90=9B=F0=9F=9A=A7=20Correctly=20?= =?UTF-8?q?insert=20&=20use=20segments?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/test.ts | 61 ++++++++++++++++++++++++------------------------ 1 file changed, 31 insertions(+), 30 deletions(-) diff --git a/src/test/test.ts b/src/test/test.ts index def23dfa..9c731066 100644 --- a/src/test/test.ts +++ b/src/test/test.ts @@ -155,36 +155,38 @@ export async function run({ getFullPaths = false, dijkstraOptions }: testOptions //Compute approached stops function computeApproachedStops() { - //Pre-generate segments to fasten the process (and not redundant computing) - //A segment describes a portion of a section (oriented) - const segments: Map, { n: number; seg: Segment }> = new Map(); - for (const arc of footGraph.arcs) { - const sId = sectionId({ rg_fv_graph_nd: arc[0], rg_fv_graph_na: arc[1] }); - const section = sections.get(sId); + //Pre-generate mapped segments to fasten the process (and not redundant computing) + //A segment describes a portion of a section (NOT oriented) + const mappedSegments: Map<(typeof footGraph.edges)[number], Segment[]> = new Map(); + for (const edge of footGraph.edges) { + const section = getSection(...edge); if (!section) continue; // Added for ts mental health - for (let i = 0; i < section.coords.length - 1; i++) { - segments.set(sId, { - n: i, - seg: new Segment(new Point(...section.coords[i]), new Point(...section.coords[i + 1])), - }); - } + mappedSegments.set( + edge, + section.coords.reduce( + (acc, v, i) => (i >= section.coords.length - 1 ? acc : [...acc, new Segment(new Point(...v), new Point(...section.coords[i + 1]))]), + [], + ), + ); } /**@description [closest point, section containing this point, indice of segment composing the section] */ - const approachedStops: Map, [Point, KeyOfMap, number]> = new Map(); + const approachedStops: Map, [Point, (typeof footGraph.edges)[number], number]> = new Map(); for (const [stopId, stop] of stops) { /**@description [distance to closest point, closest point, section containing this point, indice of segment composing the section (i;i+1 in Section coords)] */ - let closestPoint: [number, Point | null, KeyOfMap | null, number | null] = [Infinity, null, null, null]; - - for (const [sectionKey, { n, seg }] of segments) { - const stopPoint: Point = new Point(...stop.coords); - const localClosestPoint: Point = seg.closestPointFromPoint(stopPoint); - const distance: number = Point.distance(stopPoint, localClosestPoint); - if (distance < closestPoint[0]) { - closestPoint[0] = distance; - closestPoint[1] = localClosestPoint; - closestPoint[2] = sectionKey; - closestPoint[3] = n; + let closestPoint: [number, Point | null, (typeof footGraph.edges)[number] | null, number | null] = [Infinity, null, null, null]; + + for (const [edge, segs] of mappedSegments) { + for (const [n, seg] of segs.entries()) { + const stopPoint: Point = new Point(...stop.coords); + const localClosestPoint: Point = seg.closestPointFromPoint(stopPoint); + const distance: number = Point.distance(stopPoint, localClosestPoint); + if (distance < closestPoint[0]) { + closestPoint[0] = distance; + closestPoint[1] = localClosestPoint; + closestPoint[2] = edge; + closestPoint[3] = n; + } } } @@ -203,8 +205,8 @@ export async function run({ getFullPaths = false, dijkstraOptions }: testOptions /** Update {@link footGraph} & {@link sections} */ function refreshWithApproachedStops() { //Pushes new approached stops into graph, just like a proxy on a section - for (const [stopId, [closestPoint, sectionKey, n]] of approachedStops) { - const section = sections.get(sectionKey); + for (const [stopId, [closestPoint, edge, n]] of approachedStops) { + const section = getSection(...edge); if (!section) continue; // Added to ts mental health //Compute distance from section start to approachedStop const toApproadchedStop: number = @@ -222,7 +224,6 @@ export async function run({ getFullPaths = false, dijkstraOptions }: testOptions //Remove edge from p1 to p2 footGraph.remove_edge(section.rg_fv_graph_nd, section.rg_fv_graph_na); - sections.delete(sectionId(section)); const insertedNode = stopId; //Insert new node approachedStop @@ -266,9 +267,9 @@ export async function run({ getFullPaths = false, dijkstraOptions }: testOptions let rejected = false; - await FootPathModel.deleteMany({}); + await benchmark(FootPathModel.deleteMany, [{}] as unknown as any, FootPathModel); - // Number or done worker jobs + // Number of done worker jobs let computed = 0; const computedStops = new Set>(); for (const stopId of stops.keys()) { @@ -285,7 +286,7 @@ export async function run({ getFullPaths = false, dijkstraOptions }: testOptions distance, })), { ordered: false, lean: true }, - ] as unknown as [unknown], // Need to manually overwrite type, Parameters<> not taking right overload https://github.com/microsoft/TypeScript/issues/32164 + ] as unknown as any, // Need to manually overwrite type, Parameters<> not taking right overload https://github.com/microsoft/TypeScript/issues/32164 FootPathModel, ); From bd099827af9eecdbd411662465ae1c421e545a93 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Tue, 7 Mar 2023 14:50:18 +0100 Subject: [PATCH 086/251] =?UTF-8?q?=F0=9F=90=9B=20Collection=20creation=20?= =?UTF-8?q?of=20discriminators?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/models/FootGraph.model.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/test/models/FootGraph.model.ts b/src/test/models/FootGraph.model.ts index 553d537e..000c4a67 100644 --- a/src/test/models/FootGraph.model.ts +++ b/src/test/models/FootGraph.model.ts @@ -7,7 +7,7 @@ import { buildSchema, deleteModelWithClass, getDiscriminatorModelForClass, - getModelForClass, + getModelWithString, prop, Ref, } from "@typegoose/typegoose"; @@ -50,9 +50,9 @@ export class dbFootGraphEdges extends dbFootGraph { } export default function init(db: Mongoose) { - if (getModelForClass(dbFootGraph, { existingMongoose: db })) deleteModelWithClass(dbFootGraph); - if (getModelForClass(dbFootGraphNodes, { existingMongoose: db })) deleteModelWithClass(dbFootGraphNodes); - if (getModelForClass(dbFootGraphEdges, { existingMongoose: db })) deleteModelWithClass(dbFootGraphEdges); + if (getModelWithString(getName(dbFootGraph))) deleteModelWithClass(dbFootGraph); + if (getModelWithString(getName(dbFootGraphNodes))) deleteModelWithClass(dbFootGraphNodes); + if (getModelWithString(getName(dbFootGraphEdges))) deleteModelWithClass(dbFootGraphEdges); const dbFootGraphSchema = buildSchema(dbFootGraph, { existingMongoose: db }); const dbFootGraphModelRaw = db.model(getName(dbFootGraph), dbFootGraphSchema); From 333d793188d812281e3857fc61b1025ad98034f5 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Tue, 7 Mar 2023 15:01:14 +0100 Subject: [PATCH 087/251] =?UTF-8?q?=F0=9F=90=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/test.ts | 33 +++++++++++++++------------------ 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/src/test/test.ts b/src/test/test.ts index 9c731066..54d030c1 100644 --- a/src/test/test.ts +++ b/src/test/test.ts @@ -24,7 +24,7 @@ import { computePath, initialCallback } from "./computePath"; import { DocumentType } from "@typegoose/typegoose"; import { approachedStopName, euclidianDistance, Deferred, sectionId, unique, dbIntersectionId, dbSectionId, unpackRefType } from "./utils/ultils"; import FootGraphModelInit, { dbFootGraphEdges, dbFootGraphNodes } from "./models/FootGraph.model"; -import FootPathsModelInit, { dbFootPaths } from "./models/FootPaths.model"; +import FootPathsModelInit, { dbFootPaths } from "./models/NonScheduledRoutes.model"; import { KeyOfMap } from "../utils"; import { DijkstraOptions } from "../FootPaths"; @@ -262,7 +262,7 @@ export async function run({ getFullPaths = false, dijkstraOptions }: testOptions stops: Array.from(stops.keys()), options: dijkstraOptions, }, - true, + false, ); let rejected = false; @@ -276,30 +276,27 @@ export async function run({ getFullPaths = false, dijkstraOptions }: testOptions workerPool .run([approachedStopName(stopId), getFullPaths, computedStops]) .then(async (sourcePaths) => { - await benchmark( - FootPathModel.insertMany, - [ - Array.from(sourcePaths).map(([to, [path, distance]]) => ({ - from: stopId, - to, - path: path.map((node) => (typeof node === "number" ? dbIntersectionId(node) : node)), - distance, - })), - { ordered: false, lean: true }, - ] as unknown as any, // Need to manually overwrite type, Parameters<> not taking right overload https://github.com/microsoft/TypeScript/issues/32164 - FootPathModel, + await FootPathModel.insertMany( + Array.from(sourcePaths).map(([to, [path, distance]]) => ({ + from: stopId, + to, + path: path.map((node) => (typeof node === "number" ? dbIntersectionId(node) : node)), + distance, + })), + { ordered: false, lean: true }, ); + computedStops.add(stopId); + computed++; if (computed === approachedStops.size) def.resolve(); }) .catch((r) => { + computedStops.add(stopId); + computed++; + if (rejected) return; rejected = true; def.reject(r); - }) - .finally(() => { - computedStops.add(stopId); - computed++; }); } From 7108b3c90988618ffdf22b1d29f26c79f54a5614 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Tue, 7 Mar 2023 15:01:30 +0100 Subject: [PATCH 088/251] =?UTF-8?q?=F0=9F=9A=A7=20Rename=20footPaths?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../models/{FootPaths.model.ts => NonScheduledRoutes.model.ts} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/test/models/{FootPaths.model.ts => NonScheduledRoutes.model.ts} (95%) diff --git a/src/test/models/FootPaths.model.ts b/src/test/models/NonScheduledRoutes.model.ts similarity index 95% rename from src/test/models/FootPaths.model.ts rename to src/test/models/NonScheduledRoutes.model.ts index 3ff0dc96..0ee114d3 100644 --- a/src/test/models/FootPaths.model.ts +++ b/src/test/models/NonScheduledRoutes.model.ts @@ -9,7 +9,7 @@ import { Mongoose } from "mongoose"; import { dbTBM_Stops } from "./TBM_stops.model"; import { dbFootGraphNodes } from "./FootGraph.model"; -@modelOptions({ options: { customName: "footPaths" } }) +@modelOptions({ options: { customName: "NonScheduledRoutes" } }) export class dbFootPaths { @prop({ required: true, index: true, ref: () => dbTBM_Stops, type: () => Number }) public from!: Ref; From 50fead281086201fa23714c24e534345c588a061 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Tue, 7 Mar 2023 15:24:25 +0100 Subject: [PATCH 089/251] =?UTF-8?q?=F0=9F=90=9B=E2=9A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/test.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/test/test.ts b/src/test/test.ts index 54d030c1..cd991806 100644 --- a/src/test/test.ts +++ b/src/test/test.ts @@ -276,6 +276,8 @@ export async function run({ getFullPaths = false, dijkstraOptions }: testOptions workerPool .run([approachedStopName(stopId), getFullPaths, computedStops]) .then(async (sourcePaths) => { + computedStops.add(stopId); + await FootPathModel.insertMany( Array.from(sourcePaths).map(([to, [path, distance]]) => ({ from: stopId, @@ -286,9 +288,8 @@ export async function run({ getFullPaths = false, dijkstraOptions }: testOptions { ordered: false, lean: true }, ); - computedStops.add(stopId); computed++; - if (computed === approachedStops.size) def.resolve(); + if (!rejected && computed === approachedStops.size) def.resolve(); }) .catch((r) => { computedStops.add(stopId); From 525447560fbdb606f1c60526e9bff657c9f12d37 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Sat, 1 Apr 2023 14:31:09 +0200 Subject: [PATCH 090/251] =?UTF-8?q?=F0=9F=9A=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/utils/Workers.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/test/utils/Workers.ts b/src/test/utils/Workers.ts index e6cea916..1f24fc8e 100644 --- a/src/test/utils/Workers.ts +++ b/src/test/utils/Workers.ts @@ -50,7 +50,6 @@ export class WorkerPool any, F extends (...args: if (this.debug) console.log(`Initializing worker ${worker.id}`); - worker.worker.postMessage({ ...initData }); worker.worker.once("message", (v) => { if (v === true) { worker.status = Status.Idle; @@ -61,6 +60,8 @@ export class WorkerPool any, F extends (...args: } }); worker.worker.once("error", console.error); + + worker.worker.postMessage({ ...initData }); } } } From 19c32fe25841a85681567b3aa5a1c38783392c2f Mon Sep 17 00:00:00 2001 From: Catatomik Date: Sat, 1 Apr 2023 14:33:05 +0200 Subject: [PATCH 091/251] =?UTF-8?q?=F0=9F=9A=A7=E2=9A=A1=20Count=20total?= =?UTF-8?q?=20paths?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/test.ts | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/test/test.ts b/src/test/test.ts index cd991806..ce212f4f 100644 --- a/src/test/test.ts +++ b/src/test/test.ts @@ -24,7 +24,7 @@ import { computePath, initialCallback } from "./computePath"; import { DocumentType } from "@typegoose/typegoose"; import { approachedStopName, euclidianDistance, Deferred, sectionId, unique, dbIntersectionId, dbSectionId, unpackRefType } from "./utils/ultils"; import FootGraphModelInit, { dbFootGraphEdges, dbFootGraphNodes } from "./models/FootGraph.model"; -import FootPathsModelInit, { dbFootPaths } from "./models/NonScheduledRoutes.model"; +import NonScheduledRoutesModelInit, { dbFootPaths } from "./models/NonScheduledRoutes.model"; import { KeyOfMap } from "../utils"; import { DijkstraOptions } from "../FootPaths"; @@ -48,7 +48,7 @@ export async function run({ getFullPaths = false, dijkstraOptions }: testOptions const sectionsModel = sectionsModelInit(db); const stopsModel = stopsModelInit(db); const [FootGraphModel, FootGraphNodesModel, FootGraphEdgesModel] = FootGraphModelInit(db); - const FootPathModel = FootPathsModelInit(db); + const NonScheduledRoutesModel = NonScheduledRoutesModelInit(db); // const limitTop = new Point(44.813926, -0.581271).fromWGSToLambert93(); // const limitBot = new Point(44.793123, -0.632578).fromWGSToLambert93(); @@ -251,7 +251,7 @@ export async function run({ getFullPaths = false, dijkstraOptions }: testOptions console.log("b4 ended"); async function computePaths() { - const def = new Deferred(); + const def = new Deferred(); const workerPool = new WorkerPool( __dirname + "/computePath.js", @@ -267,7 +267,9 @@ export async function run({ getFullPaths = false, dijkstraOptions }: testOptions let rejected = false; - await benchmark(FootPathModel.deleteMany, [{}] as unknown as any, FootPathModel); + await benchmark(NonScheduledRoutesModel.deleteMany, [{}] as unknown as any, NonScheduledRoutesModel); + + let totalPaths = 0; // Number of done worker jobs let computed = 0; @@ -278,18 +280,19 @@ export async function run({ getFullPaths = false, dijkstraOptions }: testOptions .then(async (sourcePaths) => { computedStops.add(stopId); - await FootPathModel.insertMany( + totalPaths += sourcePaths.size; + + await NonScheduledRoutesModel.insertMany( Array.from(sourcePaths).map(([to, [path, distance]]) => ({ from: stopId, to, path: path.map((node) => (typeof node === "number" ? dbIntersectionId(node) : node)), distance, })), - { ordered: false, lean: true }, ); computed++; - if (!rejected && computed === approachedStops.size) def.resolve(); + if (!rejected && computed === approachedStops.size) def.resolve(totalPaths); }) .catch((r) => { computedStops.add(stopId); From 419781b500ab9b34a5a3592b214478cd714bc41d Mon Sep 17 00:00:00 2001 From: Catatomik Date: Sat, 1 Apr 2023 14:34:50 +0200 Subject: [PATCH 092/251] =?UTF-8?q?=F0=9F=8F=97=EF=B8=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/{ => footPaths}/computePath.ts | 4 ++-- src/test/{ => footPaths}/index.ts | 0 src/test/{ => footPaths}/models/FootGraph.model.ts | 0 .../{ => footPaths}/models/NonScheduledRoutes.model.ts | 0 .../{ => footPaths}/models/SNCF_schedules.model.ts | 0 src/test/{ => footPaths}/models/SNCF_stops.model.ts | 0 .../{ => footPaths}/models/TBMScheduledRoutes.model.ts | 0 src/test/{ => footPaths}/models/TBM_lines.model.ts | 0 .../{ => footPaths}/models/TBM_lines_routes.model.ts | 0 src/test/{ => footPaths}/models/TBM_schedules.model.ts | 0 src/test/{ => footPaths}/models/TBM_stops.model.ts | 0 src/test/{ => footPaths}/models/TBM_trips.model.ts | 0 src/test/{ => footPaths}/models/addresses.model.ts | 0 src/test/{ => footPaths}/models/index.ts | 0 src/test/{ => footPaths}/models/intersections.model.ts | 0 src/test/{ => footPaths}/models/sections.model.ts | 0 src/test/{ => footPaths}/test.ts | 10 +++++----- src/test/{ => footPaths}/utils/Link.ts | 0 src/test/{ => footPaths}/utils/Queue.ts | 0 src/test/{ => footPaths}/utils/TypedEmitter.ts | 0 src/test/{ => footPaths}/utils/Workers.ts | 0 src/test/{ => footPaths}/utils/benchmark.ts | 0 src/test/{ => footPaths}/utils/mongoose.ts | 0 src/test/{ => footPaths}/utils/ultils.ts | 2 +- 24 files changed, 8 insertions(+), 8 deletions(-) rename src/test/{ => footPaths}/computePath.ts (95%) rename src/test/{ => footPaths}/index.ts (100%) rename src/test/{ => footPaths}/models/FootGraph.model.ts (100%) rename src/test/{ => footPaths}/models/NonScheduledRoutes.model.ts (100%) rename src/test/{ => footPaths}/models/SNCF_schedules.model.ts (100%) rename src/test/{ => footPaths}/models/SNCF_stops.model.ts (100%) rename src/test/{ => footPaths}/models/TBMScheduledRoutes.model.ts (100%) rename src/test/{ => footPaths}/models/TBM_lines.model.ts (100%) rename src/test/{ => footPaths}/models/TBM_lines_routes.model.ts (100%) rename src/test/{ => footPaths}/models/TBM_schedules.model.ts (100%) rename src/test/{ => footPaths}/models/TBM_stops.model.ts (100%) rename src/test/{ => footPaths}/models/TBM_trips.model.ts (100%) rename src/test/{ => footPaths}/models/addresses.model.ts (100%) rename src/test/{ => footPaths}/models/index.ts (100%) rename src/test/{ => footPaths}/models/intersections.model.ts (100%) rename src/test/{ => footPaths}/models/sections.model.ts (100%) rename src/test/{ => footPaths}/test.ts (98%) rename src/test/{ => footPaths}/utils/Link.ts (100%) rename src/test/{ => footPaths}/utils/Queue.ts (100%) rename src/test/{ => footPaths}/utils/TypedEmitter.ts (100%) rename src/test/{ => footPaths}/utils/Workers.ts (100%) rename src/test/{ => footPaths}/utils/benchmark.ts (100%) rename src/test/{ => footPaths}/utils/mongoose.ts (100%) rename src/test/{ => footPaths}/utils/ultils.ts (96%) diff --git a/src/test/computePath.ts b/src/test/footPaths/computePath.ts similarity index 95% rename from src/test/computePath.ts rename to src/test/footPaths/computePath.ts index f997ece6..2f47e497 100644 --- a/src/test/computePath.ts +++ b/src/test/footPaths/computePath.ts @@ -1,5 +1,5 @@ -import { path, Dijkstra, tracePath, DijkstraOptions } from "../FootPaths"; -import { unpackGraphNode, WeightedGraph } from "../utils/Graph"; +import { path, Dijkstra, tracePath, DijkstraOptions } from "../../FootPaths"; +import { unpackGraphNode, WeightedGraph } from "../../utils/Graph"; import type { footGraphNodes, id } from "./test"; import { parentPort } from "worker_threads"; diff --git a/src/test/index.ts b/src/test/footPaths/index.ts similarity index 100% rename from src/test/index.ts rename to src/test/footPaths/index.ts diff --git a/src/test/models/FootGraph.model.ts b/src/test/footPaths/models/FootGraph.model.ts similarity index 100% rename from src/test/models/FootGraph.model.ts rename to src/test/footPaths/models/FootGraph.model.ts diff --git a/src/test/models/NonScheduledRoutes.model.ts b/src/test/footPaths/models/NonScheduledRoutes.model.ts similarity index 100% rename from src/test/models/NonScheduledRoutes.model.ts rename to src/test/footPaths/models/NonScheduledRoutes.model.ts diff --git a/src/test/models/SNCF_schedules.model.ts b/src/test/footPaths/models/SNCF_schedules.model.ts similarity index 100% rename from src/test/models/SNCF_schedules.model.ts rename to src/test/footPaths/models/SNCF_schedules.model.ts diff --git a/src/test/models/SNCF_stops.model.ts b/src/test/footPaths/models/SNCF_stops.model.ts similarity index 100% rename from src/test/models/SNCF_stops.model.ts rename to src/test/footPaths/models/SNCF_stops.model.ts diff --git a/src/test/models/TBMScheduledRoutes.model.ts b/src/test/footPaths/models/TBMScheduledRoutes.model.ts similarity index 100% rename from src/test/models/TBMScheduledRoutes.model.ts rename to src/test/footPaths/models/TBMScheduledRoutes.model.ts diff --git a/src/test/models/TBM_lines.model.ts b/src/test/footPaths/models/TBM_lines.model.ts similarity index 100% rename from src/test/models/TBM_lines.model.ts rename to src/test/footPaths/models/TBM_lines.model.ts diff --git a/src/test/models/TBM_lines_routes.model.ts b/src/test/footPaths/models/TBM_lines_routes.model.ts similarity index 100% rename from src/test/models/TBM_lines_routes.model.ts rename to src/test/footPaths/models/TBM_lines_routes.model.ts diff --git a/src/test/models/TBM_schedules.model.ts b/src/test/footPaths/models/TBM_schedules.model.ts similarity index 100% rename from src/test/models/TBM_schedules.model.ts rename to src/test/footPaths/models/TBM_schedules.model.ts diff --git a/src/test/models/TBM_stops.model.ts b/src/test/footPaths/models/TBM_stops.model.ts similarity index 100% rename from src/test/models/TBM_stops.model.ts rename to src/test/footPaths/models/TBM_stops.model.ts diff --git a/src/test/models/TBM_trips.model.ts b/src/test/footPaths/models/TBM_trips.model.ts similarity index 100% rename from src/test/models/TBM_trips.model.ts rename to src/test/footPaths/models/TBM_trips.model.ts diff --git a/src/test/models/addresses.model.ts b/src/test/footPaths/models/addresses.model.ts similarity index 100% rename from src/test/models/addresses.model.ts rename to src/test/footPaths/models/addresses.model.ts diff --git a/src/test/models/index.ts b/src/test/footPaths/models/index.ts similarity index 100% rename from src/test/models/index.ts rename to src/test/footPaths/models/index.ts diff --git a/src/test/models/intersections.model.ts b/src/test/footPaths/models/intersections.model.ts similarity index 100% rename from src/test/models/intersections.model.ts rename to src/test/footPaths/models/intersections.model.ts diff --git a/src/test/models/sections.model.ts b/src/test/footPaths/models/sections.model.ts similarity index 100% rename from src/test/models/sections.model.ts rename to src/test/footPaths/models/sections.model.ts diff --git a/src/test/test.ts b/src/test/footPaths/test.ts similarity index 98% rename from src/test/test.ts rename to src/test/footPaths/test.ts index ce212f4f..de77b750 100644 --- a/src/test/test.ts +++ b/src/test/footPaths/test.ts @@ -3,10 +3,10 @@ import initDB from "./utils/mongoose"; import { benchmark } from "./utils/benchmark"; import { WorkerPool } from "./utils/Workers"; -import { node, WeightedGraph } from "../utils/Graph"; +import { node, WeightedGraph } from "../../utils/Graph"; -import Point from "../utils/Point"; -import Segment from "../utils/Segment"; +import Point from "../../utils/Point"; +import Segment from "../../utils/Segment"; export interface testOptions { getFullPaths?: boolean; @@ -25,8 +25,8 @@ import { DocumentType } from "@typegoose/typegoose"; import { approachedStopName, euclidianDistance, Deferred, sectionId, unique, dbIntersectionId, dbSectionId, unpackRefType } from "./utils/ultils"; import FootGraphModelInit, { dbFootGraphEdges, dbFootGraphNodes } from "./models/FootGraph.model"; import NonScheduledRoutesModelInit, { dbFootPaths } from "./models/NonScheduledRoutes.model"; -import { KeyOfMap } from "../utils"; -import { DijkstraOptions } from "../FootPaths"; +import { KeyOfMap } from "../../utils"; +import { DijkstraOptions } from "../../FootPaths"; const sectionProjection = { coords: 1, distance: 1, rg_fv_graph_nd: 1, rg_fv_graph_na: 1 }; export type dbSection = Pick; diff --git a/src/test/utils/Link.ts b/src/test/footPaths/utils/Link.ts similarity index 100% rename from src/test/utils/Link.ts rename to src/test/footPaths/utils/Link.ts diff --git a/src/test/utils/Queue.ts b/src/test/footPaths/utils/Queue.ts similarity index 100% rename from src/test/utils/Queue.ts rename to src/test/footPaths/utils/Queue.ts diff --git a/src/test/utils/TypedEmitter.ts b/src/test/footPaths/utils/TypedEmitter.ts similarity index 100% rename from src/test/utils/TypedEmitter.ts rename to src/test/footPaths/utils/TypedEmitter.ts diff --git a/src/test/utils/Workers.ts b/src/test/footPaths/utils/Workers.ts similarity index 100% rename from src/test/utils/Workers.ts rename to src/test/footPaths/utils/Workers.ts diff --git a/src/test/utils/benchmark.ts b/src/test/footPaths/utils/benchmark.ts similarity index 100% rename from src/test/utils/benchmark.ts rename to src/test/footPaths/utils/benchmark.ts diff --git a/src/test/utils/mongoose.ts b/src/test/footPaths/utils/mongoose.ts similarity index 100% rename from src/test/utils/mongoose.ts rename to src/test/footPaths/utils/mongoose.ts diff --git a/src/test/utils/ultils.ts b/src/test/footPaths/utils/ultils.ts similarity index 96% rename from src/test/utils/ultils.ts rename to src/test/footPaths/utils/ultils.ts index f759acc2..97588071 100644 --- a/src/test/utils/ultils.ts +++ b/src/test/footPaths/utils/ultils.ts @@ -1,6 +1,6 @@ import { Ref } from "@typegoose/typegoose"; import { RefType } from "@typegoose/typegoose/lib/types"; -import { node } from "../../utils/Graph"; +import { node } from "../../../utils/Graph"; export type resolveCb = (value: T) => void; export type rejectCb = (reason?: any) => void; From 43c4cd79572b0b7a16ccfba8266dab99bdc60e12 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Sun, 16 Apr 2023 00:40:57 +0200 Subject: [PATCH 093/251] =?UTF-8?q?=F0=9F=8F=97=EF=B8=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/footPaths/computePath.ts | 4 ++-- src/test/footPaths/index.ts | 2 +- src/test/footPaths/test.ts | 16 ++++++++-------- .../{footPaths => }/models/FootGraph.model.ts | 0 .../models/NonScheduledRoutes.model.ts | 0 .../models/SNCF_schedules.model.ts | 0 .../{footPaths => }/models/SNCF_stops.model.ts | 0 .../models/TBMScheduledRoutes.model.ts | 0 .../{footPaths => }/models/TBM_lines.model.ts | 0 .../models/TBM_lines_routes.model.ts | 0 .../models/TBM_schedules.model.ts | 0 .../{footPaths => }/models/TBM_stops.model.ts | 0 .../{footPaths => }/models/TBM_trips.model.ts | 0 .../{footPaths => }/models/addresses.model.ts | 0 src/test/{footPaths => }/models/index.ts | 0 .../models/intersections.model.ts | 0 .../{footPaths => }/models/sections.model.ts | 0 src/test/{footPaths => }/utils/Link.ts | 0 src/test/{footPaths => }/utils/Queue.ts | 0 src/test/{footPaths => }/utils/TypedEmitter.ts | 0 src/test/{footPaths => }/utils/Workers.ts | 0 src/test/{footPaths => }/utils/benchmark.ts | 0 src/test/{footPaths => }/utils/mongoose.ts | 0 src/test/{footPaths => }/utils/ultils.ts | 2 +- 24 files changed, 12 insertions(+), 12 deletions(-) rename src/test/{footPaths => }/models/FootGraph.model.ts (100%) rename src/test/{footPaths => }/models/NonScheduledRoutes.model.ts (100%) rename src/test/{footPaths => }/models/SNCF_schedules.model.ts (100%) rename src/test/{footPaths => }/models/SNCF_stops.model.ts (100%) rename src/test/{footPaths => }/models/TBMScheduledRoutes.model.ts (100%) rename src/test/{footPaths => }/models/TBM_lines.model.ts (100%) rename src/test/{footPaths => }/models/TBM_lines_routes.model.ts (100%) rename src/test/{footPaths => }/models/TBM_schedules.model.ts (100%) rename src/test/{footPaths => }/models/TBM_stops.model.ts (100%) rename src/test/{footPaths => }/models/TBM_trips.model.ts (100%) rename src/test/{footPaths => }/models/addresses.model.ts (100%) rename src/test/{footPaths => }/models/index.ts (100%) rename src/test/{footPaths => }/models/intersections.model.ts (100%) rename src/test/{footPaths => }/models/sections.model.ts (100%) rename src/test/{footPaths => }/utils/Link.ts (100%) rename src/test/{footPaths => }/utils/Queue.ts (100%) rename src/test/{footPaths => }/utils/TypedEmitter.ts (100%) rename src/test/{footPaths => }/utils/Workers.ts (100%) rename src/test/{footPaths => }/utils/benchmark.ts (100%) rename src/test/{footPaths => }/utils/mongoose.ts (100%) rename src/test/{footPaths => }/utils/ultils.ts (96%) diff --git a/src/test/footPaths/computePath.ts b/src/test/footPaths/computePath.ts index 2f47e497..a165ee71 100644 --- a/src/test/footPaths/computePath.ts +++ b/src/test/footPaths/computePath.ts @@ -3,8 +3,8 @@ import { unpackGraphNode, WeightedGraph } from "../../utils/Graph"; import type { footGraphNodes, id } from "./test"; import { parentPort } from "worker_threads"; -import { benchmark } from "./utils/benchmark"; -import { approachedStopName } from "./utils/ultils"; +import { benchmark } from "../utils/benchmark"; +import { approachedStopName } from "../utils/ultils"; export interface initData { adj: Required>>[0]; diff --git a/src/test/footPaths/index.ts b/src/test/footPaths/index.ts index 71a27a2a..a46fb6fb 100644 --- a/src/test/footPaths/index.ts +++ b/src/test/footPaths/index.ts @@ -1,5 +1,5 @@ import { run } from "./test"; -import { benchmark } from "./utils/benchmark"; +import { benchmark } from "../utils/benchmark"; const args = process.argv.slice(2); const getFullPaths = JSON.parse(args[0]); diff --git a/src/test/footPaths/test.ts b/src/test/footPaths/test.ts index de77b750..6eb29f91 100644 --- a/src/test/footPaths/test.ts +++ b/src/test/footPaths/test.ts @@ -1,7 +1,7 @@ import { HydratedDocument } from "mongoose"; -import initDB from "./utils/mongoose"; -import { benchmark } from "./utils/benchmark"; -import { WorkerPool } from "./utils/Workers"; +import initDB from "../utils/mongoose"; +import { benchmark } from "../utils/benchmark"; +import { WorkerPool } from "../utils/Workers"; import { node, WeightedGraph } from "../../utils/Graph"; @@ -18,13 +18,13 @@ export type footGraphNodes = number | ReturnType; // Needed to solve "Reflect.getMetadata is not a function" error of typegoose import "@abraham/reflection"; -import sectionsModelInit, { dbSections } from "./models/sections.model"; -import stopsModelInit, { dbTBM_Stops } from "./models/TBM_stops.model"; +import sectionsModelInit, { dbSections } from "../models/sections.model"; +import stopsModelInit, { dbTBM_Stops } from "../models/TBM_stops.model"; import { computePath, initialCallback } from "./computePath"; import { DocumentType } from "@typegoose/typegoose"; -import { approachedStopName, euclidianDistance, Deferred, sectionId, unique, dbIntersectionId, dbSectionId, unpackRefType } from "./utils/ultils"; -import FootGraphModelInit, { dbFootGraphEdges, dbFootGraphNodes } from "./models/FootGraph.model"; -import NonScheduledRoutesModelInit, { dbFootPaths } from "./models/NonScheduledRoutes.model"; +import { approachedStopName, euclidianDistance, Deferred, sectionId, unique, dbIntersectionId, dbSectionId, unpackRefType } from "../utils/ultils"; +import FootGraphModelInit, { dbFootGraphEdges, dbFootGraphNodes } from "../models/FootGraph.model"; +import NonScheduledRoutesModelInit, { dbFootPaths } from "../models/NonScheduledRoutes.model"; import { KeyOfMap } from "../../utils"; import { DijkstraOptions } from "../../FootPaths"; diff --git a/src/test/footPaths/models/FootGraph.model.ts b/src/test/models/FootGraph.model.ts similarity index 100% rename from src/test/footPaths/models/FootGraph.model.ts rename to src/test/models/FootGraph.model.ts diff --git a/src/test/footPaths/models/NonScheduledRoutes.model.ts b/src/test/models/NonScheduledRoutes.model.ts similarity index 100% rename from src/test/footPaths/models/NonScheduledRoutes.model.ts rename to src/test/models/NonScheduledRoutes.model.ts diff --git a/src/test/footPaths/models/SNCF_schedules.model.ts b/src/test/models/SNCF_schedules.model.ts similarity index 100% rename from src/test/footPaths/models/SNCF_schedules.model.ts rename to src/test/models/SNCF_schedules.model.ts diff --git a/src/test/footPaths/models/SNCF_stops.model.ts b/src/test/models/SNCF_stops.model.ts similarity index 100% rename from src/test/footPaths/models/SNCF_stops.model.ts rename to src/test/models/SNCF_stops.model.ts diff --git a/src/test/footPaths/models/TBMScheduledRoutes.model.ts b/src/test/models/TBMScheduledRoutes.model.ts similarity index 100% rename from src/test/footPaths/models/TBMScheduledRoutes.model.ts rename to src/test/models/TBMScheduledRoutes.model.ts diff --git a/src/test/footPaths/models/TBM_lines.model.ts b/src/test/models/TBM_lines.model.ts similarity index 100% rename from src/test/footPaths/models/TBM_lines.model.ts rename to src/test/models/TBM_lines.model.ts diff --git a/src/test/footPaths/models/TBM_lines_routes.model.ts b/src/test/models/TBM_lines_routes.model.ts similarity index 100% rename from src/test/footPaths/models/TBM_lines_routes.model.ts rename to src/test/models/TBM_lines_routes.model.ts diff --git a/src/test/footPaths/models/TBM_schedules.model.ts b/src/test/models/TBM_schedules.model.ts similarity index 100% rename from src/test/footPaths/models/TBM_schedules.model.ts rename to src/test/models/TBM_schedules.model.ts diff --git a/src/test/footPaths/models/TBM_stops.model.ts b/src/test/models/TBM_stops.model.ts similarity index 100% rename from src/test/footPaths/models/TBM_stops.model.ts rename to src/test/models/TBM_stops.model.ts diff --git a/src/test/footPaths/models/TBM_trips.model.ts b/src/test/models/TBM_trips.model.ts similarity index 100% rename from src/test/footPaths/models/TBM_trips.model.ts rename to src/test/models/TBM_trips.model.ts diff --git a/src/test/footPaths/models/addresses.model.ts b/src/test/models/addresses.model.ts similarity index 100% rename from src/test/footPaths/models/addresses.model.ts rename to src/test/models/addresses.model.ts diff --git a/src/test/footPaths/models/index.ts b/src/test/models/index.ts similarity index 100% rename from src/test/footPaths/models/index.ts rename to src/test/models/index.ts diff --git a/src/test/footPaths/models/intersections.model.ts b/src/test/models/intersections.model.ts similarity index 100% rename from src/test/footPaths/models/intersections.model.ts rename to src/test/models/intersections.model.ts diff --git a/src/test/footPaths/models/sections.model.ts b/src/test/models/sections.model.ts similarity index 100% rename from src/test/footPaths/models/sections.model.ts rename to src/test/models/sections.model.ts diff --git a/src/test/footPaths/utils/Link.ts b/src/test/utils/Link.ts similarity index 100% rename from src/test/footPaths/utils/Link.ts rename to src/test/utils/Link.ts diff --git a/src/test/footPaths/utils/Queue.ts b/src/test/utils/Queue.ts similarity index 100% rename from src/test/footPaths/utils/Queue.ts rename to src/test/utils/Queue.ts diff --git a/src/test/footPaths/utils/TypedEmitter.ts b/src/test/utils/TypedEmitter.ts similarity index 100% rename from src/test/footPaths/utils/TypedEmitter.ts rename to src/test/utils/TypedEmitter.ts diff --git a/src/test/footPaths/utils/Workers.ts b/src/test/utils/Workers.ts similarity index 100% rename from src/test/footPaths/utils/Workers.ts rename to src/test/utils/Workers.ts diff --git a/src/test/footPaths/utils/benchmark.ts b/src/test/utils/benchmark.ts similarity index 100% rename from src/test/footPaths/utils/benchmark.ts rename to src/test/utils/benchmark.ts diff --git a/src/test/footPaths/utils/mongoose.ts b/src/test/utils/mongoose.ts similarity index 100% rename from src/test/footPaths/utils/mongoose.ts rename to src/test/utils/mongoose.ts diff --git a/src/test/footPaths/utils/ultils.ts b/src/test/utils/ultils.ts similarity index 96% rename from src/test/footPaths/utils/ultils.ts rename to src/test/utils/ultils.ts index 97588071..f759acc2 100644 --- a/src/test/footPaths/utils/ultils.ts +++ b/src/test/utils/ultils.ts @@ -1,6 +1,6 @@ import { Ref } from "@typegoose/typegoose"; import { RefType } from "@typegoose/typegoose/lib/types"; -import { node } from "../../../utils/Graph"; +import { node } from "../../utils/Graph"; export type resolveCb = (value: T) => void; export type rejectCb = (reason?: any) => void; From b33d3f0def36433cd0f7022f35462406daf71497 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Sun, 16 Apr 2023 02:24:07 +0200 Subject: [PATCH 094/251] =?UTF-8?q?=F0=9F=90=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/models/TBMScheduledRoutes.model.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/models/TBMScheduledRoutes.model.ts b/src/test/models/TBMScheduledRoutes.model.ts index ca6ec1dd..3bd67fc6 100644 --- a/src/test/models/TBMScheduledRoutes.model.ts +++ b/src/test/models/TBMScheduledRoutes.model.ts @@ -6,7 +6,7 @@ import { TimeStamps } from "@typegoose/typegoose/lib/defaultClasses"; import { addModelToTypegoose, buildSchema, deleteModelWithClass, getModelForClass, prop, Ref } from "@typegoose/typegoose"; import { modelOptions } from "@typegoose/typegoose/lib/modelOptions"; import { getName } from "@typegoose/typegoose/lib/internal/utils"; -import { dbTBM_Schedules } from "./TBM_schedules.model"; +import { dbTBM_Schedules_rt } from "./TBM_schedules.model"; import { dbTBM_Stops } from "./TBM_stops.model"; import { TBMEndpoints } from "."; import { Mongoose } from "mongoose"; @@ -16,8 +16,8 @@ export class TripOfScheduledRoute { @prop({ required: true }) public tripId!: number; - @prop({ required: true, ref: () => dbTBM_Schedules }) - public schedules!: Ref[]; + @prop({ required: true, ref: () => dbTBM_Schedules_rt }) + public schedules!: Ref[]; } @modelOptions({ options: { customName: TBMEndpoints.ScheduledRoutes } }) From 6d4e273ae61b7138149f0c96ca8684f5c33385a0 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Sun, 16 Apr 2023 02:26:29 +0200 Subject: [PATCH 095/251] =?UTF-8?q?=E2=9C=A8=20binarySearch=20&=20binaryFi?= =?UTF-8?q?lter,=20complete=20unpackRefType?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/utils/ultils.ts | 48 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/src/test/utils/ultils.ts b/src/test/utils/ultils.ts index f759acc2..891a3d92 100644 --- a/src/test/utils/ultils.ts +++ b/src/test/utils/ultils.ts @@ -28,6 +28,12 @@ export type unpackRefType = T extends Ref } ? D["_id"] : never + : T extends Ref[] + ? D extends { + _id?: RefType; + } + ? D["_id"][] + : never : never; /** Ensure unique node id for approachedStop (as(approached stop)={stop id}) */ @@ -53,3 +59,45 @@ export function sectionId(v: T, i: number, arr: T[]): boolean { return arr.indexOf(v) === i; } + +/** + * @description Search for a value in a **sorted** array, in O(log2(n)). + * @param arr The **sorted** array where performing the search + * @param el The element to look for, which will be compared + * @param compare A compare function that takes 2 arguments : `a` el and `b` an element of the array. + * It returns : + * - a negative number if `a` is before `b`; + * - 0 if `a` is equal to `b`; + * - a positive number of `a` is after `b`. + * @returns The index of el if positive ; index of insertion if negative + */ +export function binarySearch(arr: T[], el: C, compare: (a: C, b: T) => number) { + let low = 0; + let high = arr.length - 1; + while (low <= high) { + const mid = (high + low) >> 1; // x >> 1 == Math.floor(x/2) + const cmp = compare(el, arr[mid]); + if (cmp > 0) { + low = mid + 1; + } else if (cmp < 0) { + high = mid - 1; + } else { + return mid; + } + } + return ~low; // ~x == -x-1 +} + +export function binaryFilter(arr: T[], el: C, compare: (a: C, b: T) => number): T[] { + const binarySearchResult = binarySearch(arr, el, compare); + if (binarySearchResult < 0) return []; + let low = binarySearchResult; + while (compare(el, arr[low]) === 0) { + low--; + } + let high = binarySearchResult; + while (compare(el, arr[high]) === 0) { + high--; + } + return arr.slice(low, high + 1); +} From c4b3938e35a700919a760a3941fabac4660ea622 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Sun, 16 Apr 2023 03:26:17 +0200 Subject: [PATCH 096/251] =?UTF-8?q?=F0=9F=90=9B=20binaryFilter?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/utils/ultils.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/utils/ultils.ts b/src/test/utils/ultils.ts index 891a3d92..f7630888 100644 --- a/src/test/utils/ultils.ts +++ b/src/test/utils/ultils.ts @@ -92,12 +92,12 @@ export function binaryFilter(arr: T[], el: C, compare: (a: C, b: T) => num const binarySearchResult = binarySearch(arr, el, compare); if (binarySearchResult < 0) return []; let low = binarySearchResult; - while (compare(el, arr[low]) === 0) { + while (low >= 0 && compare(el, arr[low]) === 0) { low--; } let high = binarySearchResult; - while (compare(el, arr[high]) === 0) { - high--; + while (high < arr.length && compare(el, arr[high]) === 0) { + high++; } return arr.slice(low, high + 1); } From bd1411a78eaa1f00f19bc2cca59fa2be890a1e8c Mon Sep 17 00:00:00 2001 From: Catatomik Date: Sun, 16 Apr 2023 03:52:48 +0200 Subject: [PATCH 097/251] =?UTF-8?q?=E2=9C=A8=20Main=20RAPTOR=20test?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/index.ts | 133 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 src/test/index.ts diff --git a/src/test/index.ts b/src/test/index.ts new file mode 100644 index 00000000..7b726b1f --- /dev/null +++ b/src/test/index.ts @@ -0,0 +1,133 @@ +import initDB from "./utils/mongoose"; + +// Needed to solve "Reflect.getMetadata is not a function" error of typegoose +import "@abraham/reflection"; + +import stopsModelInit, { dbTBM_Stops } from "./models/TBM_stops.model"; +import TBMSchedulesModelInit from "./models/TBM_schedules.model"; +import TBMScheduledRoutesModelInit, { dbTBM_ScheduledRoutes } from "./models/TBMScheduledRoutes.model"; +import NonScheduledRoutesModelInit, { dbFootPaths } from "./models/NonScheduledRoutes.model"; +import RAPTOR from "../main"; +import { HydratedDocument } from "mongoose"; +import { DocumentType, isDocument } from "@typegoose/typegoose"; +import { binaryFilter, unpackRefType } from "./utils/ultils"; +import { stopId } from "../utils/Structures"; +import { benchmark } from "./utils/benchmark"; + +// Main IIFE test function +(async () => { + const db = await initDB(); + const stopsModel = stopsModelInit(db); + TBMSchedulesModelInit(db); + const TBMScheduledRoutesModel = TBMScheduledRoutesModelInit(db); + const NonScheduledRoutesModel = NonScheduledRoutesModelInit(db); + + async function queryData() { + const dbScheduledRoutesProjection: Partial> = { _id: 1, stops: 1, trips: 1 }; + type dbScheduledRoute = Pick; + type ScheduledRoutesOverwritten = { + stops: unpackRefType; + }; + type ScheduledRoute = Omit & ScheduledRoutesOverwritten; + + const dbScheduledRoutes = (await TBMScheduledRoutesModel.find>>({}, dbScheduledRoutesProjection) + .populate("trips.schedules") + .lean() + .exec()) as ScheduledRoute[]; + + const dbStopProjection = { _id: 1, coords: 1 }; + type Stop = Pick; + + const dbStops = (await stopsModel + .find>>( + { + $and: [{ coords: { $not: { $elemMatch: { $eq: Infinity } } } }], + }, + dbStopProjection, + ) + .lean() + // Coords field type lost... + .exec()) as unknown as Stop[]; + + const dbNonScheduledRoutesProjection: Partial> = { from: 1, to: 1, distance: 1 }; + type dbNonScheduledRoute = Pick; + type NonScheduledRoutesOverwritten = { + from: unpackRefType; + to: unpackRefType; + }; + type NonScheduledRoute = Omit & NonScheduledRoutesOverwritten; + + const dbNonScheduledRoutes = (await NonScheduledRoutesModel.find>>( + {}, + dbNonScheduledRoutesProjection, + ) + .sort({ from: 1 }) + .lean() + // Coords field type lost... + .exec()) as NonScheduledRoute[]; + + return { dbScheduledRoutes, dbStops, dbNonScheduledRoutes }; + } + const b1 = await benchmark(queryData, []); + console.log("b1 ended"); + if (!b1.lastReturn) throw `b1 return null`; + const { dbScheduledRoutes, dbStops, dbNonScheduledRoutes } = b1.lastReturn; + + function createRAPTOR() { + const RAPTORInstance = new RAPTOR( + dbStops.map(({ _id, coords }) => [ + _id, + ...coords, + dbScheduledRoutes.filter((ScheduledRoute) => ScheduledRoute.stops.find((stopId) => stopId === _id)).map(({ _id }) => _id), + binaryFilter(dbNonScheduledRoutes, _id, (stopFrom, NonScheduledRoute) => stopFrom - NonScheduledRoute.from).map(({ to, distance }) => ({ + to, + length: distance, + })), + ]), + dbScheduledRoutes.map(({ _id, stops, trips }) => [ + _id, + [ + stops, + trips.map(({ tripId, schedules }) => ({ + id: tripId, + times: schedules.map((schedule) => + "hor_estime" in schedule ? [schedule.hor_estime.getTime(), schedule.hor_estime.getTime()] : [Infinity, Infinity], + ), + })), + ], + ]), + ); + + return { RAPTORInstance }; + } + const b2 = await benchmark(createRAPTOR, []); + console.log("b2 ended"); + if (!b2.lastReturn) throw `b2 return null`; + const { RAPTORInstance } = b2.lastReturn; + + //From "Les Harmonies" to "Peixotto" + const ps: stopId = 128738; + const pt: stopId = 126798; + + let minSchedule: number = Infinity; + for (const schedule of dbScheduledRoutes.flatMap(({ trips }) => trips.flatMap(({ schedules }) => schedules))) { + if ("hor_estime" in schedule && schedule.hor_estime.getTime() < minSchedule) minSchedule = schedule.hor_estime.getTime(); + } + + function runRAPTOR() { + RAPTORInstance.run(ps, pt, minSchedule, { walkSpeed: 8 }); + + return true as const; + } + const b3 = await benchmark(runRAPTOR, []); + console.log("b3 ended"); + if (!b3.lastReturn) throw `b3 return null`; + + function resultRAPTOR() { + return RAPTORInstance.getBestJourney(ps, pt); + } + const b4 = await benchmark(resultRAPTOR, []); + console.log("b4 ended"); + if (!b4.lastReturn) throw `b4 return null`; + return b4.lastReturn; +})().then(console.log); From 73b2d0fa9fd24e6871cfe51dad5bd7799a2f9aab Mon Sep 17 00:00:00 2001 From: Catatomik Date: Fri, 5 May 2023 20:39:50 +0200 Subject: [PATCH 098/251] =?UTF-8?q?=F0=9F=90=9B=20walkDuration=20&=20foot-?= =?UTF-8?q?paths=20lookup?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main.ts b/src/main.ts index 896f490e..0ea440af 100644 --- a/src/main.ts +++ b/src/main.ts @@ -50,10 +50,11 @@ export default class RAPTOR { /** * @param length Length of the path. - * @param walkSpeed Walk speed, in ms/km + * @param walkSpeed Walk speed, in m/s + * @returns Duration in ms */ protected walkDuration(length: number, walkSpeed: number): number { - return length * walkSpeed; + return length / walkSpeed * 1000; } /** @@ -148,7 +149,7 @@ export default class RAPTOR { } //Look at foot-paths - for (const p of Q.values()) { + for (const p of Marked) { const stop = this.stops.get(p); if (stop === undefined) continue; From d1bb0489b36179a5fcf40ccdd5e35052aa6dae20 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Sat, 20 May 2023 17:32:32 +0200 Subject: [PATCH 099/251] =?UTF-8?q?=F0=9F=9A=A7=20Add=20MAX=5FSAFE=5FTIMES?= =?UTF-8?q?TAMP=20coming=20from=20raw=20data?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/utils/Structures.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/Structures.ts b/src/utils/Structures.ts index 36cb7faa..d5d31590 100644 --- a/src/utils/Structures.ts +++ b/src/utils/Structures.ts @@ -2,7 +2,7 @@ export type timestamp = number; export type Id = number | string; -export const MAX_SAFE_TIMESTAMP: timestamp = 8_640_000_000_000_000 +export const MAX_SAFE_TIMESTAMP: timestamp = 8_640_000_000_000_000; /** * @description A Trip, i.e. a succession of stop times. From f62fd109ea6c5612d062c45e3edbb79b41231c71 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Sat, 20 May 2023 17:42:52 +0200 Subject: [PATCH 100/251] =?UTF-8?q?=F0=9F=9A=A7=20Prevent=20using=20non-nu?= =?UTF-8?q?ll=20assertion=20operator?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.ts b/src/main.ts index 0ea440af..a2797999 100644 --- a/src/main.ts +++ b/src/main.ts @@ -115,7 +115,7 @@ export default class RAPTOR { for (const r of connectedRoutes) { const p2 = Q.get(r); if (p2) { - if (this.routes.get(r)!.stops.indexOf(p) < this.routes.get(r)!.stops.indexOf(p2)) Q.set(r, p); + if ((this.routes.get(r)?.stops ?? []).indexOf(p) < (this.routes.get(r)?.stops ?? []).indexOf(p2)) Q.set(r, p); } else Q.set(r, p); } From 8398f46b69f856849e95aa068ef539b0417720ed Mon Sep 17 00:00:00 2001 From: Catatomik Date: Sat, 20 May 2023 17:43:56 +0200 Subject: [PATCH 101/251] =?UTF-8?q?=E2=9A=A1=20Directly=20use=20route=20in?= =?UTF-8?q?=20`et`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main.ts | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/main.ts b/src/main.ts index a2797999..276ded24 100644 --- a/src/main.ts +++ b/src/main.ts @@ -64,14 +64,11 @@ export default class RAPTOR { * @param k Current round. * @returns The earliest {@link Trip} on the route (and its index) r at the stop p, or null if no one is catchable. */ - protected et(r: routeId, p: stopId, k: number): [Trip, number] | null { - const route = this.routes.get(r); - - if (route === undefined) return null; - - for (let t: number = 0; t < route.trips.length; t++) { + protected et(route: Route, p: stopId, k: number): [Trip, number] | null { + for (let t = 0; t < route.trips.length; t++) { //Catchable - if (route.departureTime(t, p) < MAX_SAFE_TIMESTAMP && route.departureTime(t, p) >= (this.multiLabel[k - 1].get(p)?.time ?? Infinity)) return [route.trips[t], t]; + let tDep = route.departureTime(t, p); + if (tDep < MAX_SAFE_TIMESTAMP && tDep >= (this.multiLabel[k - 1].get(p)?.time ?? Infinity)) return [route.trips[t], t]; } return null; } @@ -144,7 +141,7 @@ export default class RAPTOR { } //Catch an earlier trip at pi ? - t = this.et(r, pi, k) ?? t; + t = this.et(route, pi, k) ?? t; } } From 7bb2ece27086b471b88fb8b8c83408a86e23426a Mon Sep 17 00:00:00 2001 From: Catatomik Date: Sat, 20 May 2023 17:45:53 +0200 Subject: [PATCH 102/251] =?UTF-8?q?=F0=9F=90=9B=20Prevent=20instant=20foot?= =?UTF-8?q?-transfers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Input data should fix this by omitting (p,p) transfer --- src/main.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main.ts b/src/main.ts index 276ded24..8b6aa76b 100644 --- a/src/main.ts +++ b/src/main.ts @@ -151,6 +151,7 @@ export default class RAPTOR { if (stop === undefined) continue; for (const transfer of stop.transfers) { + if (transfer.to === p) continue; const arrivalTime: timestamp = (this.multiLabel[k].get(p)?.time ?? Infinity) + this.walkDuration(transfer.length, settings.walkSpeed); if (arrivalTime < (this.multiLabel[k].get(transfer.to)?.time ?? Infinity)) From 7bd6e44845e6cceed34780a6abec0892a24de17b Mon Sep 17 00:00:00 2001 From: Catatomik Date: Sat, 20 May 2023 17:46:36 +0200 Subject: [PATCH 103/251] =?UTF-8?q?=F0=9F=90=9B=20Wrong=20stopping=20crite?= =?UTF-8?q?rion?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.ts b/src/main.ts index 8b6aa76b..c4bbdeb6 100644 --- a/src/main.ts +++ b/src/main.ts @@ -161,7 +161,7 @@ export default class RAPTOR { } //Stopping criterion - if (Q.size === 0) break; + if (Marked.size === 0) break; } } From c8142a6c75a2ced765b7b5741747ecdf4be21956 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Sat, 20 May 2023 17:49:03 +0200 Subject: [PATCH 104/251] =?UTF-8?q?=F0=9F=90=9B=20Fix=20back=20tracing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main.ts b/src/main.ts index c4bbdeb6..fdcd7e89 100644 --- a/src/main.ts +++ b/src/main.ts @@ -167,22 +167,22 @@ export default class RAPTOR { getBestJourney(ps: stopId, pt: stopId, rounds: number = RAPTOR.defaultRounds): Label<"FIRST" | "TRANSFER" | "FULL">[] { let journey: Label<"FIRST" | "TRANSFER" | "FULL">[] = []; - let previousStop: stopId | null = pt; - if (rounds > this.multiLabel.length) throw new Error(`Current RAPTOR didn't ran with ${rounds} rounds.`) + if (rounds > this.multiLabel.length) throw new Error(`Current RAPTOR didn't ran with ${rounds} rounds.`); - while (previousStop != null) { + let previousStop: stopId | null = pt; + while (previousStop != ps) { const previousLabel = this.multiLabel[rounds - 1].get(previousStop); if (!previousLabel || previousLabel.time >= MAX_SAFE_TIMESTAMP) throw new Error(`Journey is not possible to ${pt}.`); - journey = [previousLabel, ...journey]; if ("boardedAt" in previousLabel) { // Cyclic - if (previousLabel.boardedAt === previousStop) throw new Error(`Journey is not possible to ${pt}.`); + if (journey.find((j) => "boardedAt" in j && j.boardedAt === previousLabel.boardedAt)) + throw new Error(`Journey is not possible to ${pt} (cyclic).`); previousStop = previousLabel.boardedAt; - } - else if (previousStop != ps) throw new Error(`Journey is not possible to ${pt}.`); - else previousStop = null; + } else throw new Error(`Journey is not possible to ${pt} (unreachable).`); + + journey = [previousLabel, ...journey]; } return journey; From d426b59ba9978dd7f44b9a78a9a5390e282501d1 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Sat, 20 May 2023 17:57:11 +0200 Subject: [PATCH 105/251] =?UTF-8?q?=F0=9F=9A=A7=F0=9F=90=9B=20Partially=20?= =?UTF-8?q?fix=20getBestJourney?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.ts b/src/main.ts index fdcd7e89..538e1230 100644 --- a/src/main.ts +++ b/src/main.ts @@ -177,7 +177,7 @@ export default class RAPTOR { if ("boardedAt" in previousLabel) { // Cyclic - if (journey.find((j) => "boardedAt" in j && j.boardedAt === previousLabel.boardedAt)) + if (journey.find((j) => "boardedAt" in j && j.boardedAt === previousLabel.boardedAt && j.time === previousLabel.time)) throw new Error(`Journey is not possible to ${pt} (cyclic).`); previousStop = previousLabel.boardedAt; } else throw new Error(`Journey is not possible to ${pt} (unreachable).`); From a304bdecbd6370cfde6db36368e6f566830eeb39 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Sat, 20 May 2023 17:58:37 +0200 Subject: [PATCH 106/251] =?UTF-8?q?=F0=9F=8E=A8=20Prettier?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main.ts b/src/main.ts index 538e1230..0801181f 100644 --- a/src/main.ts +++ b/src/main.ts @@ -54,7 +54,7 @@ export default class RAPTOR { * @returns Duration in ms */ protected walkDuration(length: number, walkSpeed: number): number { - return length / walkSpeed * 1000; + return (length / walkSpeed) * 1000; } /** @@ -156,6 +156,7 @@ export default class RAPTOR { if (arrivalTime < (this.multiLabel[k].get(transfer.to)?.time ?? Infinity)) this.multiLabel[k].set(transfer.to, { boardedAt: p, transferId: p, time: arrivalTime }); + Marked.add(transfer.to); } } From 40741dd7db48fa5e6d68da16e17c135ff7cf36b0 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Sat, 20 May 2023 18:04:55 +0200 Subject: [PATCH 107/251] =?UTF-8?q?=E2=9E=95=20Add=20linting?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .eslintrc.cjs | 7 + package-lock.json | 1521 ++++++++++++++++++++++++++++++++++++++++++++- package.json | 8 +- 3 files changed, 1506 insertions(+), 30 deletions(-) create mode 100644 .eslintrc.cjs diff --git a/.eslintrc.cjs b/.eslintrc.cjs new file mode 100644 index 00000000..cc9c0012 --- /dev/null +++ b/.eslintrc.cjs @@ -0,0 +1,7 @@ +/* eslint-env node */ +module.exports = { + extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended'], + parser: '@typescript-eslint/parser', + plugins: ['@typescript-eslint'], + root: true, +}; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index dfdc4359..59c716aa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,11 +12,12 @@ "@abraham/reflection": "^0.12.0", "@typegoose/typegoose": "^10.2.0-beta.3", "@tyriar/fibonacci-heap": "^2.0.9", - "mongodb": "^5.0.1", - "proj4": "^2.8.1" + "mongodb": "^5.0.1" }, "devDependencies": { - "@types/proj4": "^2.5.2", + "@typescript-eslint/eslint-plugin": "^5.59.6", + "@typescript-eslint/parser": "^5.59.6", + "eslint": "^8.41.0", "prettier": "^2.8.4", "ts-node": "^10.9.1", "typescript": "^4.9.5" @@ -1172,6 +1173,95 @@ "node": ">=12" } }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", + "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", + "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.5.2", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.41.0.tgz", + "integrity": "sha512-LxcyMGxwmTh2lY9FwHPGWOHmYFCZvbrFCBZL4FzSSsxsRPuhrYUg/49/0KDfW8tnIEaEHtfmn6+NPN+1DqaNmA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.0", "dev": true, @@ -1194,6 +1284,41 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/@tsconfig/node10": { "version": "1.0.9", "dev": true, @@ -1232,14 +1357,20 @@ "mongoose": "~6.9.0" } }, + "node_modules/@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, "node_modules/@types/node": { "version": "18.11.18", "license": "MIT" }, - "node_modules/@types/proj4": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@types/proj4/-/proj4-2.5.2.tgz", - "integrity": "sha512-/Nmfn9p08yaYw6xo5f2b0L+2oHk2kZeOkp5v+4VCeNfq+ETlLQbmHmC97/pjDIEZy8jxwz7pdPpwNzDHM5cuJw==", + "node_modules/@types/semver": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", "dev": true }, "node_modules/@types/webidl-conversions": { @@ -1256,6 +1387,194 @@ "@types/webidl-conversions": "*" } }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.59.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.6.tgz", + "integrity": "sha512-sXtOgJNEuRU5RLwPUb1jxtToZbgvq3M6FPpY4QENxoOggK+UpTxUBpj6tD8+Qh2g46Pi9We87E+eHnUw8YcGsw==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.59.6", + "@typescript-eslint/type-utils": "5.59.6", + "@typescript-eslint/utils": "5.59.6", + "debug": "^4.3.4", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.59.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.6.tgz", + "integrity": "sha512-7pCa6al03Pv1yf/dUg/s1pXz/yGMUBAw5EeWqNTFiSueKvRNonze3hma3lhdsOrQcaOXhbk5gKu2Fludiho9VA==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.59.6", + "@typescript-eslint/types": "5.59.6", + "@typescript-eslint/typescript-estree": "5.59.6", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.59.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.6.tgz", + "integrity": "sha512-gLbY3Le9Dxcb8KdpF0+SJr6EQ+hFGYFl6tVY8VxLPFDfUZC7BHFw+Vq7bM5lE9DwWPfx4vMWWTLGXgpc0mAYyQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.59.6", + "@typescript-eslint/visitor-keys": "5.59.6" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.59.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.6.tgz", + "integrity": "sha512-A4tms2Mp5yNvLDlySF+kAThV9VTBPCvGf0Rp8nl/eoDX9Okun8byTKoj3fJ52IJitjWOk0fKPNQhXEB++eNozQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "5.59.6", + "@typescript-eslint/utils": "5.59.6", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.59.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.6.tgz", + "integrity": "sha512-tH5lBXZI7T2MOUgOWFdVNUILsI02shyQvfzG9EJkoONWugCG77NDDa1EeDGw7oJ5IvsTAAGVV8I3Tk2PNu9QfA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.59.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.6.tgz", + "integrity": "sha512-vW6JP3lMAs/Tq4KjdI/RiHaaJSO7IUsbkz17it/Rl9Q+WkQ77EOuOnlbaU8kKfVIOJxMhnRiBG+olE7f3M16DA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.59.6", + "@typescript-eslint/visitor-keys": "5.59.6", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.59.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.6.tgz", + "integrity": "sha512-vzaaD6EXbTS29cVH0JjXBdzMt6VBlv+hE31XktDRMX1j3462wZCJa7VzO2AxXEXcIl8GQqZPcOPuW/Z1tZVogg==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.59.6", + "@typescript-eslint/types": "5.59.6", + "@typescript-eslint/typescript-estree": "5.59.6", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.59.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.6.tgz", + "integrity": "sha512-zEfbFLzB9ETcEJ4HZEEsCR9HHeNku5/Qw1jSS5McYJv5BR+ftYXwFFAH5Al+xkGaZEqowMwl7uoJjQb1YSPF8Q==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.59.6", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@tyriar/fibonacci-heap": { "version": "2.0.9", "license": "MIT" @@ -1271,6 +1590,15 @@ "node": ">=0.4.0" } }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, "node_modules/acorn-walk": { "version": "8.2.0", "dev": true, @@ -1279,11 +1607,72 @@ "node": ">=0.4.0" } }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/arg": { "version": "4.1.3", "dev": true, "license": "MIT" }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -1311,6 +1700,28 @@ "optional": true, "peer": true }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/bson": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/bson/-/bson-5.0.1.tgz", @@ -1343,16 +1754,78 @@ "ieee754": "^1.1.13" } }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, "node_modules/create-require": { "version": "1.1.1", "dev": true, "license": "MIT" }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "peer": true, "dependencies": { "ms": "2.1.2" }, @@ -1368,8 +1841,13 @@ "node_modules/debug/node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "peer": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true }, "node_modules/diff": { "version": "4.0.2", @@ -1379,6 +1857,271 @@ "node": ">=0.3.1" } }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.41.0.tgz", + "integrity": "sha512-WQDQpzGBOP5IrXPo4Hc0814r4/v2rrIsB0rhT7jtunIalgg6gYXWhRMOejVO8yH21T/FGaxjmFjBMNqcIlmH1Q==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.3", + "@eslint/js": "8.41.0", + "@humanwhocodes/config-array": "^0.11.8", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.1", + "espree": "^9.5.2", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/espree": { + "version": "9.5.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", + "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", + "dev": true, + "dependencies": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, "node_modules/fast-xml-parser": { "version": "4.0.11", "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.0.11.tgz", @@ -1396,6 +2139,168 @@ "url": "https://paypal.me/naturalintelligence" } }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -1416,11 +2321,130 @@ ], "peer": true }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, "node_modules/ip": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, "node_modules/kareem": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.5.1.tgz", @@ -1430,11 +2454,45 @@ "node": ">=12.0.0" } }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, "node_modules/loglevel": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.1.tgz", @@ -1469,10 +2527,39 @@ "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", "optional": true }, - "node_modules/mgrs": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mgrs/-/mgrs-1.0.0.tgz", - "integrity": "sha512-awNbTOqCxK1DBGjalK3xqWIstBZgN6fxsMSiXLs9/spqWkF2pAhb2rrYCFSsr1/tT7PhcDGjZndG8SWYn0byYA==" + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } }, "node_modules/mongodb": { "version": "5.0.1", @@ -1594,6 +2681,143 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "peer": true }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/prettier": { "version": "2.8.4", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.4.tgz", @@ -1609,15 +2833,6 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "node_modules/proj4": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/proj4/-/proj4-2.8.1.tgz", - "integrity": "sha512-KK/bgM6oIwxdpeCaJ/JK3V1D8LMQCKKKzndab4/pYQNd+NVKTcddUNtds053Q110GxTALXVjx98L9f5q8xPVXQ==", - "dependencies": { - "mgrs": "1.0.0", - "wkt-parser": "^1.3.1" - } - }, "node_modules/punycode": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", @@ -1626,11 +2841,88 @@ "node": ">=6" } }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/reflect-metadata": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, "node_modules/saslprep": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", @@ -1657,12 +2949,42 @@ "node": ">=10" } }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/sift": { "version": "16.0.1", "resolved": "https://registry.npmjs.org/sift/-/sift-16.0.1.tgz", "integrity": "sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ==", "peer": true }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/smart-buffer": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", @@ -1694,6 +3016,30 @@ "memory-pager": "^1.0.2" } }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/strnum": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", @@ -1701,6 +3047,36 @@ "optional": true, "peer": true }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/tr46": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", @@ -1760,6 +3136,51 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/typescript": { "version": "4.9.5", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", @@ -1773,6 +3194,15 @@ "node": ">=4.2.0" } }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, "node_modules/uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", @@ -1808,10 +3238,35 @@ "node": ">=12" } }, - "node_modules/wkt-parser": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/wkt-parser/-/wkt-parser-1.3.2.tgz", - "integrity": "sha512-A26BOOo7sHAagyxG7iuRhnKMO7Q3mEOiOT4oGUmohtN/Li5wameeU4S6f8vWw6NADTVKljBs8bzA8JPQgSEMVQ==" + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true }, "node_modules/yallist": { "version": "4.0.0", @@ -1825,6 +3280,18 @@ "engines": { "node": ">=6" } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } } } } diff --git a/package.json b/package.json index 667d0969..4e40ac84 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,7 @@ "scripts": { "build": "tsc", "prettier": "npx prettier \"**/*.ts\" --write", + "lint": "eslint ./src/", "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", @@ -14,11 +15,12 @@ "@abraham/reflection": "^0.12.0", "@typegoose/typegoose": "^10.2.0-beta.3", "@tyriar/fibonacci-heap": "^2.0.9", - "mongodb": "^5.0.1", - "proj4": "^2.8.1" + "mongodb": "^5.0.1" }, "devDependencies": { - "@types/proj4": "^2.5.2", + "@typescript-eslint/eslint-plugin": "^5.59.6", + "@typescript-eslint/parser": "^5.59.6", + "eslint": "^8.41.0", "prettier": "^2.8.4", "ts-node": "^10.9.1", "typescript": "^4.9.5" From cb92fb8e84ad2c2ccc0100479a55c3d63ae8080c Mon Sep 17 00:00:00 2001 From: Catatomik Date: Sat, 20 May 2023 19:00:46 +0200 Subject: [PATCH 108/251] =?UTF-8?q?=F0=9F=9A=A7=20Fix=20linter=20errors?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/FootPaths.ts | 7 +++++- src/main.ts | 3 ++- src/test/footPaths/computePath.ts | 10 ++++++-- src/test/footPaths/test.ts | 5 ++-- src/test/utils/Link.ts | 39 ++++++++++++++++--------------- src/test/utils/Workers.ts | 4 +++- src/test/utils/benchmark.ts | 7 +++--- src/test/utils/ultils.ts | 2 +- src/utils/Graph.ts | 7 +++--- src/utils/Vector.ts | 4 ++-- 10 files changed, 53 insertions(+), 35 deletions(-) diff --git a/src/FootPaths.ts b/src/FootPaths.ts index 1accf2ae..12df1a66 100644 --- a/src/FootPaths.ts +++ b/src/FootPaths.ts @@ -1,4 +1,4 @@ -import { node, nodeOrNullNode, nullNode, unpackGraphNode, WeightedGraph } from "./utils/Graph"; +import { node, nodeOrNullNode, nullNode, WeightedGraph } from "./utils/Graph"; import { FibonacciHeap, INode } from "@tyriar/fibonacci-heap"; export type path = N[]; @@ -57,19 +57,24 @@ export function Dijkstra>( } while (!Q.isEmpty()) { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion const min = Q.extractMinimum()!; // Can't be null otherwise Q is empty + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion QMapping.set(min.value!, null); if (t !== undefined && min.value === t) break; + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion for (const v of G.neighborsIterator(min.value!) ?? []) { /**@description New alternative distance found from min, from a + (a,b) instead of b */ + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion const alt = min.key + G.weight(min.value!, v); if (O && alt > O.maxCumulWeight) continue; if (alt < (dist.get(v) ?? Infinity)) { dist.set(v, alt); + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion prev.set(v, min.value!); const vINode = QMapping.get(v); if (vINode != null) Q.decreaseKey(vINode, alt); diff --git a/src/main.ts b/src/main.ts index 0801181f..8c0f3a0f 100644 --- a/src/main.ts +++ b/src/main.ts @@ -67,7 +67,7 @@ export default class RAPTOR { protected et(route: Route, p: stopId, k: number): [Trip, number] | null { for (let t = 0; t < route.trips.length; t++) { //Catchable - let tDep = route.departureTime(t, p); + const tDep = route.departureTime(t, p); if (tDep < MAX_SAFE_TIMESTAMP && tDep >= (this.multiLabel[k - 1].get(p)?.time ?? Infinity)) return [route.trips[t], t]; } return null; @@ -123,6 +123,7 @@ export default class RAPTOR { for (const [r, p] of Q) { let t: [Trip, number] | null = null; + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion const route: Route = this.routes.get(r)!; for (let i = route.stops.indexOf(p); i < route.stops.length; i++) { diff --git a/src/test/footPaths/computePath.ts b/src/test/footPaths/computePath.ts index a165ee71..e2fd85ef 100644 --- a/src/test/footPaths/computePath.ts +++ b/src/test/footPaths/computePath.ts @@ -48,7 +48,9 @@ export async function computePath( for (const stopId of stops) { const targetNode = approachedStopName(stopId); + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion if (dist.get(targetNode) !== undefined && dist.get(targetNode)! < Infinity && sourceStopId !== targetNode && !computedStops.has(stopId)) + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion sourcePaths.set(stopId, [returnPaths ? tracePath(prev, targetNode) : [], dist.get(targetNode)!]); } @@ -65,7 +67,8 @@ export async function computePathBench( if (!footGraph || !stops) return sourcePaths; const [dist, prev] = options - ? ( + ? // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + ( await benchmark( Dijkstra as ( G: typeof footGraph, @@ -75,7 +78,8 @@ export async function computePathBench( [footGraph, [sourceStopId], options], ) ).lastReturn! - : ( + : // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + ( await benchmark( Dijkstra as (G: typeof footGraph, [s]: [typeof sourceStopId]) => [Map, Map], [footGraph, [sourceStopId]], @@ -87,7 +91,9 @@ export async function computePathBench( for (const stopId of s) { const targetNode = approachedStopName(stopId); + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion if (dist.get(targetNode) !== undefined && dist.get(targetNode)! < Infinity && sourceStopId !== targetNode && !computedStops.has(stopId)) + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion sourcePaths.set(stopId, [returnPaths ? tracePath(prev, targetNode) : [], dist.get(targetNode)!]); } }, diff --git a/src/test/footPaths/test.ts b/src/test/footPaths/test.ts index 6eb29f91..f4218908 100644 --- a/src/test/footPaths/test.ts +++ b/src/test/footPaths/test.ts @@ -89,6 +89,7 @@ export async function run({ getFullPaths = false, dijkstraOptions }: testOptions intersectionId, { _id: intersectionId, + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion coords: (Array.from(sections.values()).find((s) => s.rg_fv_graph_nd === intersectionId)?.coords[0] ?? Array.from(sections.values()) .find((s) => s.rg_fv_graph_na === intersectionId) @@ -174,7 +175,7 @@ export async function run({ getFullPaths = false, dijkstraOptions }: testOptions const approachedStops: Map, [Point, (typeof footGraph.edges)[number], number]> = new Map(); for (const [stopId, stop] of stops) { /**@description [distance to closest point, closest point, section containing this point, indice of segment composing the section (i;i+1 in Section coords)] */ - let closestPoint: [number, Point | null, (typeof footGraph.edges)[number] | null, number | null] = [Infinity, null, null, null]; + const closestPoint: [number, Point | null, (typeof footGraph.edges)[number] | null, number | null] = [Infinity, null, null, null]; for (const [edge, segs] of mappedSegments) { for (const [n, seg] of segs.entries()) { @@ -267,7 +268,7 @@ export async function run({ getFullPaths = false, dijkstraOptions }: testOptions let rejected = false; - await benchmark(NonScheduledRoutesModel.deleteMany, [{}] as unknown as any, NonScheduledRoutesModel); + await benchmark(NonScheduledRoutesModel.deleteMany, [{}] as never, NonScheduledRoutesModel); let totalPaths = 0; diff --git a/src/test/utils/Link.ts b/src/test/utils/Link.ts index 0c7b1162..2d35b5c8 100644 --- a/src/test/utils/Link.ts +++ b/src/test/utils/Link.ts @@ -9,18 +9,18 @@ export class Link { static emptyLink: typeof emptyLink = emptyLink; private _value: Type; - private _next: LinkOrEmpty; + private _next: LinkOrEmpty; /** * @description Construction of the first LinkOrEmpty * @param val Any type of data to LinkOrEmpty */ - constructor(val: Type, next: LinkOrEmpty = Link.emptyLink) { + constructor(val: Type, next: LinkOrEmpty = Link.emptyLink) { this._value = val; this._next = next; } - static isLink(l: LinkOrEmpty): boolean { + static isLink(l: LinkOrEmpty): l is Link { return l instanceof Link; } @@ -31,18 +31,18 @@ export class Link { return this._value; } - set value(v: any) { + set value(v: Type) { this._value = v; } /** * @description Get the next LinkOrEmpty of this chained array */ - get next(): LinkOrEmpty { + get next(): LinkOrEmpty { return this._next; } - set next(v: LinkOrEmpty) { + set next(v: LinkOrEmpty) { if (!Link.isLink(v) && v != Link.emptyLink) throw new Error("Next value of the LinkOrEmpty can only be a Link or an empty Link."); this._next = v; } @@ -52,34 +52,35 @@ export class Link { */ get depth(): number { if (!Link.isLink(this._next)) return 1; - return 1 + (this._next as Link).depth; + return 1 + (this._next as Link).depth; } - toArrayRec(): any[] { + toArrayRec(): Type[] { if (!Link.isLink(this.next)) return [this.value]; - let next = (this.next as Link).toArrayRec(); + const next = (this.next as Link).toArrayRec(); return [this.value, ...next]; } - toArray(): any[] { + toArray(): Type[] { return Array.from(this); } - toArrayRevertedRec(): any[] { + toArrayRevertedRec(): Type[] { if (!this._next || !(this._next instanceof Link)) return [this.value]; - let next = this._next.toArray(); + const next = this._next.toArray(); return [...next, this.value]; } - toArrayReverted(): any[] { + toArrayReverted(): Type[] { return this.toArray().reverse(); } *[Symbol.iterator]() { - let el = this as Link; + // eslint-disable-next-line @typescript-eslint/no-this-alias + let el: LinkOrEmpty = this; while (Link.isLink(el)) { yield el.value; - el = el._next as Link; + el = el._next; } } @@ -87,7 +88,7 @@ export class Link { * @description Get the n(th) element of the LinkOrEmpty * @param {Number} n Index of the element to access to */ - get_rec(n: number): any { + get_rec(n: number): Type { if (n < 0) throw new Error("Invalid index"); if (n == 0) return this.value; if (this._next instanceof Link) return this._next.get(n - 1); @@ -98,10 +99,10 @@ export class Link { * @description Get the n(th) element of the LinkOrEmpty * @param {Number} n Index of the element to access to */ - get(n: number): any { + get(n: number): Type { if (n < 0) throw new Error("Invalid index"); let i = 0; - for (let el of this) { + for (const el of this) { if (n === i) return el; i++; } @@ -112,7 +113,7 @@ export class Link { * @description Create chained array from array * @param {Array} a The array to convert into chained array */ - static fromArray(a: Array = []): LinkOrEmpty { + static fromArray(a: Array = []): LinkOrEmpty { let m: LinkOrEmpty = Link.emptyLink; for (let i = a.length - 1; i >= 0; i--) { m = new this(a[i], m); diff --git a/src/test/utils/Workers.ts b/src/test/utils/Workers.ts index 1f24fc8e..8634022c 100644 --- a/src/test/utils/Workers.ts +++ b/src/test/utils/Workers.ts @@ -25,7 +25,8 @@ type workerPoolEvents = { jobEnded: (result: R | unknown) => void; }; -export class WorkerPool any, F extends (...args: any) => any> extends TypedEventEmitter< +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export class WorkerPool unknown, F extends (...args: any[]) => unknown> extends TypedEventEmitter< workerPoolEvents, Awaited>> > { readonly pool: poolWorker, Awaited>>[]; @@ -124,6 +125,7 @@ export class WorkerPool any, F extends (...args: worker.worker.once("message", onceMessage); worker.worker.once("error", onceError); + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion if (!res || !rej) return def!.promise; } diff --git a/src/test/utils/benchmark.ts b/src/test/utils/benchmark.ts index cb49ee92..0771e818 100644 --- a/src/test/utils/benchmark.ts +++ b/src/test/utils/benchmark.ts @@ -6,12 +6,13 @@ * @param times Number of times to repeat the benchmark * @param logStats Wheter to log to the bench to the console at its end, or not */ -export async function benchmark any>( - this: any, +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export async function benchmark any, ThisType>( + this: ThisType, f: F, args: Parameters, thisArg: unknown = this, - times: number = 1, + times = 1, logStats = true, ) { const starts: number[] = new Array(times); diff --git a/src/test/utils/ultils.ts b/src/test/utils/ultils.ts index f7630888..67298c4f 100644 --- a/src/test/utils/ultils.ts +++ b/src/test/utils/ultils.ts @@ -3,7 +3,7 @@ import { RefType } from "@typegoose/typegoose/lib/types"; import { node } from "../../utils/Graph"; export type resolveCb = (value: T) => void; -export type rejectCb = (reason?: any) => void; +export type rejectCb = (reason?: unknown) => void; export class Deferred { public promise: Promise; diff --git a/src/utils/Graph.ts b/src/utils/Graph.ts index 100a83ce..b69cc810 100644 --- a/src/utils/Graph.ts +++ b/src/utils/Graph.ts @@ -175,7 +175,7 @@ export class Graph { * @description A list including the nodes that are connected (source or target) with the node n * @param n A node of the graph */ - connections(n: N): Array { + connections(n: N): N[] { return this.nodes.filter((n1) => this.adjacent(n, n1)); } } @@ -200,7 +200,7 @@ export class WeightedGraph extends Graph { * @param n2 A node of the graph * @param w The weight of this arc */ - add_arc(n1: N, n2: N, w: number = 0): this { + add_arc(n1: N, n2: N, w = 0): this { super.add_arc(n1, n2); this.weights.set(`${n1}-${n2}`, w); return this; @@ -242,8 +242,9 @@ export class WeightedGraph extends Graph { weight(n1: N, n2: N): number { if (!this.arc(n1, n2)) throw new Error("Invalid nodes"); + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion return this.weights.get(`${n1}-${n2}`)!; } } -export type unpackGraphNode = G extends Graph ? KeyOfMap : never; +export type unpackGraphNode = G extends Graph ? KeyOfMap : never; diff --git a/src/utils/Vector.ts b/src/utils/Vector.ts index 41d615e2..4d7eabb3 100644 --- a/src/utils/Vector.ts +++ b/src/utils/Vector.ts @@ -3,8 +3,8 @@ import Point from "./Point"; export type direction = 0 | 1; export default class Vector2 { - x: number = NaN; - y: number = NaN; + x = NaN; + y = NaN; /** * @description Create a new vector from 2 points From 6ba8d64f96e84a7e39bcf6a622be4bf8c8487c20 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Sat, 20 May 2023 20:24:58 +0200 Subject: [PATCH 109/251] =?UTF-8?q?=F0=9F=94=A7=20Linter=20rules?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .eslintrc.cjs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.eslintrc.cjs b/.eslintrc.cjs index cc9c0012..dadd7c02 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -4,4 +4,7 @@ module.exports = { parser: '@typescript-eslint/parser', plugins: ['@typescript-eslint'], root: true, + rules: { + "no-empty": [ "error", { allowEmptyCatch: true } ] + } }; \ No newline at end of file From a1930b0a474641c895dcc6a203e95e78cdca8f9b Mon Sep 17 00:00:00 2001 From: Catatomik Date: Sat, 20 May 2023 21:30:36 +0200 Subject: [PATCH 110/251] =?UTF-8?q?=E2=9C=A8=20Automatically=20retrieves?= =?UTF-8?q?=20all=20journeys?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main.ts | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/main.ts b/src/main.ts index 8c0f3a0f..a33ebbba 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,7 +1,7 @@ import { Stop, Trip, Route, stopId, routeId, footPaths, timestamp, MAX_SAFE_TIMESTAMP } from "./utils/Structures"; export type LabelType = "DEFAULT" | "FIRST" | "TRANSFER" | "FULL"; -export type Label = T extends "FULL" +export type Label = T extends "FULL" ? { /** @param boardedAt {@link stopId} in {@link RAPTOR.stops} */ boardedAt: stopId; @@ -25,6 +25,7 @@ export type Label = T extends "FULL" : T extends "DEFAULT" ? { time: typeof MAX_SAFE_TIMESTAMP } : never; +export type Journey = Label[]; /** * @description A RAPTOR instance @@ -189,4 +190,16 @@ export default class RAPTOR { return journey; } + + getBestJourneys(ps: stopId, pt: stopId): (null | Journey)[] { + const journeys: (null | Journey)[] = Array.from({ length: this.multiLabel.length }, () => null); + + for (let k = 0; k < journeys.length; k++) { + try { + journeys[k] = this.getBestJourney(ps, pt, k); + } catch (_) {} + } + + return journeys; + } } From cb0cc005adef9ff61553b426d7eec5fa7b206bb6 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Sun, 21 May 2023 01:21:14 +0200 Subject: [PATCH 111/251] =?UTF-8?q?=F0=9F=9A=A7=20FootPath=20types=20enhan?= =?UTF-8?q?cement?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main.ts | 8 ++++---- src/utils/Structures.ts | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main.ts b/src/main.ts index a33ebbba..a3104c84 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,4 +1,4 @@ -import { Stop, Trip, Route, stopId, routeId, footPaths, timestamp, MAX_SAFE_TIMESTAMP } from "./utils/Structures"; +import { Stop, Trip, Route, stopId, routeId, timestamp, MAX_SAFE_TIMESTAMP, FootPath } from "./utils/Structures"; export type LabelType = "DEFAULT" | "FIRST" | "TRANSFER" | "FULL"; export type Label = T extends "FULL" @@ -15,7 +15,7 @@ export type Label = T extends "FULL" /** @param boardedAt {@link stopId} in {@link RAPTOR.stops} */ boardedAt: stopId; /** @param boardedAt {@link stopId} in {@link RAPTOR.stops} */ - transferId: stopId; + transfer: FootPath; time: timestamp; } : T extends "FIRST" @@ -44,7 +44,7 @@ export default class RAPTOR { /** * @description Creates a new RAPTOR instance for a defined network. */ - constructor(stops: Array<[stopId, number, number, routeId[], footPaths]>, routes: Array<[routeId, [stopId[], Trip[]]]>) { + constructor(stops: Array<[stopId, number, number, routeId[], FootPath[]]>, routes: Array<[routeId, [stopId[], Trip[]]]>) { this.stops = new Map(stops.map(([id, lat, long, connectedRoutes, transfers]) => [id, { id, lat, long, connectedRoutes, transfers }])); this.routes = new Map(routes.map(([rId, r]) => [rId, new Route(rId, ...r)])); } @@ -157,7 +157,7 @@ export default class RAPTOR { const arrivalTime: timestamp = (this.multiLabel[k].get(p)?.time ?? Infinity) + this.walkDuration(transfer.length, settings.walkSpeed); if (arrivalTime < (this.multiLabel[k].get(transfer.to)?.time ?? Infinity)) - this.multiLabel[k].set(transfer.to, { boardedAt: p, transferId: p, time: arrivalTime }); + this.multiLabel[k].set(transfer.to, { boardedAt: p, transfer, time: arrivalTime }); Marked.add(transfer.to); } diff --git a/src/utils/Structures.ts b/src/utils/Structures.ts index d5d31590..79a650d0 100644 --- a/src/utils/Structures.ts +++ b/src/utils/Structures.ts @@ -15,7 +15,7 @@ export interface Trip { times: [timestamp, timestamp][]; } -export type footPaths = { to: stopId; length: number }[]; +export type FootPath = { to: stopId; length: number }; export type stopId = Id; /** @@ -26,7 +26,7 @@ export interface Stop { readonly lat: number; readonly long: number; readonly connectedRoutes: Array; - readonly transfers: footPaths; + readonly transfers: FootPath[]; } export type routeId = Id; From 9249bafdbe0a04d871e4ce8b70b3e4bef4a6ddf2 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Sun, 21 May 2023 01:23:28 +0200 Subject: [PATCH 112/251] =?UTF-8?q?=F0=9F=90=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/index.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/test/index.ts b/src/test/index.ts index 7b726b1f..27ec32d8 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -109,9 +109,10 @@ import { benchmark } from "./utils/benchmark"; const ps: stopId = 128738; const pt: stopId = 126798; - let minSchedule: number = Infinity; + let minSchedule = Infinity; for (const schedule of dbScheduledRoutes.flatMap(({ trips }) => trips.flatMap(({ schedules }) => schedules))) { - if ("hor_estime" in schedule && schedule.hor_estime.getTime() < minSchedule) minSchedule = schedule.hor_estime.getTime(); + if ("hor_estime" in schedule && schedule.hor_estime.getTime() < minSchedule && schedule.hor_estime.getTime() > 0) + minSchedule = schedule.hor_estime.getTime(); } function runRAPTOR() { From 8605f6fe4b2c0cb2d67631915cc507008724200b Mon Sep 17 00:00:00 2001 From: Catatomik Date: Sun, 21 May 2023 01:23:41 +0200 Subject: [PATCH 113/251] =?UTF-8?q?=F0=9F=9A=A7=20Use=20getBestJourneys?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/index.ts b/src/test/index.ts index 27ec32d8..9dbc3473 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -125,7 +125,7 @@ import { benchmark } from "./utils/benchmark"; if (!b3.lastReturn) throw `b3 return null`; function resultRAPTOR() { - return RAPTORInstance.getBestJourney(ps, pt); + return RAPTORInstance.getBestJourneys(ps, pt); } const b4 = await benchmark(resultRAPTOR, []); console.log("b4 ended"); From 1373b80758ef793b03b6246c6d0f2e9e90959460 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Sun, 21 May 2023 01:26:22 +0200 Subject: [PATCH 114/251] =?UTF-8?q?=F0=9F=9A=A7=20Unused=20import?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/index.ts b/src/test/index.ts index 9dbc3473..37fea43b 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -9,7 +9,7 @@ import TBMScheduledRoutesModelInit, { dbTBM_ScheduledRoutes } from "./models/TBM import NonScheduledRoutesModelInit, { dbFootPaths } from "./models/NonScheduledRoutes.model"; import RAPTOR from "../main"; import { HydratedDocument } from "mongoose"; -import { DocumentType, isDocument } from "@typegoose/typegoose"; +import { DocumentType } from "@typegoose/typegoose"; import { binaryFilter, unpackRefType } from "./utils/ultils"; import { stopId } from "../utils/Structures"; import { benchmark } from "./utils/benchmark"; From 04c510105c2f1d9239113e7a855e7216d6525218 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Sun, 21 May 2023 01:26:48 +0200 Subject: [PATCH 115/251] =?UTF-8?q?=F0=9F=9A=A7=20Use=20MAX=5FSAFE=5FTIMES?= =?UTF-8?q?TAMP?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/index.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/test/index.ts b/src/test/index.ts index 37fea43b..05580d00 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -11,7 +11,7 @@ import RAPTOR from "../main"; import { HydratedDocument } from "mongoose"; import { DocumentType } from "@typegoose/typegoose"; import { binaryFilter, unpackRefType } from "./utils/ultils"; -import { stopId } from "../utils/Structures"; +import { MAX_SAFE_TIMESTAMP, stopId } from "../utils/Structures"; import { benchmark } from "./utils/benchmark"; // Main IIFE test function @@ -91,7 +91,9 @@ import { benchmark } from "./utils/benchmark"; trips.map(({ tripId, schedules }) => ({ id: tripId, times: schedules.map((schedule) => - "hor_estime" in schedule ? [schedule.hor_estime.getTime(), schedule.hor_estime.getTime()] : [Infinity, Infinity], + "hor_estime" in schedule + ? [schedule.hor_estime.getTime() || MAX_SAFE_TIMESTAMP, schedule.hor_estime.getTime() || MAX_SAFE_TIMESTAMP] + : [Infinity, Infinity], ), })), ], From 5d0afc2027ea5c90ca70b97af0a74241d25ac292 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Sun, 21 May 2023 02:13:13 +0200 Subject: [PATCH 116/251] =?UTF-8?q?=F0=9F=9A=A7=20More=20realistic=20setti?= =?UTF-8?q?ngs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/index.ts b/src/test/index.ts index 05580d00..f8f1269c 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -118,7 +118,7 @@ import { benchmark } from "./utils/benchmark"; } function runRAPTOR() { - RAPTORInstance.run(ps, pt, minSchedule, { walkSpeed: 8 }); + RAPTORInstance.run(ps, pt, minSchedule, { walkSpeed: 1.5 }); return true as const; } From 89d4f1097b7bf622f9dae95dd171296cb58636e1 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Fri, 2 Jun 2023 17:13:35 +0200 Subject: [PATCH 117/251] =?UTF-8?q?=E2=9A=A1=F0=9F=90=9B=20Boarded=20stop?= =?UTF-8?q?=20on=20current=20trip?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main.ts | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/main.ts b/src/main.ts index a3104c84..383f7bf6 100644 --- a/src/main.ts +++ b/src/main.ts @@ -65,11 +65,11 @@ export default class RAPTOR { * @param k Current round. * @returns The earliest {@link Trip} on the route (and its index) r at the stop p, or null if no one is catchable. */ - protected et(route: Route, p: stopId, k: number): [Trip, number] | null { + protected et(route: Route, p: stopId, k: number): { tripIndex: number; boardedAt: stopId } | null { for (let t = 0; t < route.trips.length; t++) { //Catchable const tDep = route.departureTime(t, p); - if (tDep < MAX_SAFE_TIMESTAMP && tDep >= (this.multiLabel[k - 1].get(p)?.time ?? Infinity)) return [route.trips[t], t]; + if (tDep < MAX_SAFE_TIMESTAMP && tDep >= (this.multiLabel[k - 1].get(p)?.time ?? Infinity)) return { tripIndex: t, boardedAt: p }; } return null; } @@ -122,7 +122,7 @@ export default class RAPTOR { //Traverse each route for (const [r, p] of Q) { - let t: [Trip, number] | null = null; + let t: ReturnType | null = null; // eslint-disable-next-line @typescript-eslint/no-non-null-assertion const route: Route = this.routes.get(r)!; @@ -132,12 +132,11 @@ export default class RAPTOR { //Improve periods, local & target pruning if (t !== null) { - const arrivalTime: timestamp = t[0].times[i][0]; - + const arrivalTime: timestamp = route.trips[t.tripIndex].times[i][0]; if (arrivalTime < Math.min(this.bestLabels.get(pi)?.time ?? Infinity, this.bestLabels.get(pt)?.time ?? Infinity)) { //local & target pruning - this.multiLabel[k].set(pi, { boardedAt: p, route, tripIndex: t[1], time: arrivalTime }); - this.bestLabels.set(pi, { boardedAt: p, route, tripIndex: t[1], time: arrivalTime }); + this.multiLabel[k].set(pi, { boardedAt: t.boardedAt, route, tripIndex: t.tripIndex, time: arrivalTime }); + this.bestLabels.set(pi, { boardedAt: t.boardedAt, route, tripIndex: t.tripIndex, time: arrivalTime }); Marked.add(pi); } } From 425a2c45afee165faca71969082ea7791f9f5118 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Fri, 2 Jun 2023 17:14:26 +0200 Subject: [PATCH 118/251] =?UTF-8?q?=F0=9F=90=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.ts b/src/main.ts index 383f7bf6..4aba9c91 100644 --- a/src/main.ts +++ b/src/main.ts @@ -147,7 +147,7 @@ export default class RAPTOR { } //Look at foot-paths - for (const p of Marked) { + for (const p of new Set(Marked)) { const stop = this.stops.get(p); if (stop === undefined) continue; From 8c868fa3816a0346c02079f4965cc845c867dd4b Mon Sep 17 00:00:00 2001 From: Catatomik Date: Fri, 2 Jun 2023 17:15:12 +0200 Subject: [PATCH 119/251] =?UTF-8?q?=E2=9A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main.ts b/src/main.ts index 4aba9c91..52775b42 100644 --- a/src/main.ts +++ b/src/main.ts @@ -112,9 +112,7 @@ export default class RAPTOR { for (const r of connectedRoutes) { const p2 = Q.get(r); - if (p2) { - if ((this.routes.get(r)?.stops ?? []).indexOf(p) < (this.routes.get(r)?.stops ?? []).indexOf(p2)) Q.set(r, p); - } else Q.set(r, p); + if (!p2 || (this.routes.get(r)?.stops ?? []).indexOf(p) < (this.routes.get(r)?.stops ?? []).indexOf(p2)) Q.set(r, p); } Marked.delete(p); From fbcbce220f7d28481ab438d5dae9ed801267df91 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Mon, 5 Jun 2023 03:51:04 +0200 Subject: [PATCH 120/251] =?UTF-8?q?=E2=9A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main.ts b/src/main.ts index 52775b42..6dda6bc1 100644 --- a/src/main.ts +++ b/src/main.ts @@ -133,8 +133,8 @@ export default class RAPTOR { const arrivalTime: timestamp = route.trips[t.tripIndex].times[i][0]; if (arrivalTime < Math.min(this.bestLabels.get(pi)?.time ?? Infinity, this.bestLabels.get(pt)?.time ?? Infinity)) { //local & target pruning - this.multiLabel[k].set(pi, { boardedAt: t.boardedAt, route, tripIndex: t.tripIndex, time: arrivalTime }); - this.bestLabels.set(pi, { boardedAt: t.boardedAt, route, tripIndex: t.tripIndex, time: arrivalTime }); + this.multiLabel[k].set(pi, { ...t, route, time: arrivalTime }); + this.bestLabels.set(pi, { ...t, route, time: arrivalTime }); Marked.add(pi); } } From 5a05d4b9d26375f30240baffdb76eb843404aef9 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Mon, 5 Jun 2023 03:52:10 +0200 Subject: [PATCH 121/251] =?UTF-8?q?=F0=9F=9A=A7=F0=9F=90=9B=20Earliest=20t?= =?UTF-8?q?rip=20assignement?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main.ts b/src/main.ts index 6dda6bc1..5391fb11 100644 --- a/src/main.ts +++ b/src/main.ts @@ -139,8 +139,14 @@ export default class RAPTOR { } } + if (!t) t = this.et(route, pi, k); //Catch an earlier trip at pi ? - t = this.et(route, pi, k) ?? t; + else if ((this.multiLabel[k - 1].get(pi)?.time ?? Infinity) <= route.departureTime(t.tripIndex, pi)) { + const newEt = this.et(route, pi, k); + if (t.tripIndex !== newEt?.tripIndex) { + t = newEt; + } + } } } From 1e44b885ace471edc4bd47264080b7c1ee473234 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Mon, 5 Jun 2023 03:54:23 +0200 Subject: [PATCH 122/251] =?UTF-8?q?=F0=9F=9A=A7=F0=9F=90=9B=E2=9A=A1=20get?= =?UTF-8?q?BestJourney=20renamed=20into=20traceBack?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Lookup previous round results --- src/main.ts | 38 ++++++++++++++++++++++++-------------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/src/main.ts b/src/main.ts index 5391fb11..bae16c41 100644 --- a/src/main.ts +++ b/src/main.ts @@ -171,27 +171,37 @@ export default class RAPTOR { } } - getBestJourney(ps: stopId, pt: stopId, rounds: number = RAPTOR.defaultRounds): Label<"FIRST" | "TRANSFER" | "FULL">[] { - let journey: Label<"FIRST" | "TRANSFER" | "FULL">[] = []; + protected traceBack(from: stopId, initRound: number): Label<"DEPARTURE" | "FOOT" | "VEHICLE">[] { + if (initRound < 1 || initRound > this.multiLabel.length) throw new Error(`Invalid round (${initRound}) provided.`); - if (rounds > this.multiLabel.length) throw new Error(`Current RAPTOR didn't ran with ${rounds} rounds.`); + let k = initRound; + let trace: Label<"DEPARTURE" | "FOOT" | "VEHICLE">[] = []; - let previousStop: stopId | null = pt; - while (previousStop != ps) { - const previousLabel = this.multiLabel[rounds - 1].get(previousStop); - if (!previousLabel || previousLabel.time >= MAX_SAFE_TIMESTAMP) throw new Error(`Journey is not possible to ${pt}.`); + let previousStop: stopId | null = from; + while (previousStop !== null) { + if (k < 0) throw new Error(`No journey in round ${initRound}.`); // Unable to get back to source + + const previousLabel = this.multiLabel[k].get(previousStop); + if (!previousLabel) throw new Error(`Invalid stop ${previousStop}.`); // Should never get here, unless invalid "from" stop + + if (!("boardedAt" in previousLabel)) { + if (previousLabel.time >= MAX_SAFE_TIMESTAMP) { + k--; + continue; + } + + previousStop = null; + } else { + if (trace.find((j) => "boardedAt" in j && j.boardedAt === previousLabel.boardedAt && j.time === previousLabel.time)) + throw new Error(`Impossible journey (cyclic).`); - if ("boardedAt" in previousLabel) { - // Cyclic - if (journey.find((j) => "boardedAt" in j && j.boardedAt === previousLabel.boardedAt && j.time === previousLabel.time)) - throw new Error(`Journey is not possible to ${pt} (cyclic).`); previousStop = previousLabel.boardedAt; - } else throw new Error(`Journey is not possible to ${pt} (unreachable).`); + } - journey = [previousLabel, ...journey]; + trace = [previousLabel, ...trace]; } - return journey; + return trace; } getBestJourneys(ps: stopId, pt: stopId): (null | Journey)[] { From 426fa314a9dec5bec4d5af63fc25bd3b17992a81 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Mon, 5 Jun 2023 03:55:04 +0200 Subject: [PATCH 123/251] =?UTF-8?q?=F0=9F=9A=A7=20Use=20new=20traceBack?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main.ts b/src/main.ts index bae16c41..1123bb96 100644 --- a/src/main.ts +++ b/src/main.ts @@ -204,12 +204,12 @@ export default class RAPTOR { return trace; } - getBestJourneys(ps: stopId, pt: stopId): (null | Journey)[] { + getBestJourneys(pt: stopId): (null | Journey)[] { const journeys: (null | Journey)[] = Array.from({ length: this.multiLabel.length }, () => null); - for (let k = 0; k < journeys.length; k++) { + for (let k = 1; k <= journeys.length; k++) { try { - journeys[k] = this.getBestJourney(ps, pt, k); + journeys[k] = this.traceBack(pt, k); } catch (_) {} } From e597b5278856d25d18757524d5fef5a58c269336 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Mon, 5 Jun 2023 03:55:32 +0200 Subject: [PATCH 124/251] =?UTF-8?q?=F0=9F=9A=A7=F0=9F=90=9B=20Prevent=20cy?= =?UTF-8?q?clic=20labels?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main.ts b/src/main.ts index 1123bb96..a30085ab 100644 --- a/src/main.ts +++ b/src/main.ts @@ -157,8 +157,12 @@ export default class RAPTOR { for (const transfer of stop.transfers) { if (transfer.to === p) continue; - const arrivalTime: timestamp = (this.multiLabel[k].get(p)?.time ?? Infinity) + this.walkDuration(transfer.length, settings.walkSpeed); + // Prevent cyclic labels + const trace = this.traceBack(p, k); + if (trace.find((label) => "boardedAt" in label && label.boardedAt === transfer.to)) continue; + + const arrivalTime: timestamp = (this.multiLabel[k].get(p)?.time ?? Infinity) + this.walkDuration(transfer.length, settings.walkSpeed); if (arrivalTime < (this.multiLabel[k].get(transfer.to)?.time ?? Infinity)) this.multiLabel[k].set(transfer.to, { boardedAt: p, transfer, time: arrivalTime }); From e8894c0c5594b115d5100252b8759974126ea44f Mon Sep 17 00:00:00 2001 From: Catatomik Date: Mon, 5 Jun 2023 03:55:46 +0200 Subject: [PATCH 125/251] =?UTF-8?q?=F0=9F=90=9B=20Type?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/utils/Structures.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/utils/Structures.ts b/src/utils/Structures.ts index 79a650d0..d4e6001c 100644 --- a/src/utils/Structures.ts +++ b/src/utils/Structures.ts @@ -1,8 +1,10 @@ -//A timestamp representation of a Date ; in milliseconds. +/** + * A timestamp representation of a Date ; in milliseconds. + */ export type timestamp = number; export type Id = number | string; -export const MAX_SAFE_TIMESTAMP: timestamp = 8_640_000_000_000_000; +export const MAX_SAFE_TIMESTAMP = 8_640_000_000_000_000; /** * @description A Trip, i.e. a succession of stop times. From 18045bbd7acdb3ba9862171c832d3a6a8a990e73 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Mon, 5 Jun 2023 03:56:24 +0200 Subject: [PATCH 126/251] =?UTF-8?q?=F0=9F=9A=A7=20LabelType=20definition?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main.ts b/src/main.ts index a30085ab..89d1808f 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,7 +1,7 @@ import { Stop, Trip, Route, stopId, routeId, timestamp, MAX_SAFE_TIMESTAMP, FootPath } from "./utils/Structures"; -export type LabelType = "DEFAULT" | "FIRST" | "TRANSFER" | "FULL"; -export type Label = T extends "FULL" +export type LabelType = "DEFAULT" | "DEPARTURE" | "FOOT" | "VEHICLE"; +export type Label = T extends "VEHICLE" ? { /** @param boardedAt {@link stopId} in {@link RAPTOR.stops} */ boardedAt: stopId; @@ -10,7 +10,7 @@ export type Label = T extends "FULL" tripIndex: number; time: timestamp; //arrival time } - : T extends "TRANSFER" + : T extends "FOOT" ? { /** @param boardedAt {@link stopId} in {@link RAPTOR.stops} */ boardedAt: stopId; @@ -18,14 +18,14 @@ export type Label = T extends "FULL" transfer: FootPath; time: timestamp; } - : T extends "FIRST" + : T extends "DEPARTURE" ? { time: number; } : T extends "DEFAULT" ? { time: typeof MAX_SAFE_TIMESTAMP } : never; -export type Journey = Label[]; +export type Journey = Label<"DEPARTURE" | "VEHICLE" | "FOOT">[]; /** * @description A RAPTOR instance From d745b6dda75b593b51ffbd3961b275a4046631f5 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Mon, 5 Jun 2023 03:57:12 +0200 Subject: [PATCH 127/251] =?UTF-8?q?=F0=9F=9A=A7=20Use=20new=20traceBack?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/index.ts b/src/test/index.ts index f8f1269c..0adac114 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -127,7 +127,7 @@ import { benchmark } from "./utils/benchmark"; if (!b3.lastReturn) throw `b3 return null`; function resultRAPTOR() { - return RAPTORInstance.getBestJourneys(ps, pt); + return RAPTORInstance.getBestJourneys(pt); } const b4 = await benchmark(resultRAPTOR, []); console.log("b4 ended"); From 5c8a0602f6e14706bcfea705f03aaf532779a6fe Mon Sep 17 00:00:00 2001 From: Catatomik Date: Mon, 5 Jun 2023 03:57:38 +0200 Subject: [PATCH 128/251] =?UTF-8?q?=F0=9F=9A=A7=20Foot=20transfers=20dista?= =?UTF-8?q?nce=20limitation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/index.ts | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/test/index.ts b/src/test/index.ts index 0adac114..7e78b003 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -79,10 +79,12 @@ import { benchmark } from "./utils/benchmark"; _id, ...coords, dbScheduledRoutes.filter((ScheduledRoute) => ScheduledRoute.stops.find((stopId) => stopId === _id)).map(({ _id }) => _id), - binaryFilter(dbNonScheduledRoutes, _id, (stopFrom, NonScheduledRoute) => stopFrom - NonScheduledRoute.from).map(({ to, distance }) => ({ - to, - length: distance, - })), + binaryFilter(dbNonScheduledRoutes, _id, (stopFrom, NonScheduledRoute) => stopFrom - NonScheduledRoute.from) + .filter(({ distance }) => distance <= 500) + .map(({ to, distance }) => ({ + to, + length: distance, + })), ]), dbScheduledRoutes.map(({ _id, stops, trips }) => [ _id, From 89b8463b78cf3e7e6258f0085071d9fbfd28c3ec Mon Sep 17 00:00:00 2001 From: Catatomik Date: Mon, 5 Jun 2023 03:58:22 +0200 Subject: [PATCH 129/251] =?UTF-8?q?=F0=9F=9A=A7=20Use=20command-line=20arg?= =?UTF-8?q?uments?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/index.ts | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/test/index.ts b/src/test/index.ts index 7e78b003..d0d63811 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -109,9 +109,19 @@ import { benchmark } from "./utils/benchmark"; if (!b2.lastReturn) throw `b2 return null`; const { RAPTORInstance } = b2.lastReturn; - //From "Les Harmonies" to "Peixotto" - const ps: stopId = 128738; - const pt: stopId = 126798; + const args = process.argv.slice(2); + let ps: stopId; + try { + ps = JSON.parse(args[0]); + } catch (_) { + ps = 2832; + } + let pt: stopId; + try { + pt = JSON.parse(args[1]); + } catch (_) { + pt = 2168; + } let minSchedule = Infinity; for (const schedule of dbScheduledRoutes.flatMap(({ trips }) => trips.flatMap(({ schedules }) => schedules))) { From 1bfec23c7ebaecb72e0141f835f4babe43ef4f94 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Mon, 5 Jun 2023 04:25:34 +0200 Subject: [PATCH 130/251] =?UTF-8?q?=E2=AC=86=EF=B8=8F=E2=9E=95=20core-js?= =?UTF-8?q?=20in=20place=20of=20"@abraham/reflection"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 145 ++++++++++++++++++++++++---------------------- package.json | 16 ++--- 2 files changed, 83 insertions(+), 78 deletions(-) diff --git a/package-lock.json b/package-lock.json index 59c716aa..3aa46b3b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,33 +1,28 @@ { "name": "raptor", - "version": "0.1.1", + "version": "0.2.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "raptor", - "version": "0.1.1", + "version": "0.2.0", "license": "ISC", "dependencies": { - "@abraham/reflection": "^0.12.0", "@typegoose/typegoose": "^10.2.0-beta.3", "@tyriar/fibonacci-heap": "^2.0.9", + "core-js": "^3.30.2", "mongodb": "^5.0.1" }, "devDependencies": { - "@typescript-eslint/eslint-plugin": "^5.59.6", - "@typescript-eslint/parser": "^5.59.6", - "eslint": "^8.41.0", + "@typescript-eslint/eslint-plugin": "^5.59.8", + "@typescript-eslint/parser": "^5.59.8", + "eslint": "^8.42.0", "prettier": "^2.8.4", "ts-node": "^10.9.1", - "typescript": "^4.9.5" + "typescript": "5.0.4" } }, - "node_modules/@abraham/reflection": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@abraham/reflection/-/reflection-0.12.0.tgz", - "integrity": "sha512-OoLlgBE5u18mc61pJNamEh2OtFpHjtvDi1pV4ojnnH77juCvQw/Z3YlHF8TJiorU7/V6UuGApFzsi+bieug7fg==" - }, "node_modules/@aws-crypto/ie11-detection": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz", @@ -1221,18 +1216,18 @@ } }, "node_modules/@eslint/js": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.41.0.tgz", - "integrity": "sha512-LxcyMGxwmTh2lY9FwHPGWOHmYFCZvbrFCBZL4FzSSsxsRPuhrYUg/49/0KDfW8tnIEaEHtfmn6+NPN+1DqaNmA==", + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.42.0.tgz", + "integrity": "sha512-6SWlXpWU5AvId8Ac7zjzmIOqMOba/JWY8XZ4A7q7Gn1Vlfg/SFFIlrtHXt9nPn4op9ZPAkl91Jao+QQv3r/ukw==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", + "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", @@ -1358,9 +1353,9 @@ } }, "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", "dev": true }, "node_modules/@types/node": { @@ -1388,15 +1383,15 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.59.6", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.6.tgz", - "integrity": "sha512-sXtOgJNEuRU5RLwPUb1jxtToZbgvq3M6FPpY4QENxoOggK+UpTxUBpj6tD8+Qh2g46Pi9We87E+eHnUw8YcGsw==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.8.tgz", + "integrity": "sha512-JDMOmhXteJ4WVKOiHXGCoB96ADWg9q7efPWHRViT/f09bA8XOMLAVHHju3l0MkZnG1izaWXYmgvQcUjTRcpShQ==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.59.6", - "@typescript-eslint/type-utils": "5.59.6", - "@typescript-eslint/utils": "5.59.6", + "@typescript-eslint/scope-manager": "5.59.8", + "@typescript-eslint/type-utils": "5.59.8", + "@typescript-eslint/utils": "5.59.8", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", @@ -1422,14 +1417,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.59.6", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.6.tgz", - "integrity": "sha512-7pCa6al03Pv1yf/dUg/s1pXz/yGMUBAw5EeWqNTFiSueKvRNonze3hma3lhdsOrQcaOXhbk5gKu2Fludiho9VA==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.8.tgz", + "integrity": "sha512-AnR19RjJcpjoeGojmwZtCwBX/RidqDZtzcbG3xHrmz0aHHoOcbWnpDllenRDmDvsV0RQ6+tbb09/kyc+UT9Orw==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.59.6", - "@typescript-eslint/types": "5.59.6", - "@typescript-eslint/typescript-estree": "5.59.6", + "@typescript-eslint/scope-manager": "5.59.8", + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/typescript-estree": "5.59.8", "debug": "^4.3.4" }, "engines": { @@ -1449,13 +1444,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.59.6", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.6.tgz", - "integrity": "sha512-gLbY3Le9Dxcb8KdpF0+SJr6EQ+hFGYFl6tVY8VxLPFDfUZC7BHFw+Vq7bM5lE9DwWPfx4vMWWTLGXgpc0mAYyQ==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.8.tgz", + "integrity": "sha512-/w08ndCYI8gxGf+9zKf1vtx/16y8MHrZs5/tnjHhMLNSixuNcJavSX4wAiPf4aS5x41Es9YPCn44MIe4cxIlig==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.6", - "@typescript-eslint/visitor-keys": "5.59.6" + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/visitor-keys": "5.59.8" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1466,13 +1461,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.59.6", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.6.tgz", - "integrity": "sha512-A4tms2Mp5yNvLDlySF+kAThV9VTBPCvGf0Rp8nl/eoDX9Okun8byTKoj3fJ52IJitjWOk0fKPNQhXEB++eNozQ==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.8.tgz", + "integrity": "sha512-+5M518uEIHFBy3FnyqZUF3BMP+AXnYn4oyH8RF012+e7/msMY98FhGL5SrN29NQ9xDgvqCgYnsOiKp1VjZ/fpA==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.59.6", - "@typescript-eslint/utils": "5.59.6", + "@typescript-eslint/typescript-estree": "5.59.8", + "@typescript-eslint/utils": "5.59.8", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -1493,9 +1488,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.59.6", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.6.tgz", - "integrity": "sha512-tH5lBXZI7T2MOUgOWFdVNUILsI02shyQvfzG9EJkoONWugCG77NDDa1EeDGw7oJ5IvsTAAGVV8I3Tk2PNu9QfA==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.8.tgz", + "integrity": "sha512-+uWuOhBTj/L6awoWIg0BlWy0u9TyFpCHrAuQ5bNfxDaZ1Ppb3mx6tUigc74LHcbHpOHuOTOJrBoAnhdHdaea1w==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1506,13 +1501,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.59.6", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.6.tgz", - "integrity": "sha512-vW6JP3lMAs/Tq4KjdI/RiHaaJSO7IUsbkz17it/Rl9Q+WkQ77EOuOnlbaU8kKfVIOJxMhnRiBG+olE7f3M16DA==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.8.tgz", + "integrity": "sha512-Jy/lPSDJGNow14vYu6IrW790p7HIf/SOV1Bb6lZ7NUkLc2iB2Z9elESmsaUtLw8kVqogSbtLH9tut5GCX1RLDg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.6", - "@typescript-eslint/visitor-keys": "5.59.6", + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/visitor-keys": "5.59.8", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -1533,17 +1528,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.59.6", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.6.tgz", - "integrity": "sha512-vzaaD6EXbTS29cVH0JjXBdzMt6VBlv+hE31XktDRMX1j3462wZCJa7VzO2AxXEXcIl8GQqZPcOPuW/Z1tZVogg==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.8.tgz", + "integrity": "sha512-Tr65630KysnNn9f9G7ROF3w1b5/7f6QVCJ+WK9nhIocWmx9F+TmCAcglF26Vm7z8KCTwoKcNEBZrhlklla3CKg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.59.6", - "@typescript-eslint/types": "5.59.6", - "@typescript-eslint/typescript-estree": "5.59.6", + "@typescript-eslint/scope-manager": "5.59.8", + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/typescript-estree": "5.59.8", "eslint-scope": "^5.1.1", "semver": "^7.3.7" }, @@ -1559,12 +1554,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.59.6", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.6.tgz", - "integrity": "sha512-zEfbFLzB9ETcEJ4HZEEsCR9HHeNku5/Qw1jSS5McYJv5BR+ftYXwFFAH5Al+xkGaZEqowMwl7uoJjQb1YSPF8Q==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.8.tgz", + "integrity": "sha512-pJhi2ms0x0xgloT7xYabil3SGGlojNNKjK/q6dB3Ey0uJLMjK2UDGJvHieiyJVW/7C3KI+Z4Q3pEHkm4ejA+xQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.6", + "@typescript-eslint/types": "5.59.8", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -1803,6 +1798,16 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, + "node_modules/core-js": { + "version": "3.30.2", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.30.2.tgz", + "integrity": "sha512-uBJiDmwqsbJCWHAwjrx3cvjbMXP7xD72Dmsn5LOJpiRmE3WbBbN5rCqQ2Qh6Ek6/eOrjlWngEynBWo4VxerQhg==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, "node_modules/create-require": { "version": "1.1.1", "dev": true, @@ -1894,16 +1899,16 @@ } }, "node_modules/eslint": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.41.0.tgz", - "integrity": "sha512-WQDQpzGBOP5IrXPo4Hc0814r4/v2rrIsB0rhT7jtunIalgg6gYXWhRMOejVO8yH21T/FGaxjmFjBMNqcIlmH1Q==", + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.42.0.tgz", + "integrity": "sha512-ulg9Ms6E1WPf67PHaEY4/6E2tEn5/f7FXGzr3t9cBMugOmf1INYvuUwwh1aXQN4MfJ6a5K2iNwP3w4AColvI9A==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.4.0", "@eslint/eslintrc": "^2.0.3", - "@eslint/js": "8.41.0", - "@humanwhocodes/config-array": "^0.11.8", + "@eslint/js": "8.42.0", + "@humanwhocodes/config-array": "^0.11.10", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", @@ -3182,16 +3187,16 @@ } }, "node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", + "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=4.2.0" + "node": ">=12.20" } }, "node_modules/uri-js": { diff --git a/package.json b/package.json index 4e40ac84..609db588 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "raptor", - "version": "0.1.1", - "description": "RAPTOR Node.js implementation", + "version": "0.2.0", + "description": "RAPTOR typescript/Node.js implementation", "main": "built/main.js", "scripts": { "build": "tsc", @@ -9,20 +9,20 @@ "lint": "eslint ./src/", "test": "echo \"Error: no test specified\" && exit 1" }, - "author": "", + "author": "Catatomik", "license": "ISC", "dependencies": { - "@abraham/reflection": "^0.12.0", "@typegoose/typegoose": "^10.2.0-beta.3", "@tyriar/fibonacci-heap": "^2.0.9", + "core-js": "^3.30.2", "mongodb": "^5.0.1" }, "devDependencies": { - "@typescript-eslint/eslint-plugin": "^5.59.6", - "@typescript-eslint/parser": "^5.59.6", - "eslint": "^8.41.0", + "@typescript-eslint/eslint-plugin": "^5.59.8", + "@typescript-eslint/parser": "^5.59.8", + "eslint": "^8.42.0", "prettier": "^2.8.4", "ts-node": "^10.9.1", - "typescript": "^4.9.5" + "typescript": "5.0.4" } } From 2885687b600ebc38ecb508bc6f90dfcb191103aa Mon Sep 17 00:00:00 2001 From: Catatomik Date: Mon, 5 Jun 2023 04:34:59 +0200 Subject: [PATCH 131/251] =?UTF-8?q?=F0=9F=8F=97=EF=B8=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/{utils => }/Structures.ts | 0 src/main.ts | 2 +- src/{ => test/footPaths}/FootPaths.ts | 0 src/test/footPaths/computePath.ts | 6 ++-- src/test/footPaths/test.ts | 13 ++++---- src/{ => test/footPaths}/utils/Graph.ts | 0 src/test/{ => footPaths}/utils/Link.ts | 0 src/{ => test/footPaths}/utils/Point.ts | 0 src/{ => test/footPaths}/utils/Segment.ts | 0 src/{ => test/footPaths}/utils/Vector.ts | 0 src/{ => test/footPaths}/utils/index.ts | 0 src/test/footPaths/utils/ultils.ts | 38 ++++++++++++++++++++++ src/test/index.ts | 7 ++-- src/test/models/FootGraph.model.ts | 2 +- src/test/utils/Queue.ts | 2 +- src/test/utils/Workers.ts | 2 +- src/test/utils/{ultils.ts => index.ts} | 39 ----------------------- 17 files changed, 56 insertions(+), 55 deletions(-) rename src/{utils => }/Structures.ts (100%) rename src/{ => test/footPaths}/FootPaths.ts (100%) rename src/{ => test/footPaths}/utils/Graph.ts (100%) rename src/test/{ => footPaths}/utils/Link.ts (100%) rename src/{ => test/footPaths}/utils/Point.ts (100%) rename src/{ => test/footPaths}/utils/Segment.ts (100%) rename src/{ => test/footPaths}/utils/Vector.ts (100%) rename src/{ => test/footPaths}/utils/index.ts (100%) create mode 100644 src/test/footPaths/utils/ultils.ts rename src/test/utils/{ultils.ts => index.ts} (65%) diff --git a/src/utils/Structures.ts b/src/Structures.ts similarity index 100% rename from src/utils/Structures.ts rename to src/Structures.ts diff --git a/src/main.ts b/src/main.ts index 89d1808f..15178991 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,4 +1,4 @@ -import { Stop, Trip, Route, stopId, routeId, timestamp, MAX_SAFE_TIMESTAMP, FootPath } from "./utils/Structures"; +import { Stop, Trip, Route, stopId, routeId, timestamp, MAX_SAFE_TIMESTAMP, FootPath } from "./Structures"; export type LabelType = "DEFAULT" | "DEPARTURE" | "FOOT" | "VEHICLE"; export type Label = T extends "VEHICLE" diff --git a/src/FootPaths.ts b/src/test/footPaths/FootPaths.ts similarity index 100% rename from src/FootPaths.ts rename to src/test/footPaths/FootPaths.ts diff --git a/src/test/footPaths/computePath.ts b/src/test/footPaths/computePath.ts index e2fd85ef..93a8c3a2 100644 --- a/src/test/footPaths/computePath.ts +++ b/src/test/footPaths/computePath.ts @@ -1,10 +1,10 @@ -import { path, Dijkstra, tracePath, DijkstraOptions } from "../../FootPaths"; -import { unpackGraphNode, WeightedGraph } from "../../utils/Graph"; +import { path, Dijkstra, tracePath, DijkstraOptions } from "./FootPaths"; +import { unpackGraphNode, WeightedGraph } from "./utils/Graph"; import type { footGraphNodes, id } from "./test"; import { parentPort } from "worker_threads"; import { benchmark } from "../utils/benchmark"; -import { approachedStopName } from "../utils/ultils"; +import { approachedStopName } from "./utils/ultils"; export interface initData { adj: Required>>[0]; diff --git a/src/test/footPaths/test.ts b/src/test/footPaths/test.ts index f4218908..c7634b89 100644 --- a/src/test/footPaths/test.ts +++ b/src/test/footPaths/test.ts @@ -3,10 +3,10 @@ import initDB from "../utils/mongoose"; import { benchmark } from "../utils/benchmark"; import { WorkerPool } from "../utils/Workers"; -import { node, WeightedGraph } from "../../utils/Graph"; +import { node, WeightedGraph } from "./utils/Graph"; -import Point from "../../utils/Point"; -import Segment from "../../utils/Segment"; +import Point from "./utils/Point"; +import Segment from "./utils/Segment"; export interface testOptions { getFullPaths?: boolean; @@ -22,11 +22,12 @@ import sectionsModelInit, { dbSections } from "../models/sections.model"; import stopsModelInit, { dbTBM_Stops } from "../models/TBM_stops.model"; import { computePath, initialCallback } from "./computePath"; import { DocumentType } from "@typegoose/typegoose"; -import { approachedStopName, euclidianDistance, Deferred, sectionId, unique, dbIntersectionId, dbSectionId, unpackRefType } from "../utils/ultils"; +import { approachedStopName, euclidianDistance, sectionId, dbIntersectionId, dbSectionId, unpackRefType } from "./utils/ultils"; import FootGraphModelInit, { dbFootGraphEdges, dbFootGraphNodes } from "../models/FootGraph.model"; import NonScheduledRoutesModelInit, { dbFootPaths } from "../models/NonScheduledRoutes.model"; -import { KeyOfMap } from "../../utils"; -import { DijkstraOptions } from "../../FootPaths"; +import { KeyOfMap } from "./utils"; +import { DijkstraOptions } from "./FootPaths"; +import { unique, Deferred } from "../utils"; const sectionProjection = { coords: 1, distance: 1, rg_fv_graph_nd: 1, rg_fv_graph_na: 1 }; export type dbSection = Pick; diff --git a/src/utils/Graph.ts b/src/test/footPaths/utils/Graph.ts similarity index 100% rename from src/utils/Graph.ts rename to src/test/footPaths/utils/Graph.ts diff --git a/src/test/utils/Link.ts b/src/test/footPaths/utils/Link.ts similarity index 100% rename from src/test/utils/Link.ts rename to src/test/footPaths/utils/Link.ts diff --git a/src/utils/Point.ts b/src/test/footPaths/utils/Point.ts similarity index 100% rename from src/utils/Point.ts rename to src/test/footPaths/utils/Point.ts diff --git a/src/utils/Segment.ts b/src/test/footPaths/utils/Segment.ts similarity index 100% rename from src/utils/Segment.ts rename to src/test/footPaths/utils/Segment.ts diff --git a/src/utils/Vector.ts b/src/test/footPaths/utils/Vector.ts similarity index 100% rename from src/utils/Vector.ts rename to src/test/footPaths/utils/Vector.ts diff --git a/src/utils/index.ts b/src/test/footPaths/utils/index.ts similarity index 100% rename from src/utils/index.ts rename to src/test/footPaths/utils/index.ts diff --git a/src/test/footPaths/utils/ultils.ts b/src/test/footPaths/utils/ultils.ts new file mode 100644 index 00000000..1b92908d --- /dev/null +++ b/src/test/footPaths/utils/ultils.ts @@ -0,0 +1,38 @@ +import { Ref } from "@typegoose/typegoose"; +import { RefType } from "@typegoose/typegoose/lib/types"; +import { node } from "./Graph"; + +export function euclidianDistance(x1: number, y1: number, x2: number, y2: number): number { + return Math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2); +} + +export type unpackRefType = T extends Ref + ? D extends { + _id?: RefType; + } + ? D["_id"] + : never + : T extends Ref[] + ? D extends { + _id?: RefType; + } + ? D["_id"][] + : never + : never; + +/** Ensure unique node id for approachedStop (as(approached stop)={stop id}) */ +export function approachedStopName(_id: number) { + return `as=${_id}` as const; +} + +export function dbIntersectionId(_id: number) { + return `i=${_id}` as const; +} + +export function dbSectionId(_id: number) { + return `s=${_id}` as const; +} + +export function sectionId({ rg_fv_graph_nd, rg_fv_graph_na }: S) { + return `${rg_fv_graph_nd}-${rg_fv_graph_na}` as const; +} diff --git a/src/test/index.ts b/src/test/index.ts index d0d63811..7ef8083a 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -1,7 +1,7 @@ import initDB from "./utils/mongoose"; // Needed to solve "Reflect.getMetadata is not a function" error of typegoose -import "@abraham/reflection"; +import "core-js/features/reflect"; import stopsModelInit, { dbTBM_Stops } from "./models/TBM_stops.model"; import TBMSchedulesModelInit from "./models/TBM_schedules.model"; @@ -10,9 +10,10 @@ import NonScheduledRoutesModelInit, { dbFootPaths } from "./models/NonScheduledR import RAPTOR from "../main"; import { HydratedDocument } from "mongoose"; import { DocumentType } from "@typegoose/typegoose"; -import { binaryFilter, unpackRefType } from "./utils/ultils"; -import { MAX_SAFE_TIMESTAMP, stopId } from "../utils/Structures"; +import { unpackRefType } from "./footPaths/utils/ultils"; +import { MAX_SAFE_TIMESTAMP, stopId } from "../Structures"; import { benchmark } from "./utils/benchmark"; +import { binaryFilter } from "./utils"; // Main IIFE test function (async () => { diff --git a/src/test/models/FootGraph.model.ts b/src/test/models/FootGraph.model.ts index 000c4a67..88ed497e 100644 --- a/src/test/models/FootGraph.model.ts +++ b/src/test/models/FootGraph.model.ts @@ -14,7 +14,7 @@ import { import { modelOptions } from "@typegoose/typegoose/lib/modelOptions"; import { getName } from "@typegoose/typegoose/lib/internal/utils"; import { Mongoose } from "mongoose"; -import { approachedStopName, dbIntersectionId, dbSectionId } from "../utils/ultils"; +import { approachedStopName, dbIntersectionId, dbSectionId } from "../footPaths/utils/ultils"; @modelOptions({ options: { customName: "FootGraph" } }) export class dbFootGraph { diff --git a/src/test/utils/Queue.ts b/src/test/utils/Queue.ts index 75077f14..accd6800 100644 --- a/src/test/utils/Queue.ts +++ b/src/test/utils/Queue.ts @@ -1,4 +1,4 @@ -import { LinkOrEmpty, Link } from "./Link"; +import { LinkOrEmpty, Link } from "../footPaths/utils/Link"; export class Queue { private front: LinkOrEmpty; diff --git a/src/test/utils/Workers.ts b/src/test/utils/Workers.ts index 8634022c..b8acb821 100644 --- a/src/test/utils/Workers.ts +++ b/src/test/utils/Workers.ts @@ -1,8 +1,8 @@ import { Worker } from "worker_threads"; -import { Deferred, rejectCb, resolveCb } from "./ultils"; import { Duration } from "./benchmark"; import { Queue, unpackQueue } from "./Queue"; import { TypedEventEmitter } from "./TypedEmitter"; +import { resolveCb, rejectCb, Deferred } from "."; const nsPerMs = BigInt(1e6); enum Status { diff --git a/src/test/utils/ultils.ts b/src/test/utils/index.ts similarity index 65% rename from src/test/utils/ultils.ts rename to src/test/utils/index.ts index 67298c4f..75a1e28d 100644 --- a/src/test/utils/ultils.ts +++ b/src/test/utils/index.ts @@ -1,7 +1,3 @@ -import { Ref } from "@typegoose/typegoose"; -import { RefType } from "@typegoose/typegoose/lib/types"; -import { node } from "../../utils/Graph"; - export type resolveCb = (value: T) => void; export type rejectCb = (reason?: unknown) => void; @@ -18,41 +14,6 @@ export class Deferred { } } -export function euclidianDistance(x1: number, y1: number, x2: number, y2: number): number { - return Math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2); -} - -export type unpackRefType = T extends Ref - ? D extends { - _id?: RefType; - } - ? D["_id"] - : never - : T extends Ref[] - ? D extends { - _id?: RefType; - } - ? D["_id"][] - : never - : never; - -/** Ensure unique node id for approachedStop (as(approached stop)={stop id}) */ -export function approachedStopName(_id: number) { - return `as=${_id}` as const; -} - -export function dbIntersectionId(_id: number) { - return `i=${_id}` as const; -} - -export function dbSectionId(_id: number) { - return `s=${_id}` as const; -} - -export function sectionId({ rg_fv_graph_nd, rg_fv_graph_na }: S) { - return `${rg_fv_graph_nd}-${rg_fv_graph_na}` as const; -} - /** * @description Checks unicity of a value in an array */ From 84b92bae216bf91fd269114e48a345bd7b7d7e60 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Mon, 5 Jun 2023 04:51:55 +0200 Subject: [PATCH 132/251] =?UTF-8?q?=F0=9F=9A=A7=20Rebase=20model?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/models/TBM_schedules.model.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/test/models/TBM_schedules.model.ts b/src/test/models/TBM_schedules.model.ts index 4162db6a..cd117946 100644 --- a/src/test/models/TBM_schedules.model.ts +++ b/src/test/models/TBM_schedules.model.ts @@ -3,6 +3,7 @@ // See http://mongoosejs.com/docs/models.html export enum RtScheduleState { + Annule = "ANNULE", Non_realise = "NON_REALISE", Realise = "REALISE", Devie = "DEVIE", From 08d130568a48db8fcb18849a88e5d19b0192caf1 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Wed, 7 Jun 2023 21:01:39 +0200 Subject: [PATCH 133/251] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20typegoose@11.2=20&?= =?UTF-8?q?=20use=20github=20catatomik/dijkstra?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 1241 ++++++++++++++-------------- package.json | 4 +- src/test/footPaths/FootPaths.ts | 110 --- src/test/footPaths/computePath.ts | 4 +- src/test/footPaths/test.ts | 12 +- src/test/footPaths/utils/Graph.ts | 250 ------ src/test/footPaths/utils/ultils.ts | 2 +- 7 files changed, 620 insertions(+), 1003 deletions(-) delete mode 100644 src/test/footPaths/FootPaths.ts delete mode 100644 src/test/footPaths/utils/Graph.ts diff --git a/package-lock.json b/package-lock.json index 3aa46b3b..5db8ebe5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,8 +9,8 @@ "version": "0.2.0", "license": "ISC", "dependencies": { - "@typegoose/typegoose": "^10.2.0-beta.3", - "@tyriar/fibonacci-heap": "^2.0.9", + "@catatomik/dijkstra": "github:catatomik/dijkstra", + "@typegoose/typegoose": "^11.2.0", "core-js": "^3.30.2", "mongodb": "^5.0.1" }, @@ -23,6 +23,25 @@ "typescript": "5.0.4" } }, + "node_modules/@aws-crypto/crc32": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-3.0.0.tgz", + "integrity": "sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==", + "optional": true, + "peer": true, + "dependencies": { + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/crc32/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "optional": true, + "peer": true + }, "node_modules/@aws-crypto/ie11-detection": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz", @@ -120,532 +139,544 @@ "peer": true }, "node_modules/@aws-sdk/abort-controller": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.272.0.tgz", - "integrity": "sha512-s2TV3phapcTwZNr4qLxbfuQuE9ZMP4RoJdkvRRCkKdm6jslsWLJf2Zlcxti/23hOlINUMYv2iXE2pftIgWGdpg==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.347.0.tgz", + "integrity": "sha512-P/2qE6ntYEmYG4Ez535nJWZbXqgbkJx8CMz7ChEuEg3Gp3dvVYEKg+iEUEvlqQ2U5dWP5J3ehw5po9t86IsVPQ==", "optional": true, "peer": true, "dependencies": { - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.347.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/client-cognito-identity": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.272.0.tgz", - "integrity": "sha512-uMjRWcNvX7SoGaVn0mXWD43+Z1awPahQwGW3riDLfXHZdOgw2oFDhD3Jg5jQ8OzQLUfDvArhE3WyZwlS4muMuQ==", + "version": "3.347.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.347.1.tgz", + "integrity": "sha512-E7hyfLORHmGFXBiN+7/8cg6h6G4b2e7mRaqdMWkAcWAalrNGrxeeNTm17BdOLpxKBfT5u7II9+1fjDOG4LLecQ==", "optional": true, "peer": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.272.0", - "@aws-sdk/config-resolver": "3.272.0", - "@aws-sdk/credential-provider-node": "3.272.0", - "@aws-sdk/fetch-http-handler": "3.272.0", - "@aws-sdk/hash-node": "3.272.0", - "@aws-sdk/invalid-dependency": "3.272.0", - "@aws-sdk/middleware-content-length": "3.272.0", - "@aws-sdk/middleware-endpoint": "3.272.0", - "@aws-sdk/middleware-host-header": "3.272.0", - "@aws-sdk/middleware-logger": "3.272.0", - "@aws-sdk/middleware-recursion-detection": "3.272.0", - "@aws-sdk/middleware-retry": "3.272.0", - "@aws-sdk/middleware-serde": "3.272.0", - "@aws-sdk/middleware-signing": "3.272.0", - "@aws-sdk/middleware-stack": "3.272.0", - "@aws-sdk/middleware-user-agent": "3.272.0", - "@aws-sdk/node-config-provider": "3.272.0", - "@aws-sdk/node-http-handler": "3.272.0", - "@aws-sdk/protocol-http": "3.272.0", - "@aws-sdk/smithy-client": "3.272.0", - "@aws-sdk/types": "3.272.0", - "@aws-sdk/url-parser": "3.272.0", - "@aws-sdk/util-base64": "3.208.0", - "@aws-sdk/util-body-length-browser": "3.188.0", - "@aws-sdk/util-body-length-node": "3.208.0", - "@aws-sdk/util-defaults-mode-browser": "3.272.0", - "@aws-sdk/util-defaults-mode-node": "3.272.0", - "@aws-sdk/util-endpoints": "3.272.0", - "@aws-sdk/util-retry": "3.272.0", - "@aws-sdk/util-user-agent-browser": "3.272.0", - "@aws-sdk/util-user-agent-node": "3.272.0", - "@aws-sdk/util-utf8": "3.254.0", - "tslib": "^2.3.1" + "@aws-sdk/client-sts": "3.347.1", + "@aws-sdk/config-resolver": "3.347.0", + "@aws-sdk/credential-provider-node": "3.347.0", + "@aws-sdk/fetch-http-handler": "3.347.0", + "@aws-sdk/hash-node": "3.347.0", + "@aws-sdk/invalid-dependency": "3.347.0", + "@aws-sdk/middleware-content-length": "3.347.0", + "@aws-sdk/middleware-endpoint": "3.347.0", + "@aws-sdk/middleware-host-header": "3.347.0", + "@aws-sdk/middleware-logger": "3.347.0", + "@aws-sdk/middleware-recursion-detection": "3.347.0", + "@aws-sdk/middleware-retry": "3.347.0", + "@aws-sdk/middleware-serde": "3.347.0", + "@aws-sdk/middleware-signing": "3.347.0", + "@aws-sdk/middleware-stack": "3.347.0", + "@aws-sdk/middleware-user-agent": "3.347.0", + "@aws-sdk/node-config-provider": "3.347.0", + "@aws-sdk/node-http-handler": "3.347.0", + "@aws-sdk/smithy-client": "3.347.0", + "@aws-sdk/types": "3.347.0", + "@aws-sdk/url-parser": "3.347.0", + "@aws-sdk/util-base64": "3.310.0", + "@aws-sdk/util-body-length-browser": "3.310.0", + "@aws-sdk/util-body-length-node": "3.310.0", + "@aws-sdk/util-defaults-mode-browser": "3.347.0", + "@aws-sdk/util-defaults-mode-node": "3.347.0", + "@aws-sdk/util-endpoints": "3.347.0", + "@aws-sdk/util-retry": "3.347.0", + "@aws-sdk/util-user-agent-browser": "3.347.0", + "@aws-sdk/util-user-agent-node": "3.347.0", + "@aws-sdk/util-utf8": "3.310.0", + "@smithy/protocol-http": "^1.0.1", + "@smithy/types": "^1.0.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/client-sso": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.272.0.tgz", - "integrity": "sha512-xn9a0IGONwQIARmngThoRhF1lLGjHAD67sUaShgIMaIMc6ipVYN6alWG1VuUpoUQ6iiwMEt0CHdfCyLyUV/fTA==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.347.0.tgz", + "integrity": "sha512-AZehWCNLUXTrDavsZYRi7d84Uef20ppYJ2FY0KxqrKB3lx89mO29SfSJSC4woeW5+6ooBokq8HtKxw5ImPfRhA==", "optional": true, "peer": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/config-resolver": "3.272.0", - "@aws-sdk/fetch-http-handler": "3.272.0", - "@aws-sdk/hash-node": "3.272.0", - "@aws-sdk/invalid-dependency": "3.272.0", - "@aws-sdk/middleware-content-length": "3.272.0", - "@aws-sdk/middleware-endpoint": "3.272.0", - "@aws-sdk/middleware-host-header": "3.272.0", - "@aws-sdk/middleware-logger": "3.272.0", - "@aws-sdk/middleware-recursion-detection": "3.272.0", - "@aws-sdk/middleware-retry": "3.272.0", - "@aws-sdk/middleware-serde": "3.272.0", - "@aws-sdk/middleware-stack": "3.272.0", - "@aws-sdk/middleware-user-agent": "3.272.0", - "@aws-sdk/node-config-provider": "3.272.0", - "@aws-sdk/node-http-handler": "3.272.0", - "@aws-sdk/protocol-http": "3.272.0", - "@aws-sdk/smithy-client": "3.272.0", - "@aws-sdk/types": "3.272.0", - "@aws-sdk/url-parser": "3.272.0", - "@aws-sdk/util-base64": "3.208.0", - "@aws-sdk/util-body-length-browser": "3.188.0", - "@aws-sdk/util-body-length-node": "3.208.0", - "@aws-sdk/util-defaults-mode-browser": "3.272.0", - "@aws-sdk/util-defaults-mode-node": "3.272.0", - "@aws-sdk/util-endpoints": "3.272.0", - "@aws-sdk/util-retry": "3.272.0", - "@aws-sdk/util-user-agent-browser": "3.272.0", - "@aws-sdk/util-user-agent-node": "3.272.0", - "@aws-sdk/util-utf8": "3.254.0", - "tslib": "^2.3.1" + "@aws-sdk/config-resolver": "3.347.0", + "@aws-sdk/fetch-http-handler": "3.347.0", + "@aws-sdk/hash-node": "3.347.0", + "@aws-sdk/invalid-dependency": "3.347.0", + "@aws-sdk/middleware-content-length": "3.347.0", + "@aws-sdk/middleware-endpoint": "3.347.0", + "@aws-sdk/middleware-host-header": "3.347.0", + "@aws-sdk/middleware-logger": "3.347.0", + "@aws-sdk/middleware-recursion-detection": "3.347.0", + "@aws-sdk/middleware-retry": "3.347.0", + "@aws-sdk/middleware-serde": "3.347.0", + "@aws-sdk/middleware-stack": "3.347.0", + "@aws-sdk/middleware-user-agent": "3.347.0", + "@aws-sdk/node-config-provider": "3.347.0", + "@aws-sdk/node-http-handler": "3.347.0", + "@aws-sdk/smithy-client": "3.347.0", + "@aws-sdk/types": "3.347.0", + "@aws-sdk/url-parser": "3.347.0", + "@aws-sdk/util-base64": "3.310.0", + "@aws-sdk/util-body-length-browser": "3.310.0", + "@aws-sdk/util-body-length-node": "3.310.0", + "@aws-sdk/util-defaults-mode-browser": "3.347.0", + "@aws-sdk/util-defaults-mode-node": "3.347.0", + "@aws-sdk/util-endpoints": "3.347.0", + "@aws-sdk/util-retry": "3.347.0", + "@aws-sdk/util-user-agent-browser": "3.347.0", + "@aws-sdk/util-user-agent-node": "3.347.0", + "@aws-sdk/util-utf8": "3.310.0", + "@smithy/protocol-http": "^1.0.1", + "@smithy/types": "^1.0.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.272.0.tgz", - "integrity": "sha512-ECcXu3xoa1yggnGKMTh29eWNHiF/wC6r5Uqbla22eOOosyh0+Z6lkJ3JUSLOUKCkBXA4Cs/tJL9UDFBrKbSlvA==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.347.0.tgz", + "integrity": "sha512-IBxRfPqb8f9FqpmDbzcRDfoiasj/Y47C4Gj+j3kA5T1XWyGwbDI9QnPW/rnkZTWxLUUG1LSbBNwbPD6TLoff8A==", "optional": true, "peer": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/config-resolver": "3.272.0", - "@aws-sdk/fetch-http-handler": "3.272.0", - "@aws-sdk/hash-node": "3.272.0", - "@aws-sdk/invalid-dependency": "3.272.0", - "@aws-sdk/middleware-content-length": "3.272.0", - "@aws-sdk/middleware-endpoint": "3.272.0", - "@aws-sdk/middleware-host-header": "3.272.0", - "@aws-sdk/middleware-logger": "3.272.0", - "@aws-sdk/middleware-recursion-detection": "3.272.0", - "@aws-sdk/middleware-retry": "3.272.0", - "@aws-sdk/middleware-serde": "3.272.0", - "@aws-sdk/middleware-stack": "3.272.0", - "@aws-sdk/middleware-user-agent": "3.272.0", - "@aws-sdk/node-config-provider": "3.272.0", - "@aws-sdk/node-http-handler": "3.272.0", - "@aws-sdk/protocol-http": "3.272.0", - "@aws-sdk/smithy-client": "3.272.0", - "@aws-sdk/types": "3.272.0", - "@aws-sdk/url-parser": "3.272.0", - "@aws-sdk/util-base64": "3.208.0", - "@aws-sdk/util-body-length-browser": "3.188.0", - "@aws-sdk/util-body-length-node": "3.208.0", - "@aws-sdk/util-defaults-mode-browser": "3.272.0", - "@aws-sdk/util-defaults-mode-node": "3.272.0", - "@aws-sdk/util-endpoints": "3.272.0", - "@aws-sdk/util-retry": "3.272.0", - "@aws-sdk/util-user-agent-browser": "3.272.0", - "@aws-sdk/util-user-agent-node": "3.272.0", - "@aws-sdk/util-utf8": "3.254.0", - "tslib": "^2.3.1" + "@aws-sdk/config-resolver": "3.347.0", + "@aws-sdk/fetch-http-handler": "3.347.0", + "@aws-sdk/hash-node": "3.347.0", + "@aws-sdk/invalid-dependency": "3.347.0", + "@aws-sdk/middleware-content-length": "3.347.0", + "@aws-sdk/middleware-endpoint": "3.347.0", + "@aws-sdk/middleware-host-header": "3.347.0", + "@aws-sdk/middleware-logger": "3.347.0", + "@aws-sdk/middleware-recursion-detection": "3.347.0", + "@aws-sdk/middleware-retry": "3.347.0", + "@aws-sdk/middleware-serde": "3.347.0", + "@aws-sdk/middleware-stack": "3.347.0", + "@aws-sdk/middleware-user-agent": "3.347.0", + "@aws-sdk/node-config-provider": "3.347.0", + "@aws-sdk/node-http-handler": "3.347.0", + "@aws-sdk/smithy-client": "3.347.0", + "@aws-sdk/types": "3.347.0", + "@aws-sdk/url-parser": "3.347.0", + "@aws-sdk/util-base64": "3.310.0", + "@aws-sdk/util-body-length-browser": "3.310.0", + "@aws-sdk/util-body-length-node": "3.310.0", + "@aws-sdk/util-defaults-mode-browser": "3.347.0", + "@aws-sdk/util-defaults-mode-node": "3.347.0", + "@aws-sdk/util-endpoints": "3.347.0", + "@aws-sdk/util-retry": "3.347.0", + "@aws-sdk/util-user-agent-browser": "3.347.0", + "@aws-sdk/util-user-agent-node": "3.347.0", + "@aws-sdk/util-utf8": "3.310.0", + "@smithy/protocol-http": "^1.0.1", + "@smithy/types": "^1.0.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/client-sts": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.272.0.tgz", - "integrity": "sha512-kigxCxURp3WupufGaL/LABMb7UQfzAQkKcj9royizL3ItJ0vw5kW/JFrPje5IW1mfLgdPF7PI9ShOjE0fCLTqA==", + "version": "3.347.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.347.1.tgz", + "integrity": "sha512-i7vomVsbZcGD2pzOuEl0RS7yCtFcT6CVfSP1wZLwgcjAssUKTLHi65I/uSAUF0KituChw31aXlxh7EGq1uDqaA==", "optional": true, "peer": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/config-resolver": "3.272.0", - "@aws-sdk/credential-provider-node": "3.272.0", - "@aws-sdk/fetch-http-handler": "3.272.0", - "@aws-sdk/hash-node": "3.272.0", - "@aws-sdk/invalid-dependency": "3.272.0", - "@aws-sdk/middleware-content-length": "3.272.0", - "@aws-sdk/middleware-endpoint": "3.272.0", - "@aws-sdk/middleware-host-header": "3.272.0", - "@aws-sdk/middleware-logger": "3.272.0", - "@aws-sdk/middleware-recursion-detection": "3.272.0", - "@aws-sdk/middleware-retry": "3.272.0", - "@aws-sdk/middleware-sdk-sts": "3.272.0", - "@aws-sdk/middleware-serde": "3.272.0", - "@aws-sdk/middleware-signing": "3.272.0", - "@aws-sdk/middleware-stack": "3.272.0", - "@aws-sdk/middleware-user-agent": "3.272.0", - "@aws-sdk/node-config-provider": "3.272.0", - "@aws-sdk/node-http-handler": "3.272.0", - "@aws-sdk/protocol-http": "3.272.0", - "@aws-sdk/smithy-client": "3.272.0", - "@aws-sdk/types": "3.272.0", - "@aws-sdk/url-parser": "3.272.0", - "@aws-sdk/util-base64": "3.208.0", - "@aws-sdk/util-body-length-browser": "3.188.0", - "@aws-sdk/util-body-length-node": "3.208.0", - "@aws-sdk/util-defaults-mode-browser": "3.272.0", - "@aws-sdk/util-defaults-mode-node": "3.272.0", - "@aws-sdk/util-endpoints": "3.272.0", - "@aws-sdk/util-retry": "3.272.0", - "@aws-sdk/util-user-agent-browser": "3.272.0", - "@aws-sdk/util-user-agent-node": "3.272.0", - "@aws-sdk/util-utf8": "3.254.0", - "fast-xml-parser": "4.0.11", - "tslib": "^2.3.1" + "@aws-sdk/config-resolver": "3.347.0", + "@aws-sdk/credential-provider-node": "3.347.0", + "@aws-sdk/fetch-http-handler": "3.347.0", + "@aws-sdk/hash-node": "3.347.0", + "@aws-sdk/invalid-dependency": "3.347.0", + "@aws-sdk/middleware-content-length": "3.347.0", + "@aws-sdk/middleware-endpoint": "3.347.0", + "@aws-sdk/middleware-host-header": "3.347.0", + "@aws-sdk/middleware-logger": "3.347.0", + "@aws-sdk/middleware-recursion-detection": "3.347.0", + "@aws-sdk/middleware-retry": "3.347.0", + "@aws-sdk/middleware-sdk-sts": "3.347.0", + "@aws-sdk/middleware-serde": "3.347.0", + "@aws-sdk/middleware-signing": "3.347.0", + "@aws-sdk/middleware-stack": "3.347.0", + "@aws-sdk/middleware-user-agent": "3.347.0", + "@aws-sdk/node-config-provider": "3.347.0", + "@aws-sdk/node-http-handler": "3.347.0", + "@aws-sdk/smithy-client": "3.347.0", + "@aws-sdk/types": "3.347.0", + "@aws-sdk/url-parser": "3.347.0", + "@aws-sdk/util-base64": "3.310.0", + "@aws-sdk/util-body-length-browser": "3.310.0", + "@aws-sdk/util-body-length-node": "3.310.0", + "@aws-sdk/util-defaults-mode-browser": "3.347.0", + "@aws-sdk/util-defaults-mode-node": "3.347.0", + "@aws-sdk/util-endpoints": "3.347.0", + "@aws-sdk/util-retry": "3.347.0", + "@aws-sdk/util-user-agent-browser": "3.347.0", + "@aws-sdk/util-user-agent-node": "3.347.0", + "@aws-sdk/util-utf8": "3.310.0", + "@smithy/protocol-http": "^1.0.1", + "@smithy/types": "^1.0.0", + "fast-xml-parser": "4.2.4", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/config-resolver": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.272.0.tgz", - "integrity": "sha512-Dr4CffRVNsOp3LRNdpvcH6XuSgXOSLblWliCy/5I86cNl567KVMxujVx6uPrdTXYs2h1rt3MNl6jQGnAiJeTbw==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.347.0.tgz", + "integrity": "sha512-2ja+Sf/VnUO7IQ3nKbDQ5aumYKKJUaTm/BuVJ29wNho8wYHfuf7wHZV0pDTkB8RF5SH7IpHap7zpZAj39Iq+EA==", "optional": true, "peer": true, "dependencies": { - "@aws-sdk/signature-v4": "3.272.0", - "@aws-sdk/types": "3.272.0", - "@aws-sdk/util-config-provider": "3.208.0", - "@aws-sdk/util-middleware": "3.272.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.347.0", + "@aws-sdk/util-config-provider": "3.310.0", + "@aws-sdk/util-middleware": "3.347.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/credential-provider-cognito-identity": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.272.0.tgz", - "integrity": "sha512-rVx0rtQjbiYCM0nah2rB/2ut2YJYPpRr1AbW/Hd4r/PI+yiusrmXAwuT4HIW2yr34zsQMPi1jZ3WHN9Rn9mzlg==", + "version": "3.347.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.347.1.tgz", + "integrity": "sha512-7UQmpX5Xe4OPUgVtMK4+g5yMlYTmlpbYWbJG0RnyXtxLBG2OP4iyc8LGBq9AVY/ljTYGv+LSdVorldvERHUDCA==", "optional": true, "peer": true, "dependencies": { - "@aws-sdk/client-cognito-identity": "3.272.0", - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" + "@aws-sdk/client-cognito-identity": "3.347.1", + "@aws-sdk/property-provider": "3.347.0", + "@aws-sdk/types": "3.347.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.272.0.tgz", - "integrity": "sha512-QI65NbLnKLYHyTYhXaaUrq6eVsCCrMUb05WDA7+TJkWkjXesovpjc8vUKgFiLSxmgKmb2uOhHNcDyObKMrYQFw==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.347.0.tgz", + "integrity": "sha512-UnEM+LKGpXKzw/1WvYEQsC6Wj9PupYZdQOE+e2Dgy2dqk/pVFy4WueRtFXYDT2B41ppv3drdXUuKZRIDVqIgNQ==", "optional": true, "peer": true, "dependencies": { - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" + "@aws-sdk/property-provider": "3.347.0", + "@aws-sdk/types": "3.347.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/credential-provider-imds": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.272.0.tgz", - "integrity": "sha512-wwAfVY1jTFQEfxVfdYD5r5ieYGl+0g4nhekVxNMqE8E1JeRDd18OqiwAflzpgBIqxfqvCUkf+vl5JYyacMkNAQ==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.347.0.tgz", + "integrity": "sha512-7scCy/DCDRLIhlqTxff97LQWDnRwRXji3bxxMg+xWOTTaJe7PWx+etGSbBWaL42vsBHFShQjSLvJryEgoBktpw==", "optional": true, "peer": true, "dependencies": { - "@aws-sdk/node-config-provider": "3.272.0", - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/types": "3.272.0", - "@aws-sdk/url-parser": "3.272.0", - "tslib": "^2.3.1" + "@aws-sdk/node-config-provider": "3.347.0", + "@aws-sdk/property-provider": "3.347.0", + "@aws-sdk/types": "3.347.0", + "@aws-sdk/url-parser": "3.347.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.272.0.tgz", - "integrity": "sha512-iE3CDzK5NcupHYjfYjBdY1JCy8NLEoRUsboEjG0i0gy3S3jVpDeVHX1dLVcL/slBFj6GiM7SoNV/UfKnJf3Gaw==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.347.0.tgz", + "integrity": "sha512-84TNF34ryabmVbILOq7f+/Jy8tJaskvHdax3X90qxFtXRU11kX0bf5NYL616KT0epR0VGpy50ThfIqvBwxeJfQ==", "optional": true, "peer": true, "dependencies": { - "@aws-sdk/credential-provider-env": "3.272.0", - "@aws-sdk/credential-provider-imds": "3.272.0", - "@aws-sdk/credential-provider-process": "3.272.0", - "@aws-sdk/credential-provider-sso": "3.272.0", - "@aws-sdk/credential-provider-web-identity": "3.272.0", - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/shared-ini-file-loader": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" + "@aws-sdk/credential-provider-env": "3.347.0", + "@aws-sdk/credential-provider-imds": "3.347.0", + "@aws-sdk/credential-provider-process": "3.347.0", + "@aws-sdk/credential-provider-sso": "3.347.0", + "@aws-sdk/credential-provider-web-identity": "3.347.0", + "@aws-sdk/property-provider": "3.347.0", + "@aws-sdk/shared-ini-file-loader": "3.347.0", + "@aws-sdk/types": "3.347.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.272.0.tgz", - "integrity": "sha512-FI8uvwM1IxiRSvbkdKv8DZG5vxU3ezaseTaB1fHWTxEUFb0pWIoHX9oeOKer9Fj31SOZTCNAaYFURbSRuZlm/w==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.347.0.tgz", + "integrity": "sha512-ds2uxE0krl94RdQ7bstwafUXdlMeEOPgedhaheVVlj8kH+XqlZdwUUaUv1uoEI9iBzuSjKftUkIHo0xsTiwtaw==", "optional": true, "peer": true, "dependencies": { - "@aws-sdk/credential-provider-env": "3.272.0", - "@aws-sdk/credential-provider-imds": "3.272.0", - "@aws-sdk/credential-provider-ini": "3.272.0", - "@aws-sdk/credential-provider-process": "3.272.0", - "@aws-sdk/credential-provider-sso": "3.272.0", - "@aws-sdk/credential-provider-web-identity": "3.272.0", - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/shared-ini-file-loader": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" + "@aws-sdk/credential-provider-env": "3.347.0", + "@aws-sdk/credential-provider-imds": "3.347.0", + "@aws-sdk/credential-provider-ini": "3.347.0", + "@aws-sdk/credential-provider-process": "3.347.0", + "@aws-sdk/credential-provider-sso": "3.347.0", + "@aws-sdk/credential-provider-web-identity": "3.347.0", + "@aws-sdk/property-provider": "3.347.0", + "@aws-sdk/shared-ini-file-loader": "3.347.0", + "@aws-sdk/types": "3.347.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.272.0.tgz", - "integrity": "sha512-hiCAjWWm2PeBFp5cjkxqyam/XADjiS+e7GzwC34TbZn3LisS0uoweLojj9tD11NnnUhyhbLteUvu5+rotOLwrg==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.347.0.tgz", + "integrity": "sha512-yl1z4MsaBdXd4GQ2halIvYds23S67kElyOwz7g8kaQ4kHj+UoYWxz3JVW/DGusM6XmQ9/F67utBrUVA0uhQYyw==", "optional": true, "peer": true, "dependencies": { - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/shared-ini-file-loader": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" + "@aws-sdk/property-provider": "3.347.0", + "@aws-sdk/shared-ini-file-loader": "3.347.0", + "@aws-sdk/types": "3.347.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.272.0.tgz", - "integrity": "sha512-hwYaulyiU/7chKKFecxCeo0ls6Dxs7h+5EtoYcJJGvfpvCncyOZF35t00OAsCd3Wo7HkhhgfpGdb6dmvCNQAZQ==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.347.0.tgz", + "integrity": "sha512-M1d7EnUaJbSNCmNalEbINmtFkc9wJufx7UhKtEeFwSq9KEzOMroH1MEOeiqIw9f/zE8NI/iPkVeEhw123vmBrQ==", "optional": true, "peer": true, "dependencies": { - "@aws-sdk/client-sso": "3.272.0", - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/shared-ini-file-loader": "3.272.0", - "@aws-sdk/token-providers": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" + "@aws-sdk/client-sso": "3.347.0", + "@aws-sdk/property-provider": "3.347.0", + "@aws-sdk/shared-ini-file-loader": "3.347.0", + "@aws-sdk/token-providers": "3.347.0", + "@aws-sdk/types": "3.347.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.272.0.tgz", - "integrity": "sha512-ImrHMkcgneGa/HadHAQXPwOrX26sAKuB8qlMxZF/ZCM2B55u8deY+ZVkVuraeKb7YsahMGehPFOfRAF6mvFI5Q==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.347.0.tgz", + "integrity": "sha512-DxoTlVK8lXjS1zVphtz/Ab+jkN/IZor9d6pP2GjJHNoAIIzXfRwwj5C8vr4eTayx/5VJ7GRP91J8GJ2cKly8Qw==", "optional": true, "peer": true, "dependencies": { - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" + "@aws-sdk/property-provider": "3.347.0", + "@aws-sdk/types": "3.347.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/credential-providers": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.272.0.tgz", - "integrity": "sha512-ucd6Xq6aBMf+nM4uz5zkjL11mwaE5BV1Q4hkulaGu2v1dRA8n6zhLJk/sb4hOJ7leelqMJMErlbQ2T3MkYvlJQ==", - "optional": true, - "peer": true, - "dependencies": { - "@aws-sdk/client-cognito-identity": "3.272.0", - "@aws-sdk/client-sso": "3.272.0", - "@aws-sdk/client-sts": "3.272.0", - "@aws-sdk/credential-provider-cognito-identity": "3.272.0", - "@aws-sdk/credential-provider-env": "3.272.0", - "@aws-sdk/credential-provider-imds": "3.272.0", - "@aws-sdk/credential-provider-ini": "3.272.0", - "@aws-sdk/credential-provider-node": "3.272.0", - "@aws-sdk/credential-provider-process": "3.272.0", - "@aws-sdk/credential-provider-sso": "3.272.0", - "@aws-sdk/credential-provider-web-identity": "3.272.0", - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/shared-ini-file-loader": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" + "version": "3.347.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.347.1.tgz", + "integrity": "sha512-2P7krq9w6egQnLxjU7IPp/Q4W8svs/NdWUKe1m17NVscop4GEAo9p26y2Ku23Jlw/lnmIpu8qHTEX+5+XEVSXg==", + "optional": true, + "peer": true, + "dependencies": { + "@aws-sdk/client-cognito-identity": "3.347.1", + "@aws-sdk/client-sso": "3.347.0", + "@aws-sdk/client-sts": "3.347.1", + "@aws-sdk/credential-provider-cognito-identity": "3.347.1", + "@aws-sdk/credential-provider-env": "3.347.0", + "@aws-sdk/credential-provider-imds": "3.347.0", + "@aws-sdk/credential-provider-ini": "3.347.0", + "@aws-sdk/credential-provider-node": "3.347.0", + "@aws-sdk/credential-provider-process": "3.347.0", + "@aws-sdk/credential-provider-sso": "3.347.0", + "@aws-sdk/credential-provider-web-identity": "3.347.0", + "@aws-sdk/property-provider": "3.347.0", + "@aws-sdk/types": "3.347.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/eventstream-codec": { + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-codec/-/eventstream-codec-3.347.0.tgz", + "integrity": "sha512-61q+SyspjsaQ4sdgjizMyRgVph2CiW4aAtfpoH69EJFJfTxTR/OqnZ9Jx/3YiYi0ksrvDenJddYodfWWJqD8/w==", + "optional": true, + "peer": true, + "dependencies": { + "@aws-crypto/crc32": "3.0.0", + "@aws-sdk/types": "3.347.0", + "@aws-sdk/util-hex-encoding": "3.310.0", + "tslib": "^2.5.0" + } + }, "node_modules/@aws-sdk/fetch-http-handler": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.272.0.tgz", - "integrity": "sha512-1Qhm9e0RbS1Xf4CZqUbQyUMkDLd7GrsRXWIvm9b86/vgeV8/WnjO3CMue9D51nYgcyQORhYXv6uVjAYCWbUExA==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.347.0.tgz", + "integrity": "sha512-sQ5P7ivY8//7wdxfA76LT1sF6V2Tyyz1qF6xXf9sihPN5Q1Y65c+SKpMzXyFSPqWZ82+SQQuDliYZouVyS6kQQ==", "optional": true, "peer": true, "dependencies": { - "@aws-sdk/protocol-http": "3.272.0", - "@aws-sdk/querystring-builder": "3.272.0", - "@aws-sdk/types": "3.272.0", - "@aws-sdk/util-base64": "3.208.0", - "tslib": "^2.3.1" + "@aws-sdk/protocol-http": "3.347.0", + "@aws-sdk/querystring-builder": "3.347.0", + "@aws-sdk/types": "3.347.0", + "@aws-sdk/util-base64": "3.310.0", + "tslib": "^2.5.0" } }, "node_modules/@aws-sdk/hash-node": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.272.0.tgz", - "integrity": "sha512-40dwND+iAm3VtPHPZu7/+CIdVJFk2s0cWZt1lOiMPMSXycSYJ45wMk7Lly3uoqRx0uWfFK5iT2OCv+fJi5jTng==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.347.0.tgz", + "integrity": "sha512-96+ml/4EaUaVpzBdOLGOxdoXOjkPgkoJp/0i1fxOJEvl8wdAQSwc3IugVK9wZkCxy2DlENtgOe6DfIOhfffm/g==", "optional": true, "peer": true, "dependencies": { - "@aws-sdk/types": "3.272.0", - "@aws-sdk/util-buffer-from": "3.208.0", - "@aws-sdk/util-utf8": "3.254.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.347.0", + "@aws-sdk/util-buffer-from": "3.310.0", + "@aws-sdk/util-utf8": "3.310.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/invalid-dependency": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.272.0.tgz", - "integrity": "sha512-ysW6wbjl1Y78txHUQ/Tldj2Rg1BI7rpMO9B9xAF6yAX3mQ7t6SUPQG/ewOGvH2208NBIl3qP5e/hDf0Q6r/1iw==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.347.0.tgz", + "integrity": "sha512-8imQcwLwqZ/wTJXZqzXT9pGLIksTRckhGLZaXT60tiBOPKuerTsus2L59UstLs5LP8TKaVZKFFSsjRIn9dQdmQ==", "optional": true, "peer": true, "dependencies": { - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.347.0", + "tslib": "^2.5.0" } }, "node_modules/@aws-sdk/is-array-buffer": { - "version": "3.201.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.201.0.tgz", - "integrity": "sha512-UPez5qLh3dNgt0DYnPD/q0mVJY84rA17QE26hVNOW3fAji8W2wrwrxdacWOxyXvlxWsVRcKmr+lay1MDqpAMfg==", + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.310.0.tgz", + "integrity": "sha512-urnbcCR+h9NWUnmOtet/s4ghvzsidFmspfhYaHAmSRdy9yDjdjBJMFjjsn85A1ODUktztm+cVncXjQ38WCMjMQ==", "optional": true, "peer": true, "dependencies": { - "tslib": "^2.3.1" + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/middleware-content-length": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.272.0.tgz", - "integrity": "sha512-sAbDZSTNmLX+UTGwlUHJBWy0QGQkiClpHwVFXACon+aG0ySLNeRKEVYs6NCPYldw4cj6hveLUn50cX44ukHErw==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.347.0.tgz", + "integrity": "sha512-i4qtWTDImMaDUtwKQPbaZpXsReiwiBomM1cWymCU4bhz81HL01oIxOxOBuiM+3NlDoCSPr3KI6txZSz/8cqXCQ==", "optional": true, "peer": true, "dependencies": { - "@aws-sdk/protocol-http": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" + "@aws-sdk/protocol-http": "3.347.0", + "@aws-sdk/types": "3.347.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/middleware-endpoint": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.272.0.tgz", - "integrity": "sha512-Dk3JVjj7SxxoUKv3xGiOeBksvPtFhTDrVW75XJ98Ymv8gJH5L1sq4hIeJAHRKogGiRFq2J73mnZSlM9FVXEylg==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.347.0.tgz", + "integrity": "sha512-unF0c6dMaUL1ffU+37Ugty43DgMnzPWXr/Jup/8GbK5fzzWT5NQq6dj9KHPubMbWeEjQbmczvhv25JuJdK8gNQ==", "optional": true, "peer": true, "dependencies": { - "@aws-sdk/middleware-serde": "3.272.0", - "@aws-sdk/protocol-http": "3.272.0", - "@aws-sdk/signature-v4": "3.272.0", - "@aws-sdk/types": "3.272.0", - "@aws-sdk/url-parser": "3.272.0", - "@aws-sdk/util-config-provider": "3.208.0", - "@aws-sdk/util-middleware": "3.272.0", - "tslib": "^2.3.1" + "@aws-sdk/middleware-serde": "3.347.0", + "@aws-sdk/types": "3.347.0", + "@aws-sdk/url-parser": "3.347.0", + "@aws-sdk/util-middleware": "3.347.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.272.0.tgz", - "integrity": "sha512-Q8K7bMMFZnioUXpxn57HIt4p+I63XaNAawMLIZ5B4F2piyukbQeM9q2XVKMGwqLvijHR8CyP5nHrtKqVuINogQ==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.347.0.tgz", + "integrity": "sha512-kpKmR9OvMlnReqp5sKcJkozbj1wmlblbVSbnQAIkzeQj2xD5dnVR3Nn2ogQKxSmU1Fv7dEroBtrruJ1o3fY38A==", "optional": true, "peer": true, "dependencies": { - "@aws-sdk/protocol-http": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" + "@aws-sdk/protocol-http": "3.347.0", + "@aws-sdk/types": "3.347.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/middleware-logger": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.272.0.tgz", - "integrity": "sha512-u2SQ0hWrFwxbxxYMG5uMEgf01pQY5jauK/LYWgGIvuCmFgiyRQQP3oN7kkmsxnS9MWmNmhbyQguX2NY02s5e9w==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.347.0.tgz", + "integrity": "sha512-NYC+Id5UCkVn+3P1t/YtmHt75uED06vwaKyxDy0UmB2K66PZLVtwWbLpVWrhbroaw1bvUHYcRyQ9NIfnVcXQjA==", "optional": true, "peer": true, "dependencies": { - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.347.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.272.0.tgz", - "integrity": "sha512-Gp/eKWeUWVNiiBdmUM2qLkBv+VLSJKoWAO+aKmyxxwjjmWhE0FrfA1NQ1a3g+NGMhRbAfQdaYswRAKsul70ISg==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.347.0.tgz", + "integrity": "sha512-qfnSvkFKCAMjMHR31NdsT0gv5Sq/ZHTUD4yQsSLpbVQ6iYAS834lrzXt41iyEHt57Y514uG7F/Xfvude3u4icQ==", "optional": true, "peer": true, "dependencies": { - "@aws-sdk/protocol-http": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" + "@aws-sdk/protocol-http": "3.347.0", + "@aws-sdk/types": "3.347.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/middleware-retry": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.272.0.tgz", - "integrity": "sha512-pCGvHM7C76VbO/dFerH+Vwf7tGv7j+e+eGrvhQ35mRghCtfIou/WMfTZlD1TNee93crrAQQVZKjtW3dMB3WCzg==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.347.0.tgz", + "integrity": "sha512-CpdM+8dCSbX96agy4FCzOfzDmhNnGBM/pxrgIVLm5nkYTLuXp/d7ubpFEUHULr+4hCd5wakHotMt7yO29NFaVw==", "optional": true, "peer": true, "dependencies": { - "@aws-sdk/protocol-http": "3.272.0", - "@aws-sdk/service-error-classification": "3.272.0", - "@aws-sdk/types": "3.272.0", - "@aws-sdk/util-middleware": "3.272.0", - "@aws-sdk/util-retry": "3.272.0", - "tslib": "^2.3.1", + "@aws-sdk/protocol-http": "3.347.0", + "@aws-sdk/service-error-classification": "3.347.0", + "@aws-sdk/types": "3.347.0", + "@aws-sdk/util-middleware": "3.347.0", + "@aws-sdk/util-retry": "3.347.0", + "tslib": "^2.5.0", "uuid": "^8.3.2" }, "engines": { @@ -653,177 +684,175 @@ } }, "node_modules/@aws-sdk/middleware-sdk-sts": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.272.0.tgz", - "integrity": "sha512-VvYPg7LrDIjUOWueSzo2wBzcNG7dw+cmzV6zAKaLxf0RC5jeAP4hE0OzDiiZfDrjNghEzgq/V+0NO+LewqYL9Q==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.347.0.tgz", + "integrity": "sha512-38LJ0bkIoVF3W97x6Jyyou72YV9Cfbml4OaDEdnrCOo0EssNZM5d7RhjMvQDwww7/3OBY/BzeOcZKfJlkYUXGw==", "optional": true, "peer": true, "dependencies": { - "@aws-sdk/middleware-signing": "3.272.0", - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/protocol-http": "3.272.0", - "@aws-sdk/signature-v4": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" + "@aws-sdk/middleware-signing": "3.347.0", + "@aws-sdk/types": "3.347.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/middleware-serde": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.272.0.tgz", - "integrity": "sha512-kW1uOxgPSwtXPB5rm3QLdWomu42lkYpQL94tM1BjyFOWmBLO2lQhk5a7Dw6HkTozT9a+vxtscLChRa6KZe61Hw==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.347.0.tgz", + "integrity": "sha512-x5Foi7jRbVJXDu9bHfyCbhYDH5pKK+31MmsSJ3k8rY8keXLBxm2XEEg/AIoV9/TUF9EeVvZ7F1/RmMpJnWQsEg==", "optional": true, "peer": true, "dependencies": { - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.347.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/middleware-signing": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.272.0.tgz", - "integrity": "sha512-4LChFK4VAR91X+dupqM8fQqYhFGE0G4Bf9rQlVTgGSbi2KUOmpqXzH0/WKE228nKuEhmH8+Qd2VPSAE2JcyAUA==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.347.0.tgz", + "integrity": "sha512-zVBF/4MGKnvhAE/J+oAL/VAehiyv+trs2dqSQXwHou9j8eA8Vm8HS2NdOwpkZQchIxTuwFlqSusDuPEdYFbvGw==", "optional": true, "peer": true, "dependencies": { - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/protocol-http": "3.272.0", - "@aws-sdk/signature-v4": "3.272.0", - "@aws-sdk/types": "3.272.0", - "@aws-sdk/util-middleware": "3.272.0", - "tslib": "^2.3.1" + "@aws-sdk/property-provider": "3.347.0", + "@aws-sdk/protocol-http": "3.347.0", + "@aws-sdk/signature-v4": "3.347.0", + "@aws-sdk/types": "3.347.0", + "@aws-sdk/util-middleware": "3.347.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/middleware-stack": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.272.0.tgz", - "integrity": "sha512-jhwhknnPBGhfXAGV5GXUWfEhDFoP/DN8MPCO2yC5OAxyp6oVJ8lTPLkZYMTW5VL0c0eG44dXpF4Ib01V+PlDrQ==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.347.0.tgz", + "integrity": "sha512-Izidg4rqtYMcKuvn2UzgEpPLSmyd8ub9+LQ2oIzG3mpIzCBITq7wp40jN1iNkMg+X6KEnX9vdMJIYZsPYMCYuQ==", "optional": true, "peer": true, "dependencies": { - "tslib": "^2.3.1" + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.272.0.tgz", - "integrity": "sha512-Qy7/0fsDJxY5l0bEk7WKDfqb4Os/sCAgFR2zEvrhDtbkhYPf72ysvg/nRUTncmCbo8tOok4SJii2myk8KMfjjw==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.347.0.tgz", + "integrity": "sha512-wJbGN3OE1/daVCrwk49whhIr9E0j1N4gWwN/wi4WuyYIA+5lMUfVp0aGIOvZR+878DxuFz2hQ4XcZVT4K2WvQw==", "optional": true, "peer": true, "dependencies": { - "@aws-sdk/protocol-http": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" + "@aws-sdk/protocol-http": "3.347.0", + "@aws-sdk/types": "3.347.0", + "@aws-sdk/util-endpoints": "3.347.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/node-config-provider": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.272.0.tgz", - "integrity": "sha512-YYCIBh9g1EQo7hm2l22HX5Yr9RoPQ2RCvhzKvF1n1e8t1QH4iObQrYUtqHG4khcm64Cft8C5MwZmgzHbya5Z6Q==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.347.0.tgz", + "integrity": "sha512-faU93d3+5uTTUcotGgMXF+sJVFjrKh+ufW+CzYKT4yUHammyaIab/IbTPWy2hIolcEGtuPeVoxXw8TXbkh/tuw==", "optional": true, "peer": true, "dependencies": { - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/shared-ini-file-loader": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" + "@aws-sdk/property-provider": "3.347.0", + "@aws-sdk/shared-ini-file-loader": "3.347.0", + "@aws-sdk/types": "3.347.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/node-http-handler": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.272.0.tgz", - "integrity": "sha512-VrW9PjhhngeyYp4yGYPe5S0vgZH6NwU3Po9xAgayUeE37Inr7LS1YteFMHdpgsUUeNXnh7d06CXqHo1XjtqOKA==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.347.0.tgz", + "integrity": "sha512-eluPf3CeeEaPbETsPw7ee0Rb0FP79amu8vdLMrQmkrD+KP4owupUXOEI4drxWJgBSd+3PRowPWCDA8wUtraHKg==", "optional": true, "peer": true, "dependencies": { - "@aws-sdk/abort-controller": "3.272.0", - "@aws-sdk/protocol-http": "3.272.0", - "@aws-sdk/querystring-builder": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" + "@aws-sdk/abort-controller": "3.347.0", + "@aws-sdk/protocol-http": "3.347.0", + "@aws-sdk/querystring-builder": "3.347.0", + "@aws-sdk/types": "3.347.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/property-provider": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.272.0.tgz", - "integrity": "sha512-V1pZTaH5eqpAt8O8CzbItHhOtzIfFuWymvwZFkAtwKuaHpnl7jjrTouV482zoq8AD/fF+VVSshwBKYA7bhidIw==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.347.0.tgz", + "integrity": "sha512-t3nJ8CYPLKAF2v9nIHOHOlF0CviQbTvbFc2L4a+A+EVd/rM4PzL3+3n8ZJsr0h7f6uD04+b5YRFgKgnaqLXlEg==", "optional": true, "peer": true, "dependencies": { - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.347.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/protocol-http": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.272.0.tgz", - "integrity": "sha512-4JQ54v5Yn08jspNDeHo45CaSn1CvTJqS1Ywgr79eU6jBExtguOWv6LNtwVSBD9X37v88iqaxt8iu1Z3pZZAJeg==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.347.0.tgz", + "integrity": "sha512-2YdBhc02Wvy03YjhGwUxF0UQgrPWEy8Iq75pfS42N+/0B/+eWX1aQgfjFxIpLg7YSjT5eKtYOQGlYd4MFTgj9g==", "optional": true, "peer": true, "dependencies": { - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.347.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/querystring-builder": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.272.0.tgz", - "integrity": "sha512-ndo++7GkdCj5tBXE6rGcITpSpZS4PfyV38wntGYAlj9liL1omk3bLZRY6uzqqkJpVHqbg2fD7O2qHNItzZgqhw==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.347.0.tgz", + "integrity": "sha512-phtKTe6FXoV02MoPkIVV6owXI8Mwr5IBN3bPoxhcPvJG2AjEmnetSIrhb8kwc4oNhlwfZwH6Jo5ARW/VEWbZtg==", "optional": true, "peer": true, "dependencies": { - "@aws-sdk/types": "3.272.0", - "@aws-sdk/util-uri-escape": "3.201.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.347.0", + "@aws-sdk/util-uri-escape": "3.310.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/querystring-parser": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.272.0.tgz", - "integrity": "sha512-5oS4/9n6N1LZW9tI3qq/0GnCuWoOXRgcHVB+AJLRBvDbEe+GI+C/xK1tKLsfpDNgsQJHc4IPQoIt4megyZ/1+A==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.347.0.tgz", + "integrity": "sha512-5VXOhfZz78T2W7SuXf2avfjKglx1VZgZgp9Zfhrt/Rq+MTu2D+PZc5zmJHhYigD7x83jLSLogpuInQpFMA9LgA==", "optional": true, "peer": true, "dependencies": { - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.347.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/service-error-classification": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.272.0.tgz", - "integrity": "sha512-REoltM1LK9byyIufLqx9znhSolPcHQgVHIA2S0zu5sdt5qER4OubkLAXuo4MBbisUTmh8VOOvIyUb5ijZCXq1w==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.347.0.tgz", + "integrity": "sha512-xZ3MqSY81Oy2gh5g0fCtooAbahqh9VhsF8vcKjVX8+XPbGC8y+kej82+MsMg4gYL8gRFB9u4hgYbNgIS6JTAvg==", "optional": true, "peer": true, "engines": { @@ -831,295 +860,296 @@ } }, "node_modules/@aws-sdk/shared-ini-file-loader": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.272.0.tgz", - "integrity": "sha512-lzFPohp5sy2XvwFjZIzLVCRpC0i5cwBiaXmFzXYQZJm6FSCszHO4ax+m9yrtlyVFF/2YPWl+/bzNthy4aJtseA==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.347.0.tgz", + "integrity": "sha512-Xw+zAZQVLb+xMNHChXQ29tzzLqm3AEHsD8JJnlkeFjeMnWQtXdUfOARl5s8NzAppcKQNlVe2gPzjaKjoy2jz1Q==", "optional": true, "peer": true, "dependencies": { - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.347.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/signature-v4": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.272.0.tgz", - "integrity": "sha512-pWxnHG1NqJWMwlhJ6NHNiUikOL00DHROmxah6krJPMPq4I3am2KY2Rs/8ouWhnEXKaHAv4EQhSALJ+7Mq5S4/A==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.347.0.tgz", + "integrity": "sha512-58Uq1do+VsTHYkP11dTK+DF53fguoNNJL9rHRWhzP+OcYv3/mBMLoS2WPz/x9FO5mBg4ESFsug0I6mXbd36tjw==", "optional": true, "peer": true, "dependencies": { - "@aws-sdk/is-array-buffer": "3.201.0", - "@aws-sdk/types": "3.272.0", - "@aws-sdk/util-hex-encoding": "3.201.0", - "@aws-sdk/util-middleware": "3.272.0", - "@aws-sdk/util-uri-escape": "3.201.0", - "@aws-sdk/util-utf8": "3.254.0", - "tslib": "^2.3.1" + "@aws-sdk/eventstream-codec": "3.347.0", + "@aws-sdk/is-array-buffer": "3.310.0", + "@aws-sdk/types": "3.347.0", + "@aws-sdk/util-hex-encoding": "3.310.0", + "@aws-sdk/util-middleware": "3.347.0", + "@aws-sdk/util-uri-escape": "3.310.0", + "@aws-sdk/util-utf8": "3.310.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/smithy-client": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.272.0.tgz", - "integrity": "sha512-pvdleJ3kaRvyRw2pIZnqL85ZlWBOZrPKmR9I69GCvlyrfdjRBhbSjIEZ+sdhZudw0vdHxq25AGoLUXhofVLf5Q==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.347.0.tgz", + "integrity": "sha512-PaGTDsJLGK0sTjA6YdYQzILRlPRN3uVFyqeBUkfltXssvUzkm8z2t1lz2H4VyJLAhwnG5ZuZTNEV/2mcWrU7JQ==", "optional": true, "peer": true, "dependencies": { - "@aws-sdk/middleware-stack": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" + "@aws-sdk/middleware-stack": "3.347.0", + "@aws-sdk/types": "3.347.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.272.0.tgz", - "integrity": "sha512-0GISJ4IKN2rXvbSddB775VjBGSKhYIGQnAdMqbvxi9LB6pSvVxcH9aIL28G0spiuL+dy3yGQZ8RlJPAyP9JW9A==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.347.0.tgz", + "integrity": "sha512-DZS9UWEy105zsaBJTgcvv1U+0jl7j1OzfMpnLf/lEYjEvx/4FqY2Ue/OZUACJorZgm/dWNqrhY17tZXtS/S3ew==", "optional": true, "peer": true, "dependencies": { - "@aws-sdk/client-sso-oidc": "3.272.0", - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/shared-ini-file-loader": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" + "@aws-sdk/client-sso-oidc": "3.347.0", + "@aws-sdk/property-provider": "3.347.0", + "@aws-sdk/shared-ini-file-loader": "3.347.0", + "@aws-sdk/types": "3.347.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/types": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.272.0.tgz", - "integrity": "sha512-MmmL6vxMGP5Bsi+4wRx4mxYlU/LX6M0noOXrDh/x5FfG7/4ZOar/nDxqDadhJtNM88cuWVHZWY59P54JzkGWmA==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.347.0.tgz", + "integrity": "sha512-GkCMy79mdjU9OTIe5KT58fI/6uqdf8UmMdWqVHmFJ+UpEzOci7L/uw4sOXWo7xpPzLs6cJ7s5ouGZW4GRPmHFA==", "optional": true, "peer": true, "dependencies": { - "tslib": "^2.3.1" + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/url-parser": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.272.0.tgz", - "integrity": "sha512-vX/Tx02PlnQ/Kgtf5TnrNDHPNbY+amLZjW0Z1d9vzAvSZhQ4i9Y18yxoRDIaDTCNVRDjdhV8iuctW+05PB5JtQ==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.347.0.tgz", + "integrity": "sha512-lhrnVjxdV7hl+yCnJfDZOaVLSqKjxN20MIOiijRiqaWGLGEAiSqBreMhL89X1WKCifxAs4zZf9YB9SbdziRpAA==", "optional": true, "peer": true, "dependencies": { - "@aws-sdk/querystring-parser": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" + "@aws-sdk/querystring-parser": "3.347.0", + "@aws-sdk/types": "3.347.0", + "tslib": "^2.5.0" } }, "node_modules/@aws-sdk/util-base64": { - "version": "3.208.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64/-/util-base64-3.208.0.tgz", - "integrity": "sha512-PQniZph5A6N7uuEOQi+1hnMz/FSOK/8kMFyFO+4DgA1dZ5pcKcn5wiFwHkcTb/BsgVqQa3Jx0VHNnvhlS8JyTg==", + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64/-/util-base64-3.310.0.tgz", + "integrity": "sha512-v3+HBKQvqgdzcbL+pFswlx5HQsd9L6ZTlyPVL2LS9nNXnCcR3XgGz9jRskikRUuUvUXtkSG1J88GAOnJ/apTPg==", "optional": true, "peer": true, "dependencies": { - "@aws-sdk/util-buffer-from": "3.208.0", - "tslib": "^2.3.1" + "@aws-sdk/util-buffer-from": "3.310.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/util-body-length-browser": { - "version": "3.188.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.188.0.tgz", - "integrity": "sha512-8VpnwFWXhnZ/iRSl9mTf+VKOX9wDE8QtN4bj9pBfxwf90H1X7E8T6NkiZD3k+HubYf2J94e7DbeHs7fuCPW5Qg==", + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.310.0.tgz", + "integrity": "sha512-sxsC3lPBGfpHtNTUoGXMQXLwjmR0zVpx0rSvzTPAuoVILVsp5AU/w5FphNPxD5OVIjNbZv9KsKTuvNTiZjDp9g==", "optional": true, "peer": true, "dependencies": { - "tslib": "^2.3.1" + "tslib": "^2.5.0" } }, "node_modules/@aws-sdk/util-body-length-node": { - "version": "3.208.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.208.0.tgz", - "integrity": "sha512-3zj50e5g7t/MQf53SsuuSf0hEELzMtD8RX8C76f12OSRo2Bca4FLLYHe0TZbxcfQHom8/hOaeZEyTyMogMglqg==", + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.310.0.tgz", + "integrity": "sha512-2tqGXdyKhyA6w4zz7UPoS8Ip+7sayOg9BwHNidiGm2ikbDxm1YrCfYXvCBdwaJxa4hJfRVz+aL9e+d3GqPI9pQ==", "optional": true, "peer": true, "dependencies": { - "tslib": "^2.3.1" + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/util-buffer-from": { - "version": "3.208.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.208.0.tgz", - "integrity": "sha512-7L0XUixNEFcLUGPeBF35enCvB9Xl+K6SQsmbrPk1P3mlV9mguWSDQqbOBwY1Ir0OVbD6H/ZOQU7hI/9RtRI0Zw==", + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.310.0.tgz", + "integrity": "sha512-i6LVeXFtGih5Zs8enLrt+ExXY92QV25jtEnTKHsmlFqFAuL3VBeod6boeMXkN2p9lbSVVQ1sAOOYZOHYbYkntw==", "optional": true, "peer": true, "dependencies": { - "@aws-sdk/is-array-buffer": "3.201.0", - "tslib": "^2.3.1" + "@aws-sdk/is-array-buffer": "3.310.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/util-config-provider": { - "version": "3.208.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-config-provider/-/util-config-provider-3.208.0.tgz", - "integrity": "sha512-DSRqwrERUsT34ug+anlMBIFooBEGwM8GejC7q00Y/9IPrQy50KnG5PW2NiTjuLKNi7pdEOlwTSEocJE15eDZIg==", + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-config-provider/-/util-config-provider-3.310.0.tgz", + "integrity": "sha512-xIBaYo8dwiojCw8vnUcIL4Z5tyfb1v3yjqyJKJWV/dqKUFOOS0U591plmXbM+M/QkXyML3ypon1f8+BoaDExrg==", "optional": true, "peer": true, "dependencies": { - "tslib": "^2.3.1" + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/util-defaults-mode-browser": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.272.0.tgz", - "integrity": "sha512-W8ZVJSZRuUBg8l0JEZzUc+9fKlthVp/cdE+pFeF8ArhZelOLCiaeCrMaZAeJusaFzIpa6cmOYQAjtSMVyrwRtg==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.347.0.tgz", + "integrity": "sha512-+JHFA4reWnW/nMWwrLKqL2Lm/biw/Dzi/Ix54DAkRZ08C462jMKVnUlzAI+TfxQE3YLm99EIa0G7jiEA+p81Qw==", "optional": true, "peer": true, "dependencies": { - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/types": "3.272.0", + "@aws-sdk/property-provider": "3.347.0", + "@aws-sdk/types": "3.347.0", "bowser": "^2.11.0", - "tslib": "^2.3.1" + "tslib": "^2.5.0" }, "engines": { "node": ">= 10.0.0" } }, "node_modules/@aws-sdk/util-defaults-mode-node": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.272.0.tgz", - "integrity": "sha512-U0NTcbMw6KFk7uz/avBmfxQSTREEiX6JDMH68oN/3ux4AICd2I4jHyxnloSWGuiER1FxZf1dEJ8ZTwy8Ibl21Q==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.347.0.tgz", + "integrity": "sha512-A8BzIVhAAZE5WEukoAN2kYebzTc99ZgncbwOmgCCbvdaYlk5tzguR/s+uoT4G0JgQGol/4hAMuJEl7elNgU6RQ==", "optional": true, "peer": true, "dependencies": { - "@aws-sdk/config-resolver": "3.272.0", - "@aws-sdk/credential-provider-imds": "3.272.0", - "@aws-sdk/node-config-provider": "3.272.0", - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" + "@aws-sdk/config-resolver": "3.347.0", + "@aws-sdk/credential-provider-imds": "3.347.0", + "@aws-sdk/node-config-provider": "3.347.0", + "@aws-sdk/property-provider": "3.347.0", + "@aws-sdk/types": "3.347.0", + "tslib": "^2.5.0" }, "engines": { "node": ">= 10.0.0" } }, "node_modules/@aws-sdk/util-endpoints": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.272.0.tgz", - "integrity": "sha512-c4MPUaJt2G6gGpoiwIOqDfUa98c1J63RpYvf/spQEKOtC/tF5Gfqlxuq8FnAl5lHnrqj1B9ZXLLxFhHtDR0IiQ==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.347.0.tgz", + "integrity": "sha512-/WUkirizeNAqwVj0zkcrqdQ9pUm1HY5kU+qy7xTR0OebkuJauglkmSTMD+56L1JPunWqHhlwCMVRaz5eaJdSEQ==", "optional": true, "peer": true, "dependencies": { - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.347.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/util-hex-encoding": { - "version": "3.201.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.201.0.tgz", - "integrity": "sha512-7t1vR1pVxKx0motd3X9rI3m/xNp78p3sHtP5yo4NP4ARpxyJ0fokBomY8ScaH2D/B+U5o9ARxldJUdMqyBlJcA==", + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.310.0.tgz", + "integrity": "sha512-sVN7mcCCDSJ67pI1ZMtk84SKGqyix6/0A1Ab163YKn+lFBQRMKexleZzpYzNGxYzmQS6VanP/cfU7NiLQOaSfA==", "optional": true, "peer": true, "dependencies": { - "tslib": "^2.3.1" + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/util-locate-window": { - "version": "3.208.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.208.0.tgz", - "integrity": "sha512-iua1A2+P7JJEDHVgvXrRJSvsnzG7stYSGQnBVphIUlemwl6nN5D+QrgbjECtrbxRz8asYFHSzhdhECqN+tFiBg==", + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.310.0.tgz", + "integrity": "sha512-qo2t/vBTnoXpjKxlsC2e1gBrRm80M3bId27r0BRB2VniSSe7bL1mmzM+/HFtujm0iAxtPM+aLEflLJlJeDPg0w==", "optional": true, "peer": true, "dependencies": { - "tslib": "^2.3.1" + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/util-middleware": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.272.0.tgz", - "integrity": "sha512-Abw8m30arbwxqmeMMha5J11ESpHUNmCeSqSzE8/C4B8jZQtHY4kq7f+upzcNIQ11lsd+uzBEzNG3+dDRi0XOJQ==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.347.0.tgz", + "integrity": "sha512-8owqUA3ePufeYTUvlzdJ7Z0miLorTwx+rNol5lourGQZ9JXsVMo23+yGA7nOlFuXSGkoKpMOtn6S0BT2bcfeiw==", "optional": true, "peer": true, "dependencies": { - "tslib": "^2.3.1" + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/util-retry": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-retry/-/util-retry-3.272.0.tgz", - "integrity": "sha512-Ngha5414LR4gRHURVKC9ZYXsEJhMkm+SJ+44wlzOhavglfdcKKPUsibz5cKY1jpUV7oKECwaxHWpBB8r6h+hOg==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-retry/-/util-retry-3.347.0.tgz", + "integrity": "sha512-NxnQA0/FHFxriQAeEgBonA43Q9/VPFQa8cfJDuT2A1YZruMasgjcltoZszi1dvoIRWSZsFTW42eY2gdOd0nffQ==", "optional": true, "peer": true, "dependencies": { - "@aws-sdk/service-error-classification": "3.272.0", - "tslib": "^2.3.1" + "@aws-sdk/service-error-classification": "3.347.0", + "tslib": "^2.5.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@aws-sdk/util-uri-escape": { - "version": "3.201.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.201.0.tgz", - "integrity": "sha512-TeTWbGx4LU2c5rx0obHeDFeO9HvwYwQtMh1yniBz00pQb6Qt6YVOETVQikRZ+XRQwEyCg/dA375UplIpiy54mA==", + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.310.0.tgz", + "integrity": "sha512-drzt+aB2qo2LgtDoiy/3sVG8w63cgLkqFIa2NFlGpUgHFWTXkqtbgf4L5QdjRGKWhmZsnqkbtL7vkSWEcYDJ4Q==", "optional": true, "peer": true, "dependencies": { - "tslib": "^2.3.1" + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.272.0.tgz", - "integrity": "sha512-Lp5QX5bH6uuwBlIdr7w7OAcAI50ttyskb++yUr9i+SPvj6RI2dsfIBaK4mDg1qUdM5LeUdvIyqwj3XHjFKAAvA==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.347.0.tgz", + "integrity": "sha512-ydxtsKVtQefgbk1Dku1q7pMkjDYThauG9/8mQkZUAVik55OUZw71Zzr3XO8J8RKvQG8lmhPXuAQ0FKAyycc0RA==", "optional": true, "peer": true, "dependencies": { - "@aws-sdk/types": "3.272.0", + "@aws-sdk/types": "3.347.0", "bowser": "^2.11.0", - "tslib": "^2.3.1" + "tslib": "^2.5.0" } }, "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.272.0.tgz", - "integrity": "sha512-ljK+R3l+Q1LIHrcR+Knhk0rmcSkfFadZ8V+crEGpABf/QUQRg7NkZMsoe814tfBO5F7tMxo8wwwSdaVNNHtoRA==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.347.0.tgz", + "integrity": "sha512-6X0b9qGsbD1s80PmbaB6v1/ZtLfSx6fjRX8caM7NN0y/ObuLoX8LhYnW6WlB2f1+xb4EjaCNgpP/zCf98MXosw==", "optional": true, "peer": true, "dependencies": { - "@aws-sdk/node-config-provider": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" + "@aws-sdk/node-config-provider": "3.347.0", + "@aws-sdk/types": "3.347.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" @@ -1134,14 +1164,14 @@ } }, "node_modules/@aws-sdk/util-utf8": { - "version": "3.254.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8/-/util-utf8-3.254.0.tgz", - "integrity": "sha512-14Kso/eIt5/qfIBmhEL9L1IfyUqswjSTqO2mY7KOzUZ9SZbwn3rpxmtkhmATkRjD7XIlLKaxBkI7tU9Zjzj8Kw==", + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8/-/util-utf8-3.310.0.tgz", + "integrity": "sha512-DnLfFT8uCO22uOJc0pt0DsSNau1GTisngBCDw8jQuWT5CqogMJu4b/uXmwEqfj8B3GX6Xsz8zOd6JpRlPftQoA==", "optional": true, "peer": true, "dependencies": { - "@aws-sdk/util-buffer-from": "3.208.0", - "tslib": "^2.3.1" + "@aws-sdk/util-buffer-from": "3.310.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" @@ -1157,6 +1187,14 @@ "tslib": "^2.3.1" } }, + "node_modules/@catatomik/dijkstra": { + "version": "1.0.0", + "resolved": "git+ssh://git@github.com/catatomik/dijkstra.git#e94608583a111aa25b8c1c8459dddd241c0348a7", + "license": "MIT", + "dependencies": { + "@tyriar/fibonacci-heap": "^2.0.9" + } + }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", "dev": true, @@ -1314,6 +1352,33 @@ "node": ">= 8" } }, + "node_modules/@smithy/protocol-http": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-1.0.1.tgz", + "integrity": "sha512-9OrEn0WfOVtBNYJUjUAn9AOiJ4lzERCJJ/JeZs8E6yajTGxBaFRxUnNBHiNqoDJVg076hY36UmEnPx7xXrvUSg==", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/types": "^1.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/types": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-1.0.0.tgz", + "integrity": "sha512-kc1m5wPBHQCTixwuaOh9vnak/iJm21DrSf9UK6yDE5S3mQQ4u11pqAUiKWnlrZnYkeLfAI9UEHj9OaMT1v5Umg==", + "optional": true, + "peer": true, + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@tsconfig/node10": { "version": "1.0.9", "dev": true, @@ -1335,21 +1400,21 @@ "license": "MIT" }, "node_modules/@typegoose/typegoose": { - "version": "10.2.0-beta.3", - "resolved": "https://registry.npmjs.org/@typegoose/typegoose/-/typegoose-10.2.0-beta.3.tgz", - "integrity": "sha512-BmWO+bto0LonMcC51odJ5fwNU/6TKbzmuURhTYXxyXSx58/O5MGzaHbmDDTuM1jg6pLrbKfJHPc6DFAic/49mw==", + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/@typegoose/typegoose/-/typegoose-11.2.0.tgz", + "integrity": "sha512-svfAvLdlYEsinusgqWUNQ4fkVNZSnCfiInT/ic6nYnUHZzSwpS2YsHbEzq2LiaLgpFJ8IHNbha1qEqoeH43Q/Q==", "dependencies": { "lodash": "^4.17.20", "loglevel": "^1.8.1", "reflect-metadata": "^0.1.13", - "semver": "^7.3.8", - "tslib": "^2.5.0" + "semver": "^7.5.1", + "tslib": "^2.5.2" }, "engines": { "node": ">=14.17.0" }, "peerDependencies": { - "mongoose": "~6.9.0" + "mongoose": "~7.2.0" } }, "node_modules/@types/json-schema": { @@ -1668,26 +1733,6 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "peer": true - }, "node_modules/bowser": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", @@ -1718,37 +1763,13 @@ } }, "node_modules/bson": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/bson/-/bson-5.0.1.tgz", - "integrity": "sha512-y09gBGusgHtinMon/GVbv1J6FrXhnr/+6hqLlSmEFzkz6PodqF6TxjyvfvY3AfO+oG1mgUtbC86xSbOlwvM62Q==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/bson/-/bson-5.3.0.tgz", + "integrity": "sha512-ukmCZMneMlaC5ebPHXIkP8YJzNl5DC41N5MAIvKDqLggdao342t4McltoJBQfQya/nHBWAcSsYRqlXPoQkTJag==", "engines": { "node": ">=14.20.1" } }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "peer": true, - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -2128,9 +2149,19 @@ "dev": true }, "node_modules/fast-xml-parser": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.0.11.tgz", - "integrity": "sha512-4aUg3aNRR/WjQAcpceODG1C3x3lFANXRo8+1biqfieHmg9pyMt7qB4lQV/Ta6sJCTbA5vfD8fnA8S54JATiFUA==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.4.tgz", + "integrity": "sha512-fbfMDvgBNIdDJLdLOwacjFAPYt67tr31H9ZhWSm45CDAxvd0I6WTlSOUo7K2P/K5sA5JgMKG64PI3DMcaFdWpQ==", + "funding": [ + { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + }, + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], "optional": true, "peer": true, "dependencies": { @@ -2138,10 +2169,6 @@ }, "bin": { "fxparser": "src/cli/cli.js" - }, - "funding": { - "type": "paypal", - "url": "https://paypal.me/naturalintelligence" } }, "node_modules/fastq": { @@ -2306,26 +2333,6 @@ "node": ">=8" } }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "peer": true - }, "node_modules/ignore": { "version": "5.2.4", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", @@ -2567,11 +2574,11 @@ } }, "node_modules/mongodb": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-5.0.1.tgz", - "integrity": "sha512-KpjtY+NWFmcic6UDYEdfn768ZTuKyv7CRaui7ZSd6q/0/o1AURMC7KygTUwB1Cl8V10Pe5NiP+Y2eBMCDs/ygQ==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-5.5.0.tgz", + "integrity": "sha512-XgrkUgAAdfnZKQfk5AsYL8j7O99WHd4YXPxYxnh8dZxD+ekYWFRA3JktUsBnfg+455Smf75/+asoU/YLwNGoQQ==", "dependencies": { - "bson": "^5.0.0", + "bson": "^5.3.0", "mongodb-connection-string-url": "^2.6.0", "socks": "^2.7.1" }, @@ -2583,7 +2590,7 @@ }, "peerDependencies": { "@aws-sdk/credential-providers": "^3.201.0", - "mongodb-client-encryption": "^2.3.0", + "mongodb-client-encryption": ">=2.3.0 <3", "snappy": "^7.2.2" }, "peerDependenciesMeta": { @@ -2608,57 +2615,27 @@ } }, "node_modules/mongoose": { - "version": "6.9.2", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.9.2.tgz", - "integrity": "sha512-Yb9rWJhYm+7Yf839QuKx2dXcclbA0GAMxtdDiaedHsOQU+y28cD/8gKYp1wTwwyAjKesqaGfLG4ez7D9lKpwBw==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-7.2.2.tgz", + "integrity": "sha512-JPBMTF+oYfLGVFWbHSZ/H+f1GajNanGLYH6c/P0nE3bNJfwGhX573vieGR0kNlNhj3cZk8WCPrnVsTNeUmFUag==", "peer": true, "dependencies": { - "bson": "^4.7.0", + "bson": "^5.3.0", "kareem": "2.5.1", - "mongodb": "4.13.0", + "mongodb": "5.5.0", "mpath": "0.9.0", - "mquery": "4.0.3", + "mquery": "5.0.0", "ms": "2.1.3", "sift": "16.0.1" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.20.1" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/mongoose" } }, - "node_modules/mongoose/node_modules/bson": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/bson/-/bson-4.7.2.tgz", - "integrity": "sha512-Ry9wCtIZ5kGqkJoi6aD8KjxFZEx78guTQDnpXWiNthsxzrxAK/i8E6pCHAIZTbaEFWcOCvbecMukfK7XUvyLpQ==", - "peer": true, - "dependencies": { - "buffer": "^5.6.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/mongoose/node_modules/mongodb": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.13.0.tgz", - "integrity": "sha512-+taZ/bV8d1pYuHL4U+gSwkhmDrwkWbH1l4aah4YpmpscMwgFBkufIKxgP/G7m87/NUuQzc2Z75ZTI7ZOyqZLbw==", - "peer": true, - "dependencies": { - "bson": "^4.7.0", - "mongodb-connection-string-url": "^2.5.4", - "socks": "^2.7.1" - }, - "engines": { - "node": ">=12.9.0" - }, - "optionalDependencies": { - "@aws-sdk/credential-providers": "^3.186.0", - "saslprep": "^1.0.3" - } - }, "node_modules/mpath": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz", @@ -2669,15 +2646,15 @@ } }, "node_modules/mquery": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/mquery/-/mquery-4.0.3.tgz", - "integrity": "sha512-J5heI+P08I6VJ2Ky3+33IpCdAvlYGTSUjwTPxkAr8i8EoduPMBX2OY/wa3IKZIQl7MU4SbFk8ndgSKyB/cl1zA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-5.0.0.tgz", + "integrity": "sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==", "peer": true, "dependencies": { "debug": "4.x" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.0.0" } }, "node_modules/ms": { @@ -2941,9 +2918,9 @@ } }, "node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -3137,9 +3114,9 @@ } }, "node_modules/tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", + "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==" }, "node_modules/tsutils": { "version": "3.21.0", diff --git a/package.json b/package.json index 609db588..ecfd6b9a 100644 --- a/package.json +++ b/package.json @@ -12,8 +12,8 @@ "author": "Catatomik", "license": "ISC", "dependencies": { - "@typegoose/typegoose": "^10.2.0-beta.3", - "@tyriar/fibonacci-heap": "^2.0.9", + "@catatomik/dijkstra": "github:catatomik/dijkstra", + "@typegoose/typegoose": "^11.2.0", "core-js": "^3.30.2", "mongodb": "^5.0.1" }, diff --git a/src/test/footPaths/FootPaths.ts b/src/test/footPaths/FootPaths.ts deleted file mode 100644 index 12df1a66..00000000 --- a/src/test/footPaths/FootPaths.ts +++ /dev/null @@ -1,110 +0,0 @@ -import { node, nodeOrNullNode, nullNode, WeightedGraph } from "./utils/Graph"; -import { FibonacciHeap, INode } from "@tyriar/fibonacci-heap"; - -export type path = N[]; - -export interface DijkstraOptions { - maxCumulWeight: number; -} - -/** - * @description Generate the shortest paths from source node `s` to every nodes in graph `G`. - * @param G Source graph - * @param s Source node - * @returns First, the distances from source node to considered node. Secondly, an array that traces downwards the shortest path from considered node to source node. - */ -export function Dijkstra>(G: G, [s]: [N]): [Map, Map]; -/** - * @description Generate the shortest paths from source node `s` to every nodes in graph `G`, considering options `O`. - * @param G Source graph - * @param s Source node - * @param O Options for Dijkstra computing - * @returns First, the distances from source node to considered node. Secondly, an array that traces downwards the shortest path from considered node to source node. - */ -export function Dijkstra>(G: G, [s]: [N], O: DijkstraOptions): [Map, Map]; -/** - * @description Computes the shortest path from source node `s` to target node `t` on graph `G`. - * @param G Source graph - * @param s Source node - * @param t Target node - * @returns The shortest path from s to t. - */ -export function Dijkstra>(G: G, [s, t]: [N, N]): path; -/** - * @description Computes the shortest path from source node `s` to target node `t` on graph `G`, considering options `O`. - * @param G Source graph - * @param s Source node - * @param t Target node - * @param O Options for Dijkstra computing - * @returns The shortest path from s to t. - */ -export function Dijkstra>(G: G, [s, t]: [N, N], O: DijkstraOptions): path; -export function Dijkstra>( - G: G, - [s, t]: [N, N] | [N], - O?: DijkstraOptions, -): path | [Map, Map>] { - const dist = new Map(); - const prev = new Map>(); - const Q = new FibonacciHeap(); - const QMapping = new Map | null>(); - - dist.set(s, 0); - QMapping.set(s, Q.insert(0, s)); - for (const e of G.nodesIterator) { - prev.set(e, nullNode); - if (e != s) dist.set(e, Infinity); - } - - while (!Q.isEmpty()) { - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - const min = Q.extractMinimum()!; // Can't be null otherwise Q is empty - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - QMapping.set(min.value!, null); - - if (t !== undefined && min.value === t) break; - - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - for (const v of G.neighborsIterator(min.value!) ?? []) { - /**@description New alternative distance found from min, from a + (a,b) instead of b */ - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - const alt = min.key + G.weight(min.value!, v); - - if (O && alt > O.maxCumulWeight) continue; - - if (alt < (dist.get(v) ?? Infinity)) { - dist.set(v, alt); - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - prev.set(v, min.value!); - const vINode = QMapping.get(v); - if (vINode != null) Q.decreaseKey(vINode, alt); - else QMapping.set(v, Q.insert(alt, v)); - } - } - } - - if (t !== undefined) { - return tracePath(prev, t, s); - } else return [dist, prev]; -} - -/** - * @description Get the path from source to target. - * @param prev The second return value of Dijkstra, specific to the source. - * @param target - * @param source - */ -export function tracePath(prev: Map>, target: N, source?: N): path { - let path: path = []; - let e: nodeOrNullNode = target; - if (prev.get(e) !== nullNode || (source && e === source)) { - // If source === target, just return [target] (== [source]) - - while (e !== nullNode) { - path = [e, ...path]; - e = prev.get(e) ?? nullNode; - } - } - - return path; -} diff --git a/src/test/footPaths/computePath.ts b/src/test/footPaths/computePath.ts index 93a8c3a2..7aaea277 100644 --- a/src/test/footPaths/computePath.ts +++ b/src/test/footPaths/computePath.ts @@ -1,5 +1,5 @@ -import { path, Dijkstra, tracePath, DijkstraOptions } from "./FootPaths"; -import { unpackGraphNode, WeightedGraph } from "./utils/Graph"; +import { path, Dijkstra, tracePath, DijkstraOptions } from "@catatomik/dijkstra"; +import { unpackGraphNode, WeightedGraph } from "@catatomik/dijkstra/lib/utils/Graph"; import type { footGraphNodes, id } from "./test"; import { parentPort } from "worker_threads"; diff --git a/src/test/footPaths/test.ts b/src/test/footPaths/test.ts index c7634b89..aadf59cc 100644 --- a/src/test/footPaths/test.ts +++ b/src/test/footPaths/test.ts @@ -3,7 +3,7 @@ import initDB from "../utils/mongoose"; import { benchmark } from "../utils/benchmark"; import { WorkerPool } from "../utils/Workers"; -import { node, WeightedGraph } from "./utils/Graph"; +import { node, WeightedGraph } from "@catatomik/dijkstra/lib/utils/Graph"; import Point from "./utils/Point"; import Segment from "./utils/Segment"; @@ -26,7 +26,7 @@ import { approachedStopName, euclidianDistance, sectionId, dbIntersectionId, dbS import FootGraphModelInit, { dbFootGraphEdges, dbFootGraphNodes } from "../models/FootGraph.model"; import NonScheduledRoutesModelInit, { dbFootPaths } from "../models/NonScheduledRoutes.model"; import { KeyOfMap } from "./utils"; -import { DijkstraOptions } from "./FootPaths"; +import { DijkstraOptions } from "@catatomik/dijkstra"; import { unique, Deferred } from "../utils"; const sectionProjection = { coords: 1, distance: 1, rg_fv_graph_nd: 1, rg_fv_graph_na: 1 }; @@ -145,7 +145,7 @@ export async function run({ getFullPaths = false, dijkstraOptions }: testOptions for (const s of sections.values()) { //Oriented but don't care (foot graph) - footGraph.add_edge(s.rg_fv_graph_nd, s.rg_fv_graph_na, s.distance); + footGraph.addEdge(s.rg_fv_graph_nd, s.rg_fv_graph_na, s.distance); } return footGraph; @@ -225,7 +225,7 @@ export async function run({ getFullPaths = false, dijkstraOptions }: testOptions }, 0) + Point.distance(closestPoint, new Point(...section.coords[n])); //Remove edge from p1 to p2 - footGraph.remove_edge(section.rg_fv_graph_nd, section.rg_fv_graph_na); + footGraph.removeEdge(section.rg_fv_graph_nd, section.rg_fv_graph_na); const insertedNode = stopId; //Insert new node approachedStop @@ -236,7 +236,7 @@ export async function run({ getFullPaths = false, dijkstraOptions }: testOptions rg_fv_graph_nd: section.rg_fv_graph_nd, rg_fv_graph_na: insertedNode, }; - footGraph.add_edge(section.rg_fv_graph_nd, insertedNode, toApproadchedStop); + footGraph.addEdge(section.rg_fv_graph_nd, insertedNode, toApproadchedStop); sections.set(sectionId({ rg_fv_graph_nd: section.rg_fv_graph_nd, rg_fv_graph_na: insertedNode }), subsectionToApproachedStop); const subsectionFromApproachedStop: Section = { @@ -245,7 +245,7 @@ export async function run({ getFullPaths = false, dijkstraOptions }: testOptions rg_fv_graph_nd: insertedNode, rg_fv_graph_na: section.rg_fv_graph_na, }; - footGraph.add_edge(insertedNode, section.rg_fv_graph_na, fromApproachedStop); + footGraph.addEdge(insertedNode, section.rg_fv_graph_na, fromApproachedStop); sections.set(sectionId({ rg_fv_graph_nd: insertedNode, rg_fv_graph_na: section.rg_fv_graph_na }), subsectionFromApproachedStop); } } diff --git a/src/test/footPaths/utils/Graph.ts b/src/test/footPaths/utils/Graph.ts deleted file mode 100644 index b69cc810..00000000 --- a/src/test/footPaths/utils/Graph.ts +++ /dev/null @@ -1,250 +0,0 @@ -import { KeyOfMap } from "."; - -export type node = string | number; -export const nullNode = Symbol("nullNode"); -export type nodeOrNullNode = typeof nullNode | N; -export type arc = [N, N]; -export type edge = arc; -export type weightedEdge = [...edge, number]; - -export class Graph { - readonly adj: Map>; - - constructor(adj?: Map>) { - if (adj instanceof Map) { - this.adj = adj; - } else this.adj = new Map(); - } - - /** - * @description Add a node to the graph - * @param n A node of the graph - */ - add_node(n: N): this { - if (!this.adj.has(n)) this.adj.set(n, new Set()); - return this; - } - - /** - * @description Add an arc from node n1 to node n2 - * @param n1 A node of the graph - * @param n2 A node of the graph - */ - add_arc(n1: N, n2: N): this { - this.add_node(n1); - this.add_node(n2); - this.adj.get(n1)?.add(n2); - return this; - } - - /** - * @description Remove an arc from node n1 to node n2 - * @param n1 A node of the graph - * @param n2 A node of the graph - */ - remove_arc(n1: N, n2: N): this { - this.adj.get(n1)?.delete(n2); - return this; - } - - /** - * @description Add an edge between two nodes n1 and n2 - * @param n1 A node of the graph - * @param n2 A node of the graph - */ - add_edge(n1: N, n2: N): this { - this.add_arc(n1, n2); - this.add_arc(n2, n1); - return this; - } - - /** - * @description Remove an edge between two nodes n1 and n2 - * @param n1 A node of the graph - * @param n2 A node of the graph - */ - remove_edge(n1: N, n2: N): this { - this.remove_arc(n1, n2); - this.remove_arc(n2, n1); - return this; - } - - /** - * @description Check the existence of an arc between two nodes n1 and n2 - * @param n1 A node of the graph - * @param n2 A node of the graph - */ - arc(n1: N, n2: N): boolean { - return !!this.adj.get(n1)?.has(n2); - } - - /** - * @description Check the existence of an edge between n1 and n2 - * @param n1 A node of the graph - * @param n2 A node of the graph - */ - edge(n1: N, n2: N): boolean { - return this.arc(n1, n2) && this.arc(n2, n1); - } - - /** - * @description Test wether n1 and n2 are adjacent - * @param n1 A node of the graph - * @param n2 A node of the graph - */ - adjacent(n1: N, n2: N): boolean { - return this.arc(n1, n2) || this.arc(n2, n1); - } - - /** - * @description The nodes of the graph - */ - get nodesIterator(): IterableIterator { - return this.adj.keys(); - } - - /** - * @description The nodes of the graph - */ - get nodes(): Array { - return Array.from(this.nodesIterator); - } - - /** - * @returns The order of the graph - */ - get ordre(): number { - return this.adj.size; - } - - /** - * @returns The neighbors of the node n - * @param n A node of the graph - */ - neighborsIterator(n: N): IterableIterator | undefined { - return this.adj.get(n)?.values(); - } - - /** - * @returns The neighbors of the node n - * @param n A node of the graph - */ - neighbors(n: N): Array { - return Array.from(this.neighborsIterator(n) ?? []); - } - - /** - * @returns The degree of the node n - * @param n A node of the graph - */ - degree(n: N): number { - return this.adj.get(n)?.size ?? 0; - } - - /** - * @returns The edges of the graph - */ - get edges(): Array> { - const edges: Array> = []; - const n = this.nodes; - for (let x = 0; x < n.length; x++) { - for (let y = x; y < n.length; y++) { - if (this.edge(n[x], n[y])) edges.push([n[x], n[y]]); - } - } - - return edges; - } - - /** - * @returns The arcs of the graph - */ - get arcs(): Array> { - const arcs: Array> = []; - const n = this.nodes; - for (let x = 0; x < n.length; x++) { - for (let y = 0; y < n.length; y++) { - if (this.arc(n[x], n[y])) arcs.push([n[x], n[y]]); - } - } - - return arcs; - } - - /** - * @description A list including the nodes that are connected (source or target) with the node n - * @param n A node of the graph - */ - connections(n: N): N[] { - return this.nodes.filter((n1) => this.adjacent(n, n1)); - } -} - -export type weightKey = `${N}-${N}`; -export class WeightedGraph extends Graph { - readonly weights: Map, number>; - - constructor(adj?: Map>, weights?: Map, number>) { - if (adj instanceof Map && weights instanceof Map) { - super(adj); - this.weights = weights; - } else { - super(); - this.weights = new Map(); - } - } - - /** - * @description Add an arc from node n1 to node n2 - * @param n1 A node of the graph - * @param n2 A node of the graph - * @param w The weight of this arc - */ - add_arc(n1: N, n2: N, w = 0): this { - super.add_arc(n1, n2); - this.weights.set(`${n1}-${n2}`, w); - return this; - } - - /** - * @description Remove an arc from node n1 to node n2 - * @param n1 A node of the graph - * @param n2 A node of the graph - */ - remove_arc(n1: N, n2: N): this { - super.remove_arc(n1, n2); - this.weights.delete(`${n1}-${n2}`); - return this; - } - - /** - * @description Add an edge between two nodes n1 and n2 - * @param n1 A node of the graph - * @param n2 A node of the graph - * @param w The weight of this arc - */ - add_edge(n1: N, n2: N, w?: number): this { - this.add_arc(n1, n2, w); - this.add_arc(n2, n1, w); - return this; - } - - /** - * @description Remove an edge between two nodes n1 and n2 - * @param n1 A node of the graph - * @param n2 A node of the graph - */ - remove_edge(n1: N, n2: N): this { - this.remove_arc(n1, n2); - this.remove_arc(n2, n1); - return this; - } - - weight(n1: N, n2: N): number { - if (!this.arc(n1, n2)) throw new Error("Invalid nodes"); - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - return this.weights.get(`${n1}-${n2}`)!; - } -} - -export type unpackGraphNode = G extends Graph ? KeyOfMap : never; diff --git a/src/test/footPaths/utils/ultils.ts b/src/test/footPaths/utils/ultils.ts index 1b92908d..fd72a0df 100644 --- a/src/test/footPaths/utils/ultils.ts +++ b/src/test/footPaths/utils/ultils.ts @@ -1,6 +1,6 @@ import { Ref } from "@typegoose/typegoose"; import { RefType } from "@typegoose/typegoose/lib/types"; -import { node } from "./Graph"; +import { node } from "@catatomik/dijkstra/lib/utils/Graph"; export function euclidianDistance(x1: number, y1: number, x2: number, y2: number): number { return Math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2); From 2e1b46fda603b7209179bd5db331f6dac85bf7d8 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Sat, 29 Jul 2023 12:58:54 +0200 Subject: [PATCH 134/251] =?UTF-8?q?=F0=9F=8E=A8=20prettier=20v3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/footPaths/utils/Point.ts | 5 ++++- src/test/footPaths/utils/Segment.ts | 5 ++++- src/test/utils/Workers.ts | 7 ++++++- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/test/footPaths/utils/Point.ts b/src/test/footPaths/utils/Point.ts index 51547a53..8ae5bf01 100644 --- a/src/test/footPaths/utils/Point.ts +++ b/src/test/footPaths/utils/Point.ts @@ -21,7 +21,10 @@ const n = Math.log((gN2 * Math.cos(phi2)) / (gN1 * Math.cos(phi1))) / (gl1 - gl2 const c = ((gN1 * Math.cos(phi1)) / n) * Math.exp(n * gl1); export default class Point { - constructor(protected _x: number, protected _y: number) {} + constructor( + protected _x: number, + protected _y: number, + ) {} public get x() { return this._x; diff --git a/src/test/footPaths/utils/Segment.ts b/src/test/footPaths/utils/Segment.ts index 89b27fdb..5671b350 100644 --- a/src/test/footPaths/utils/Segment.ts +++ b/src/test/footPaths/utils/Segment.ts @@ -4,7 +4,10 @@ import Vector2 from "./Vector"; export default class Segment { protected AB: Vector2; - constructor(protected A: Point, protected B: Point) { + constructor( + protected A: Point, + protected B: Point, + ) { this.AB = new Vector2(A, B); } diff --git a/src/test/utils/Workers.ts b/src/test/utils/Workers.ts index b8acb821..589eef17 100644 --- a/src/test/utils/Workers.ts +++ b/src/test/utils/Workers.ts @@ -32,7 +32,12 @@ export class WorkerPool unknown, F extends (...a readonly pool: poolWorker, Awaited>>[]; readonly queue: Queue, Awaited>>>; - constructor(readonly script: string, readonly size: number, initData?: Parameters[0], readonly debug = false) { + constructor( + readonly script: string, + readonly size: number, + initData?: Parameters[0], + readonly debug = false, + ) { super(); this.pool = new Array(this.size); this.queue = new Queue(); From 8e5824bafa5293fa7ec08f0208b85d232ddc1530 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Mon, 31 Jul 2023 00:21:34 +0200 Subject: [PATCH 135/251] =?UTF-8?q?=F0=9F=90=9B=20no-unsafe-declaration-me?= =?UTF-8?q?rging?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `number` cannot be an EventName?! --- src/test/utils/TypedEmitter.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/test/utils/TypedEmitter.ts b/src/test/utils/TypedEmitter.ts index 49d88bc1..a693b4bf 100644 --- a/src/test/utils/TypedEmitter.ts +++ b/src/test/utils/TypedEmitter.ts @@ -3,11 +3,11 @@ import { EventEmitter } from "events"; // eslint-disable-next-line @typescript-eslint/no-explicit-any type EmittedEvents = Record any>; -export declare interface TypedEventEmitter { - on(event: E, listener: Events[E]): this; +export declare interface ITypedEventEmitter { + on(event: Exclude, listener: Events[E]): this; - emit(event: E, ...args: Parameters): boolean; + emit(event: Exclude, ...args: Parameters): boolean; } // eslint-disable-next-line @typescript-eslint/no-unused-vars -export class TypedEventEmitter extends EventEmitter {} +export class TypedEventEmitter extends EventEmitter implements ITypedEventEmitter {} From 7087d702773f5a3aa3203cf494fe54ec73e07f36 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Mon, 31 Jul 2023 00:38:32 +0200 Subject: [PATCH 136/251] =?UTF-8?q?=F0=9F=90=9B=20Forced=20to=20use=20merg?= =?UTF-8?q?ing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/utils/TypedEmitter.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/utils/TypedEmitter.ts b/src/test/utils/TypedEmitter.ts index a693b4bf..c603395d 100644 --- a/src/test/utils/TypedEmitter.ts +++ b/src/test/utils/TypedEmitter.ts @@ -3,11 +3,11 @@ import { EventEmitter } from "events"; // eslint-disable-next-line @typescript-eslint/no-explicit-any type EmittedEvents = Record any>; -export declare interface ITypedEventEmitter { +export declare interface TypedEventEmitter { on(event: Exclude, listener: Events[E]): this; emit(event: Exclude, ...args: Parameters): boolean; } -// eslint-disable-next-line @typescript-eslint/no-unused-vars -export class TypedEventEmitter extends EventEmitter implements ITypedEventEmitter {} +// eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-unsafe-declaration-merging +export class TypedEventEmitter extends EventEmitter {} From 54b0b5d1d6c18357b563d2ba5375beba605de1c2 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Mon, 31 Jul 2023 01:08:15 +0200 Subject: [PATCH 137/251] =?UTF-8?q?=F0=9F=90=9B=20Allow=20Duration=20in=20?= =?UTF-8?q?template=20expression?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Also allows unwanted behaviors like ([object Object]) in template expressions --- .eslintrc.cjs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.eslintrc.cjs b/.eslintrc.cjs index 0f60a0da..13ad99af 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -13,6 +13,7 @@ module.exports = { plugins: ['@typescript-eslint'], root: true, rules: { - "no-empty": [ "error", { allowEmptyCatch: true } ] + "no-empty": [ "error", { allowEmptyCatch: true } ], + "@typescript-eslint/restrict-template-expressions": "warn" } }; \ No newline at end of file From d8b92d2fe7a48b251a1b35ea892fbe721d551943 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Mon, 31 Jul 2023 01:09:25 +0200 Subject: [PATCH 138/251] =?UTF-8?q?=F0=9F=90=9B=20Remove=20unused=20async?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Enable back with .then --- src/test/footPaths/computePath.ts | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/test/footPaths/computePath.ts b/src/test/footPaths/computePath.ts index 7aaea277..e4436af0 100644 --- a/src/test/footPaths/computePath.ts +++ b/src/test/footPaths/computePath.ts @@ -20,9 +20,9 @@ export function initialCallback(data: initData) { } if (parentPort) - parentPort.on("message", async (data: initData | Parameters) => { + parentPort.on("message", (data: initData | Parameters) => { if (data instanceof Array) { - if (parentPort) parentPort.postMessage(await computePath(...data)); + if (parentPort) parentPort.postMessage(computePath(...data)); } else { initialCallback(data); } @@ -32,18 +32,18 @@ let footGraph: WeightedGraph | undefined; let stops: initData["stops"] | undefined; let options: initData["options"] | undefined; -export async function computePath( +export function computePath( sourceStopId: ReturnType, returnPaths: boolean, - computedStops: Set = new Set(), + computedStops = new Set(), ) { - const sourcePaths: Map>, number]> = new Map(); + const sourcePaths = new Map>, number]>(); if (!footGraph || !stops) return sourcePaths; const [dist, prev] = options - ? await Dijkstra(footGraph, [sourceStopId], options) - : await Dijkstra(footGraph, [sourceStopId]); + ? Dijkstra(footGraph, [sourceStopId], options) + : Dijkstra(footGraph, [sourceStopId]); for (const stopId of stops) { const targetNode = approachedStopName(stopId); @@ -60,9 +60,9 @@ export async function computePath( export async function computePathBench( sourceStopId: ReturnType, returnPaths: boolean, - computedStops: Set = new Set(), + computedStops = new Set(), ) { - const sourcePaths: Map>, number]> = new Map(); + const sourcePaths = new Map>, number]>(); if (!footGraph || !stops) return sourcePaths; From eee17f1d08b98270e89e6d6ebab5498e56a9215c Mon Sep 17 00:00:00 2001 From: Catatomik Date: Mon, 31 Jul 2023 01:09:52 +0200 Subject: [PATCH 139/251] =?UTF-8?q?=F0=9F=90=9B=20ESLint=20errors?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/footPaths/index.ts | 4 ++-- src/test/footPaths/test.ts | 12 ++++++------ src/test/footPaths/utils/Link.ts | 6 +++--- src/test/index.ts | 16 +++++++++------- src/test/utils/Workers.ts | 7 ++++--- src/test/utils/benchmark.ts | 8 ++++---- 6 files changed, 28 insertions(+), 25 deletions(-) diff --git a/src/test/footPaths/index.ts b/src/test/footPaths/index.ts index a46fb6fb..1d14a068 100644 --- a/src/test/footPaths/index.ts +++ b/src/test/footPaths/index.ts @@ -2,8 +2,8 @@ import { run } from "./test"; import { benchmark } from "../utils/benchmark"; const args = process.argv.slice(2); -const getFullPaths = JSON.parse(args[0]); -const times = JSON.parse(args[1]); +const getFullPaths = JSON.parse(args[0]) as boolean; +const times = JSON.parse(args[1]) as number; if (typeof getFullPaths !== "boolean") throw new Error(`Type of argument 1 "getFullPaths" invalid (got ${typeof getFullPaths})`); if (typeof times !== "number") throw new Error(`Type of argument 2 "times" invalid (got ${typeof times})`); diff --git a/src/test/footPaths/test.ts b/src/test/footPaths/test.ts index aadf59cc..76084fad 100644 --- a/src/test/footPaths/test.ts +++ b/src/test/footPaths/test.ts @@ -31,12 +31,12 @@ import { unique, Deferred } from "../utils"; const sectionProjection = { coords: 1, distance: 1, rg_fv_graph_nd: 1, rg_fv_graph_na: 1 }; export type dbSection = Pick; -type SectionOverwritten = { +interface SectionOverwritten { /** Will never be populated, so force to be RefType */ rg_fv_graph_nd: unpackRefType | ReturnType; /** Will never be populated, so force to be RefType */ rg_fv_graph_na: unpackRefType | ReturnType; -}; +} export type Section = Omit & SectionOverwritten; const stopProjection = { _id: 1, coords: 1, libelle: 1 }; @@ -141,7 +141,7 @@ export async function run({ getFullPaths = false, dijkstraOptions }: testOptions } function makeGraph() { - const footGraph: WeightedGraph = new WeightedGraph(); + const footGraph = new WeightedGraph(); for (const s of sections.values()) { //Oriented but don't care (foot graph) @@ -159,7 +159,7 @@ export async function run({ getFullPaths = false, dijkstraOptions }: testOptions function computeApproachedStops() { //Pre-generate mapped segments to fasten the process (and not redundant computing) //A segment describes a portion of a section (NOT oriented) - const mappedSegments: Map<(typeof footGraph.edges)[number], Segment[]> = new Map(); + const mappedSegments = new Map<(typeof footGraph.edges)[number], Segment[]>(); for (const edge of footGraph.edges) { const section = getSection(...edge); if (!section) continue; // Added for ts mental health @@ -173,7 +173,7 @@ export async function run({ getFullPaths = false, dijkstraOptions }: testOptions } /**@description [closest point, section containing this point, indice of segment composing the section] */ - const approachedStops: Map, [Point, (typeof footGraph.edges)[number], number]> = new Map(); + const approachedStops = new Map, [Point, (typeof footGraph.edges)[number], number]>(); for (const [stopId, stop] of stops) { /**@description [distance to closest point, closest point, section containing this point, indice of segment composing the section (i;i+1 in Section coords)] */ const closestPoint: [number, Point | null, (typeof footGraph.edges)[number] | null, number | null] = [Infinity, null, null, null]; @@ -269,7 +269,7 @@ export async function run({ getFullPaths = false, dijkstraOptions }: testOptions let rejected = false; - await benchmark(NonScheduledRoutesModel.deleteMany, [{}] as never, NonScheduledRoutesModel); + await benchmark((...args: Parameters) => NonScheduledRoutesModel.deleteMany(args), [{}] as never); let totalPaths = 0; diff --git a/src/test/footPaths/utils/Link.ts b/src/test/footPaths/utils/Link.ts index 2d35b5c8..325b4e00 100644 --- a/src/test/footPaths/utils/Link.ts +++ b/src/test/footPaths/utils/Link.ts @@ -52,12 +52,12 @@ export class Link { */ get depth(): number { if (!Link.isLink(this._next)) return 1; - return 1 + (this._next as Link).depth; + return 1 + this._next.depth; } toArrayRec(): Type[] { if (!Link.isLink(this.next)) return [this.value]; - const next = (this.next as Link).toArrayRec(); + const next = this.next.toArrayRec(); return [this.value, ...next]; } @@ -113,7 +113,7 @@ export class Link { * @description Create chained array from array * @param {Array} a The array to convert into chained array */ - static fromArray(a: Array = []): LinkOrEmpty { + static fromArray(a: T[] = []): LinkOrEmpty { let m: LinkOrEmpty = Link.emptyLink; for (let i = a.length - 1; i >= 0; i--) { m = new this(a[i], m); diff --git a/src/test/index.ts b/src/test/index.ts index 7ef8083a..2dd1fde1 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -26,9 +26,9 @@ import { binaryFilter } from "./utils"; async function queryData() { const dbScheduledRoutesProjection: Partial> = { _id: 1, stops: 1, trips: 1 }; type dbScheduledRoute = Pick; - type ScheduledRoutesOverwritten = { + interface ScheduledRoutesOverwritten { stops: unpackRefType; - }; + } type ScheduledRoute = Omit & ScheduledRoutesOverwritten; const dbScheduledRoutes = (await TBMScheduledRoutesModel.find>>({}, dbScheduledRoutesProjection) @@ -52,10 +52,10 @@ import { binaryFilter } from "./utils"; const dbNonScheduledRoutesProjection: Partial> = { from: 1, to: 1, distance: 1 }; type dbNonScheduledRoute = Pick; - type NonScheduledRoutesOverwritten = { + interface NonScheduledRoutesOverwritten { from: unpackRefType; to: unpackRefType; - }; + } type NonScheduledRoute = Omit & NonScheduledRoutesOverwritten; const dbNonScheduledRoutes = (await NonScheduledRoutesModel.find>>( @@ -113,13 +113,13 @@ import { binaryFilter } from "./utils"; const args = process.argv.slice(2); let ps: stopId; try { - ps = JSON.parse(args[0]); + ps = JSON.parse(args[0]) as number; } catch (_) { ps = 2832; } let pt: stopId; try { - pt = JSON.parse(args[1]); + pt = JSON.parse(args[1]) as number; } catch (_) { pt = 2168; } @@ -146,4 +146,6 @@ import { binaryFilter } from "./utils"; console.log("b4 ended"); if (!b4.lastReturn) throw `b4 return null`; return b4.lastReturn; -})().then(console.log); +})() + .then(console.log) + .catch(console.error); diff --git a/src/test/utils/Workers.ts b/src/test/utils/Workers.ts index 589eef17..7738cc85 100644 --- a/src/test/utils/Workers.ts +++ b/src/test/utils/Workers.ts @@ -19,10 +19,11 @@ interface poolWorker { type queuedJob = [T, resolveCb, rejectCb]; +// eslint-disable-next-line @typescript-eslint/consistent-type-definitions type workerPoolEvents = { queuedJob: (queueSize: number) => void; runningJob: (job: queuedJob) => void; - jobEnded: (result: R | unknown) => void; + jobEnded: (result: R | object) => void; }; // eslint-disable-next-line @typescript-eslint/no-explicit-any @@ -39,7 +40,7 @@ export class WorkerPool unknown, F extends (...a readonly debug = false, ) { super(); - this.pool = new Array(this.size); + this.pool = new Array<(typeof this.pool)[number]>(this.size); this.queue = new Queue(); for (let i = 0; i < this.size; i++) { @@ -121,7 +122,7 @@ export class WorkerPool unknown, F extends (...a worker.status = Status.Idle; reject(err); if (this.debug) console.log(`Errored worker ${worker.id} (${this.queue.size})`); - this.emit("jobEnded", err); + this.emit("jobEnded", err as object); this.runCallback(); worker.worker.removeListener("error", onceError); worker.worker.removeListener("message", onceMessage); diff --git a/src/test/utils/benchmark.ts b/src/test/utils/benchmark.ts index 0771e818..dfef1845 100644 --- a/src/test/utils/benchmark.ts +++ b/src/test/utils/benchmark.ts @@ -11,16 +11,16 @@ export async function benchmark any, ThisType>( this: ThisType, f: F, args: Parameters, - thisArg: unknown = this, + thisArg: unknown = this, // TODO : deeper look on thisArg + ThisType times = 1, logStats = true, ) { - const starts: number[] = new Array(times); - const ends: number[] = new Array(times); + const starts = new Array(times); + const ends = new Array(times); let lastReturn: Awaited> | null = null; for (let i = 0; i < times; i++) { starts[i] = performance.now(); - lastReturn = await f.call(thisArg, ...args); + lastReturn = (await f.call(thisArg, ...args)) as Awaited>; ends[i] = performance.now(); } const durations = ends.map((e, i) => new Duration(e - starts[i])); From 8fc640befa7a7a462fcffdac494a2dffb12a6f31 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Thu, 31 Aug 2023 13:38:35 +0200 Subject: [PATCH 140/251] =?UTF-8?q?=E2=AC=86=EF=B8=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 30 ------------------------------ 1 file changed, 30 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0166afad..d4c2f280 100644 --- a/package-lock.json +++ b/package-lock.json @@ -292,36 +292,6 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/scope-manager/node_modules/@typescript-eslint/types": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.60.1.tgz", - "integrity": "sha512-zDcDx5fccU8BA0IDZc71bAtYIcG9PowaOwaD8rjYbqwK7dpe/UMQl3inJ4UtUK42nOCT41jTSCwg76E62JpMcg==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/scope-manager/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.60.1.tgz", - "integrity": "sha512-xEYIxKcultP6E/RMKqube11pGjXH1DCo60mQoWhVYyKfLkwbIVVjYxmOenNMxILx0TjCujPTjjnTIVzm09TXIw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.60.1", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@typescript-eslint/type-utils": { "version": "6.4.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.4.1.tgz", From 765ad63a2350fbe3a43b639b78461ee57be73b87 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Fri, 20 Oct 2023 02:21:48 +0200 Subject: [PATCH 141/251] =?UTF-8?q?=E2=AC=86=EF=B8=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 382 ++++++++++++++++------------------------------ package.json | 8 +- 2 files changed, 132 insertions(+), 258 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6d05cd74..749d7515 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,12 +10,12 @@ "license": "MIT", "dependencies": { "@catatomik/dijkstra": "github:catatomik/dijkstra", - "@typegoose/typegoose": "^11.2.0", - "core-js": "^3.30.2", - "mongodb": "^5.0.1" + "@typegoose/typegoose": "^11.6.0", + "core-js": "^3.33.0", + "mongodb": "^6.1.0" }, "devDependencies": { - "@typescript-eslint/eslint-plugin": "^6.7.5", + "@typescript-eslint/eslint-plugin": "^6.8.0", "@typescript-eslint/parser": "^6.8.0", "eslint": "^8.51.0", "prettier": "^3.0.3", @@ -128,6 +128,14 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, + "node_modules/@mongodb-js/saslprep": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.0.tgz", + "integrity": "sha512-Xfijy7HvfzzqiOAhAepF4SGN5e9leLkMvg/OPOF97XemjfVCYN/oWa75wnkc6mltMSTwY+XlbhWgUOJmkFspSw==", + "dependencies": { + "sparse-bitfield": "^3.0.3" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -164,27 +172,27 @@ } }, "node_modules/@typegoose/typegoose": { - "version": "11.4.0", - "resolved": "https://registry.npmjs.org/@typegoose/typegoose/-/typegoose-11.4.0.tgz", - "integrity": "sha512-MQE1go8wsTJCZ2PnGaOOfBsZ7e0gFVhZGZLY8g5vIs11oesNMLWpKaDxLrzrljqtMISRcBOn+iXDalo30Ibnxg==", + "version": "11.6.0", + "resolved": "https://registry.npmjs.org/@typegoose/typegoose/-/typegoose-11.6.0.tgz", + "integrity": "sha512-c6m5aTrv9tzqLmtR/txlg4sFKXfupBXMJlO4yRfg757rK5h2YfIoshMG3yi+0IEe8gkF5utCV/uh9vf8a+re4Q==", "dependencies": { "lodash": "^4.17.20", "loglevel": "^1.8.1", "reflect-metadata": "^0.1.13", "semver": "^7.5.4", - "tslib": "^2.6.0" + "tslib": "^2.6.2" }, "engines": { "node": ">=14.17.0" }, "peerDependencies": { - "mongoose": "~7.4.0" + "mongoose": "~7.6.1" } }, "node_modules/@types/json-schema": { - "version": "7.0.13", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.13.tgz", - "integrity": "sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==", + "version": "7.0.14", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.14.tgz", + "integrity": "sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==", "dev": true }, "node_modules/@types/node": { @@ -193,9 +201,9 @@ "integrity": "sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ==" }, "node_modules/@types/semver": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-MMzuxN3GdFwskAnb6fz0orFvhfqi752yjaXylr0Rp4oDg5H0Zn1IuyRhDVvYOwAXoJirx2xuS16I3WjxnAIHiQ==", "dev": true }, "node_modules/@types/webidl-conversions": { @@ -213,16 +221,16 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.5.tgz", - "integrity": "sha512-JhtAwTRhOUcP96D0Y6KYnwig/MRQbOoLGXTON2+LlyB/N35SP9j1boai2zzwXb7ypKELXMx3DVk9UTaEq1vHEw==", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.8.0.tgz", + "integrity": "sha512-GosF4238Tkes2SHPQ1i8f6rMtG6zlKwMEB0abqSJ3Npvos+doIlc/ATG+vX1G9coDF3Ex78zM3heXHLyWEwLUw==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.7.5", - "@typescript-eslint/type-utils": "6.7.5", - "@typescript-eslint/utils": "6.7.5", - "@typescript-eslint/visitor-keys": "6.7.5", + "@typescript-eslint/scope-manager": "6.8.0", + "@typescript-eslint/type-utils": "6.8.0", + "@typescript-eslint/utils": "6.8.0", + "@typescript-eslint/visitor-keys": "6.8.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -247,53 +255,6 @@ } } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.5.tgz", - "integrity": "sha512-GAlk3eQIwWOJeb9F7MKQ6Jbah/vx1zETSDw8likab/eFcqkjSD7BI75SDAeC5N2L0MmConMoPvTsmkrg71+B1A==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.7.5", - "@typescript-eslint/visitor-keys": "6.7.5" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.5.tgz", - "integrity": "sha512-WboQBlOXtdj1tDFPyIthpKrUb+kZf2VroLZhxKa/VlwLlLyqv/PwUNgL30BlTVZV1Wu4Asu2mMYPqarSO4L5ZQ==", - "dev": true, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.5.tgz", - "integrity": "sha512-3MaWdDZtLlsexZzDSdQWsFQ9l9nL8B80Z4fImSpyllFC/KLqWQRdEcB+gGGO+N3Q2uL40EsG66wZLsohPxNXvg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.7.5", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@typescript-eslint/parser": { "version": "6.8.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.8.0.tgz", @@ -340,13 +301,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.7.5.tgz", - "integrity": "sha512-Gs0qos5wqxnQrvpYv+pf3XfcRXW6jiAn9zE/K+DlmYf6FcpxeNYN0AIETaPR7rHO4K2UY+D0CIbDP9Ut0U4m1g==", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.8.0.tgz", + "integrity": "sha512-RYOJdlkTJIXW7GSldUIHqc/Hkto8E+fZN96dMIFhuTJcQwdRoGN2rEWA8U6oXbLo0qufH7NPElUb+MceHtz54g==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.7.5", - "@typescript-eslint/utils": "6.7.5", + "@typescript-eslint/typescript-estree": "6.8.0", + "@typescript-eslint/utils": "6.8.0", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -366,63 +327,6 @@ } } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.5.tgz", - "integrity": "sha512-WboQBlOXtdj1tDFPyIthpKrUb+kZf2VroLZhxKa/VlwLlLyqv/PwUNgL30BlTVZV1Wu4Asu2mMYPqarSO4L5ZQ==", - "dev": true, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.5.tgz", - "integrity": "sha512-NhJiJ4KdtwBIxrKl0BqG1Ur+uw7FiOnOThcYx9DpOGJ/Abc9z2xNzLeirCG02Ig3vkvrc2qFLmYSSsaITbKjlg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.7.5", - "@typescript-eslint/visitor-keys": "6.7.5", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.5.tgz", - "integrity": "sha512-3MaWdDZtLlsexZzDSdQWsFQ9l9nL8B80Z4fImSpyllFC/KLqWQRdEcB+gGGO+N3Q2uL40EsG66wZLsohPxNXvg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.7.5", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@typescript-eslint/types": { "version": "6.8.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.8.0.tgz", @@ -464,17 +368,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.7.5.tgz", - "integrity": "sha512-pfRRrH20thJbzPPlPc4j0UNGvH1PjPlhlCMq4Yx7EGjV7lvEeGX0U6MJYe8+SyFutWgSHsdbJ3BXzZccYggezA==", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.8.0.tgz", + "integrity": "sha512-dKs1itdE2qFG4jr0dlYLQVppqTE+Itt7GmIf/vX6CSvsW+3ov8PbWauVKyyfNngokhIO9sKZeRGCUo1+N7U98Q==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.7.5", - "@typescript-eslint/types": "6.7.5", - "@typescript-eslint/typescript-estree": "6.7.5", + "@typescript-eslint/scope-manager": "6.8.0", + "@typescript-eslint/types": "6.8.0", + "@typescript-eslint/typescript-estree": "6.8.0", "semver": "^7.5.4" }, "engines": { @@ -488,80 +392,6 @@ "eslint": "^7.0.0 || ^8.0.0" } }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.5.tgz", - "integrity": "sha512-GAlk3eQIwWOJeb9F7MKQ6Jbah/vx1zETSDw8likab/eFcqkjSD7BI75SDAeC5N2L0MmConMoPvTsmkrg71+B1A==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.7.5", - "@typescript-eslint/visitor-keys": "6.7.5" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.5.tgz", - "integrity": "sha512-WboQBlOXtdj1tDFPyIthpKrUb+kZf2VroLZhxKa/VlwLlLyqv/PwUNgL30BlTVZV1Wu4Asu2mMYPqarSO4L5ZQ==", - "dev": true, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.5.tgz", - "integrity": "sha512-NhJiJ4KdtwBIxrKl0BqG1Ur+uw7FiOnOThcYx9DpOGJ/Abc9z2xNzLeirCG02Ig3vkvrc2qFLmYSSsaITbKjlg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.7.5", - "@typescript-eslint/visitor-keys": "6.7.5", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.5.tgz", - "integrity": "sha512-3MaWdDZtLlsexZzDSdQWsFQ9l9nL8B80Z4fImSpyllFC/KLqWQRdEcB+gGGO+N3Q2uL40EsG66wZLsohPxNXvg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.7.5", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@typescript-eslint/visitor-keys": { "version": "6.8.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.8.0.tgz", @@ -689,9 +519,10 @@ } }, "node_modules/bson": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/bson/-/bson-5.4.0.tgz", - "integrity": "sha512-WRZ5SQI5GfUuKnPTNmAYPiKIof3ORXAF4IRU5UcgmivNIon01rWQlw5RUH954dpu8yGL8T59YShVddIPaU/gFA==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/bson/-/bson-5.5.1.tgz", + "integrity": "sha512-ix0EwukN2EpC0SRWIj/7B5+A6uQMQy6KMREI9qQqvgpkV2frH63T0UDVd1SYedL6dNCmDBYB3QtXi4ISk9YT+g==", + "peer": true, "engines": { "node": ">=14.20.1" } @@ -746,9 +577,9 @@ "dev": true }, "node_modules/core-js": { - "version": "3.30.2", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.30.2.tgz", - "integrity": "sha512-uBJiDmwqsbJCWHAwjrx3cvjbMXP7xD72Dmsn5LOJpiRmE3WbBbN5rCqQ2Qh6Ek6/eOrjlWngEynBWo4VxerQhg==", + "version": "3.33.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.33.0.tgz", + "integrity": "sha512-HoZr92+ZjFEKar5HS6MC776gYslNOKHt75mEBKWKnPeFDpZ6nH5OeF3S6HFT1mUAUZKrzkez05VboaX8myjSuw==", "hasInstallScript": true, "funding": { "type": "opencollective", @@ -1223,7 +1054,8 @@ "node_modules/ip": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", + "peer": true }, "node_modules/is-extglob": { "version": "2.1.1", @@ -1368,8 +1200,7 @@ "node_modules/memory-pager": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", - "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", - "optional": true + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==" }, "node_modules/merge2": { "version": "1.4.1", @@ -1406,26 +1237,25 @@ } }, "node_modules/mongodb": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-5.7.0.tgz", - "integrity": "sha512-zm82Bq33QbqtxDf58fLWBwTjARK3NSvKYjyz997KSy6hpat0prjeX/kxjbPVyZY60XYPDNETaHkHJI2UCzSLuw==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.1.0.tgz", + "integrity": "sha512-AvzNY0zMkpothZ5mJAaIo2bGDjlJQqqAbn9fvtVgwIIUPEfdrqGxqNjjbuKyrgQxg2EvCmfWdjq+4uj96c0YPw==", "dependencies": { - "bson": "^5.4.0", - "mongodb-connection-string-url": "^2.6.0", - "socks": "^2.7.1" + "@mongodb-js/saslprep": "^1.1.0", + "bson": "^6.1.0", + "mongodb-connection-string-url": "^2.6.0" }, "engines": { - "node": ">=14.20.1" - }, - "optionalDependencies": { - "saslprep": "^1.0.3" + "node": ">=16.20.1" }, "peerDependencies": { - "@aws-sdk/credential-providers": "^3.201.0", + "@aws-sdk/credential-providers": "^3.188.0", "@mongodb-js/zstd": "^1.1.0", + "gcp-metadata": "^5.2.0", "kerberos": "^2.0.1", - "mongodb-client-encryption": ">=2.3.0 <3", - "snappy": "^7.2.2" + "mongodb-client-encryption": ">=6.0.0 <7", + "snappy": "^7.2.2", + "socks": "^2.7.1" }, "peerDependenciesMeta": { "@aws-sdk/credential-providers": { @@ -1434,6 +1264,9 @@ "@mongodb-js/zstd": { "optional": true }, + "gcp-metadata": { + "optional": true + }, "kerberos": { "optional": true }, @@ -1442,6 +1275,9 @@ }, "snappy": { "optional": true + }, + "socks": { + "optional": true } } }, @@ -1454,15 +1290,23 @@ "whatwg-url": "^11.0.0" } }, + "node_modules/mongodb/node_modules/bson": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/bson/-/bson-6.2.0.tgz", + "integrity": "sha512-ID1cI+7bazPDyL9wYy9GaQ8gEEohWvcUl/Yf0dIdutJxnmInEEyCsb4awy/OiBfall7zBA179Pahi3vCdFze3Q==", + "engines": { + "node": ">=16.20.1" + } + }, "node_modules/mongoose": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-7.4.1.tgz", - "integrity": "sha512-o3E5KHHiHdaiwCJG3+9r70sncRKki71Ktf/TfXdW6myu+53rtZ56uLl5ylkQiCf60V3COJuOeekcxXVsjQ7cBA==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-7.6.3.tgz", + "integrity": "sha512-moYP2qWCOdWRDeBxqB/zYwQmQnTBsF5DoolX5uPyI218BkiA1ujGY27P0NTd4oWIX+LLkZPw0LDzlc/7oh1plg==", "peer": true, "dependencies": { - "bson": "^5.4.0", + "bson": "^5.5.0", "kareem": "2.5.1", - "mongodb": "5.7.0", + "mongodb": "5.9.0", "mpath": "0.9.0", "mquery": "5.0.0", "ms": "2.1.3", @@ -1476,6 +1320,47 @@ "url": "https://opencollective.com/mongoose" } }, + "node_modules/mongoose/node_modules/mongodb": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-5.9.0.tgz", + "integrity": "sha512-g+GCMHN1CoRUA+wb1Agv0TI4YTSiWr42B5ulkiAfLLHitGK1R+PkSAf3Lr5rPZwi/3F04LiaZEW0Kxro9Fi2TA==", + "peer": true, + "dependencies": { + "bson": "^5.5.0", + "mongodb-connection-string-url": "^2.6.0", + "socks": "^2.7.1" + }, + "engines": { + "node": ">=14.20.1" + }, + "optionalDependencies": { + "@mongodb-js/saslprep": "^1.1.0" + }, + "peerDependencies": { + "@aws-sdk/credential-providers": "^3.188.0", + "@mongodb-js/zstd": "^1.0.0", + "kerberos": "^1.0.0 || ^2.0.0", + "mongodb-client-encryption": ">=2.3.0 <3", + "snappy": "^7.2.2" + }, + "peerDependenciesMeta": { + "@aws-sdk/credential-providers": { + "optional": true + }, + "@mongodb-js/zstd": { + "optional": true + }, + "kerberos": { + "optional": true + }, + "mongodb-client-encryption": { + "optional": true + }, + "snappy": { + "optional": true + } + } + }, "node_modules/mongoose/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -1744,18 +1629,6 @@ "queue-microtask": "^1.2.2" } }, - "node_modules/saslprep": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", - "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", - "optional": true, - "dependencies": { - "sparse-bitfield": "^3.0.3" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/semver": { "version": "7.5.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", @@ -1810,6 +1683,7 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "peer": true, "engines": { "node": ">= 6.0.0", "npm": ">= 3.0.0" @@ -1819,6 +1693,7 @@ "version": "2.7.1", "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "peer": true, "dependencies": { "ip": "^2.0.0", "smart-buffer": "^4.2.0" @@ -1832,7 +1707,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", - "optional": true, "dependencies": { "memory-pager": "^1.0.2" } @@ -1915,9 +1789,9 @@ } }, "node_modules/tslib": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", - "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==" + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, "node_modules/type-check": { "version": "0.4.0", diff --git a/package.json b/package.json index d4742c90..a51917a4 100644 --- a/package.json +++ b/package.json @@ -23,12 +23,12 @@ "license": "MIT", "dependencies": { "@catatomik/dijkstra": "github:catatomik/dijkstra", - "@typegoose/typegoose": "^11.2.0", - "core-js": "^3.30.2", - "mongodb": "^5.0.1" + "@typegoose/typegoose": "^11.6.0", + "core-js": "^3.33.0", + "mongodb": "^6.1.0" }, "devDependencies": { - "@typescript-eslint/eslint-plugin": "^6.7.5", + "@typescript-eslint/eslint-plugin": "^6.8.0", "@typescript-eslint/parser": "^6.8.0", "eslint": "^8.51.0", "prettier": "^3.0.3", From 85f441b1d868a3bef73c5629001012fdfc6e667d Mon Sep 17 00:00:00 2001 From: Catatomik Date: Fri, 20 Oct 2023 02:22:07 +0200 Subject: [PATCH 142/251] =?UTF-8?q?=F0=9F=9A=A7=20Move=20reflect=20to=20co?= =?UTF-8?q?re-js?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/footPaths/test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/footPaths/test.ts b/src/test/footPaths/test.ts index 76084fad..29a359c7 100644 --- a/src/test/footPaths/test.ts +++ b/src/test/footPaths/test.ts @@ -16,7 +16,7 @@ export type id = number; export type footGraphNodes = number | ReturnType; // Needed to solve "Reflect.getMetadata is not a function" error of typegoose -import "@abraham/reflection"; +import "core-js/features/reflect"; import sectionsModelInit, { dbSections } from "../models/sections.model"; import stopsModelInit, { dbTBM_Stops } from "../models/TBM_stops.model"; From 54359e8efdd4708b9fa33b07abc636bbb4eb320f Mon Sep 17 00:00:00 2001 From: Catatomik Date: Fri, 20 Oct 2023 02:40:47 +0200 Subject: [PATCH 143/251] =?UTF-8?q?=F0=9F=90=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/footPaths/test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/footPaths/test.ts b/src/test/footPaths/test.ts index 29a359c7..3ccbf836 100644 --- a/src/test/footPaths/test.ts +++ b/src/test/footPaths/test.ts @@ -269,7 +269,7 @@ export async function run({ getFullPaths = false, dijkstraOptions }: testOptions let rejected = false; - await benchmark((...args: Parameters) => NonScheduledRoutesModel.deleteMany(args), [{}] as never); + await benchmark(() => NonScheduledRoutesModel.deleteMany({}), []); let totalPaths = 0; From cf83171b4653ba919de7ab25f745f72adf8d29e6 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Fri, 20 Oct 2023 02:49:37 +0200 Subject: [PATCH 144/251] =?UTF-8?q?=F0=9F=94=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tsconfig.json | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/tsconfig.json b/tsconfig.json index 28fb8029..5db615b0 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,20 +1,16 @@ { "compilerOptions": { "outDir": "./lib", + "rootDir": "./src", "moduleResolution": "Node", "module": "CommonJS", + "target": "es6", + "strict": true, + "skipLibCheck": true, "experimentalDecorators": true, "emitDecoratorMetadata": true, "esModuleInterop": true, - "allowJs": true, "sourceMap": true, "declaration": true, - "target": "es6", - "strict": true, - "skipLibCheck": true, }, - "include": [ - "./src/**/*", - ".eslintrc.cjs" - ] } \ No newline at end of file From 6f5483cc69a2389d084c6927c90f6c378f2adba0 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Fri, 20 Oct 2023 14:00:51 +0200 Subject: [PATCH 145/251] =?UTF-8?q?=F0=9F=9A=A7=20Improve=20debug=20loggin?= =?UTF-8?q?g?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/index.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/test/index.ts b/src/test/index.ts index 2dd1fde1..d0b8b1f4 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -14,6 +14,7 @@ import { unpackRefType } from "./footPaths/utils/ultils"; import { MAX_SAFE_TIMESTAMP, stopId } from "../Structures"; import { benchmark } from "./utils/benchmark"; import { binaryFilter } from "./utils"; +import { inspect } from "util"; // Main IIFE test function (async () => { @@ -144,8 +145,9 @@ import { binaryFilter } from "./utils"; } const b4 = await benchmark(resultRAPTOR, []); console.log("b4 ended"); + if (!b4.lastReturn) throw `b4 return null`; return b4.lastReturn; })() - .then(console.log) + .then((r) => console.log(inspect(r, false, 3))) .catch(console.error); From 340b633b325e1f6bf1ff15393e99e049319c0977 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Wed, 25 Oct 2023 00:34:33 +0200 Subject: [PATCH 146/251] =?UTF-8?q?=E2=AC=86=EF=B8=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 209 ++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 173 insertions(+), 36 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8fb51242..fe89c146 100644 --- a/package-lock.json +++ b/package-lock.json @@ -190,9 +190,9 @@ } }, "node_modules/@types/json-schema": { - "version": "7.0.13", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.13.tgz", - "integrity": "sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==", + "version": "7.0.14", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.14.tgz", + "integrity": "sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==", "dev": true }, "node_modules/@types/node": { @@ -201,9 +201,9 @@ "integrity": "sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ==" }, "node_modules/@types/semver": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-MMzuxN3GdFwskAnb6fz0orFvhfqi752yjaXylr0Rp4oDg5H0Zn1IuyRhDVvYOwAXoJirx2xuS16I3WjxnAIHiQ==", "dev": true }, "node_modules/@types/webidl-conversions": { @@ -221,16 +221,16 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.5.tgz", - "integrity": "sha512-JhtAwTRhOUcP96D0Y6KYnwig/MRQbOoLGXTON2+LlyB/N35SP9j1boai2zzwXb7ypKELXMx3DVk9UTaEq1vHEw==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.9.0.tgz", + "integrity": "sha512-lgX7F0azQwRPB7t7WAyeHWVfW1YJ9NIgd9mvGhfQpRY56X6AVf8mwM8Wol+0z4liE7XX3QOt8MN1rUKCfSjRIA==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.7.5", - "@typescript-eslint/type-utils": "6.7.5", - "@typescript-eslint/utils": "6.7.5", - "@typescript-eslint/visitor-keys": "6.7.5", + "@typescript-eslint/scope-manager": "6.9.0", + "@typescript-eslint/type-utils": "6.9.0", + "@typescript-eslint/utils": "6.9.0", + "@typescript-eslint/visitor-keys": "6.9.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -256,13 +256,13 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.5.tgz", - "integrity": "sha512-GAlk3eQIwWOJeb9F7MKQ6Jbah/vx1zETSDw8likab/eFcqkjSD7BI75SDAeC5N2L0MmConMoPvTsmkrg71+B1A==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.9.0.tgz", + "integrity": "sha512-1R8A9Mc39n4pCCz9o79qRO31HGNDvC7UhPhv26TovDsWPBDx+Sg3rOZdCELIA3ZmNoWAuxaMOT7aWtGRSYkQxw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.7.5", - "@typescript-eslint/visitor-keys": "6.7.5" + "@typescript-eslint/types": "6.9.0", + "@typescript-eslint/visitor-keys": "6.9.0" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -273,9 +273,9 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.5.tgz", - "integrity": "sha512-WboQBlOXtdj1tDFPyIthpKrUb+kZf2VroLZhxKa/VlwLlLyqv/PwUNgL30BlTVZV1Wu4Asu2mMYPqarSO4L5ZQ==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.9.0.tgz", + "integrity": "sha512-+KB0lbkpxBkBSiVCuQvduqMJy+I1FyDbdwSpM3IoBS7APl4Bu15lStPjgBIdykdRqQNYqYNMa8Kuidax6phaEw==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -286,12 +286,12 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.5.tgz", - "integrity": "sha512-3MaWdDZtLlsexZzDSdQWsFQ9l9nL8B80Z4fImSpyllFC/KLqWQRdEcB+gGGO+N3Q2uL40EsG66wZLsohPxNXvg==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.9.0.tgz", + "integrity": "sha512-dGtAfqjV6RFOtIP8I0B4ZTBRrlTT8NHHlZZSchQx3qReaoDeXhYM++M4So2AgFK9ZB0emRPA6JI1HkafzA2Ibg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.7.5", + "@typescript-eslint/types": "6.9.0", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -348,13 +348,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.7.5.tgz", - "integrity": "sha512-Gs0qos5wqxnQrvpYv+pf3XfcRXW6jiAn9zE/K+DlmYf6FcpxeNYN0AIETaPR7rHO4K2UY+D0CIbDP9Ut0U4m1g==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.9.0.tgz", + "integrity": "sha512-XXeahmfbpuhVbhSOROIzJ+b13krFmgtc4GlEuu1WBT+RpyGPIA4Y/eGnXzjbDj5gZLzpAXO/sj+IF/x2GtTMjQ==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.7.5", - "@typescript-eslint/utils": "6.7.5", + "@typescript-eslint/typescript-estree": "6.9.0", + "@typescript-eslint/utils": "6.9.0", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -374,6 +374,63 @@ } } }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.9.0.tgz", + "integrity": "sha512-+KB0lbkpxBkBSiVCuQvduqMJy+I1FyDbdwSpM3IoBS7APl4Bu15lStPjgBIdykdRqQNYqYNMa8Kuidax6phaEw==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.9.0.tgz", + "integrity": "sha512-NJM2BnJFZBEAbCfBP00zONKXvMqihZCrmwCaik0UhLr0vAgb6oguXxLX1k00oQyD+vZZ+CJn3kocvv2yxm4awQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.9.0", + "@typescript-eslint/visitor-keys": "6.9.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.9.0.tgz", + "integrity": "sha512-dGtAfqjV6RFOtIP8I0B4ZTBRrlTT8NHHlZZSchQx3qReaoDeXhYM++M4So2AgFK9ZB0emRPA6JI1HkafzA2Ibg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.9.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@typescript-eslint/types": { "version": "6.8.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.8.0.tgz", @@ -415,17 +472,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.7.5.tgz", - "integrity": "sha512-pfRRrH20thJbzPPlPc4j0UNGvH1PjPlhlCMq4Yx7EGjV7lvEeGX0U6MJYe8+SyFutWgSHsdbJ3BXzZccYggezA==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.9.0.tgz", + "integrity": "sha512-5Wf+Jsqya7WcCO8me504FBigeQKVLAMPmUzYgDbWchINNh1KJbxCgVya3EQ2MjvJMVeXl3pofRmprqX6mfQkjQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.7.5", - "@typescript-eslint/types": "6.7.5", - "@typescript-eslint/typescript-estree": "6.7.5", + "@typescript-eslint/scope-manager": "6.9.0", + "@typescript-eslint/types": "6.9.0", + "@typescript-eslint/typescript-estree": "6.9.0", "semver": "^7.5.4" }, "engines": { @@ -439,6 +496,80 @@ "eslint": "^7.0.0 || ^8.0.0" } }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.9.0.tgz", + "integrity": "sha512-1R8A9Mc39n4pCCz9o79qRO31HGNDvC7UhPhv26TovDsWPBDx+Sg3rOZdCELIA3ZmNoWAuxaMOT7aWtGRSYkQxw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.9.0", + "@typescript-eslint/visitor-keys": "6.9.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.9.0.tgz", + "integrity": "sha512-+KB0lbkpxBkBSiVCuQvduqMJy+I1FyDbdwSpM3IoBS7APl4Bu15lStPjgBIdykdRqQNYqYNMa8Kuidax6phaEw==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.9.0.tgz", + "integrity": "sha512-NJM2BnJFZBEAbCfBP00zONKXvMqihZCrmwCaik0UhLr0vAgb6oguXxLX1k00oQyD+vZZ+CJn3kocvv2yxm4awQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.9.0", + "@typescript-eslint/visitor-keys": "6.9.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.9.0.tgz", + "integrity": "sha512-dGtAfqjV6RFOtIP8I0B4ZTBRrlTT8NHHlZZSchQx3qReaoDeXhYM++M4So2AgFK9ZB0emRPA6JI1HkafzA2Ibg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.9.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@typescript-eslint/visitor-keys": { "version": "6.8.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.8.0.tgz", @@ -461,6 +592,12 @@ "resolved": "https://registry.npmjs.org/@tyriar/fibonacci-heap/-/fibonacci-heap-2.0.9.tgz", "integrity": "sha512-bYuSNomfn4hu2tPiDN+JZtnzCpSpbJ/PNeulmocDy3xN2X5OkJL65zo6rPZp65cPPhLF9vfT/dgE+RtFRCSxOA==" }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, "node_modules/acorn": { "version": "8.10.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", From 1a52fd98fa8c136e0f983167e960b8ef76d135c8 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Wed, 25 Oct 2023 01:02:16 +0200 Subject: [PATCH 147/251] =?UTF-8?q?=F0=9F=9A=A7=E2=9A=A1=20Rework=20test?= =?UTF-8?q?=20structure=20Ease=20debug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/index.ts | 92 +++++++++++++++++++++++------------------ src/test/utils/index.ts | 14 +++++++ 2 files changed, 65 insertions(+), 41 deletions(-) diff --git a/src/test/index.ts b/src/test/index.ts index d0b8b1f4..d367be84 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -8,16 +8,16 @@ import TBMSchedulesModelInit from "./models/TBM_schedules.model"; import TBMScheduledRoutesModelInit, { dbTBM_ScheduledRoutes } from "./models/TBMScheduledRoutes.model"; import NonScheduledRoutesModelInit, { dbFootPaths } from "./models/NonScheduledRoutes.model"; import RAPTOR from "../main"; -import { HydratedDocument } from "mongoose"; +import { MAX_SAFE_TIMESTAMP, Stop, stopId } from "../Structures"; +import { HydratedDocument, FilterQuery } from "mongoose"; import { DocumentType } from "@typegoose/typegoose"; import { unpackRefType } from "./footPaths/utils/ultils"; -import { MAX_SAFE_TIMESTAMP, stopId } from "../Structures"; import { benchmark } from "./utils/benchmark"; -import { binaryFilter } from "./utils"; +import { mapAsync, wait } from "./utils"; import { inspect } from "util"; // Main IIFE test function -(async () => { +async function init() { const db = await initDB(); const stopsModel = stopsModelInit(db); TBMSchedulesModelInit(db); @@ -59,14 +59,16 @@ import { inspect } from "util"; } type NonScheduledRoute = Omit & NonScheduledRoutesOverwritten; - const dbNonScheduledRoutes = (await NonScheduledRoutesModel.find>>( - {}, - dbNonScheduledRoutesProjection, - ) - .sort({ from: 1 }) - .lean() - // Coords field type lost... - .exec()) as NonScheduledRoute[]; + //Query must associate (s, from) AND (from, s) forall s in stops ! + const dbNonScheduledRoutes = async (stopId: NonScheduledRoutesOverwritten["from"], additionalQuery: FilterQuery = {}) => + ( + (await NonScheduledRoutesModel.find>>( + { $and: [{ $or: [{ from: stopId }, { to: stopId }] }, additionalQuery] }, + dbNonScheduledRoutesProjection, + ) + .lean() + .exec()) as NonScheduledRoute[] + ).map(({ from, to, distance }) => ({ distance, ...(to === stopId ? { to: from } : { to }) })); return { dbScheduledRoutes, dbStops, dbNonScheduledRoutes }; } @@ -75,32 +77,29 @@ import { inspect } from "util"; if (!b1.lastReturn) throw `b1 return null`; const { dbScheduledRoutes, dbStops, dbNonScheduledRoutes } = b1.lastReturn; - function createRAPTOR() { + async function createRAPTOR() { const RAPTORInstance = new RAPTOR( - dbStops.map(({ _id, coords }) => [ - _id, - ...coords, - dbScheduledRoutes.filter((ScheduledRoute) => ScheduledRoute.stops.find((stopId) => stopId === _id)).map(({ _id }) => _id), - binaryFilter(dbNonScheduledRoutes, _id, (stopFrom, NonScheduledRoute) => stopFrom - NonScheduledRoute.from) - .filter(({ distance }) => distance <= 500) - .map(({ to, distance }) => ({ - to, - length: distance, - })), - ]), + await mapAsync<(typeof dbStops)[number], Stop>(dbStops, async ({ _id, coords }) => ({ + id: _id, + lat: coords[0], + long: coords[1], + connectedRoutes: dbScheduledRoutes.filter((ScheduledRoute) => ScheduledRoute.stops.find((stopId) => stopId === _id)).map(({ _id }) => _id), + transfers: (await dbNonScheduledRoutes(_id, { distance: { $lte: 1_000 } })).map(({ to, distance }) => ({ + to, + length: distance, + })), + })), dbScheduledRoutes.map(({ _id, stops, trips }) => [ _id, - [ - stops, - trips.map(({ tripId, schedules }) => ({ - id: tripId, - times: schedules.map((schedule) => - "hor_estime" in schedule - ? [schedule.hor_estime.getTime() || MAX_SAFE_TIMESTAMP, schedule.hor_estime.getTime() || MAX_SAFE_TIMESTAMP] - : [Infinity, Infinity], - ), - })), - ], + stops, + trips.map(({ tripId, schedules }) => ({ + id: tripId, + times: schedules.map((schedule) => + "hor_estime" in schedule + ? [schedule.hor_estime.getTime() || MAX_SAFE_TIMESTAMP, schedule.hor_estime.getTime() || MAX_SAFE_TIMESTAMP] + : [Infinity, Infinity], + ), + })), ]), ); @@ -111,6 +110,10 @@ import { inspect } from "util"; if (!b2.lastReturn) throw `b2 return null`; const { RAPTORInstance } = b2.lastReturn; + return { RAPTORInstance, TBMScheduledRoutesModel }; +} + +async function run({ RAPTORInstance, TBMScheduledRoutesModel }: Awaited>) { const args = process.argv.slice(2); let ps: stopId; try { @@ -125,11 +128,7 @@ import { inspect } from "util"; pt = 2168; } - let minSchedule = Infinity; - for (const schedule of dbScheduledRoutes.flatMap(({ trips }) => trips.flatMap(({ schedules }) => schedules))) { - if ("hor_estime" in schedule && schedule.hor_estime.getTime() < minSchedule && schedule.hor_estime.getTime() > 0) - minSchedule = schedule.hor_estime.getTime(); - } + const minSchedule = (await TBMScheduledRoutesModel.findOne({}).lean())?.updatedAt?.getTime() ?? Infinity; function runRAPTOR() { RAPTORInstance.run(ps, pt, minSchedule, { walkSpeed: 1.5 }); @@ -148,6 +147,17 @@ import { inspect } from "util"; if (!b4.lastReturn) throw `b4 return null`; return b4.lastReturn; +} + +(async () => { + const initr = await init(); + // eslint-disable-next-line no-constant-condition + while (true) { + const r = await run(initr); + console.log(inspect(r, false, 3)); + //Let time to debug + await wait(10_000); + } })() - .then((r) => console.log(inspect(r, false, 3))) + .then(() => true) .catch(console.error); diff --git a/src/test/utils/index.ts b/src/test/utils/index.ts index 75a1e28d..c8e75ab0 100644 --- a/src/test/utils/index.ts +++ b/src/test/utils/index.ts @@ -62,3 +62,17 @@ export function binaryFilter(arr: T[], el: C, compare: (a: C, b: T) => num } return arr.slice(low, high + 1); } + +export async function mapAsync(array: I[], callback: (value: I, index: number, array: I[]) => Promise): Promise { + return await Promise.all(array.map(callback)); +} + +export function wait(ms = 1000): Promise { + const defP = new Deferred(); + + setTimeout(() => { + defP.resolve(null); + }, ms); + + return defP.promise; +} From d43c56cc2a26c5fbbe7a21f229491468cd3adc0a Mon Sep 17 00:00:00 2001 From: Catatomik Date: Wed, 25 Oct 2023 10:05:13 +0200 Subject: [PATCH 148/251] =?UTF-8?q?=F0=9F=9A=A7=20Move=20comment?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/index.ts b/src/test/index.ts index d367be84..a9a1e78e 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -16,7 +16,6 @@ import { benchmark } from "./utils/benchmark"; import { mapAsync, wait } from "./utils"; import { inspect } from "util"; -// Main IIFE test function async function init() { const db = await initDB(); const stopsModel = stopsModelInit(db); @@ -149,6 +148,7 @@ async function run({ RAPTORInstance, TBMScheduledRoutesModel }: Awaited { const initr = await init(); // eslint-disable-next-line no-constant-condition From 187b12f4d4a9f97fd6133af8e58dbb7682e3bf82 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Wed, 25 Oct 2023 10:15:09 +0200 Subject: [PATCH 149/251] =?UTF-8?q?=F0=9F=9A=A7=20Update=20Section=20model?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/models/sections.model.ts | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/test/models/sections.model.ts b/src/test/models/sections.model.ts index 5e5b1937..07895792 100644 --- a/src/test/models/sections.model.ts +++ b/src/test/models/sections.model.ts @@ -2,6 +2,17 @@ // // See http://mongoosejs.com/docs/models.html +export enum SectionDomanial { + NonRenseigne = 0, + Autoroute = 1, + RouteNationale = 2, + RouteDepartementale = 3, + VoieMetropolitaine = 4, + VoiePrivee = 5, + CheminRural = 6, + Autre = 7, +} + import { TBMEndpoints } from "."; import { TimeStamps } from "@typegoose/typegoose/lib/defaultClasses"; import { addModelToTypegoose, buildSchema, deleteModelWithClass, getModelForClass, prop, Ref } from "@typegoose/typegoose"; @@ -21,8 +32,8 @@ export class dbSections extends TimeStamps { @prop({ required: true }) public distance!: number; - @prop({ required: true }) - public domanial!: number; + @prop({ required: true, enum: SectionDomanial }) + public domanial!: SectionDomanial; @prop({ required: true }) public groupe!: number; From cc83f5624489adc89d23d83e7b78e75d63a4af00 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Mon, 5 Feb 2024 11:44:32 +0100 Subject: [PATCH 150/251] =?UTF-8?q?=F0=9F=94=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .eslintrc.cjs | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/.eslintrc.cjs b/.eslintrc.cjs index 13ad99af..b98d2a61 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -1,19 +1,16 @@ /* eslint-env node */ module.exports = { - extends: [ - 'eslint:recommended', - 'plugin:@typescript-eslint/recommended-type-checked', - 'plugin:@typescript-eslint/stylistic-type-checked', - ], - parser: '@typescript-eslint/parser', + extends: ["eslint:recommended", "plugin:@typescript-eslint/recommended-type-checked", "plugin:@typescript-eslint/stylistic-type-checked"], + parser: "@typescript-eslint/parser", parserOptions: { project: true, tsconfigRootDir: __dirname, }, - plugins: ['@typescript-eslint'], + plugins: ["@typescript-eslint"], root: true, rules: { - "no-empty": [ "error", { allowEmptyCatch: true } ], - "@typescript-eslint/restrict-template-expressions": "warn" - } -}; \ No newline at end of file + "no-empty": ["error", { allowEmptyCatch: true }], + "@typescript-eslint/restrict-template-expressions": "warn", + "@typescript-eslint/no-unused-vars": ["error", { caughtErrorsIgnorePattern: "^_+$", argsIgnorePattern: "^_+$", varsIgnorePattern: "^_+$" }], + }, +}; From ed8df861105113e2127a2f2966a8ad3e52e80031 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Sat, 2 Mar 2024 14:15:15 +0100 Subject: [PATCH 151/251] =?UTF-8?q?=F0=9F=9A=A7=20Generic=20RAPTOR?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/index.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/test/index.ts b/src/test/index.ts index a9a1e78e..cb1702ba 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -8,7 +8,7 @@ import TBMSchedulesModelInit from "./models/TBM_schedules.model"; import TBMScheduledRoutesModelInit, { dbTBM_ScheduledRoutes } from "./models/TBMScheduledRoutes.model"; import NonScheduledRoutesModelInit, { dbFootPaths } from "./models/NonScheduledRoutes.model"; import RAPTOR from "../main"; -import { MAX_SAFE_TIMESTAMP, Stop, stopId } from "../Structures"; +import { MAX_SAFE_TIMESTAMP, Stop } from "../Structures"; import { HydratedDocument, FilterQuery } from "mongoose"; import { DocumentType } from "@typegoose/typegoose"; import { unpackRefType } from "./footPaths/utils/ultils"; @@ -78,7 +78,7 @@ async function init() { async function createRAPTOR() { const RAPTORInstance = new RAPTOR( - await mapAsync<(typeof dbStops)[number], Stop>(dbStops, async ({ _id, coords }) => ({ + await mapAsync<(typeof dbStops)[number], Stop>(dbStops, async ({ _id, coords }) => ({ id: _id, lat: coords[0], long: coords[1], @@ -114,13 +114,13 @@ async function init() { async function run({ RAPTORInstance, TBMScheduledRoutesModel }: Awaited>) { const args = process.argv.slice(2); - let ps: stopId; + let ps: number; try { ps = JSON.parse(args[0]) as number; } catch (_) { ps = 2832; } - let pt: stopId; + let pt: number; try { pt = JSON.parse(args[1]) as number; } catch (_) { From 65e5e2eb809cf8cc9b7cf6999534daf9101ea632 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Sun, 3 Mar 2024 16:10:16 +0100 Subject: [PATCH 152/251] =?UTF-8?q?=E2=AC=86=EF=B8=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 7 ++- pnpm-lock.yaml | 147 ++++++++++++++++--------------------------------- 2 files changed, 50 insertions(+), 104 deletions(-) diff --git a/package.json b/package.json index 5d9a7ce9..55d6e5fa 100644 --- a/package.json +++ b/package.json @@ -25,11 +25,12 @@ "license": "MIT", "dependencies": { "@catatomik/dijkstra": "github:catatomik/dijkstra", - "@typegoose/typegoose": "^11.6.0", - "core-js": "^3.33.0", - "mongodb": "^6.1.0" + "@typegoose/typegoose": "^12.2.0", + "core-js": "^3.36.0", + "mongodb": "^6.4.0" }, "devDependencies": { + "@types/node": "^20.11.24", "eslint": "^8.57.0", "prettier": "^3.2.5", "typescript": "5.3.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index be8f29d7..17ac4583 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,16 +9,19 @@ dependencies: specifier: github:catatomik/dijkstra version: github.com/catatomik/dijkstra/b18a747fc80aa7d2022bdd6faacdbb3f0e69d8a2 '@typegoose/typegoose': - specifier: ^11.6.0 - version: 11.7.1(mongoose@7.6.9) + specifier: ^12.2.0 + version: 12.2.0(mongoose@8.2.0) core-js: - specifier: ^3.33.0 + specifier: ^3.36.0 version: 3.36.0 mongodb: - specifier: ^6.1.0 - version: 6.3.0 + specifier: ^6.4.0 + version: 6.4.0 devDependencies: + '@types/node': + specifier: ^20.11.24 + version: 20.11.24 eslint: specifier: ^8.57.0 version: 8.57.0 @@ -123,16 +126,16 @@ packages: fastq: 1.17.1 dev: true - /@typegoose/typegoose@11.7.1(mongoose@7.6.9): - resolution: {integrity: sha512-+tFasAsrn7mSEpHJvRcmEpCaupntiaCFImd2w/swEj8Sx5v3YTrwdKV2hjesZhIoLIMSQ+CrsNo+Y9RqTnmRig==} - engines: {node: '>=14.17.0'} + /@typegoose/typegoose@12.2.0(mongoose@8.2.0): + resolution: {integrity: sha512-6gC5aIfccXw4IZOMe3oSef63M6leDyMvuycfwzQdVi8M9C5UnpaV8tO1xzmxiOxUHDST0GdDW/aWCCX6MtOQxg==} + engines: {node: '>=16.20.1'} peerDependencies: - mongoose: ~7.6.3 + mongoose: ~8.2.0 dependencies: lodash: 4.17.21 loglevel: 1.9.1 - mongoose: 7.6.9 - reflect-metadata: 0.1.14 + mongoose: 8.2.0 + reflect-metadata: 0.2.1 semver: 7.6.0 tslib: 2.6.2 dev: false @@ -141,11 +144,11 @@ packages: resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} dev: true - /@types/node@20.11.20: - resolution: {integrity: sha512-7/rR21OS+fq8IyHTgtLkDK949uzsa6n8BkziAKtPVpugIkO6D+/ooXMvzXxDnZrmtXVfjb1bKQafYpb8s89LOg==} + /@types/node@20.11.24: + resolution: {integrity: sha512-Kza43ewS3xoLgCEpQrsT+xRo/EJej1y0kVYGiLFE1NEODXGzTfwiC6tXTLMQskn1X4/Rjlh0MQUvx9W+L9long==} dependencies: undici-types: 5.26.5 - dev: false + dev: true /@types/semver@7.5.8: resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} @@ -161,13 +164,6 @@ packages: '@types/webidl-conversions': 7.0.3 dev: false - /@types/whatwg-url@8.2.2: - resolution: {integrity: sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==} - dependencies: - '@types/node': 20.11.20 - '@types/webidl-conversions': 7.0.3 - dev: false - /@typescript-eslint/eslint-plugin@7.1.0(@typescript-eslint/parser@7.1.0)(eslint@8.57.0)(typescript@5.3.3): resolution: {integrity: sha512-j6vT/kCulhG5wBmGtstKeiVr1rdXE4nk+DT1k6trYkwlrvW9eOF5ZbgKnd/YR6PcM4uTEXa0h6Fcvf6X7Dxl0w==} engines: {node: ^16.0.0 || >=18.0.0} @@ -376,13 +372,8 @@ packages: fill-range: 7.0.1 dev: true - /bson@5.5.1: - resolution: {integrity: sha512-ix0EwukN2EpC0SRWIj/7B5+A6uQMQy6KMREI9qQqvgpkV2frH63T0UDVd1SYedL6dNCmDBYB3QtXi4ISk9YT+g==} - engines: {node: '>=14.20.1'} - dev: false - - /bson@6.3.0: - resolution: {integrity: sha512-balJfqwwTBddxfnidJZagCBPP/f48zj9Sdp3OJswREOgsJzHiQSaOIAtApSgDQFYgHqAvFkp53AFSqjMDZoTFw==} + /bson@6.4.0: + resolution: {integrity: sha512-6/gSSEdbkuFlSb+ufj5jUSU4+wo8xQOwm2bDSqwmxiPE17JTpsP63eAwoN8iF8Oy4gJYj+PAL3zdRCTdaw5Y1g==} engines: {node: '>=16.20.1'} dev: false @@ -705,14 +696,6 @@ packages: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} dev: true - /ip-address@9.0.5: - resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} - engines: {node: '>= 12'} - dependencies: - jsbn: 1.1.0 - sprintf-js: 1.1.3 - dev: false - /is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -746,10 +729,6 @@ packages: argparse: 2.0.1 dev: true - /jsbn@1.1.0: - resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} - dev: false - /json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} dev: true @@ -837,13 +816,6 @@ packages: brace-expansion: 2.0.1 dev: true - /mongodb-connection-string-url@2.6.0: - resolution: {integrity: sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==} - dependencies: - '@types/whatwg-url': 8.2.2 - whatwg-url: 11.0.0 - dev: false - /mongodb-connection-string-url@3.0.0: resolution: {integrity: sha512-t1Vf+m1I5hC2M5RJx/7AtxgABy1cZmIPQRMXw+gEIPn/cZNF3Oiy+l0UIypUwVB5trcWHq3crg2g3uAR9aAwsQ==} dependencies: @@ -851,36 +823,40 @@ packages: whatwg-url: 13.0.0 dev: false - /mongodb@5.9.1: - resolution: {integrity: sha512-NBGA8AfJxGPeB12F73xXwozt8ZpeIPmCUeWRwl9xejozTXFes/3zaep9zhzs1B/nKKsw4P3I4iPfXl3K7s6g+Q==} - engines: {node: '>=14.20.1'} + /mongodb@6.3.0: + resolution: {integrity: sha512-tt0KuGjGtLUhLoU263+xvQmPHEGTw5LbcNC73EoFRYgSHwZt5tsoJC110hDyO1kjQzpgNrpdcSza9PknWN4LrA==} + engines: {node: '>=16.20.1'} peerDependencies: '@aws-sdk/credential-providers': ^3.188.0 - '@mongodb-js/zstd': ^1.0.0 - kerberos: ^1.0.0 || ^2.0.0 - mongodb-client-encryption: '>=2.3.0 <3' + '@mongodb-js/zstd': ^1.1.0 + gcp-metadata: ^5.2.0 + kerberos: ^2.0.1 + mongodb-client-encryption: '>=6.0.0 <7' snappy: ^7.2.2 + socks: ^2.7.1 peerDependenciesMeta: '@aws-sdk/credential-providers': optional: true '@mongodb-js/zstd': optional: true + gcp-metadata: + optional: true kerberos: optional: true mongodb-client-encryption: optional: true snappy: optional: true + socks: + optional: true dependencies: - bson: 5.5.1 - mongodb-connection-string-url: 2.6.0 - socks: 2.8.1 - optionalDependencies: '@mongodb-js/saslprep': 1.1.4 + bson: 6.4.0 + mongodb-connection-string-url: 3.0.0 dev: false - /mongodb@6.3.0: - resolution: {integrity: sha512-tt0KuGjGtLUhLoU263+xvQmPHEGTw5LbcNC73EoFRYgSHwZt5tsoJC110hDyO1kjQzpgNrpdcSza9PknWN4LrA==} + /mongodb@6.4.0: + resolution: {integrity: sha512-MdFHsyb1a/Ee0H3NmzWTSLqchacDV/APF0H6BNQvraWrOiIocys2EmTFZPgHxWhcfO94c1F34I9MACU7x0hHKA==} engines: {node: '>=16.20.1'} peerDependencies: '@aws-sdk/credential-providers': ^3.188.0 @@ -907,17 +883,17 @@ packages: optional: true dependencies: '@mongodb-js/saslprep': 1.1.4 - bson: 6.3.0 + bson: 6.4.0 mongodb-connection-string-url: 3.0.0 dev: false - /mongoose@7.6.9: - resolution: {integrity: sha512-3lR1fA/gS1E9Bn0woFqIysnnjCFDYtVo3yY+rGsVg1Q7kHX+gUTgAHTEKXrkwKxk2gHFdUfAsLt/Zjrdf6+nZA==} - engines: {node: '>=14.20.1'} + /mongoose@8.2.0: + resolution: {integrity: sha512-la93n6zCYRbPS+c5N9oTDAktvREy5OT9OCljp1Tah0y3+p8UPMTAoabWaLZMdzYruOtF9/9GRf6MasaZjiZP1A==} + engines: {node: '>=16.20.1'} dependencies: - bson: 5.5.1 + bson: 6.4.0 kareem: 2.5.1 - mongodb: 5.9.1 + mongodb: 6.3.0 mpath: 0.9.0 mquery: 5.0.0 ms: 2.1.3 @@ -925,9 +901,11 @@ packages: transitivePeerDependencies: - '@aws-sdk/credential-providers' - '@mongodb-js/zstd' + - gcp-metadata - kerberos - mongodb-client-encryption - snappy + - socks - supports-color dev: false @@ -1039,8 +1017,8 @@ packages: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} dev: true - /reflect-metadata@0.1.14: - resolution: {integrity: sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A==} + /reflect-metadata@0.2.1: + resolution: {integrity: sha512-i5lLI6iw9AU3Uu4szRNPPEkomnkjRTaVt9hy/bn5g/oSzekBSMeLZblcjP74AW0vBabqERLLIrz+gR8QYR54Tw==} dev: false /resolve-from@4.0.0: @@ -1094,29 +1072,12 @@ packages: engines: {node: '>=8'} dev: true - /smart-buffer@4.2.0: - resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} - engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} - dev: false - - /socks@2.8.1: - resolution: {integrity: sha512-B6w7tkwNid7ToxjZ08rQMT8M9BJAf8DKx8Ft4NivzH0zBUfd6jldGcisJn/RLgxcX3FPNDdNQCUEMMT79b+oCQ==} - engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} - dependencies: - ip-address: 9.0.5 - smart-buffer: 4.2.0 - dev: false - /sparse-bitfield@3.0.3: resolution: {integrity: sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==} dependencies: memory-pager: 1.5.0 dev: false - /sprintf-js@1.1.3: - resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} - dev: false - /strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -1147,13 +1108,6 @@ packages: is-number: 7.0.0 dev: true - /tr46@3.0.0: - resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==} - engines: {node: '>=12'} - dependencies: - punycode: 2.3.1 - dev: false - /tr46@4.1.1: resolution: {integrity: sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==} engines: {node: '>=14'} @@ -1212,7 +1166,7 @@ packages: /undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - dev: false + dev: true /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -1225,14 +1179,6 @@ packages: engines: {node: '>=12'} dev: false - /whatwg-url@11.0.0: - resolution: {integrity: sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==} - engines: {node: '>=12'} - dependencies: - tr46: 3.0.0 - webidl-conversions: 7.0.0 - dev: false - /whatwg-url@13.0.0: resolution: {integrity: sha512-9WWbymnqj57+XEuqADHrCJ2eSXzn8WXIW/YSGaZtb2WKAInQ6CHfaUUcTyyver0p8BDg5StLQq8h1vtZuwmOig==} engines: {node: '>=16'} @@ -1265,7 +1211,6 @@ packages: resolution: {tarball: https://codeload.github.com/catatomik/dijkstra/tar.gz/b18a747fc80aa7d2022bdd6faacdbb3f0e69d8a2} name: '@catatomik/dijkstra' version: 1.0.0 - prepare: true requiresBuild: true dependencies: '@tyriar/fibonacci-heap': 2.0.9 From ba517eba7d521c60c45016c43b28c3b7ca772d4e Mon Sep 17 00:00:00 2001 From: Catatomik Date: Fri, 4 Oct 2024 17:03:32 +0200 Subject: [PATCH 153/251] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20@catatomik/dijkstr?= =?UTF-8?q?a?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pnpm-lock.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d79f16e7..57af911c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,7 +10,7 @@ importers: dependencies: '@catatomik/dijkstra': specifier: github:catatomik/dijkstra - version: https://codeload.github.com/catatomik/dijkstra/tar.gz/cf41e075be950dc00fc0d67c8565f755ac016b91 + version: https://codeload.github.com/catatomik/dijkstra/tar.gz/5d7bb84998070e5cc3d0be30f95e24e93025b919 '@typegoose/typegoose': specifier: ^12.2.0 version: 12.8.0(mongoose@8.7.0) @@ -43,8 +43,8 @@ packages: resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} engines: {node: '>=0.10.0'} - '@catatomik/dijkstra@https://codeload.github.com/catatomik/dijkstra/tar.gz/cf41e075be950dc00fc0d67c8565f755ac016b91': - resolution: {tarball: https://codeload.github.com/catatomik/dijkstra/tar.gz/cf41e075be950dc00fc0d67c8565f755ac016b91} + '@catatomik/dijkstra@https://codeload.github.com/catatomik/dijkstra/tar.gz/5d7bb84998070e5cc3d0be30f95e24e93025b919': + resolution: {tarball: https://codeload.github.com/catatomik/dijkstra/tar.gz/5d7bb84998070e5cc3d0be30f95e24e93025b919} version: 1.0.0 '@eslint-community/eslint-utils@4.4.0': @@ -671,7 +671,7 @@ snapshots: '@aashutoshrathi/word-wrap@1.2.6': {} - '@catatomik/dijkstra@https://codeload.github.com/catatomik/dijkstra/tar.gz/cf41e075be950dc00fc0d67c8565f755ac016b91': + '@catatomik/dijkstra@https://codeload.github.com/catatomik/dijkstra/tar.gz/5d7bb84998070e5cc3d0be30f95e24e93025b919': dependencies: '@tyriar/fibonacci-heap': 2.0.9 From 0086de8d6e8b6bcdf488b6346ddb5609d0677fa9 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Fri, 4 Oct 2024 17:06:21 +0200 Subject: [PATCH 154/251] =?UTF-8?q?=F0=9F=8E=A8=F0=9F=9A=A8=20ESLint+prett?= =?UTF-8?q?ier?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/footPaths/computePath.ts | 10 ++-------- src/test/footPaths/test.ts | 8 ++++---- src/test/footPaths/utils/ultils.ts | 27 ++++++++++++++------------- src/test/index.ts | 10 +++++----- src/test/utils/Workers.ts | 1 - 5 files changed, 25 insertions(+), 31 deletions(-) diff --git a/src/test/footPaths/computePath.ts b/src/test/footPaths/computePath.ts index e4436af0..d30a0cf1 100644 --- a/src/test/footPaths/computePath.ts +++ b/src/test/footPaths/computePath.ts @@ -48,9 +48,7 @@ export function computePath( for (const stopId of stops) { const targetNode = approachedStopName(stopId); - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion if (dist.get(targetNode) !== undefined && dist.get(targetNode)! < Infinity && sourceStopId !== targetNode && !computedStops.has(stopId)) - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion sourcePaths.set(stopId, [returnPaths ? tracePath(prev, targetNode) : [], dist.get(targetNode)!]); } @@ -67,8 +65,7 @@ export async function computePathBench( if (!footGraph || !stops) return sourcePaths; const [dist, prev] = options - ? // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - ( + ? ( await benchmark( Dijkstra as ( G: typeof footGraph, @@ -78,8 +75,7 @@ export async function computePathBench( [footGraph, [sourceStopId], options], ) ).lastReturn! - : // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - ( + : ( await benchmark( Dijkstra as (G: typeof footGraph, [s]: [typeof sourceStopId]) => [Map, Map], [footGraph, [sourceStopId]], @@ -91,9 +87,7 @@ export async function computePathBench( for (const stopId of s) { const targetNode = approachedStopName(stopId); - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion if (dist.get(targetNode) !== undefined && dist.get(targetNode)! < Infinity && sourceStopId !== targetNode && !computedStops.has(stopId)) - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion sourcePaths.set(stopId, [returnPaths ? tracePath(prev, targetNode) : [], dist.get(targetNode)!]); } }, diff --git a/src/test/footPaths/test.ts b/src/test/footPaths/test.ts index 3ccbf836..d98a4d63 100644 --- a/src/test/footPaths/test.ts +++ b/src/test/footPaths/test.ts @@ -90,7 +90,7 @@ export async function run({ getFullPaths = false, dijkstraOptions }: testOptions intersectionId, { _id: intersectionId, - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + coords: (Array.from(sections.values()).find((s) => s.rg_fv_graph_nd === intersectionId)?.coords[0] ?? Array.from(sections.values()) .find((s) => s.rg_fv_graph_na === intersectionId) @@ -132,7 +132,7 @@ export async function run({ getFullPaths = false, dijkstraOptions }: testOptions } const b1 = await benchmark(queryData, []); console.log("b1 ended"); - if (!b1.lastReturn) throw `b1 return null`; + if (!b1.lastReturn) throw new Error(`b1 return null`); const { validIntersections, sections, stops } = b1.lastReturn; /** Little helper to get a section easier */ @@ -152,7 +152,7 @@ export async function run({ getFullPaths = false, dijkstraOptions }: testOptions } const b2 = await benchmark(makeGraph, []); console.log("b2 ended"); - if (!b2.lastReturn) throw `b2 return null`; + if (!b2.lastReturn) throw new Error(`b2 return null`); const footGraph = b2.lastReturn; //Compute approached stops @@ -201,7 +201,7 @@ export async function run({ getFullPaths = false, dijkstraOptions }: testOptions } const b3 = await benchmark(computeApproachedStops, []); console.log("b3 ended"); - if (!b3.lastReturn) throw `b3 return null`; + if (!b3.lastReturn) throw new Error(`b3 return null`); const approachedStops = b3.lastReturn; /** Update {@link footGraph} & {@link sections} */ diff --git a/src/test/footPaths/utils/ultils.ts b/src/test/footPaths/utils/ultils.ts index fd72a0df..62947dcb 100644 --- a/src/test/footPaths/utils/ultils.ts +++ b/src/test/footPaths/utils/ultils.ts @@ -6,19 +6,20 @@ export function euclidianDistance(x1: number, y1: number, x2: number, y2: number return Math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2); } -export type unpackRefType = T extends Ref - ? D extends { - _id?: RefType; - } - ? D["_id"] - : never - : T extends Ref[] - ? D extends { - _id?: RefType; - } - ? D["_id"][] - : never - : never; +export type unpackRefType = + T extends Ref + ? D extends { + _id?: RefType; + } + ? D["_id"] + : never + : T extends Ref[] + ? D extends { + _id?: RefType; + } + ? D["_id"][] + : never + : never; /** Ensure unique node id for approachedStop (as(approached stop)={stop id}) */ export function approachedStopName(_id: number) { diff --git a/src/test/index.ts b/src/test/index.ts index cb1702ba..790f1d60 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -73,7 +73,7 @@ async function init() { } const b1 = await benchmark(queryData, []); console.log("b1 ended"); - if (!b1.lastReturn) throw `b1 return null`; + if (!b1.lastReturn) throw new Error(`b1 return null`); const { dbScheduledRoutes, dbStops, dbNonScheduledRoutes } = b1.lastReturn; async function createRAPTOR() { @@ -106,7 +106,7 @@ async function init() { } const b2 = await benchmark(createRAPTOR, []); console.log("b2 ended"); - if (!b2.lastReturn) throw `b2 return null`; + if (!b2.lastReturn) throw new Error(`b2 return null`); const { RAPTORInstance } = b2.lastReturn; return { RAPTORInstance, TBMScheduledRoutesModel }; @@ -136,7 +136,7 @@ async function run({ RAPTORInstance, TBMScheduledRoutesModel }: Awaited { const initr = await init(); - // eslint-disable-next-line no-constant-condition + while (true) { const r = await run(initr); console.log(inspect(r, false, 3)); diff --git a/src/test/utils/Workers.ts b/src/test/utils/Workers.ts index 7738cc85..251954df 100644 --- a/src/test/utils/Workers.ts +++ b/src/test/utils/Workers.ts @@ -131,7 +131,6 @@ export class WorkerPool unknown, F extends (...a worker.worker.once("message", onceMessage); worker.worker.once("error", onceError); - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion if (!res || !rej) return def!.promise; } From c656de9edfac5af192c256448d8dad6178507917 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Fri, 4 Oct 2024 22:47:01 +0200 Subject: [PATCH 155/251] =?UTF-8?q?=F0=9F=9A=A7=20Adapt=20to=20new=20RAPTO?= =?UTF-8?q?RData?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/index.ts | 52 +++++++++++++++++++++++++++-------------------- 1 file changed, 30 insertions(+), 22 deletions(-) diff --git a/src/test/index.ts b/src/test/index.ts index 790f1d60..1b86ce87 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -8,7 +8,7 @@ import TBMSchedulesModelInit from "./models/TBM_schedules.model"; import TBMScheduledRoutesModelInit, { dbTBM_ScheduledRoutes } from "./models/TBMScheduledRoutes.model"; import NonScheduledRoutesModelInit, { dbFootPaths } from "./models/NonScheduledRoutes.model"; import RAPTOR from "../main"; -import { MAX_SAFE_TIMESTAMP, Stop } from "../Structures"; +import { MAX_SAFE_TIMESTAMP, RAPTORData, Stop } from "../Structures"; import { HydratedDocument, FilterQuery } from "mongoose"; import { DocumentType } from "@typegoose/typegoose"; import { unpackRefType } from "./footPaths/utils/ultils"; @@ -78,28 +78,36 @@ async function init() { async function createRAPTOR() { const RAPTORInstance = new RAPTOR( - await mapAsync<(typeof dbStops)[number], Stop>(dbStops, async ({ _id, coords }) => ({ - id: _id, - lat: coords[0], - long: coords[1], - connectedRoutes: dbScheduledRoutes.filter((ScheduledRoute) => ScheduledRoute.stops.find((stopId) => stopId === _id)).map(({ _id }) => _id), - transfers: (await dbNonScheduledRoutes(_id, { distance: { $lte: 1_000 } })).map(({ to, distance }) => ({ - to, - length: distance, + new RAPTORData( + await mapAsync<(typeof dbStops)[number], Stop>(dbStops, async ({ _id, coords }) => ({ + id: _id, + lat: coords[0], + long: coords[1], + connectedRoutes: dbScheduledRoutes.filter((ScheduledRoute) => ScheduledRoute.stops.find((stopId) => stopId === _id)).map(({ _id }) => _id), + transfers: (await dbNonScheduledRoutes(_id, { distance: { $lte: 1_000 } })).map(({ to, distance }) => ({ + to, + length: distance, + })), })), - })), - dbScheduledRoutes.map(({ _id, stops, trips }) => [ - _id, - stops, - trips.map(({ tripId, schedules }) => ({ - id: tripId, - times: schedules.map((schedule) => - "hor_estime" in schedule - ? [schedule.hor_estime.getTime() || MAX_SAFE_TIMESTAMP, schedule.hor_estime.getTime() || MAX_SAFE_TIMESTAMP] - : [Infinity, Infinity], - ), - })), - ]), + dbScheduledRoutes.map( + ({ _id, stops, trips }) => + [ + _id, + stops, + trips.map(({ tripId, schedules }) => ({ + id: tripId, + times: schedules.map((schedule) => + "hor_estime" in schedule + ? ([schedule.hor_estime.getTime() || MAX_SAFE_TIMESTAMP, schedule.hor_estime.getTime() || MAX_SAFE_TIMESTAMP] satisfies [ + unknown, + unknown, + ]) + : ([Infinity, Infinity] satisfies [unknown, unknown]), + ), + })), + ] satisfies [unknown, unknown, unknown], + ), + ), ); return { RAPTORInstance }; From 5710138e0bb49c54feca671b7ab3ef70c3332585 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Fri, 4 Oct 2024 23:41:25 +0200 Subject: [PATCH 156/251] =?UTF-8?q?=F0=9F=90=9B=20Fix=20departureTime?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/index.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/test/index.ts b/src/test/index.ts index 1b86ce87..7e901936 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -19,7 +19,7 @@ import { inspect } from "util"; async function init() { const db = await initDB(); const stopsModel = stopsModelInit(db); - TBMSchedulesModelInit(db); + const TBMSchedulesModel = TBMSchedulesModelInit(db)[1]; const TBMScheduledRoutesModel = TBMScheduledRoutesModelInit(db); const NonScheduledRoutesModel = NonScheduledRoutesModelInit(db); @@ -117,10 +117,10 @@ async function init() { if (!b2.lastReturn) throw new Error(`b2 return null`); const { RAPTORInstance } = b2.lastReturn; - return { RAPTORInstance, TBMScheduledRoutesModel }; + return { RAPTORInstance, TBMSchedulesModel }; } -async function run({ RAPTORInstance, TBMScheduledRoutesModel }: Awaited>) { +async function run({ RAPTORInstance, TBMSchedulesModel }: Awaited>) { const args = process.argv.slice(2); let ps: number; try { @@ -132,10 +132,10 @@ async function run({ RAPTORInstance, TBMScheduledRoutesModel }: Awaited Date: Sat, 5 Oct 2024 15:01:53 +0200 Subject: [PATCH 157/251] =?UTF-8?q?=F0=9F=90=9B=20MAX=5FSAFE=5FTIMESTAMP?= =?UTF-8?q?=20location?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/index.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/test/index.ts b/src/test/index.ts index 7e901936..921b290e 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -8,7 +8,7 @@ import TBMSchedulesModelInit from "./models/TBM_schedules.model"; import TBMScheduledRoutesModelInit, { dbTBM_ScheduledRoutes } from "./models/TBMScheduledRoutes.model"; import NonScheduledRoutesModelInit, { dbFootPaths } from "./models/NonScheduledRoutes.model"; import RAPTOR from "../main"; -import { MAX_SAFE_TIMESTAMP, RAPTORData, Stop } from "../Structures"; +import { RAPTORData, Stop } from "../Structures"; import { HydratedDocument, FilterQuery } from "mongoose"; import { DocumentType } from "@typegoose/typegoose"; import { unpackRefType } from "./footPaths/utils/ultils"; @@ -98,10 +98,10 @@ async function init() { id: tripId, times: schedules.map((schedule) => "hor_estime" in schedule - ? ([schedule.hor_estime.getTime() || MAX_SAFE_TIMESTAMP, schedule.hor_estime.getTime() || MAX_SAFE_TIMESTAMP] satisfies [ - unknown, - unknown, - ]) + ? ([ + schedule.hor_estime.getTime() || RAPTORData.MAX_SAFE_TIMESTAMP, + schedule.hor_estime.getTime() || RAPTORData.MAX_SAFE_TIMESTAMP, + ] satisfies [unknown, unknown]) : ([Infinity, Infinity] satisfies [unknown, unknown]), ), })), From dc8217f114ac43e70ef8e70cfb7efbc31e2ae777 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Mon, 30 Jun 2025 18:17:59 +0200 Subject: [PATCH 158/251] =?UTF-8?q?=F0=9F=9A=A7=20Fix=20pnpm=20lock?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pnpm-lock.yaml | 357 +++++++++++++++++-------------------------------- 1 file changed, 123 insertions(+), 234 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 45f73a78..aecdee51 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,16 +10,16 @@ importers: dependencies: '@catatomik/dijkstra': specifier: github:catatomik/dijkstra - version: https://codeload.github.com/catatomik/dijkstra/tar.gz/5d7bb84998070e5cc3d0be30f95e24e93025b919 + version: https://codeload.github.com/catatomik/dijkstra/tar.gz/e3304b71e4bda9aefb04d2d18b32e7aa369a4aed '@typegoose/typegoose': specifier: ^12.2.0 - version: 12.8.0(mongoose@8.7.0) + version: 12.17.0(mongoose@8.16.1) core-js: specifier: ^3.36.0 - version: 3.38.1 + version: 3.43.0 mongodb: specifier: ^6.4.0 - version: 6.9.0 + version: 6.17.0 devDependencies: '@jest/globals': specifier: ^30.0.2 @@ -58,14 +58,6 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} -<<<<<<< HEAD - '@catatomik/dijkstra@https://codeload.github.com/catatomik/dijkstra/tar.gz/5d7bb84998070e5cc3d0be30f95e24e93025b919': - resolution: {tarball: https://codeload.github.com/catatomik/dijkstra/tar.gz/5d7bb84998070e5cc3d0be30f95e24e93025b919} - version: 1.0.0 - - '@eslint-community/eslint-utils@4.4.0': - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} -======= '@babel/code-frame@7.27.1': resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} @@ -227,6 +219,10 @@ packages: '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + '@catatomik/dijkstra@https://codeload.github.com/catatomik/dijkstra/tar.gz/e3304b71e4bda9aefb04d2d18b32e7aa369a4aed': + resolution: {tarball: https://codeload.github.com/catatomik/dijkstra/tar.gz/e3304b71e4bda9aefb04d2d18b32e7aa369a4aed} + version: 1.0.0 + '@emnapi/core@1.4.3': resolution: {integrity: sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g==} @@ -238,7 +234,6 @@ packages: '@eslint-community/eslint-utils@4.7.0': resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} ->>>>>>> main engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 @@ -295,10 +290,6 @@ packages: resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} engines: {node: '>=18.18'} -<<<<<<< HEAD - '@mongodb-js/saslprep@1.1.9': - resolution: {integrity: sha512-tVkljjeEaAhCqTzajSdgbQ6gE6f3oneVwa3iXR6csiEwXXOFsiC6Uh9iAjAhXPtqa/XMDHWjjeNH/77m/Yq2dw==} -======= '@humanwhocodes/retry@0.4.3': resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} @@ -415,9 +406,11 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@mongodb-js/saslprep@1.3.0': + resolution: {integrity: sha512-zlayKCsIjYb7/IdfqxorK5+xUMyi4vOKcFy10wKJYc63NSdKI8mNME+uJqfatkPmOSMMUiojrL58IePKBm3gvQ==} + '@napi-rs/wasm-runtime@0.2.11': resolution: {integrity: sha512-9DPkXtvHydrcOsopiYpUgPHpmj0HWZKMUnL2dZqpvC42lsratuBG06V5ipyno0fUek5VlFsNQ+AcFATSrJXgMA==} ->>>>>>> main '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} @@ -431,16 +424,6 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} -<<<<<<< HEAD - '@typegoose/typegoose@12.8.0': - resolution: {integrity: sha512-YCeYYH0joT4n48WRUfofPq3KBg6OQw1zR6wB4WKflkFYf9SC4P29hf0PlmsiA+hAbubd3Qn51KmkjiUJetJmFQ==} - engines: {node: '>=16.20.1'} - peerDependencies: - mongoose: ~8.7.0 - - '@types/estree@1.0.6': - resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} -======= '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -464,6 +447,12 @@ packages: '@tybys/wasm-util@0.9.0': resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==} + '@typegoose/typegoose@12.17.0': + resolution: {integrity: sha512-oty0KpmURqJBZiBD0DuEhpKaMwB5KDAoosvVB3V2JI630b1WMGSN2IeiiCqEhKAhTCxRwmMM48YrX1Ih6BMg/A==} + engines: {node: '>=16.20.1'} + peerDependencies: + mongoose: ~8.16.0 + '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} @@ -487,7 +476,6 @@ packages: '@types/istanbul-reports@3.0.4': resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} ->>>>>>> main '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} @@ -495,19 +483,15 @@ packages: '@types/node@22.15.32': resolution: {integrity: sha512-3jigKqgSjsH6gYZv2nEsqdXfZqIFGAV36XYYjf9KGZ3PSG+IhLecqPnI310RvjutyMwifE2hhhNEklOUrvx/wA==} -<<<<<<< HEAD + '@types/stack-utils@2.0.3': + resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + '@types/webidl-conversions@7.0.3': resolution: {integrity: sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==} '@types/whatwg-url@11.0.5': resolution: {integrity: sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==} - '@typescript-eslint/eslint-plugin@8.7.0': - resolution: {integrity: sha512-RIHOoznhA3CCfSTFiB6kBGLQtB/sox+pJ6jeFu6FxJvqL8qRxq/FfGO/UhsGgQM9oGdXkV4xUgli+dt26biB6A==} -======= - '@types/stack-utils@2.0.3': - resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} - '@types/yargs-parser@21.0.3': resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} @@ -516,7 +500,6 @@ packages: '@typescript-eslint/eslint-plugin@8.34.1': resolution: {integrity: sha512-STXcN6ebF6li4PxwNeFnqF8/2BNDvBupf2OPx2yWNzr6mKNGF7q49VM00Pz5FaomJyqvbXpY6PhO+T9w139YEQ==} ->>>>>>> main engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.34.1 @@ -557,10 +540,6 @@ packages: resolution: {integrity: sha512-rjLVbmE7HR18kDsjNIZQHxmv9RZwlgzavryL5Lnj2ujIRTeXlKtILHgRNmQ3j4daw7zd+mQgy+uyt6Zo6I0IGA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} -<<<<<<< HEAD - '@tyriar/fibonacci-heap@2.0.9': - resolution: {integrity: sha512-bYuSNomfn4hu2tPiDN+JZtnzCpSpbJ/PNeulmocDy3xN2X5OkJL65zo6rPZp65cPPhLF9vfT/dgE+RtFRCSxOA==} -======= '@typescript-eslint/typescript-estree@8.34.1': resolution: {integrity: sha512-rjCNqqYPuMUF5ODD+hWBNmOitjBWghkGKJg6hiCHzUvXRy6rK22Jd3rwbP2Xi+R7oYVvIKhokHVhH41BxPV5mA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -578,6 +557,9 @@ packages: resolution: {integrity: sha512-xoh5rJ+tgsRKoXnkBPFRLZ7rjKM0AfVbC68UZ/ECXoDbfggb9RbEySN359acY1vS3qZ0jVTVWzbtfapwm5ztxw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@tyriar/fibonacci-heap@2.0.9': + resolution: {integrity: sha512-bYuSNomfn4hu2tPiDN+JZtnzCpSpbJ/PNeulmocDy3xN2X5OkJL65zo6rPZp65cPPhLF9vfT/dgE+RtFRCSxOA==} + '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} @@ -675,7 +657,6 @@ packages: resolution: {integrity: sha512-rS86wI4R6cknYM3is3grCb/laE8XBEbpWAMSIPjYfmYp75KL5dT87jXF2orDa4tQYg5aajP5G8Fgh34dRyR+Rw==} cpu: [x64] os: [win32] ->>>>>>> main acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} @@ -765,11 +746,6 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} -<<<<<<< HEAD - bson@6.8.0: - resolution: {integrity: sha512-iOJg8pr7wq2tg/zSlCCHMi3hMm5JTOxLTagf3zxhcenHsFp+c6uOs6K7W5UE7A4QIJGtqh/ZovFNMP4mOPJynQ==} - engines: {node: '>=16.20.1'} -======= browserslist@4.25.0: resolution: {integrity: sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} @@ -782,9 +758,12 @@ packages: bser@2.1.1: resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + bson@6.10.4: + resolution: {integrity: sha512-WIsKqkSC0ABoBJuT1LEX+2HEvNmNKKgnTAyd0fL8qzK4SH2i9NXg+t08YtdZp/V9IZ33cxe3iV4yM0qg8lMQng==} + engines: {node: '>=16.20.1'} + buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} ->>>>>>> main callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} @@ -837,19 +816,14 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} -<<<<<<< HEAD - core-js@3.38.1: - resolution: {integrity: sha512-OP35aUorbU3Zvlx7pjsFdu1rGNnD4pgw/CWoYzRY3t2EzoVT7shKHY1dlAy3f41cGIO7ZDPQimhGFTlEYkG/Hw==} - - cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} -======= convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + core-js@3.43.0: + resolution: {integrity: sha512-N6wEbTTZSYOY2rYAn85CuvWWkCK6QweMn7/4Nr3w+gDBeBhk/x4EJeY6FPo4QzDoJZxVTv8U7CMvgWk6pOHHqA==} + cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} ->>>>>>> main engines: {node: '>= 8'} debug@4.4.1: @@ -1335,16 +1309,14 @@ packages: json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} -<<<<<<< HEAD - kareem@2.6.3: - resolution: {integrity: sha512-C3iHfuGUXK2u8/ipq9LfjFfXFxAZMQJJq7vLS45r3D9Y2xQ/m4S8zaR4zMLFWh9AsNPXmcFfUDhTEO8UIC/V6Q==} - engines: {node: '>=12.0.0'} -======= json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} hasBin: true ->>>>>>> main + + kareem@2.6.3: + resolution: {integrity: sha512-C3iHfuGUXK2u8/ipq9LfjFfXFxAZMQJJq7vLS45r3D9Y2xQ/m4S8zaR4zMLFWh9AsNPXmcFfUDhTEO8UIC/V6Q==} + engines: {node: '>=12.0.0'} keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} @@ -1374,7 +1346,6 @@ packages: lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} -<<<<<<< HEAD lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} @@ -1382,13 +1353,6 @@ packages: resolution: {integrity: sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==} engines: {node: '>= 0.6.0'} - lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - - memory-pager@1.5.0: - resolution: {integrity: sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==} -======= lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} @@ -1405,9 +1369,11 @@ packages: makeerror@1.0.12: resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + memory-pager@1.5.0: + resolution: {integrity: sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==} + merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} ->>>>>>> main merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} @@ -1432,16 +1398,19 @@ packages: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} -<<<<<<< HEAD - mongodb-connection-string-url@3.0.1: - resolution: {integrity: sha512-XqMGwRX0Lgn05TDB4PyG2h2kKO/FfWJyCzYQbIhXUxz7ETt0I/FqHjUeqj37irJ+Dl1ZtU82uYyj14u2XsZKfg==} + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + mongodb-connection-string-url@3.0.2: + resolution: {integrity: sha512-rMO7CGo/9BFwyZABcKAWL8UJwH/Kc2x0g72uhDWzG48URRax5TCIcJ7Rc3RZqffZzO/Gwff/jyKwCU9TN8gehA==} - mongodb@6.9.0: - resolution: {integrity: sha512-UMopBVx1LmEUbW/QE0Hw18u583PEDVQmUmVzzBRH0o/xtE9DBRA5ZYLOjpLIa03i8FXjzvQECJcqoMvCXftTUA==} + mongodb@6.17.0: + resolution: {integrity: sha512-neerUzg/8U26cgruLysKEjJvoNSXhyID3RvzvdcpsIi2COYM3FS3o9nlH7fxFtefTb942dX3W9i37oPfCVj4wA==} engines: {node: '>=16.20.1'} peerDependencies: '@aws-sdk/credential-providers': ^3.188.0 - '@mongodb-js/zstd': ^1.1.0 + '@mongodb-js/zstd': ^1.1.0 || ^2.0.0 gcp-metadata: ^5.2.0 kerberos: ^2.0.1 mongodb-client-encryption: '>=6.0.0 <7' @@ -1463,8 +1432,8 @@ packages: socks: optional: true - mongoose@8.7.0: - resolution: {integrity: sha512-rUCSF1mMYQXjXYdqEQLLlMD3xbcj2j1/hRn+9VnVj7ipzru/UoUZxlj/hWmteKMAh4EFnDZ+BIrmma9l/0Hi1g==} + mongoose@8.16.1: + resolution: {integrity: sha512-Q+0TC+KLdY4SYE+u9gk9pdW1tWu/pl0jusyEkMGTgBoAbvwQdfy4f9IM8dmvCwb/blSfp7IfLkob7v76x6ZGpQ==} engines: {node: '>=16.20.1'} mpath@0.9.0: @@ -1475,13 +1444,6 @@ packages: resolution: {integrity: sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==} engines: {node: '>=14.0.0'} - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} -======= - minipass@7.1.2: - resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} - engines: {node: '>=16 || 14 >=14.17'} - ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -1489,10 +1451,6 @@ packages: resolution: {integrity: sha512-ZEzHJwBhZ8qQSbknHqYcdtQVr8zUgGyM/q6h6qAyhtyVMNrSgDhrC4disf03dYW0e+czXyLnZINnCTEkWy0eJg==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} hasBin: true ->>>>>>> main - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -1611,13 +1569,12 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} -<<<<<<< HEAD - reflect-metadata@0.2.2: - resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==} -======= react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + reflect-metadata@0.2.2: + resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==} + require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -1625,7 +1582,6 @@ packages: resolve-cwd@3.0.0: resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} engines: {node: '>=8'} ->>>>>>> main resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} @@ -1651,11 +1607,6 @@ packages: engines: {node: '>=10'} hasBin: true - semver@7.6.3: - resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} - engines: {node: '>=10'} - hasBin: true - shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -1664,13 +1615,9 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} -<<<<<<< HEAD sift@17.1.3: resolution: {integrity: sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ==} - sparse-bitfield@3.0.3: - resolution: {integrity: sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==} -======= signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} @@ -1689,6 +1636,9 @@ packages: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} + sparse-bitfield@3.0.3: + resolution: {integrity: sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==} + sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} @@ -1707,7 +1657,6 @@ packages: string-width@5.1.2: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} ->>>>>>> main strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} @@ -1752,19 +1701,13 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} -<<<<<<< HEAD - tr46@4.1.1: - resolution: {integrity: sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==} - engines: {node: '>=14'} + tr46@5.1.1: + resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==} + engines: {node: '>=18'} - ts-api-utils@1.3.0: - resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} - engines: {node: '>=16'} -======= ts-api-utils@2.1.0: resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} engines: {node: '>=18.12'} ->>>>>>> main peerDependencies: typescript: '>=4.8.4' @@ -1798,9 +1741,6 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - tslib@2.7.0: - resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} - type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -1844,22 +1784,20 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} -<<<<<<< HEAD - webidl-conversions@7.0.0: - resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} - engines: {node: '>=12'} - - whatwg-url@13.0.0: - resolution: {integrity: sha512-9WWbymnqj57+XEuqADHrCJ2eSXzn8WXIW/YSGaZtb2WKAInQ6CHfaUUcTyyver0p8BDg5StLQq8h1vtZuwmOig==} - engines: {node: '>=16'} -======= v8-to-istanbul@9.3.0: resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} engines: {node: '>=10.12.0'} walker@1.0.8: resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} ->>>>>>> main + + webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} + + whatwg-url@14.2.0: + resolution: {integrity: sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==} + engines: {node: '>=18'} which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} @@ -1906,17 +1844,7 @@ packages: snapshots: -<<<<<<< HEAD - '@aashutoshrathi/word-wrap@1.2.6': {} - - '@catatomik/dijkstra@https://codeload.github.com/catatomik/dijkstra/tar.gz/5d7bb84998070e5cc3d0be30f95e24e93025b919': - dependencies: - '@tyriar/fibonacci-heap': 2.0.9 - - '@eslint-community/eslint-utils@4.4.0(eslint@9.11.1)': -======= '@ampproject/remapping@2.3.0': ->>>>>>> main dependencies: '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 @@ -2108,6 +2036,10 @@ snapshots: '@bcoe/v8-coverage@0.2.3': {} + '@catatomik/dijkstra@https://codeload.github.com/catatomik/dijkstra/tar.gz/e3304b71e4bda9aefb04d2d18b32e7aa369a4aed': + dependencies: + '@tyriar/fibonacci-heap': 2.0.9 + '@emnapi/core@1.4.3': dependencies: '@emnapi/wasi-threads': 1.0.2 @@ -2400,6 +2332,10 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 + '@mongodb-js/saslprep@1.3.0': + dependencies: + sparse-bitfield: 3.0.3 + '@napi-rs/wasm-runtime@0.2.11': dependencies: '@emnapi/core': 1.4.3 @@ -2407,10 +2343,6 @@ snapshots: '@tybys/wasm-util': 0.9.0 optional: true - '@mongodb-js/saslprep@1.1.9': - dependencies: - sparse-bitfield: 3.0.3 - '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -2423,18 +2355,6 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.19.1 -<<<<<<< HEAD - '@typegoose/typegoose@12.8.0(mongoose@8.7.0)': - dependencies: - lodash: 4.17.21 - loglevel: 1.9.2 - mongoose: 8.7.0 - reflect-metadata: 0.2.2 - semver: 7.6.3 - tslib: 2.7.0 - - '@types/estree@1.0.6': {} -======= '@pkgjs/parseargs@0.11.0': optional: true @@ -2457,6 +2377,15 @@ snapshots: tslib: 2.8.1 optional: true + '@typegoose/typegoose@12.17.0(mongoose@8.16.1)': + dependencies: + lodash: 4.17.21 + loglevel: 1.9.2 + mongoose: 8.16.1 + reflect-metadata: 0.2.2 + semver: 7.7.2 + tslib: 2.8.1 + '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.27.5 @@ -2489,7 +2418,6 @@ snapshots: '@types/istanbul-reports@3.0.4': dependencies: '@types/istanbul-lib-report': 3.0.3 ->>>>>>> main '@types/json-schema@7.0.15': {} @@ -2497,21 +2425,17 @@ snapshots: dependencies: undici-types: 6.21.0 -<<<<<<< HEAD + '@types/stack-utils@2.0.3': {} + '@types/webidl-conversions@7.0.3': {} '@types/whatwg-url@11.0.5': dependencies: '@types/webidl-conversions': 7.0.3 - '@typescript-eslint/eslint-plugin@8.7.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1)(typescript@5.6.2))(eslint@9.11.1)(typescript@5.6.2)': -======= - '@types/stack-utils@2.0.3': {} - '@types/yargs-parser@21.0.3': {} '@types/yargs@17.0.33': ->>>>>>> main dependencies: '@types/yargs-parser': 21.0.3 @@ -2607,11 +2531,8 @@ snapshots: '@typescript-eslint/types': 8.34.1 eslint-visitor-keys: 4.2.1 -<<<<<<< HEAD '@tyriar/fibonacci-heap@2.0.9': {} - acorn-jsx@5.3.2(acorn@8.12.1): -======= '@ungap/structured-clone@1.3.0': {} '@unrs/resolver-binding-android-arm-eabi@1.9.1': @@ -2660,7 +2581,6 @@ snapshots: optional: true '@unrs/resolver-binding-wasm32-wasi@1.9.1': ->>>>>>> main dependencies: '@napi-rs/wasm-runtime': 0.2.11 optional: true @@ -2800,9 +2720,9 @@ snapshots: dependencies: node-int64: 0.4.0 - buffer-from@1.1.2: {} + bson@6.10.4: {} - bson@6.8.0: {} + buffer-from@1.1.2: {} callsites@3.1.0: {} @@ -2841,15 +2761,11 @@ snapshots: concat-map@0.0.1: {} -<<<<<<< HEAD - core-js@3.38.1: {} - - cross-spawn@7.0.3: -======= convert-source-map@2.0.0: {} + core-js@3.43.0: {} + cross-spawn@7.0.6: ->>>>>>> main dependencies: path-key: 3.1.1 shebang-command: 2.0.0 @@ -3511,11 +3427,9 @@ snapshots: json-stable-stringify-without-jsonify@1.0.1: {} -<<<<<<< HEAD - kareem@2.6.3: {} -======= json5@2.2.3: {} ->>>>>>> main + + kareem@2.6.3: {} keyv@4.5.4: dependencies: @@ -3542,17 +3456,13 @@ snapshots: lodash.merge@4.6.2: {} -<<<<<<< HEAD lodash@4.17.21: {} loglevel@1.9.2: {} - lru-cache@6.0.0: -======= lru-cache@10.4.3: {} lru-cache@5.1.1: ->>>>>>> main dependencies: yallist: 3.1.1 @@ -3566,10 +3476,10 @@ snapshots: dependencies: tmpl: 1.0.5 - merge-stream@2.0.0: {} - memory-pager@1.5.0: {} + merge-stream@2.0.0: {} + merge2@1.4.1: {} micromatch@4.0.8: @@ -3587,23 +3497,28 @@ snapshots: dependencies: brace-expansion: 2.0.2 -<<<<<<< HEAD - mongodb-connection-string-url@3.0.1: + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.2 + + minipass@7.1.2: {} + + mongodb-connection-string-url@3.0.2: dependencies: '@types/whatwg-url': 11.0.5 - whatwg-url: 13.0.0 + whatwg-url: 14.2.0 - mongodb@6.9.0: + mongodb@6.17.0: dependencies: - '@mongodb-js/saslprep': 1.1.9 - bson: 6.8.0 - mongodb-connection-string-url: 3.0.1 + '@mongodb-js/saslprep': 1.3.0 + bson: 6.10.4 + mongodb-connection-string-url: 3.0.2 - mongoose@8.7.0: + mongoose@8.16.1: dependencies: - bson: 6.8.0 + bson: 6.10.4 kareem: 2.6.3 - mongodb: 6.9.0 + mongodb: 6.17.0 mpath: 0.9.0 mquery: 5.0.0 ms: 2.1.3 @@ -3622,24 +3537,13 @@ snapshots: mquery@5.0.0: dependencies: - debug: 4.3.4 + debug: 4.4.1 transitivePeerDependencies: - supports-color - ms@2.1.2: {} -======= - minimatch@9.0.5: - dependencies: - brace-expansion: 2.0.2 - - minipass@7.1.2: {} - ms@2.1.3: {} napi-postinstall@0.2.4: {} ->>>>>>> main - - ms@2.1.3: {} natural-compare@1.4.0: {} @@ -3740,17 +3644,15 @@ snapshots: queue-microtask@1.2.3: {} -<<<<<<< HEAD - reflect-metadata@0.2.2: {} -======= react-is@18.3.1: {} + reflect-metadata@0.2.2: {} + require-directory@2.1.1: {} resolve-cwd@3.0.0: dependencies: resolve-from: 5.0.0 ->>>>>>> main resolve-from@4.0.0: {} @@ -3766,21 +3668,14 @@ snapshots: semver@7.7.2: {} - semver@7.6.3: {} - shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 shebang-regex@3.0.0: {} -<<<<<<< HEAD sift@17.1.3: {} - sparse-bitfield@3.0.3: - dependencies: - memory-pager: 1.5.0 -======= signal-exit@3.0.7: {} signal-exit@4.1.0: {} @@ -3794,6 +3689,10 @@ snapshots: source-map@0.6.1: {} + sparse-bitfield@3.0.3: + dependencies: + memory-pager: 1.5.0 + sprintf-js@1.0.3: {} stack-utils@2.0.6: @@ -3816,7 +3715,6 @@ snapshots: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 strip-ansi: 7.1.0 ->>>>>>> main strip-ansi@6.0.1: dependencies: @@ -3856,15 +3754,11 @@ snapshots: dependencies: is-number: 7.0.0 -<<<<<<< HEAD - tr46@4.1.1: + tr46@5.1.1: dependencies: punycode: 2.3.1 - ts-api-utils@1.3.0(typescript@5.6.2): -======= ts-api-utils@2.1.0(typescript@5.8.3): ->>>>>>> main dependencies: typescript: 5.8.3 @@ -3888,10 +3782,7 @@ snapshots: babel-jest: 30.0.2(@babel/core@7.27.4) jest-util: 30.0.2 - tslib@2.8.1: - optional: true - - tslib@2.7.0: {} + tslib@2.8.1: {} type-check@0.4.0: dependencies: @@ -3951,14 +3842,6 @@ snapshots: dependencies: punycode: 2.3.1 -<<<<<<< HEAD - webidl-conversions@7.0.0: {} - - whatwg-url@13.0.0: - dependencies: - tr46: 4.1.1 - webidl-conversions: 7.0.0 -======= v8-to-istanbul@9.3.0: dependencies: '@jridgewell/trace-mapping': 0.3.25 @@ -3968,7 +3851,13 @@ snapshots: walker@1.0.8: dependencies: makeerror: 1.0.12 ->>>>>>> main + + webidl-conversions@7.0.0: {} + + whatwg-url@14.2.0: + dependencies: + tr46: 5.1.1 + webidl-conversions: 7.0.0 which@2.0.2: dependencies: From 56e766dd126ed47468590f85784b2f4c853c8ec9 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Mon, 30 Jun 2025 18:55:10 +0200 Subject: [PATCH 159/251] =?UTF-8?q?=F0=9F=9A=A7=20Work=20with=20latest=20v?= =?UTF-8?q?ersions,=20remove=20foot=20paths=20stuff?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 5 +- pnpm-lock.yaml | 5 +- src/test/footPaths/computePath.ts | 98 ------ src/test/footPaths/index.ts | 13 - src/test/footPaths/test.ts | 351 -------------------- src/test/footPaths/utils/Point.ts | 75 ----- src/test/footPaths/utils/Segment.ts | 46 --- src/test/footPaths/utils/Vector.ts | 50 --- src/test/footPaths/utils/index.ts | 1 - src/test/footPaths/utils/ultils.ts | 39 --- src/test/index.ts | 11 +- src/test/models/FootGraph.model.ts | 73 ---- src/test/models/NonScheduledRoutes.model.ts | 20 +- src/test/models/SNCF_schedules.model.ts | 42 --- src/test/models/SNCF_stops.model.ts | 36 -- src/test/models/TBMScheduledRoutes.model.ts | 25 +- src/test/models/TBM_lines.model.ts | 14 +- src/test/models/TBM_lines_routes.model.ts | 18 +- src/test/models/TBM_schedules.model.ts | 32 +- src/test/models/TBM_stops.model.ts | 18 +- src/test/models/TBM_trips.model.ts | 19 +- src/test/models/addresses.model.ts | 14 +- src/test/models/index.ts | 64 +++- src/test/models/intersections.model.ts | 22 +- src/test/models/sections.model.ts | 21 +- src/test/{footPaths => }/utils/Link.ts | 2 +- src/test/utils/Queue.ts | 4 +- src/test/utils/Workers.ts | 9 +- src/test/utils/benchmark.ts | 5 +- src/test/utils/index.ts | 18 + 30 files changed, 185 insertions(+), 965 deletions(-) delete mode 100644 src/test/footPaths/computePath.ts delete mode 100644 src/test/footPaths/index.ts delete mode 100644 src/test/footPaths/test.ts delete mode 100644 src/test/footPaths/utils/Point.ts delete mode 100644 src/test/footPaths/utils/Segment.ts delete mode 100644 src/test/footPaths/utils/Vector.ts delete mode 100644 src/test/footPaths/utils/index.ts delete mode 100644 src/test/footPaths/utils/ultils.ts delete mode 100644 src/test/models/FootGraph.model.ts delete mode 100644 src/test/models/SNCF_schedules.model.ts delete mode 100644 src/test/models/SNCF_stops.model.ts rename src/test/{footPaths => }/utils/Link.ts (97%) diff --git a/package.json b/package.json index f2d22f43..29a44f38 100644 --- a/package.json +++ b/package.json @@ -26,9 +26,10 @@ "license": "MIT", "dependencies": { "@catatomik/dijkstra": "github:catatomik/dijkstra", - "@typegoose/typegoose": "^12.2.0", + "@typegoose/typegoose": "^12.10.1", "core-js": "^3.36.0", - "mongodb": "^6.4.0" + "mongodb": "^6.4.0", + "mongoose": "^8.16.1" }, "devDependencies": { "@jest/globals": "^30.0.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index aecdee51..19ea0287 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,7 +12,7 @@ importers: specifier: github:catatomik/dijkstra version: https://codeload.github.com/catatomik/dijkstra/tar.gz/e3304b71e4bda9aefb04d2d18b32e7aa369a4aed '@typegoose/typegoose': - specifier: ^12.2.0 + specifier: ^12.10.1 version: 12.17.0(mongoose@8.16.1) core-js: specifier: ^3.36.0 @@ -20,6 +20,9 @@ importers: mongodb: specifier: ^6.4.0 version: 6.17.0 + mongoose: + specifier: ^8.16.1 + version: 8.16.1 devDependencies: '@jest/globals': specifier: ^30.0.2 diff --git a/src/test/footPaths/computePath.ts b/src/test/footPaths/computePath.ts deleted file mode 100644 index d30a0cf1..00000000 --- a/src/test/footPaths/computePath.ts +++ /dev/null @@ -1,98 +0,0 @@ -import { path, Dijkstra, tracePath, DijkstraOptions } from "@catatomik/dijkstra"; -import { unpackGraphNode, WeightedGraph } from "@catatomik/dijkstra/lib/utils/Graph"; -import type { footGraphNodes, id } from "./test"; - -import { parentPort } from "worker_threads"; -import { benchmark } from "../utils/benchmark"; -import { approachedStopName } from "./utils/ultils"; - -export interface initData { - adj: Required>>[0]; - weights: Required>>[1]; - stops: id[]; - options?: DijkstraOptions; -} -export function initialCallback(data: initData) { - footGraph = new WeightedGraph(data.adj, data.weights); - stops = data.stops; - options = data.options; - if (parentPort) parentPort.postMessage(true); -} - -if (parentPort) - parentPort.on("message", (data: initData | Parameters) => { - if (data instanceof Array) { - if (parentPort) parentPort.postMessage(computePath(...data)); - } else { - initialCallback(data); - } - }); - -let footGraph: WeightedGraph | undefined; -let stops: initData["stops"] | undefined; -let options: initData["options"] | undefined; - -export function computePath( - sourceStopId: ReturnType, - returnPaths: boolean, - computedStops = new Set(), -) { - const sourcePaths = new Map>, number]>(); - - if (!footGraph || !stops) return sourcePaths; - - const [dist, prev] = options - ? Dijkstra(footGraph, [sourceStopId], options) - : Dijkstra(footGraph, [sourceStopId]); - - for (const stopId of stops) { - const targetNode = approachedStopName(stopId); - - if (dist.get(targetNode) !== undefined && dist.get(targetNode)! < Infinity && sourceStopId !== targetNode && !computedStops.has(stopId)) - sourcePaths.set(stopId, [returnPaths ? tracePath(prev, targetNode) : [], dist.get(targetNode)!]); - } - - return sourcePaths; -} - -export async function computePathBench( - sourceStopId: ReturnType, - returnPaths: boolean, - computedStops = new Set(), -) { - const sourcePaths = new Map>, number]>(); - - if (!footGraph || !stops) return sourcePaths; - - const [dist, prev] = options - ? ( - await benchmark( - Dijkstra as ( - G: typeof footGraph, - [s]: [typeof sourceStopId], - O: DijkstraOptions, - ) => [Map, Map], - [footGraph, [sourceStopId], options], - ) - ).lastReturn! - : ( - await benchmark( - Dijkstra as (G: typeof footGraph, [s]: [typeof sourceStopId]) => [Map, Map], - [footGraph, [sourceStopId]], - ) - ).lastReturn!; - - await benchmark( - (s: NonNullable) => { - for (const stopId of s) { - const targetNode = approachedStopName(stopId); - - if (dist.get(targetNode) !== undefined && dist.get(targetNode)! < Infinity && sourceStopId !== targetNode && !computedStops.has(stopId)) - sourcePaths.set(stopId, [returnPaths ? tracePath(prev, targetNode) : [], dist.get(targetNode)!]); - } - }, - [stops], - ); - - return sourcePaths; -} diff --git a/src/test/footPaths/index.ts b/src/test/footPaths/index.ts deleted file mode 100644 index 1d14a068..00000000 --- a/src/test/footPaths/index.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { run } from "./test"; -import { benchmark } from "../utils/benchmark"; - -const args = process.argv.slice(2); -const getFullPaths = JSON.parse(args[0]) as boolean; -const times = JSON.parse(args[1]) as number; - -if (typeof getFullPaths !== "boolean") throw new Error(`Type of argument 1 "getFullPaths" invalid (got ${typeof getFullPaths})`); -if (typeof times !== "number") throw new Error(`Type of argument 2 "times" invalid (got ${typeof times})`); - -benchmark(run, [{ getFullPaths, dijkstraOptions: { maxCumulWeight: 5_000 } }], this, times) - .then(console.log) - .catch(console.error); diff --git a/src/test/footPaths/test.ts b/src/test/footPaths/test.ts deleted file mode 100644 index d98a4d63..00000000 --- a/src/test/footPaths/test.ts +++ /dev/null @@ -1,351 +0,0 @@ -import { HydratedDocument } from "mongoose"; -import initDB from "../utils/mongoose"; -import { benchmark } from "../utils/benchmark"; -import { WorkerPool } from "../utils/Workers"; - -import { node, WeightedGraph } from "@catatomik/dijkstra/lib/utils/Graph"; - -import Point from "./utils/Point"; -import Segment from "./utils/Segment"; - -export interface testOptions { - getFullPaths?: boolean; - dijkstraOptions?: DijkstraOptions; -} -export type id = number; -export type footGraphNodes = number | ReturnType; - -// Needed to solve "Reflect.getMetadata is not a function" error of typegoose -import "core-js/features/reflect"; - -import sectionsModelInit, { dbSections } from "../models/sections.model"; -import stopsModelInit, { dbTBM_Stops } from "../models/TBM_stops.model"; -import { computePath, initialCallback } from "./computePath"; -import { DocumentType } from "@typegoose/typegoose"; -import { approachedStopName, euclidianDistance, sectionId, dbIntersectionId, dbSectionId, unpackRefType } from "./utils/ultils"; -import FootGraphModelInit, { dbFootGraphEdges, dbFootGraphNodes } from "../models/FootGraph.model"; -import NonScheduledRoutesModelInit, { dbFootPaths } from "../models/NonScheduledRoutes.model"; -import { KeyOfMap } from "./utils"; -import { DijkstraOptions } from "@catatomik/dijkstra"; -import { unique, Deferred } from "../utils"; - -const sectionProjection = { coords: 1, distance: 1, rg_fv_graph_nd: 1, rg_fv_graph_na: 1 }; -export type dbSection = Pick; -interface SectionOverwritten { - /** Will never be populated, so force to be RefType */ - rg_fv_graph_nd: unpackRefType | ReturnType; - /** Will never be populated, so force to be RefType */ - rg_fv_graph_na: unpackRefType | ReturnType; -} -export type Section = Omit & SectionOverwritten; - -const stopProjection = { _id: 1, coords: 1, libelle: 1 }; -export type Stop = Pick; - -export async function run({ getFullPaths = false, dijkstraOptions }: testOptions) { - //Grab required data - const db = await initDB(); - - const sectionsModel = sectionsModelInit(db); - const stopsModel = stopsModelInit(db); - const [FootGraphModel, FootGraphNodesModel, FootGraphEdgesModel] = FootGraphModelInit(db); - const NonScheduledRoutesModel = NonScheduledRoutesModelInit(db); - - // const limitTop = new Point(44.813926, -0.581271).fromWGSToLambert93(); - // const limitBot = new Point(44.793123, -0.632578).fromWGSToLambert93(); - - async function queryData() { - //Important : sections are oriented => 2 entries per section - const sections = new Map( - ( - (await sectionsModel - .find>>( - { - //Restrict domain - // $and: [ - // { "coords.0.0": { $lte: limitTop.x } }, - // { "coords.0.0": { $gte: limitBot.x } }, - // { "coords.0.1": { $lte: limitTop.y } }, - // { "coords.0.1": { $gte: limitBot.y } }, - // ], - cat_dig: { - $in: [2, 3, 4, 5, 7, 9], - }, - }, - sectionProjection, - ) - .lean() - // Coords field type lost... - .exec()) as unknown as Section[] - ).map((s) => [sectionId(s as { rg_fv_graph_nd: number; rg_fv_graph_na: number }), s] as const), - ); - - //Restricted domain - const validIntersections = new Map( - Array.from(sections.values()) - .flatMap((s) => [s.rg_fv_graph_nd as number, s.rg_fv_graph_na as number]) - .filter(unique) - .map((intersectionId) => { - return [ - intersectionId, - { - _id: intersectionId, - - coords: (Array.from(sections.values()).find((s) => s.rg_fv_graph_nd === intersectionId)?.coords[0] ?? - Array.from(sections.values()) - .find((s) => s.rg_fv_graph_na === intersectionId) - ?.coords.at(-1))!, - }, - ] as const; - }), - ); - - const stops = new Map( - ( - (await stopsModel - .find>>( - { - $and: [ - { coords: { $not: { $elemMatch: { $eq: Infinity } } } }, - //Restrict domain - // { "coords.0": { $lte: limitTop.x } }, - // { "coords.0": { $gte: limitBot.x } }, - // { "coords.1": { $lte: limitTop.y } }, - // { "coords.1": { $gte: limitBot.y } }, - ], - }, - stopProjection, - ) - .lean() - // Coords field type lost... - .exec()) as unknown as Stop[] - ) - .filter((s, _, arr) => !arr.find((ss) => s.coords[0] === ss.coords[0] && s.coords[1] === ss.coords[1] && s._id !== ss._id)) - .map((s) => [s._id, s]), - ); - - return { - sections, - validIntersections, - stops, - }; - } - const b1 = await benchmark(queryData, []); - console.log("b1 ended"); - if (!b1.lastReturn) throw new Error(`b1 return null`); - const { validIntersections, sections, stops } = b1.lastReturn; - - /** Little helper to get a section easier */ - function getSection(nd: node, na: node) { - return sections.get(sectionId({ rg_fv_graph_nd: nd, rg_fv_graph_na: na })) ?? sections.get(sectionId({ rg_fv_graph_nd: na, rg_fv_graph_na: nd })); - } - - function makeGraph() { - const footGraph = new WeightedGraph(); - - for (const s of sections.values()) { - //Oriented but don't care (foot graph) - footGraph.addEdge(s.rg_fv_graph_nd, s.rg_fv_graph_na, s.distance); - } - - return footGraph; - } - const b2 = await benchmark(makeGraph, []); - console.log("b2 ended"); - if (!b2.lastReturn) throw new Error(`b2 return null`); - const footGraph = b2.lastReturn; - - //Compute approached stops - function computeApproachedStops() { - //Pre-generate mapped segments to fasten the process (and not redundant computing) - //A segment describes a portion of a section (NOT oriented) - const mappedSegments = new Map<(typeof footGraph.edges)[number], Segment[]>(); - for (const edge of footGraph.edges) { - const section = getSection(...edge); - if (!section) continue; // Added for ts mental health - mappedSegments.set( - edge, - section.coords.reduce( - (acc, v, i) => (i >= section.coords.length - 1 ? acc : [...acc, new Segment(new Point(...v), new Point(...section.coords[i + 1]))]), - [], - ), - ); - } - - /**@description [closest point, section containing this point, indice of segment composing the section] */ - const approachedStops = new Map, [Point, (typeof footGraph.edges)[number], number]>(); - for (const [stopId, stop] of stops) { - /**@description [distance to closest point, closest point, section containing this point, indice of segment composing the section (i;i+1 in Section coords)] */ - const closestPoint: [number, Point | null, (typeof footGraph.edges)[number] | null, number | null] = [Infinity, null, null, null]; - - for (const [edge, segs] of mappedSegments) { - for (const [n, seg] of segs.entries()) { - const stopPoint: Point = new Point(...stop.coords); - const localClosestPoint: Point = seg.closestPointFromPoint(stopPoint); - const distance: number = Point.distance(stopPoint, localClosestPoint); - if (distance < closestPoint[0]) { - closestPoint[0] = distance; - closestPoint[1] = localClosestPoint; - closestPoint[2] = edge; - closestPoint[3] = n; - } - } - } - - if (closestPoint[1] !== null && closestPoint[2] !== null && closestPoint[3] !== null) { - approachedStops.set(approachedStopName(stopId), [closestPoint[1], closestPoint[2], closestPoint[3]]); - // else : couldn't find an approched stop (coords = Infinity) - } - } - return approachedStops; - } - const b3 = await benchmark(computeApproachedStops, []); - console.log("b3 ended"); - if (!b3.lastReturn) throw new Error(`b3 return null`); - const approachedStops = b3.lastReturn; - - /** Update {@link footGraph} & {@link sections} */ - function refreshWithApproachedStops() { - //Pushes new approached stops into graph, just like a proxy on a section - for (const [stopId, [closestPoint, edge, n]] of approachedStops) { - const section = getSection(...edge); - if (!section) continue; // Added to ts mental health - //Compute distance from section start to approachedStop - const toApproadchedStop: number = - section.coords.reduce((acc, v, i, arr) => { - if (i < n && i < arr.length - 1) return acc + euclidianDistance(...v, ...arr[i + 1]); - return acc; - }, 0) + Point.distance(closestPoint, new Point(...section.coords[n])); - - //Compute distance form approachedStop to section end - const fromApproachedStop: number = - section.coords.reduce((acc, v, i, arr) => { - if (i > n && i < arr.length - 1) return acc + euclidianDistance(...v, ...arr[i + 1]); - return acc; - }, 0) + Point.distance(closestPoint, new Point(...section.coords[n])); - - //Remove edge from p1 to p2 - footGraph.removeEdge(section.rg_fv_graph_nd, section.rg_fv_graph_na); - - const insertedNode = stopId; - //Insert new node approachedStop - //Create edges from p1 to approachedStop, then from approachedStop to p2 - const subsectionToApproachedStop: Section = { - coords: [...section.coords.slice(0, n + 1), [closestPoint.x, closestPoint.y]], - distance: toApproadchedStop, - rg_fv_graph_nd: section.rg_fv_graph_nd, - rg_fv_graph_na: insertedNode, - }; - footGraph.addEdge(section.rg_fv_graph_nd, insertedNode, toApproadchedStop); - sections.set(sectionId({ rg_fv_graph_nd: section.rg_fv_graph_nd, rg_fv_graph_na: insertedNode }), subsectionToApproachedStop); - - const subsectionFromApproachedStop: Section = { - coords: [[closestPoint.x, closestPoint.y], ...section.coords.slice(n + 1)], - distance: fromApproachedStop, - rg_fv_graph_nd: insertedNode, - rg_fv_graph_na: section.rg_fv_graph_na, - }; - footGraph.addEdge(insertedNode, section.rg_fv_graph_na, fromApproachedStop); - sections.set(sectionId({ rg_fv_graph_nd: insertedNode, rg_fv_graph_na: section.rg_fv_graph_na }), subsectionFromApproachedStop); - } - } - const b4 = await benchmark(refreshWithApproachedStops, []); - console.log("b4 ended"); - - async function computePaths() { - const def = new Deferred(); - - const workerPool = new WorkerPool( - __dirname + "/computePath.js", - 8, - { - adj: footGraph.adj, - weights: footGraph.weights, - stops: Array.from(stops.keys()), - options: dijkstraOptions, - }, - false, - ); - - let rejected = false; - - await benchmark(() => NonScheduledRoutesModel.deleteMany({}), []); - - let totalPaths = 0; - - // Number of done worker jobs - let computed = 0; - const computedStops = new Set>(); - for (const stopId of stops.keys()) { - workerPool - .run([approachedStopName(stopId), getFullPaths, computedStops]) - .then(async (sourcePaths) => { - computedStops.add(stopId); - - totalPaths += sourcePaths.size; - - await NonScheduledRoutesModel.insertMany( - Array.from(sourcePaths).map(([to, [path, distance]]) => ({ - from: stopId, - to, - path: path.map((node) => (typeof node === "number" ? dbIntersectionId(node) : node)), - distance, - })), - ); - - computed++; - if (!rejected && computed === approachedStops.size) def.resolve(totalPaths); - }) - .catch((r) => { - computedStops.add(stopId); - computed++; - - if (rejected) return; - rejected = true; - def.reject(r); - }); - } - - return def.promise; - } - const b5 = await benchmark(computePaths, []); - console.log("b5 ended"); - - async function updateDb() { - //Empty db - await FootGraphModel.deleteMany({}); - - await FootGraphNodesModel.insertMany( - Array.from(validIntersections.values()) - .map(({ _id, coords }) => ({ - _id: dbIntersectionId(_id), - coords, - })) - .concat( - Array.from(approachedStops).map(([asId, [Point]]) => ({ - _id: asId, - coords: [Point.x, Point.y], - })), - ), - ); - - await FootGraphEdgesModel.insertMany( - Array.from(sections.values()).map((section, index) => ({ - _id: dbSectionId(index), - coords: section.coords, - distance: section.distance, - ends: [ - typeof section.rg_fv_graph_nd === "number" ? dbIntersectionId(section.rg_fv_graph_nd) : section.rg_fv_graph_nd, - typeof section.rg_fv_graph_na === "number" ? dbIntersectionId(section.rg_fv_graph_na) : section.rg_fv_graph_na, - ], - })), - ); - } - const b6 = await benchmark(updateDb, []); - console.log("b6 ended"); - - //End procedure - await db.disconnect(); - - return { b1, b2, b3, b4, b5, b6 }; -} diff --git a/src/test/footPaths/utils/Point.ts b/src/test/footPaths/utils/Point.ts deleted file mode 100644 index 8ae5bf01..00000000 --- a/src/test/footPaths/utils/Point.ts +++ /dev/null @@ -1,75 +0,0 @@ -import Vector2 from "./Vector"; - -const X0 = 700000; -const Y0 = 6600000; -const a = 6378137; -const e = 0.08181919106; -const l0 = (Math.PI / 180) * 3; -const lc = l0; -const phi0 = (Math.PI / 180) * 46.5; -const phi1 = (Math.PI / 180) * 44; -const phi2 = (Math.PI / 180) * 49; - -const gN1 = a / Math.sqrt(1 - e * e * Math.sin(phi1) * Math.sin(phi1)); -const gN2 = a / Math.sqrt(1 - e * e * Math.sin(phi2) * Math.sin(phi2)); - -const gl0 = Math.log(Math.tan(Math.PI / 4 + phi0 / 2) * Math.pow((1 - e * Math.sin(phi0)) / (1 + e * Math.sin(phi0)), e / 2)); -const gl1 = Math.log(Math.tan(Math.PI / 4 + phi1 / 2) * Math.pow((1 - e * Math.sin(phi1)) / (1 + e * Math.sin(phi1)), e / 2)); -const gl2 = Math.log(Math.tan(Math.PI / 4 + phi2 / 2) * Math.pow((1 - e * Math.sin(phi2)) / (1 + e * Math.sin(phi2)), e / 2)); - -const n = Math.log((gN2 * Math.cos(phi2)) / (gN1 * Math.cos(phi1))) / (gl1 - gl2); -const c = ((gN1 * Math.cos(phi1)) / n) * Math.exp(n * gl1); - -export default class Point { - constructor( - protected _x: number, - protected _y: number, - ) {} - - public get x() { - return this._x; - } - - public get y() { - return this._y; - } - - transform(v: Vector2) { - this._x += v.x; - this._y += v.y; - return this; - } - - static transform(p: Point, v: Vector2): Point { - return new Point(p.x + v.x, p.y + v.y); - } - - distance(p: Point) { - return Math.sqrt((p.x - this.x) ** 2 + (p.y - this.y) ** 2); - } - - static distance(p1: Point, p2: Point): number { - return Math.sqrt((p2.x - p1.x) ** 2 + (p2.y - p1.y) ** 2); - } - - fromWGSToLambert93() { - const { x, y } = Point.fromWGSToLambert93(this); - this._x = x; - this._y = y; - return this; - } - - /** - * @description Converts WGS coordinates into Lambert 93 coordinates. X is latitude, Y is longitude. - */ - static fromWGSToLambert93 = ({ x, y }: Point): Point => { - const phi = (Math.PI / 180) * x; - const l = (Math.PI / 180) * y; - - const gl = Math.log(Math.tan(Math.PI / 4 + phi / 2) * Math.pow((1 - e * Math.sin(phi)) / (1 + e * Math.sin(phi)), e / 2)); - - const ys = Y0 + c * Math.exp(-1 * n * gl0); - - return new Point(X0 + c * Math.exp(-1 * n * gl) * Math.sin(n * (l - lc)), ys - c * Math.exp(-1 * n * gl) * Math.cos(n * (l - lc))); - }; -} diff --git a/src/test/footPaths/utils/Segment.ts b/src/test/footPaths/utils/Segment.ts deleted file mode 100644 index 5671b350..00000000 --- a/src/test/footPaths/utils/Segment.ts +++ /dev/null @@ -1,46 +0,0 @@ -import Point from "./Point"; -import Vector2 from "./Vector"; - -export default class Segment { - protected AB: Vector2; - - constructor( - protected A: Point, - protected B: Point, - ) { - this.AB = new Vector2(A, B); - } - - get length() { - return new Vector2(this.A, this.B).length; - } - - orthogonalProjection(C: Point): Point { - const AC = new Vector2(this.A, C); - const AB = new Vector2(this.A, this.B); - - const coeff = Vector2.dot(AC, AB) / AB.magnitude; - const AH = AB.mult(coeff); - - return new Point(AH.x + this.A.x, AH.y + this.A.y); - } - - /** - * @description It's basically an orthogonal projection - */ - closestPointFromPoint(P: Point): Point { - const AP: Vector2 = new Vector2(this.A, P); - - const ABAP = Vector2.dot(AP, this.AB); - const magnitudeAB: number = this.AB.magnitude; - const distance: number = ABAP / magnitudeAB; - - if (distance < 0) { - return this.A; - } else if (distance > 1) { - return this.B; - } else { - return Point.transform(this.A, Vector2.mult(this.AB, distance)); - } - } -} diff --git a/src/test/footPaths/utils/Vector.ts b/src/test/footPaths/utils/Vector.ts deleted file mode 100644 index 4d7eabb3..00000000 --- a/src/test/footPaths/utils/Vector.ts +++ /dev/null @@ -1,50 +0,0 @@ -import Point from "./Point"; - -export type direction = 0 | 1; - -export default class Vector2 { - x = NaN; - y = NaN; - - /** - * @description Create a new vector from 2 points - * @param e1 Origin - * @param e2 Destination - */ - constructor(e1: Point, e2: Point); - constructor(x: number, y: number); - constructor(xe1: Point | number, ye2: Point | number) { - if (xe1 instanceof Point && ye2 instanceof Point) { - this.x = ye2.x - xe1.x; - this.y = ye2.y - xe1.y; - } else if (typeof xe1 === "number" && typeof ye2 === "number") { - this.x = xe1; - this.y = ye2; - } - } - - /** - * @description Squared length - */ - get magnitude(): number { - return this.x ** 2 + this.y ** 2; - } - - get length(): number { - return Math.sqrt(this.magnitude); - } - - mult(k: number): Vector2 { - this.x *= k; - this.y *= k; - return this; - } - - static mult(v: Vector2, k: number): Vector2 { - return new Vector2(v.x * k, v.y * k); - } - - static dot(v1: Vector2, v2: Vector2): number { - return v1.x * v2.x + v1.y * v2.y; - } -} diff --git a/src/test/footPaths/utils/index.ts b/src/test/footPaths/utils/index.ts deleted file mode 100644 index 5ff2d434..00000000 --- a/src/test/footPaths/utils/index.ts +++ /dev/null @@ -1 +0,0 @@ -export type KeyOfMap> = M extends Map ? K : never; diff --git a/src/test/footPaths/utils/ultils.ts b/src/test/footPaths/utils/ultils.ts deleted file mode 100644 index 62947dcb..00000000 --- a/src/test/footPaths/utils/ultils.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { Ref } from "@typegoose/typegoose"; -import { RefType } from "@typegoose/typegoose/lib/types"; -import { node } from "@catatomik/dijkstra/lib/utils/Graph"; - -export function euclidianDistance(x1: number, y1: number, x2: number, y2: number): number { - return Math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2); -} - -export type unpackRefType = - T extends Ref - ? D extends { - _id?: RefType; - } - ? D["_id"] - : never - : T extends Ref[] - ? D extends { - _id?: RefType; - } - ? D["_id"][] - : never - : never; - -/** Ensure unique node id for approachedStop (as(approached stop)={stop id}) */ -export function approachedStopName(_id: number) { - return `as=${_id}` as const; -} - -export function dbIntersectionId(_id: number) { - return `i=${_id}` as const; -} - -export function dbSectionId(_id: number) { - return `s=${_id}` as const; -} - -export function sectionId({ rg_fv_graph_nd, rg_fv_graph_na }: S) { - return `${rg_fv_graph_nd}-${rg_fv_graph_na}` as const; -} diff --git a/src/test/index.ts b/src/test/index.ts index 921b290e..df13fbbc 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -7,13 +7,11 @@ import stopsModelInit, { dbTBM_Stops } from "./models/TBM_stops.model"; import TBMSchedulesModelInit from "./models/TBM_schedules.model"; import TBMScheduledRoutesModelInit, { dbTBM_ScheduledRoutes } from "./models/TBMScheduledRoutes.model"; import NonScheduledRoutesModelInit, { dbFootPaths } from "./models/NonScheduledRoutes.model"; -import RAPTOR from "../main"; -import { RAPTORData, Stop } from "../Structures"; +import { RAPTOR, RAPTORData, Stop } from "../"; import { HydratedDocument, FilterQuery } from "mongoose"; import { DocumentType } from "@typegoose/typegoose"; -import { unpackRefType } from "./footPaths/utils/ultils"; import { benchmark } from "./utils/benchmark"; -import { mapAsync, wait } from "./utils"; +import { mapAsync, unpackRefType, wait } from "./utils"; import { inspect } from "util"; async function init() { @@ -36,7 +34,7 @@ async function init() { .lean() .exec()) as ScheduledRoute[]; - const dbStopProjection = { _id: 1, coords: 1 }; + const dbStopProjection = { _id: 1, coords: 1 } as const; type Stop = Pick; const dbStops = (await stopsModel @@ -97,7 +95,7 @@ async function init() { trips.map(({ tripId, schedules }) => ({ id: tripId, times: schedules.map((schedule) => - "hor_estime" in schedule + typeof schedule === "object" && "hor_estime" in schedule ? ([ schedule.hor_estime.getTime() || RAPTORData.MAX_SAFE_TIMESTAMP, schedule.hor_estime.getTime() || RAPTORData.MAX_SAFE_TIMESTAMP, @@ -160,6 +158,7 @@ async function run({ RAPTORInstance, TBMSchedulesModel }: Awaited { const initr = await init(); + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition while (true) { const r = await run(initr); console.log(inspect(r, false, 3)); diff --git a/src/test/models/FootGraph.model.ts b/src/test/models/FootGraph.model.ts deleted file mode 100644 index 88ed497e..00000000 --- a/src/test/models/FootGraph.model.ts +++ /dev/null @@ -1,73 +0,0 @@ -// tbm_schedules-model.js - A mongoose model -// -// See http://mongoosejs.com/docs/models.html - -import { - addModelToTypegoose, - buildSchema, - deleteModelWithClass, - getDiscriminatorModelForClass, - getModelWithString, - prop, - Ref, -} from "@typegoose/typegoose"; -import { modelOptions } from "@typegoose/typegoose/lib/modelOptions"; -import { getName } from "@typegoose/typegoose/lib/internal/utils"; -import { Mongoose } from "mongoose"; -import { approachedStopName, dbIntersectionId, dbSectionId } from "../footPaths/utils/ultils"; - -@modelOptions({ options: { customName: "FootGraph" } }) -export class dbFootGraph { - @prop({ required: true, type: () => String }) - public _id!: ReturnType | ReturnType | ReturnType; -} - -@modelOptions({ options: { customName: "FootGraphNode" } }) -export class dbFootGraphNodes extends dbFootGraph { - @prop({ required: true, type: () => String }) - public _id!: ReturnType | ReturnType; - - @prop({ required: true, type: () => [Number] }) - public coords!: [number, number]; - - @prop() - public stopId?: number; -} - -@modelOptions({ options: { customName: "FootGraphEdge" } }) -export class dbFootGraphEdges extends dbFootGraph { - @prop({ required: true, type: () => String }) - public _id!: ReturnType; - - @prop({ required: true }) - public distance!: number; - - @prop({ required: true, type: () => [[Number, Number]] }) - public coords!: [number, number][]; - - @prop({ required: true, ref: () => dbFootGraphNodes, type: () => [String, String] }) - public ends!: [Ref, Ref]; -} - -export default function init(db: Mongoose) { - if (getModelWithString(getName(dbFootGraph))) deleteModelWithClass(dbFootGraph); - if (getModelWithString(getName(dbFootGraphNodes))) deleteModelWithClass(dbFootGraphNodes); - if (getModelWithString(getName(dbFootGraphEdges))) deleteModelWithClass(dbFootGraphEdges); - - const dbFootGraphSchema = buildSchema(dbFootGraph, { existingMongoose: db }); - const dbFootGraphModelRaw = db.model(getName(dbFootGraph), dbFootGraphSchema); - - const dbFootGraphModel = addModelToTypegoose(dbFootGraphModelRaw, dbFootGraph, { - existingMongoose: db, - }); - - return [ - dbFootGraphModel, - getDiscriminatorModelForClass(dbFootGraphModel, dbFootGraphNodes), - getDiscriminatorModelForClass(dbFootGraphModel, dbFootGraphEdges), - ] as const; -} - -export type dbFootGraphModel = ReturnType[0]; -export type dbFootGraphNodesModel = ReturnType[1]; -export type dbFootGraphEdgesModel = ReturnType[2]; diff --git a/src/test/models/NonScheduledRoutes.model.ts b/src/test/models/NonScheduledRoutes.model.ts index 0ee114d3..0e286659 100644 --- a/src/test/models/NonScheduledRoutes.model.ts +++ b/src/test/models/NonScheduledRoutes.model.ts @@ -2,12 +2,15 @@ // // See http://mongoosejs.com/docs/models.html -import { addModelToTypegoose, buildSchema, deleteModelWithClass, getModelForClass, prop, Ref } from "@typegoose/typegoose"; +export function approachedStopName(_id: number) { + return `as=${_id}` as const; +} + +import { deleteModelWithClass, getModelForClass, prop, type Ref, type ReturnModelType } from "@typegoose/typegoose"; import { modelOptions } from "@typegoose/typegoose/lib/modelOptions"; -import { getName } from "@typegoose/typegoose/lib/internal/utils"; import { Mongoose } from "mongoose"; import { dbTBM_Stops } from "./TBM_stops.model"; -import { dbFootGraphNodes } from "./FootGraph.model"; +import { dbSections } from "./sections.model"; @modelOptions({ options: { customName: "NonScheduledRoutes" } }) export class dbFootPaths { @@ -20,17 +23,14 @@ export class dbFootPaths { @prop({ required: true }) public distance!: number; - @prop({ ref: () => dbFootGraphNodes, type: () => String }) - public path?: Ref[]; // Ref[] to intersections | stops + @prop() + public path?: (dbSections["_id"] | ReturnType)[]; // Ref[] to intersections | stops } -export default function init(db: Mongoose) { +export default function init(db: Mongoose): ReturnModelType { if (getModelForClass(dbFootPaths, { existingMongoose: db })) deleteModelWithClass(dbFootPaths); - const dbFootPathsSchema = buildSchema(dbFootPaths, { existingMongoose: db }); - const dbFootPathsModelRaw = db.model(getName(dbFootPaths), dbFootPathsSchema); - - return addModelToTypegoose(dbFootPathsModelRaw, dbFootPaths, { existingMongoose: db }); + return getModelForClass(dbFootPaths, { existingMongoose: db }); } export type dbFootPathsModel = ReturnType; diff --git a/src/test/models/SNCF_schedules.model.ts b/src/test/models/SNCF_schedules.model.ts deleted file mode 100644 index d1d656e7..00000000 --- a/src/test/models/SNCF_schedules.model.ts +++ /dev/null @@ -1,42 +0,0 @@ -// sncf_schedules-model.js - A mongoose model -// -// See http://mongoosejs.com/docs/models.html - -import { SNCFEndpoints } from "."; -import { TimeStamps } from "@typegoose/typegoose/lib/defaultClasses"; -import { addModelToTypegoose, buildSchema, deleteModelWithClass, getModelForClass, prop, Ref } from "@typegoose/typegoose"; -import { modelOptions } from "@typegoose/typegoose/lib/modelOptions"; -import { getName } from "@typegoose/typegoose/lib/internal/utils"; -import { dbSNCF_Stops } from "./SNCF_stops.model"; -import { Mongoose } from "mongoose"; - -@modelOptions({ options: { customName: SNCFEndpoints.Schedules } }) -export class dbSNCF_Schedules extends TimeStamps { - @prop({ required: true }) - public _id!: string; - - @prop({ required: true }) - public realtime!: Date; - - @prop({ required: true }) - public trip!: number; //iImplicitly includes direction - - @prop({ required: true, ref: () => dbSNCF_Stops, type: () => Number }) - public stop_point!: Ref; - - @prop({ required: true }) - public route!: string; // Should be a ref -} - -export default function init(db: Mongoose) { - if (getModelForClass(dbSNCF_Schedules, { existingMongoose: db })) deleteModelWithClass(dbSNCF_Schedules); - - const dbSNCF_SchedulesSchema = buildSchema(dbSNCF_Schedules, { existingMongoose: db }); - const dbSNCF_SchedulesModelRaw = db.model(getName(dbSNCF_Schedules), dbSNCF_SchedulesSchema); - - return addModelToTypegoose(dbSNCF_SchedulesModelRaw, dbSNCF_Schedules, { - existingMongoose: db, - }); -} - -export type dbSNCF_SchedulesModel = ReturnType; diff --git a/src/test/models/SNCF_stops.model.ts b/src/test/models/SNCF_stops.model.ts deleted file mode 100644 index f1e5a2dd..00000000 --- a/src/test/models/SNCF_stops.model.ts +++ /dev/null @@ -1,36 +0,0 @@ -// sncf_stops-model.js - A mongoose model -// -// See http://mongoosejs.com/docs/models.html - -import { TimeStamps } from "@typegoose/typegoose/lib/defaultClasses"; -import { addModelToTypegoose, buildSchema, deleteModelWithClass, getModelForClass, prop } from "@typegoose/typegoose"; -import { modelOptions } from "@typegoose/typegoose/lib/modelOptions"; -import { getName } from "@typegoose/typegoose/lib/internal/utils"; -import { SNCFEndpoints } from "."; -import { Mongoose } from "mongoose"; - -@modelOptions({ options: { customName: SNCFEndpoints.Stops } }) -export class dbSNCF_Stops extends TimeStamps { - @prop({ required: true }) - public _id!: number; - - @prop({ type: () => [Number, Number], required: true }) - public coords!: [number, number]; - - @prop({ required: true }) - public name!: string; - - @prop({ required: true }) - public name_lowercase!: string; -} - -export default function init(db: Mongoose) { - if (getModelForClass(dbSNCF_Stops, { existingMongoose: db })) deleteModelWithClass(dbSNCF_Stops); - - const dbSNCF_StopsSchema = buildSchema(dbSNCF_Stops, { existingMongoose: db }); - const dbSNCF_StopsModelRaw = db.model(getName(dbSNCF_Stops), dbSNCF_StopsSchema); - - return addModelToTypegoose(dbSNCF_StopsModelRaw, dbSNCF_Stops, { existingMongoose: db }); -} - -export type dbSNCF_StopsModel = ReturnType; diff --git a/src/test/models/TBMScheduledRoutes.model.ts b/src/test/models/TBMScheduledRoutes.model.ts index 3bd67fc6..68183bf1 100644 --- a/src/test/models/TBMScheduledRoutes.model.ts +++ b/src/test/models/TBMScheduledRoutes.model.ts @@ -2,22 +2,21 @@ // // See http://mongoosejs.com/docs/models.html +import { deleteModelWithClass, getModelForClass, prop, type Ref, type ReturnModelType } from "@typegoose/typegoose"; import { TimeStamps } from "@typegoose/typegoose/lib/defaultClasses"; -import { addModelToTypegoose, buildSchema, deleteModelWithClass, getModelForClass, prop, Ref } from "@typegoose/typegoose"; import { modelOptions } from "@typegoose/typegoose/lib/modelOptions"; -import { getName } from "@typegoose/typegoose/lib/internal/utils"; -import { dbTBM_Schedules_rt } from "./TBM_schedules.model"; -import { dbTBM_Stops } from "./TBM_stops.model"; -import { TBMEndpoints } from "."; import { Mongoose } from "mongoose"; +import { TBMEndpoints } from "."; +import { dbTBM_Schedules_rt, default as TBMSchedulesRtInit } from "./TBM_schedules.model"; +import { dbTBM_Stops, default as TBMStopsInit } from "./TBM_stops.model"; @modelOptions({ schemaOptions: { _id: false } }) export class TripOfScheduledRoute { @prop({ required: true }) public tripId!: number; - @prop({ required: true, ref: () => dbTBM_Schedules_rt }) - public schedules!: Ref[]; + @prop({ required: true, ref: () => dbTBM_Schedules_rt, type: () => Number }) + public schedules!: Ref[]; } @modelOptions({ options: { customName: TBMEndpoints.ScheduledRoutes } }) @@ -33,15 +32,13 @@ export class dbTBM_ScheduledRoutes extends TimeStamps { public stops!: Ref[]; } -export default function init(db: Mongoose) { - if (getModelForClass(dbTBM_ScheduledRoutes, { existingMongoose: db })) deleteModelWithClass(dbTBM_ScheduledRoutes); +export default function init(db: Mongoose): ReturnModelType { + TBMSchedulesRtInit(db); + TBMStopsInit(db); - const dbTBM_ScheduledRoutesSchema = buildSchema(dbTBM_ScheduledRoutes, { - existingMongoose: db, - }); - const dbTBM_ScheduledRoutesModelRaw = db.model(getName(dbTBM_ScheduledRoutes), dbTBM_ScheduledRoutesSchema); + if (getModelForClass(dbTBM_ScheduledRoutes, { existingMongoose: db })) deleteModelWithClass(dbTBM_ScheduledRoutes); - return addModelToTypegoose(dbTBM_ScheduledRoutesModelRaw, dbTBM_ScheduledRoutes, { + return getModelForClass(dbTBM_ScheduledRoutes, { existingMongoose: db, }); } diff --git a/src/test/models/TBM_lines.model.ts b/src/test/models/TBM_lines.model.ts index df49c7e4..9cbc46db 100644 --- a/src/test/models/TBM_lines.model.ts +++ b/src/test/models/TBM_lines.model.ts @@ -2,13 +2,12 @@ // // See http://mongoosejs.com/docs/models.html -import { TBMEndpoints } from "."; +import { type ReturnModelType, deleteModelWithClass, getModelForClass, prop } from "@typegoose/typegoose"; import { TimeStamps } from "@typegoose/typegoose/lib/defaultClasses"; -import { addModelToTypegoose, buildSchema, deleteModelWithClass, getModelForClass, prop } from "@typegoose/typegoose"; import { modelOptions } from "@typegoose/typegoose/lib/modelOptions"; -import { getName } from "@typegoose/typegoose/lib/internal/utils"; -import { Active, VehicleType } from "./TBM_stops.model"; import { Mongoose } from "mongoose"; +import { TBMEndpoints } from "."; +import { type Active, VehicleType } from "./TBM_stops.model"; @modelOptions({ options: { customName: TBMEndpoints.Lines } }) export class dbTBM_Lines extends TimeStamps { @@ -25,13 +24,10 @@ export class dbTBM_Lines extends TimeStamps { public active!: Active; } -export default function init(db: Mongoose) { +export default function init(db: Mongoose): ReturnModelType { if (getModelForClass(dbTBM_Lines, { existingMongoose: db })) deleteModelWithClass(dbTBM_Lines); - const dbTBM_LinesSchema = buildSchema(dbTBM_Lines, { existingMongoose: db }); - const dbTBM_LinesModelRaw = db.model(getName(dbTBM_Lines), dbTBM_LinesSchema); - - return addModelToTypegoose(dbTBM_LinesModelRaw, dbTBM_Lines, { existingMongoose: db }); + return getModelForClass(dbTBM_Lines, { existingMongoose: db }); } export type dbTBM_LinesModel = ReturnType; diff --git a/src/test/models/TBM_lines_routes.model.ts b/src/test/models/TBM_lines_routes.model.ts index cd5281cf..9d7bb820 100644 --- a/src/test/models/TBM_lines_routes.model.ts +++ b/src/test/models/TBM_lines_routes.model.ts @@ -2,14 +2,13 @@ // // See http://mongoosejs.com/docs/models.html -import { TBMEndpoints } from "."; +import { deleteModelWithClass, getModelForClass, prop, type Ref, type ReturnModelType } from "@typegoose/typegoose"; import { TimeStamps } from "@typegoose/typegoose/lib/defaultClasses"; -import { addModelToTypegoose, buildSchema, deleteModelWithClass, getModelForClass, prop, Ref } from "@typegoose/typegoose"; import { modelOptions } from "@typegoose/typegoose/lib/modelOptions"; -import { getName } from "@typegoose/typegoose/lib/internal/utils"; -import { dbTBM_Lines } from "./TBM_lines.model"; -import { dbTBM_Stops } from "./TBM_stops.model"; import { Mongoose } from "mongoose"; +import { TBMEndpoints } from "."; +import { dbTBM_Lines } from "./TBM_lines.model"; +import { dbTBM_Stops, VehicleType } from "./TBM_stops.model"; @modelOptions({ options: { customName: TBMEndpoints.Lines_routes } }) export class dbTBM_Lines_routes extends TimeStamps { @@ -23,7 +22,7 @@ export class dbTBM_Lines_routes extends TimeStamps { public sens!: string; @prop({ required: true }) - public vehicule!: string; + public vehicule!: VehicleType; @prop({ required: true, ref: () => dbTBM_Lines, type: () => Number }) public rs_sv_ligne_a!: Ref; @@ -36,13 +35,10 @@ export class dbTBM_Lines_routes extends TimeStamps { } // for more of what you can do here. -export default function init(db: Mongoose) { +export default function init(db: Mongoose): ReturnModelType { if (getModelForClass(dbTBM_Lines_routes, { existingMongoose: db })) deleteModelWithClass(dbTBM_Lines_routes); - const dbTBM_Lines_routesSchema = buildSchema(dbTBM_Lines_routes, { existingMongoose: db }); - const dbTBM_Lines_routesModelRaw = db.model(getName(dbTBM_Lines_routes), dbTBM_Lines_routesSchema); - - return addModelToTypegoose(dbTBM_Lines_routesModelRaw, dbTBM_Lines_routes, { + return getModelForClass(dbTBM_Lines_routes, { existingMongoose: db, }); } diff --git a/src/test/models/TBM_schedules.model.ts b/src/test/models/TBM_schedules.model.ts index cd117946..e8cc19b5 100644 --- a/src/test/models/TBM_schedules.model.ts +++ b/src/test/models/TBM_schedules.model.ts @@ -14,30 +14,27 @@ export enum RtScheduleType { Deviation = "DEVIATION", } -import { TBMEndpoints } from "."; -import { TimeStamps } from "@typegoose/typegoose/lib/defaultClasses"; import { - addModelToTypegoose, - buildSchema, deleteModelWithClass, getDiscriminatorModelForClass, getModelForClass, index, prop, - Ref, + type Ref, + type ReturnModelType, } from "@typegoose/typegoose"; +import { TimeStamps } from "@typegoose/typegoose/lib/defaultClasses"; import { modelOptions } from "@typegoose/typegoose/lib/modelOptions"; -import { getName } from "@typegoose/typegoose/lib/internal/utils"; +import { Mongoose } from "mongoose"; +import { TBMEndpoints } from "."; import { dbTBM_Stops } from "./TBM_stops.model"; import { dbTBM_Trips } from "./TBM_trips.model"; -import { Mongoose } from "mongoose"; -@index({ gid: 1, realtime: 1 }, { unique: true }) -@index({ rs_sv_cours_a: 1 }) +@index({ _id: 1, realtime: 1 }, { unique: true }) @modelOptions({ options: { customName: TBMEndpoints.Schedules } }) export class dbTBM_Schedules extends TimeStamps { - @prop({ required: true, index: true }) - public gid!: number; + @prop({ required: true }) + public _id!: number; @prop({ required: true }) public hor_theo!: Date; @@ -48,7 +45,7 @@ export class dbTBM_Schedules extends TimeStamps { @prop({ required: true, ref: () => dbTBM_Stops, type: () => Number }) public rs_sv_arret_p!: Ref; - @prop({ required: true, ref: () => dbTBM_Trips, type: () => Number }) + @prop({ required: true, ref: () => dbTBM_Trips, type: () => Number, index: true }) public rs_sv_cours_a!: Ref; } @@ -67,16 +64,9 @@ export class dbTBM_Schedules_rt extends dbTBM_Schedules { public type!: RtScheduleType; } -export default function init(db: Mongoose) { +export default function init(db: Mongoose): readonly [ReturnModelType, ReturnModelType] { if (getModelForClass(dbTBM_Schedules, { existingMongoose: db })) deleteModelWithClass(dbTBM_Schedules); - if (getModelForClass(dbTBM_Schedules_rt, { existingMongoose: db })) deleteModelWithClass(dbTBM_Schedules_rt); - - const dbTBM_SchedulesSchema = buildSchema(dbTBM_Schedules, { existingMongoose: db }); - const dbTBM_SchedulesModelRaw = db.model(getName(dbTBM_Schedules), dbTBM_SchedulesSchema); - - const dbTBM_SchedulesModel = addModelToTypegoose(dbTBM_SchedulesModelRaw, dbTBM_Schedules, { - existingMongoose: db, - }); + const dbTBM_SchedulesModel = getModelForClass(dbTBM_Schedules, { existingMongoose: db }); return [dbTBM_SchedulesModel, getDiscriminatorModelForClass(dbTBM_SchedulesModel, dbTBM_Schedules_rt)] as const; } diff --git a/src/test/models/TBM_stops.model.ts b/src/test/models/TBM_stops.model.ts index 6664dac5..7ff087a7 100644 --- a/src/test/models/TBM_stops.model.ts +++ b/src/test/models/TBM_stops.model.ts @@ -2,12 +2,11 @@ // // See http://mongoosejs.com/docs/models.html -import { TBMEndpoints } from "."; +import { type ReturnModelType, deleteModelWithClass, getModelForClass, prop } from "@typegoose/typegoose"; import { TimeStamps } from "@typegoose/typegoose/lib/defaultClasses"; -import { addModelToTypegoose, buildSchema, deleteModelWithClass, getModelForClass, prop } from "@typegoose/typegoose"; import { modelOptions } from "@typegoose/typegoose/lib/modelOptions"; -import { getName } from "@typegoose/typegoose/lib/internal/utils"; import { Mongoose } from "mongoose"; +import { TBMEndpoints } from "."; export enum VehicleType { Bus = "BUS", @@ -29,14 +28,14 @@ export class dbTBM_Stops extends TimeStamps { @prop({ required: true }) public _id!: number; - @prop({ type: () => [Number, Number], required: true }) + @prop({ type: () => [Number], required: true }) public coords!: [number, number]; @prop({ required: true }) public libelle!: string; @prop({ required: true }) - public libelle_lowercase!: string; + public libelle_norm!: string; @prop({ required: true, enum: VehicleType }) public vehicule!: VehicleType; @@ -49,16 +48,13 @@ export class dbTBM_Stops extends TimeStamps { } // export type dbTBM_Stops = Omit, "coords"> & { -// coords: [number, number]; +// coords: Coords; // }; -export default function init(db: Mongoose) { +export default function init(db: Mongoose): ReturnModelType { if (getModelForClass(dbTBM_Stops, { existingMongoose: db })) deleteModelWithClass(dbTBM_Stops); - const dbTBM_StopsSchema = buildSchema(dbTBM_Stops, { existingMongoose: db }); - const dbTBM_StopsModelRaw = db.model(getName(dbTBM_Stops), dbTBM_StopsSchema); - - return addModelToTypegoose(dbTBM_StopsModelRaw, dbTBM_Stops, { existingMongoose: db }); + return getModelForClass(dbTBM_Stops, { existingMongoose: db }); } export type dbTBM_StopsModel = ReturnType; diff --git a/src/test/models/TBM_trips.model.ts b/src/test/models/TBM_trips.model.ts index 38fbea36..1498d453 100644 --- a/src/test/models/TBM_trips.model.ts +++ b/src/test/models/TBM_trips.model.ts @@ -2,17 +2,15 @@ // // See http://mongoosejs.com/docs/models.html -import { TBMEndpoints } from "."; +import { deleteModelWithClass, getModelForClass, prop, type Ref, type ReturnModelType } from "@typegoose/typegoose"; import { TimeStamps } from "@typegoose/typegoose/lib/defaultClasses"; -import { addModelToTypegoose, buildSchema, deleteModelWithClass, getModelForClass, index, prop, Ref } from "@typegoose/typegoose"; import { modelOptions } from "@typegoose/typegoose/lib/modelOptions"; -import { getName } from "@typegoose/typegoose/lib/internal/utils"; +import { Mongoose } from "mongoose"; +import { TBMEndpoints } from "."; import { dbTBM_Lines } from "./TBM_lines.model"; -import { dbTBM_Stops } from "./TBM_stops.model"; import { dbTBM_Lines_routes } from "./TBM_lines_routes.model"; -import { Mongoose } from "mongoose"; +import { dbTBM_Stops } from "./TBM_stops.model"; -@index({ rs_sv_chem_l: 1 }) @modelOptions({ options: { customName: TBMEndpoints.Trips } }) export class dbTBM_Trips extends TimeStamps { @prop({ required: true }) @@ -30,17 +28,14 @@ export class dbTBM_Trips extends TimeStamps { @prop({ required: true, ref: () => dbTBM_Stops, type: () => Number }) public rg_sv_arret_p_na!: Ref; - @prop({ required: true, ref: () => dbTBM_Lines_routes, type: () => Number }) + @prop({ required: true, ref: () => dbTBM_Lines_routes, type: () => Number, index: true }) public rs_sv_chem_l!: Ref; } -export default function init(db: Mongoose) { +export default function init(db: Mongoose): ReturnModelType { if (getModelForClass(dbTBM_Trips, { existingMongoose: db })) deleteModelWithClass(dbTBM_Trips); - const dbTBM_TripsSchema = buildSchema(dbTBM_Trips, { existingMongoose: db }); - const dbTBM_TripsModelRaw = db.model(getName(dbTBM_Trips), dbTBM_TripsSchema); - - return addModelToTypegoose(dbTBM_TripsModelRaw, dbTBM_Trips, { existingMongoose: db }); + return getModelForClass(dbTBM_Trips, { existingMongoose: db }); } export type dbTBM_TripsModel = ReturnType; diff --git a/src/test/models/addresses.model.ts b/src/test/models/addresses.model.ts index affbbd30..a909292e 100644 --- a/src/test/models/addresses.model.ts +++ b/src/test/models/addresses.model.ts @@ -2,12 +2,11 @@ // // See http://mongoosejs.com/docs/models.html -import { TBMEndpoints } from "."; +import { type ReturnModelType, deleteModelWithClass, getModelForClass, prop } from "@typegoose/typegoose"; import { TimeStamps } from "@typegoose/typegoose/lib/defaultClasses"; -import { addModelToTypegoose, buildSchema, deleteModelWithClass, getModelForClass, prop } from "@typegoose/typegoose"; import { modelOptions } from "@typegoose/typegoose/lib/modelOptions"; -import { getName } from "@typegoose/typegoose/lib/internal/utils"; import { Mongoose } from "mongoose"; +import { TBMEndpoints } from "."; @modelOptions({ options: { customName: TBMEndpoints.Addresses } }) export class dbAddresses extends TimeStamps { @@ -30,7 +29,7 @@ export class dbAddresses extends TimeStamps { public nom_voie!: string; @prop({ required: true }) - public nom_voie_lowercase!: string; + public nom_voie_norm!: string; @prop({ required: true }) public code_postal!: number; @@ -42,13 +41,10 @@ export class dbAddresses extends TimeStamps { public commune!: string; } -export default function init(db: Mongoose) { +export default function init(db: Mongoose): ReturnModelType { if (getModelForClass(dbAddresses, { existingMongoose: db })) deleteModelWithClass(dbAddresses); - const dbAddressesSchema = buildSchema(dbAddresses, { existingMongoose: db }); - const dbAddressesModelRaw = db.model(getName(dbAddresses), dbAddressesSchema); - - return addModelToTypegoose(dbAddressesModelRaw, dbAddresses, { existingMongoose: db }); + return getModelForClass(dbAddresses, { existingMongoose: db }); } export type dbAddressesModel = ReturnType; diff --git a/src/test/models/index.ts b/src/test/models/index.ts index ef18fc7f..894bada2 100644 --- a/src/test/models/index.ts +++ b/src/test/models/index.ts @@ -1,4 +1,14 @@ -export enum TBMEndpoints { +import { dbAddresses, dbAddressesModel } from "./addresses.model"; +import { dbIntersections, dbIntersectionsModel } from "./intersections.model"; +import { dbSections, dbSectionsModel } from "./sections.model"; +import { dbTBM_Lines, dbTBM_LinesModel } from "./TBM_lines.model"; +import { dbTBM_Lines_routes, dbTBM_Lines_routesModel } from "./TBM_lines_routes.model"; +import { dbTBM_Schedules, dbTBM_Schedules_rt, dbTBM_Schedules_rtModel, dbTBM_SchedulesModel } from "./TBM_schedules.model"; +import { dbTBM_Stops, dbTBM_StopsModel } from "./TBM_stops.model"; +import { dbTBM_Trips, dbTBM_TripsModel } from "./TBM_trips.model"; +import { dbTBM_ScheduledRoutes, dbTBM_ScheduledRoutesModel } from "./TBMScheduledRoutes.model"; + +enum TBMEndpoints { Addresses = "Addresses", Intersections = "Intersections", Sections = "Sections", @@ -10,9 +20,53 @@ export enum TBMEndpoints { Trips = "TBM_Trips", Lines_routes = "TBM_Lines_routes", ScheduledRoutes = "TBM_Scheduled_routes", + RouteSections = "TBM_Route_sections", + LinkLineRoutesSections = "TBM_Link_line_routes_sections", } -export enum SNCFEndpoints { - Schedules = "SNCF_Schedules", - Stops = "SNCF_Stops", -} +type TBMClass = E extends TBMEndpoints.Addresses + ? dbAddresses + : E extends TBMEndpoints.Intersections + ? dbIntersections + : E extends TBMEndpoints.Sections + ? dbSections + : E extends TBMEndpoints.Lines + ? dbTBM_Lines + : E extends TBMEndpoints.Lines_routes + ? dbTBM_Lines_routes + : E extends TBMEndpoints.Schedules + ? dbTBM_Schedules + : E extends TBMEndpoints.Schedules_rt + ? dbTBM_Schedules_rt + : E extends TBMEndpoints.Stops + ? dbTBM_Stops + : E extends TBMEndpoints.Trips + ? dbTBM_Trips + : E extends TBMEndpoints.ScheduledRoutes + ? dbTBM_ScheduledRoutes + : never; + +type TBMModel = E extends TBMEndpoints.Addresses + ? dbAddressesModel + : E extends TBMEndpoints.Intersections + ? dbIntersectionsModel + : E extends TBMEndpoints.Sections + ? dbSectionsModel + : E extends TBMEndpoints.Lines + ? dbTBM_LinesModel + : E extends TBMEndpoints.Lines_routes + ? dbTBM_Lines_routesModel + : E extends TBMEndpoints.Schedules + ? dbTBM_SchedulesModel + : E extends TBMEndpoints.Schedules_rt + ? dbTBM_Schedules_rtModel + : E extends TBMEndpoints.Stops + ? dbTBM_StopsModel + : E extends TBMEndpoints.Trips + ? dbTBM_TripsModel + : E extends TBMEndpoints.ScheduledRoutes + ? dbTBM_ScheduledRoutesModel + : never; + +export { TBMEndpoints }; +export type { TBMClass, TBMModel }; diff --git a/src/test/models/intersections.model.ts b/src/test/models/intersections.model.ts index 7cdb876e..2a0564db 100644 --- a/src/test/models/intersections.model.ts +++ b/src/test/models/intersections.model.ts @@ -2,12 +2,11 @@ // // See http://mongoosejs.com/docs/models.html -import { TBMEndpoints } from "."; +import { deleteModelWithClass, getModelForClass, prop, type ReturnModelType } from "@typegoose/typegoose"; import { TimeStamps } from "@typegoose/typegoose/lib/defaultClasses"; -import { addModelToTypegoose, buildSchema, deleteModelWithClass, getModelForClass, prop } from "@typegoose/typegoose"; import { modelOptions } from "@typegoose/typegoose/lib/modelOptions"; -import { getName } from "@typegoose/typegoose/lib/internal/utils"; import { Mongoose } from "mongoose"; +import { TBMEndpoints } from "."; @modelOptions({ options: { customName: TBMEndpoints.Intersections } }) export class dbIntersections extends TimeStamps { @@ -19,17 +18,20 @@ export class dbIntersections extends TimeStamps { @prop({ required: true }) public nature!: string; + + /** Not used for now + @prop({ required: true }) + public commune!: string; + + @prop({ required: true }) + public code_commune!: string; + */ } -export default function init(db: Mongoose) { +export default function init(db: Mongoose): ReturnModelType { if (getModelForClass(dbIntersections, { existingMongoose: db })) deleteModelWithClass(dbIntersections); - const dbIntersectionsSchema = buildSchema(dbIntersections, { existingMongoose: db }); - const dbIntersectionsModelRaw = db.model(getName(dbIntersections), dbIntersectionsSchema); - - return addModelToTypegoose(dbIntersectionsModelRaw, dbIntersections, { - existingMongoose: db, - }); + return getModelForClass(dbIntersections, { existingMongoose: db }); } export type dbIntersectionsModel = ReturnType; diff --git a/src/test/models/sections.model.ts b/src/test/models/sections.model.ts index 07895792..48650cfd 100644 --- a/src/test/models/sections.model.ts +++ b/src/test/models/sections.model.ts @@ -13,13 +13,11 @@ export enum SectionDomanial { Autre = 7, } -import { TBMEndpoints } from "."; +import { deleteModelWithClass, getModelForClass, prop, type ReturnModelType } from "@typegoose/typegoose"; import { TimeStamps } from "@typegoose/typegoose/lib/defaultClasses"; -import { addModelToTypegoose, buildSchema, deleteModelWithClass, getModelForClass, prop, Ref } from "@typegoose/typegoose"; import { modelOptions } from "@typegoose/typegoose/lib/modelOptions"; -import { getName } from "@typegoose/typegoose/lib/internal/utils"; -import { dbIntersections } from "./intersections.model"; import { Mongoose } from "mongoose"; +import { TBMEndpoints } from "."; @modelOptions({ options: { customName: TBMEndpoints.Sections } }) export class dbSections extends TimeStamps { @@ -47,20 +45,17 @@ export class dbSections extends TimeStamps { @prop({ required: true }) public rg_fv_graph_dbl!: boolean; - @prop({ required: true, ref: () => dbIntersections, type: () => Number }) - public rg_fv_graph_nd!: Ref; + @prop({ required: true }) + public rg_fv_graph_nd!: number; - @prop({ required: true, ref: () => dbIntersections, type: () => Number }) - public rg_fv_graph_na!: Ref; + @prop({ required: true }) + public rg_fv_graph_na!: number; } -export default function init(db: Mongoose) { +export default function init(db: Mongoose): ReturnModelType { if (getModelForClass(dbSections, { existingMongoose: db })) deleteModelWithClass(dbSections); - const dbSectionsSchema = buildSchema(dbSections, { existingMongoose: db }); - const dbSectionsModelRaw = db.model(getName(dbSections), dbSectionsSchema); - - return addModelToTypegoose(dbSectionsModelRaw, dbSections, { existingMongoose: db }); + return getModelForClass(dbSections, { existingMongoose: db }); } export type dbSectionsModel = ReturnType; diff --git a/src/test/footPaths/utils/Link.ts b/src/test/utils/Link.ts similarity index 97% rename from src/test/footPaths/utils/Link.ts rename to src/test/utils/Link.ts index 325b4e00..d992d24c 100644 --- a/src/test/footPaths/utils/Link.ts +++ b/src/test/utils/Link.ts @@ -66,7 +66,7 @@ export class Link { } toArrayRevertedRec(): Type[] { - if (!this._next || !(this._next instanceof Link)) return [this.value]; + if (!(this._next instanceof Link)) return [this.value]; const next = this._next.toArray(); return [...next, this.value]; } diff --git a/src/test/utils/Queue.ts b/src/test/utils/Queue.ts index accd6800..df2cc4ac 100644 --- a/src/test/utils/Queue.ts +++ b/src/test/utils/Queue.ts @@ -1,4 +1,4 @@ -import { LinkOrEmpty, Link } from "../footPaths/utils/Link"; +import { LinkOrEmpty, Link } from "./Link"; export class Queue { private front: LinkOrEmpty; @@ -15,7 +15,7 @@ export class Queue { return this._size; } - enqueue(val: Type): Queue { + enqueue(val: Type): this { if (this.size === 0) { this.front = new Link(val); this.back = this.front; diff --git a/src/test/utils/Workers.ts b/src/test/utils/Workers.ts index 251954df..e9d8a6f7 100644 --- a/src/test/utils/Workers.ts +++ b/src/test/utils/Workers.ts @@ -112,6 +112,7 @@ export class WorkerPool unknown, F extends (...a const delta = new Duration(Number((process.hrtime.bigint() - startTime) / nsPerMs)); worker.status = Status.Idle; resolve(result); + // eslint-disable-next-line @typescript-eslint/restrict-template-expressions if (this.debug) console.log(`Finished worker ${worker.id} after ${delta} (${this.queue.size})`); this.emit("jobEnded", result); this.runCallback(); @@ -131,6 +132,7 @@ export class WorkerPool unknown, F extends (...a worker.worker.once("message", onceMessage); worker.worker.once("error", onceError); + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion if (!res || !rej) return def!.promise; } @@ -139,7 +141,7 @@ export class WorkerPool unknown, F extends (...a if (!this.queue.size) return; job = this.queue.dequeue(); } - return this.run(...job); + this.run(...job); } protected getIdleWorker(): poolWorker, Awaited>> | undefined { @@ -150,7 +152,10 @@ export class WorkerPool unknown, F extends (...a const def = new Deferred(); if (this.getIdleWorker()) def.resolve(); - else this.on("jobEnded", () => def.resolve()); + else + this.on("jobEnded", () => { + def.resolve(); + }); return def.promise; } diff --git a/src/test/utils/benchmark.ts b/src/test/utils/benchmark.ts index dfef1845..4c8bd85e 100644 --- a/src/test/utils/benchmark.ts +++ b/src/test/utils/benchmark.ts @@ -7,8 +7,8 @@ * @param logStats Wheter to log to the bench to the console at its end, or not */ // eslint-disable-next-line @typescript-eslint/no-explicit-any -export async function benchmark any, ThisType>( - this: ThisType, +export async function benchmark any>( + this: unknown, f: F, args: Parameters, thisArg: unknown = this, // TODO : deeper look on thisArg + ThisType @@ -26,6 +26,7 @@ export async function benchmark any, ThisType>( const durations = ends.map((e, i) => new Duration(e - starts[i])); const totalDuration = new Duration(durations.reduce((acc, v) => acc + v.ms, 0)); const averageDuration = new Duration(totalDuration.ms / times); + // eslint-disable-next-line @typescript-eslint/restrict-template-expressions if (logStats) console.log(`Benchmark of ${f.name || "anonymous"} : ${averageDuration}`); return { fName: f.name, diff --git a/src/test/utils/index.ts b/src/test/utils/index.ts index c8e75ab0..57def1b9 100644 --- a/src/test/utils/index.ts +++ b/src/test/utils/index.ts @@ -1,3 +1,6 @@ +import { Ref } from "@typegoose/typegoose"; +import { RefType } from "@typegoose/typegoose/lib/types"; + export type resolveCb = (value: T) => void; export type rejectCb = (reason?: unknown) => void; @@ -76,3 +79,18 @@ export function wait(ms = 1000): Promise { return defP.promise; } + +export type unpackRefType = + T extends Ref + ? D extends { + _id?: RefType; + } + ? D["_id"] + : never + : T extends Ref[] + ? D extends { + _id?: RefType; + } + ? D["_id"][] + : never + : never; From 6322f854c601834207a5da83487a2e8d82a9e90b Mon Sep 17 00:00:00 2001 From: Catatomik Date: Mon, 30 Jun 2025 17:02:34 +0000 Subject: [PATCH 160/251] Updating coverage badges --- badges/coverage-branches.svg | 2 +- badges/coverage-functions.svg | 2 +- badges/coverage-lines.svg | 2 +- badges/coverage-statements.svg | 2 +- badges/coverage-total.svg | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/badges/coverage-branches.svg b/badges/coverage-branches.svg index d2c18428..65e1b085 100644 --- a/badges/coverage-branches.svg +++ b/badges/coverage-branches.svg @@ -1 +1 @@ -Coverage: branches: 71.23%Coverage: branches71.23% \ No newline at end of file +Coverage: branches: 53.48%Coverage: branches53.48% \ No newline at end of file diff --git a/badges/coverage-functions.svg b/badges/coverage-functions.svg index 80dad938..b445706e 100644 --- a/badges/coverage-functions.svg +++ b/badges/coverage-functions.svg @@ -1 +1 @@ -Coverage: functions: 82.91%Coverage: functions82.91% \ No newline at end of file +Coverage: functions: 46.45%Coverage: functions46.45% \ No newline at end of file diff --git a/badges/coverage-lines.svg b/badges/coverage-lines.svg index 01aaf97a..7ac4e3fb 100644 --- a/badges/coverage-lines.svg +++ b/badges/coverage-lines.svg @@ -1 +1 @@ -Coverage: lines: 88.61%Coverage: lines88.61% \ No newline at end of file +Coverage: lines: 46.25%Coverage: lines46.25% \ No newline at end of file diff --git a/badges/coverage-statements.svg b/badges/coverage-statements.svg index 3c7ddce1..a3cbf34f 100644 --- a/badges/coverage-statements.svg +++ b/badges/coverage-statements.svg @@ -1 +1 @@ -Coverage: statements: 85.5%Coverage: statements85.5% \ No newline at end of file +Coverage: statements: 44.63%Coverage: statements44.63% \ No newline at end of file diff --git a/badges/coverage-total.svg b/badges/coverage-total.svg index c5b1f7bd..edc348de 100644 --- a/badges/coverage-total.svg +++ b/badges/coverage-total.svg @@ -1 +1 @@ -Coverage: total: 82.06%Coverage: total82.06% \ No newline at end of file +Coverage: total: 47.7%Coverage: total47.7% \ No newline at end of file From b7a549a266a254b049d76c27eb900324f89546f6 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Tue, 1 Jul 2025 19:43:48 +0200 Subject: [PATCH 161/251] =?UTF-8?q?=F0=9F=90=9B=20Correct=20minSchedule=20?= =?UTF-8?q?time?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/index.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/test/index.ts b/src/test/index.ts index df13fbbc..05f3471a 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -133,7 +133,8 @@ async function run({ RAPTORInstance, TBMSchedulesModel }: Awaited Date: Tue, 1 Jul 2025 19:44:12 +0200 Subject: [PATCH 162/251] =?UTF-8?q?=F0=9F=9A=A7=20Switch=20to=20McRAPTOR?= =?UTF-8?q?=20with=20bufferTime?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/index.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/test/index.ts b/src/test/index.ts index 05f3471a..3f6f2f2c 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -7,7 +7,7 @@ import stopsModelInit, { dbTBM_Stops } from "./models/TBM_stops.model"; import TBMSchedulesModelInit from "./models/TBM_schedules.model"; import TBMScheduledRoutesModelInit, { dbTBM_ScheduledRoutes } from "./models/TBMScheduledRoutes.model"; import NonScheduledRoutesModelInit, { dbFootPaths } from "./models/NonScheduledRoutes.model"; -import { RAPTOR, RAPTORData, Stop } from "../"; +import { bufferTime, McRAPTOR, RAPTORData, Stop } from "../"; import { HydratedDocument, FilterQuery } from "mongoose"; import { DocumentType } from "@typegoose/typegoose"; import { benchmark } from "./utils/benchmark"; @@ -75,7 +75,7 @@ async function init() { const { dbScheduledRoutes, dbStops, dbNonScheduledRoutes } = b1.lastReturn; async function createRAPTOR() { - const RAPTORInstance = new RAPTOR( + const RAPTORInstance = new McRAPTOR<["bufferTime"], number, number, number>( new RAPTORData( await mapAsync<(typeof dbStops)[number], Stop>(dbStops, async ({ _id, coords }) => ({ id: _id, @@ -106,6 +106,7 @@ async function init() { ] satisfies [unknown, unknown, unknown], ), ), + [bufferTime], ); return { RAPTORInstance }; From 23d47ffeaa7d4434efa27a2087f6e450d072c497 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Wed, 2 Jul 2025 16:24:48 +0200 Subject: [PATCH 163/251] =?UTF-8?q?=F0=9F=9A=A7=20Various=20fixes=20+=20in?= =?UTF-8?q?sert=20results=20in=20DB=20to=20be=20viewed=20through=20BIBM?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/index.ts | 171 ++++++++++++++----- src/test/models/NonScheduledRoutes.model.ts | 8 +- src/test/models/TBMScheduledRoutes.model.ts | 8 +- src/test/models/TBM_lines.model.ts | 8 +- src/test/models/TBM_lines_routes.model.ts | 8 +- src/test/models/TBM_schedules.model.ts | 8 +- src/test/models/TBM_stops.model.ts | 8 +- src/test/models/TBM_trips.model.ts | 8 +- src/test/models/addresses.model.ts | 8 +- src/test/models/intersections.model.ts | 8 +- src/test/models/result.model.ts | 180 ++++++++++++++++++++ src/test/models/sections.model.ts | 8 +- src/test/utils/mongoose.ts | 15 +- 13 files changed, 352 insertions(+), 94 deletions(-) create mode 100644 src/test/models/result.model.ts diff --git a/src/test/index.ts b/src/test/index.ts index 3f6f2f2c..736b15dc 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -3,23 +3,32 @@ import initDB from "./utils/mongoose"; // Needed to solve "Reflect.getMetadata is not a function" error of typegoose import "core-js/features/reflect"; -import stopsModelInit, { dbTBM_Stops } from "./models/TBM_stops.model"; +import NonScheduledRoutesModelInit, { dbFootPaths } from "./models/NonScheduledRoutes.model"; +import ResultModelInit from "./models/result.model"; import TBMSchedulesModelInit from "./models/TBM_schedules.model"; +import stopsModelInit, { dbTBM_Stops } from "./models/TBM_stops.model"; import TBMScheduledRoutesModelInit, { dbTBM_ScheduledRoutes } from "./models/TBMScheduledRoutes.model"; -import NonScheduledRoutesModelInit, { dbFootPaths } from "./models/NonScheduledRoutes.model"; -import { bufferTime, McRAPTOR, RAPTORData, Stop } from "../"; -import { HydratedDocument, FilterQuery } from "mongoose"; import { DocumentType } from "@typegoose/typegoose"; -import { benchmark } from "./utils/benchmark"; -import { mapAsync, unpackRefType, wait } from "./utils"; +import { FilterQuery, HydratedDocument } from "mongoose"; import { inspect } from "util"; +// eslint-disable-next-line @typescript-eslint/no-unused-vars +import { bufferTime, McRAPTOR, McSharedRAPTOR, RAPTORData, RAPTORRunSettings, SharedRAPTORData, Stop } from "../"; +import { Journey, JourneyStepBase, JourneyStepFoot, JourneyStepType, JourneyStepVehicle, LocationType } from "./models/result.model"; +import { mapAsync, unpackRefType, wait } from "./utils"; +import { benchmark } from "./utils/benchmark"; + +// In meters +const FP_MAX_LEN = 1_000; async function init() { - const db = await initDB(); - const stopsModel = stopsModelInit(db); - const TBMSchedulesModel = TBMSchedulesModelInit(db)[1]; - const TBMScheduledRoutesModel = TBMScheduledRoutesModelInit(db); - const NonScheduledRoutesModel = NonScheduledRoutesModelInit(db); + const sourceDB = await initDB("bibm"); + const computeDB = await initDB("bibm-compute"); + const stopsModel = stopsModelInit(sourceDB); + const TBMSchedulesModel = TBMSchedulesModelInit(sourceDB)[1]; + const TBMScheduledRoutesModel = TBMScheduledRoutesModelInit(sourceDB); + const NonScheduledRoutesModel = NonScheduledRoutesModelInit(sourceDB); + + const resultModel = ResultModelInit(computeDB); async function queryData() { const dbScheduledRoutesProjection: Partial> = { _id: 1, stops: 1, trips: 1 }; @@ -75,39 +84,38 @@ async function init() { const { dbScheduledRoutes, dbStops, dbNonScheduledRoutes } = b1.lastReturn; async function createRAPTOR() { - const RAPTORInstance = new McRAPTOR<["bufferTime"], number, number, number>( - new RAPTORData( - await mapAsync<(typeof dbStops)[number], Stop>(dbStops, async ({ _id, coords }) => ({ - id: _id, - lat: coords[0], - long: coords[1], - connectedRoutes: dbScheduledRoutes.filter((ScheduledRoute) => ScheduledRoute.stops.find((stopId) => stopId === _id)).map(({ _id }) => _id), - transfers: (await dbNonScheduledRoutes(_id, { distance: { $lte: 1_000 } })).map(({ to, distance }) => ({ - to, - length: distance, - })), + const RAPTORDataInst = new RAPTORData( + await mapAsync<(typeof dbStops)[number], Stop>(dbStops, async ({ _id, coords }) => ({ + id: _id, + lat: coords[0], + long: coords[1], + connectedRoutes: dbScheduledRoutes.filter((ScheduledRoute) => ScheduledRoute.stops.find((stopId) => stopId === _id)).map(({ _id }) => _id), + transfers: (await dbNonScheduledRoutes(_id, { distance: { $lte: FP_MAX_LEN } })).map(({ to, distance }) => ({ + to, + length: distance, })), - dbScheduledRoutes.map( - ({ _id, stops, trips }) => - [ - _id, - stops, - trips.map(({ tripId, schedules }) => ({ - id: tripId, - times: schedules.map((schedule) => - typeof schedule === "object" && "hor_estime" in schedule - ? ([ - schedule.hor_estime.getTime() || RAPTORData.MAX_SAFE_TIMESTAMP, - schedule.hor_estime.getTime() || RAPTORData.MAX_SAFE_TIMESTAMP, - ] satisfies [unknown, unknown]) - : ([Infinity, Infinity] satisfies [unknown, unknown]), - ), - })), - ] satisfies [unknown, unknown, unknown], - ), + })), + dbScheduledRoutes.map( + ({ _id, stops, trips }) => + [ + _id, + stops, + trips.map(({ tripId, schedules }) => ({ + id: tripId, + times: schedules.map((schedule) => + typeof schedule === "object" && "hor_estime" in schedule + ? ([ + schedule.hor_estime.getTime() || RAPTORData.MAX_SAFE_TIMESTAMP, + schedule.hor_estime.getTime() || RAPTORData.MAX_SAFE_TIMESTAMP, + ] satisfies [unknown, unknown]) + : ([Infinity, Infinity] satisfies [unknown, unknown]), + ), + })), + ] satisfies [unknown, unknown, unknown], ), - [bufferTime], ); + // RAPTORDataInst.secure = true; + const RAPTORInstance = new McRAPTOR<["bufferTime"], number, number, number>(RAPTORDataInst, [bufferTime]); return { RAPTORInstance }; } @@ -116,10 +124,10 @@ async function init() { if (!b2.lastReturn) throw new Error(`b2 return null`); const { RAPTORInstance } = b2.lastReturn; - return { RAPTORInstance, TBMSchedulesModel }; + return { RAPTORInstance, TBMSchedulesModel, resultModel }; } -async function run({ RAPTORInstance, TBMSchedulesModel }: Awaited>) { +async function run({ RAPTORInstance, TBMSchedulesModel, resultModel }: Awaited>) { const args = process.argv.slice(2); let ps: number; try { @@ -135,10 +143,20 @@ async function run({ RAPTORInstance, TBMSchedulesModel }: Awaited) { + type DBJourney = Omit & { + steps: (JourneyStepBase | JourneyStepFoot | JourneyStepVehicle)[]; + }; + function journeyDBFormatter( + journey: NonNullable>["RAPTORInstance"]["getBestJourneys"]>[number]>[number], + ): DBJourney { + return { + steps: journey.map((js) => { + if ("transfer" in js) { + return { + ...js, + time: js.label.time, + type: JourneyStepType.Foot, + } satisfies JourneyStepFoot; + } + + if ("route" in js) { + if (typeof js.route.id === "string") throw new Error("Invalid route to retrieve."); + + return { + ...js, + time: js.label.time, + route: js.route.id, + type: JourneyStepType.Vehicle, + } satisfies JourneyStepVehicle; + } + + return { + ...js, + time: js.label.time, + type: JourneyStepType.Base, + } satisfies JourneyStepBase; + }), + criteria: journey[0].label.criteria.map(({ name }) => ({ + name, + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + value: journey.at(-1)!.label.value(name), + })), + }; + } + + if (!results.length) throw new Error("No journey found"); + + const { _id } = await resultModel.create({ + from: { type: LocationType.TBM, id: ps }, + to: { type: LocationType.TBM, id: pt }, + departureTime: new Date(departureTime), + journeys: results + .flat() + .filter((journey) => !!journey) + .map((journey) => journeyDBFormatter(journey)), + settings, + }); + + return _id; + } + + const b5 = await benchmark(insertResults, [b4.lastReturn]); + console.log("inserted", b5.lastReturn); + return b4.lastReturn; } @@ -164,7 +244,6 @@ async function run({ RAPTORInstance, TBMSchedulesModel }: Awaited)[]; // Ref[] to intersections | stops } -export default function init(db: Mongoose): ReturnModelType { - if (getModelForClass(dbFootPaths, { existingMongoose: db })) deleteModelWithClass(dbFootPaths); +export default function init(db: Connection): ReturnModelType { + if (getModelForClass(dbFootPaths, { existingConnection: db })) deleteModelWithClass(dbFootPaths); - return getModelForClass(dbFootPaths, { existingMongoose: db }); + return getModelForClass(dbFootPaths, { existingConnection: db }); } export type dbFootPathsModel = ReturnType; diff --git a/src/test/models/TBMScheduledRoutes.model.ts b/src/test/models/TBMScheduledRoutes.model.ts index 68183bf1..a5a225de 100644 --- a/src/test/models/TBMScheduledRoutes.model.ts +++ b/src/test/models/TBMScheduledRoutes.model.ts @@ -5,7 +5,7 @@ import { deleteModelWithClass, getModelForClass, prop, type Ref, type ReturnModelType } from "@typegoose/typegoose"; import { TimeStamps } from "@typegoose/typegoose/lib/defaultClasses"; import { modelOptions } from "@typegoose/typegoose/lib/modelOptions"; -import { Mongoose } from "mongoose"; +import { Connection } from "mongoose"; import { TBMEndpoints } from "."; import { dbTBM_Schedules_rt, default as TBMSchedulesRtInit } from "./TBM_schedules.model"; import { dbTBM_Stops, default as TBMStopsInit } from "./TBM_stops.model"; @@ -32,14 +32,14 @@ export class dbTBM_ScheduledRoutes extends TimeStamps { public stops!: Ref[]; } -export default function init(db: Mongoose): ReturnModelType { +export default function init(db: Connection): ReturnModelType { TBMSchedulesRtInit(db); TBMStopsInit(db); - if (getModelForClass(dbTBM_ScheduledRoutes, { existingMongoose: db })) deleteModelWithClass(dbTBM_ScheduledRoutes); + if (getModelForClass(dbTBM_ScheduledRoutes, { existingConnection: db })) deleteModelWithClass(dbTBM_ScheduledRoutes); return getModelForClass(dbTBM_ScheduledRoutes, { - existingMongoose: db, + existingConnection: db, }); } diff --git a/src/test/models/TBM_lines.model.ts b/src/test/models/TBM_lines.model.ts index 9cbc46db..4939cb90 100644 --- a/src/test/models/TBM_lines.model.ts +++ b/src/test/models/TBM_lines.model.ts @@ -5,7 +5,7 @@ import { type ReturnModelType, deleteModelWithClass, getModelForClass, prop } from "@typegoose/typegoose"; import { TimeStamps } from "@typegoose/typegoose/lib/defaultClasses"; import { modelOptions } from "@typegoose/typegoose/lib/modelOptions"; -import { Mongoose } from "mongoose"; +import { Connection } from "mongoose"; import { TBMEndpoints } from "."; import { type Active, VehicleType } from "./TBM_stops.model"; @@ -24,10 +24,10 @@ export class dbTBM_Lines extends TimeStamps { public active!: Active; } -export default function init(db: Mongoose): ReturnModelType { - if (getModelForClass(dbTBM_Lines, { existingMongoose: db })) deleteModelWithClass(dbTBM_Lines); +export default function init(db: Connection): ReturnModelType { + if (getModelForClass(dbTBM_Lines, { existingConnection: db })) deleteModelWithClass(dbTBM_Lines); - return getModelForClass(dbTBM_Lines, { existingMongoose: db }); + return getModelForClass(dbTBM_Lines, { existingConnection: db }); } export type dbTBM_LinesModel = ReturnType; diff --git a/src/test/models/TBM_lines_routes.model.ts b/src/test/models/TBM_lines_routes.model.ts index 9d7bb820..ecd38727 100644 --- a/src/test/models/TBM_lines_routes.model.ts +++ b/src/test/models/TBM_lines_routes.model.ts @@ -5,7 +5,7 @@ import { deleteModelWithClass, getModelForClass, prop, type Ref, type ReturnModelType } from "@typegoose/typegoose"; import { TimeStamps } from "@typegoose/typegoose/lib/defaultClasses"; import { modelOptions } from "@typegoose/typegoose/lib/modelOptions"; -import { Mongoose } from "mongoose"; +import { Connection } from "mongoose"; import { TBMEndpoints } from "."; import { dbTBM_Lines } from "./TBM_lines.model"; import { dbTBM_Stops, VehicleType } from "./TBM_stops.model"; @@ -35,11 +35,11 @@ export class dbTBM_Lines_routes extends TimeStamps { } // for more of what you can do here. -export default function init(db: Mongoose): ReturnModelType { - if (getModelForClass(dbTBM_Lines_routes, { existingMongoose: db })) deleteModelWithClass(dbTBM_Lines_routes); +export default function init(db: Connection): ReturnModelType { + if (getModelForClass(dbTBM_Lines_routes, { existingConnection: db })) deleteModelWithClass(dbTBM_Lines_routes); return getModelForClass(dbTBM_Lines_routes, { - existingMongoose: db, + existingConnection: db, }); } diff --git a/src/test/models/TBM_schedules.model.ts b/src/test/models/TBM_schedules.model.ts index e8cc19b5..ac7027c9 100644 --- a/src/test/models/TBM_schedules.model.ts +++ b/src/test/models/TBM_schedules.model.ts @@ -25,7 +25,7 @@ import { } from "@typegoose/typegoose"; import { TimeStamps } from "@typegoose/typegoose/lib/defaultClasses"; import { modelOptions } from "@typegoose/typegoose/lib/modelOptions"; -import { Mongoose } from "mongoose"; +import { Connection } from "mongoose"; import { TBMEndpoints } from "."; import { dbTBM_Stops } from "./TBM_stops.model"; import { dbTBM_Trips } from "./TBM_trips.model"; @@ -64,9 +64,9 @@ export class dbTBM_Schedules_rt extends dbTBM_Schedules { public type!: RtScheduleType; } -export default function init(db: Mongoose): readonly [ReturnModelType, ReturnModelType] { - if (getModelForClass(dbTBM_Schedules, { existingMongoose: db })) deleteModelWithClass(dbTBM_Schedules); - const dbTBM_SchedulesModel = getModelForClass(dbTBM_Schedules, { existingMongoose: db }); +export default function init(db: Connection): readonly [ReturnModelType, ReturnModelType] { + if (getModelForClass(dbTBM_Schedules, { existingConnection: db })) deleteModelWithClass(dbTBM_Schedules); + const dbTBM_SchedulesModel = getModelForClass(dbTBM_Schedules, { existingConnection: db }); return [dbTBM_SchedulesModel, getDiscriminatorModelForClass(dbTBM_SchedulesModel, dbTBM_Schedules_rt)] as const; } diff --git a/src/test/models/TBM_stops.model.ts b/src/test/models/TBM_stops.model.ts index 7ff087a7..9f3112d4 100644 --- a/src/test/models/TBM_stops.model.ts +++ b/src/test/models/TBM_stops.model.ts @@ -5,7 +5,7 @@ import { type ReturnModelType, deleteModelWithClass, getModelForClass, prop } from "@typegoose/typegoose"; import { TimeStamps } from "@typegoose/typegoose/lib/defaultClasses"; import { modelOptions } from "@typegoose/typegoose/lib/modelOptions"; -import { Mongoose } from "mongoose"; +import { Connection } from "mongoose"; import { TBMEndpoints } from "."; export enum VehicleType { @@ -51,10 +51,10 @@ export class dbTBM_Stops extends TimeStamps { // coords: Coords; // }; -export default function init(db: Mongoose): ReturnModelType { - if (getModelForClass(dbTBM_Stops, { existingMongoose: db })) deleteModelWithClass(dbTBM_Stops); +export default function init(db: Connection): ReturnModelType { + if (getModelForClass(dbTBM_Stops, { existingConnection: db })) deleteModelWithClass(dbTBM_Stops); - return getModelForClass(dbTBM_Stops, { existingMongoose: db }); + return getModelForClass(dbTBM_Stops, { existingConnection: db }); } export type dbTBM_StopsModel = ReturnType; diff --git a/src/test/models/TBM_trips.model.ts b/src/test/models/TBM_trips.model.ts index 1498d453..51f2ab4e 100644 --- a/src/test/models/TBM_trips.model.ts +++ b/src/test/models/TBM_trips.model.ts @@ -5,7 +5,7 @@ import { deleteModelWithClass, getModelForClass, prop, type Ref, type ReturnModelType } from "@typegoose/typegoose"; import { TimeStamps } from "@typegoose/typegoose/lib/defaultClasses"; import { modelOptions } from "@typegoose/typegoose/lib/modelOptions"; -import { Mongoose } from "mongoose"; +import { Connection } from "mongoose"; import { TBMEndpoints } from "."; import { dbTBM_Lines } from "./TBM_lines.model"; import { dbTBM_Lines_routes } from "./TBM_lines_routes.model"; @@ -32,10 +32,10 @@ export class dbTBM_Trips extends TimeStamps { public rs_sv_chem_l!: Ref; } -export default function init(db: Mongoose): ReturnModelType { - if (getModelForClass(dbTBM_Trips, { existingMongoose: db })) deleteModelWithClass(dbTBM_Trips); +export default function init(db: Connection): ReturnModelType { + if (getModelForClass(dbTBM_Trips, { existingConnection: db })) deleteModelWithClass(dbTBM_Trips); - return getModelForClass(dbTBM_Trips, { existingMongoose: db }); + return getModelForClass(dbTBM_Trips, { existingConnection: db }); } export type dbTBM_TripsModel = ReturnType; diff --git a/src/test/models/addresses.model.ts b/src/test/models/addresses.model.ts index a909292e..f3b76d9d 100644 --- a/src/test/models/addresses.model.ts +++ b/src/test/models/addresses.model.ts @@ -5,7 +5,7 @@ import { type ReturnModelType, deleteModelWithClass, getModelForClass, prop } from "@typegoose/typegoose"; import { TimeStamps } from "@typegoose/typegoose/lib/defaultClasses"; import { modelOptions } from "@typegoose/typegoose/lib/modelOptions"; -import { Mongoose } from "mongoose"; +import { Connection } from "mongoose"; import { TBMEndpoints } from "."; @modelOptions({ options: { customName: TBMEndpoints.Addresses } }) @@ -41,10 +41,10 @@ export class dbAddresses extends TimeStamps { public commune!: string; } -export default function init(db: Mongoose): ReturnModelType { - if (getModelForClass(dbAddresses, { existingMongoose: db })) deleteModelWithClass(dbAddresses); +export default function init(db: Connection): ReturnModelType { + if (getModelForClass(dbAddresses, { existingConnection: db })) deleteModelWithClass(dbAddresses); - return getModelForClass(dbAddresses, { existingMongoose: db }); + return getModelForClass(dbAddresses, { existingConnection: db }); } export type dbAddressesModel = ReturnType; diff --git a/src/test/models/intersections.model.ts b/src/test/models/intersections.model.ts index 2a0564db..293cdeae 100644 --- a/src/test/models/intersections.model.ts +++ b/src/test/models/intersections.model.ts @@ -5,7 +5,7 @@ import { deleteModelWithClass, getModelForClass, prop, type ReturnModelType } from "@typegoose/typegoose"; import { TimeStamps } from "@typegoose/typegoose/lib/defaultClasses"; import { modelOptions } from "@typegoose/typegoose/lib/modelOptions"; -import { Mongoose } from "mongoose"; +import { Connection } from "mongoose"; import { TBMEndpoints } from "."; @modelOptions({ options: { customName: TBMEndpoints.Intersections } }) @@ -28,10 +28,10 @@ export class dbIntersections extends TimeStamps { */ } -export default function init(db: Mongoose): ReturnModelType { - if (getModelForClass(dbIntersections, { existingMongoose: db })) deleteModelWithClass(dbIntersections); +export default function init(db: Connection): ReturnModelType { + if (getModelForClass(dbIntersections, { existingConnection: db })) deleteModelWithClass(dbIntersections); - return getModelForClass(dbIntersections, { existingMongoose: db }); + return getModelForClass(dbIntersections, { existingConnection: db }); } export type dbIntersectionsModel = ReturnType; diff --git a/src/test/models/result.model.ts b/src/test/models/result.model.ts new file mode 100644 index 00000000..a202dc63 --- /dev/null +++ b/src/test/models/result.model.ts @@ -0,0 +1,180 @@ +// ComputeResult-model.js - A mongoose model +// +// See http://mongoosejs.com/docs/models.html +export enum JourneyStepType { + Base = "B", + Foot = "F", + Vehicle = "V", +} + +export enum LocationType { + SNCF = "S", + TBM = "T", + Address = "A", +} + +import { deleteModelWithClass, getModelForClass, prop, type Ref } from "@typegoose/typegoose"; +import { TimeStamps } from "@typegoose/typegoose/lib/defaultClasses"; +import { modelOptions } from "@typegoose/typegoose/lib/modelOptions"; +import { Connection } from "mongoose"; +import { RAPTORRunSettings } from "../../"; +import { dbAddresses } from "./addresses.model"; +import { dbTBM_Stops } from "./TBM_stops.model"; +import { dbTBM_ScheduledRoutes } from "./TBMScheduledRoutes.model"; + +export type stopId = dbTBM_Stops["_id"]; +export type routeId = dbTBM_ScheduledRoutes["_id"]; + +@modelOptions({ + schemaOptions: { + _id: false, + }, +}) +class RunSettings implements RAPTORRunSettings { + @prop({ required: true }) + public walkSpeed!: number; +} + +@modelOptions({ + schemaOptions: { + discriminatorKey: "type", + _id: false, + }, +}) +export class JourneyStepBase { + @prop({ required: true }) + /** @description JourneyStep type */ + public type!: JourneyStepType; + + @prop({ required: true }) + public time!: number; +} + +class Transfer { + @prop({ required: true }) + public to!: stopId | string; + + @prop({ required: true }) + public length!: number; +} + +export class JourneyStepFoot extends JourneyStepBase { + @prop({ required: true }) + public boardedAt!: stopId | string; + + @prop({ required: true }) + public transfer!: Transfer; +} + +export function isJourneyStepFoot(label: JourneyStepBase): label is JourneyStepFoot { + return label.type === JourneyStepType.Foot; +} + +export class JourneyStepVehicle extends JourneyStepBase { + @prop({ required: true }) + public boardedAt!: stopId | string; + + @prop({ required: true, ref: () => dbTBM_ScheduledRoutes, type: () => Number }) + public route!: Ref; + + @prop({ required: true }) + public tripIndex!: number; +} + +export function isJourneyStepVehicle(js: JourneyStepBase): js is JourneyStepVehicle { + return js.type === JourneyStepType.Vehicle; +} + +export class Criterion { + @prop({ required: true }) + public name!: string; + + @prop({ required: true }) + public value!: number; +} + +export class Journey { + @prop({ + required: true, + type: [JourneyStepBase], + discriminators: () => [ + { type: JourneyStepBase, value: JourneyStepType.Base }, + { type: JourneyStepFoot, value: JourneyStepType.Foot }, + { type: JourneyStepVehicle, value: JourneyStepType.Vehicle }, + ], + }) + public steps!: JourneyStepBase[]; + + @prop({ required: true }) + public criteria!: Criterion[]; +} + +@modelOptions({ + schemaOptions: { + discriminatorKey: "type", + _id: false, + }, +}) +class LocationBase { + @prop({ required: true }) + public type!: LocationType; +} + +export class LocationTBM extends LocationBase { + @prop({ required: true, ref: () => dbTBM_Stops, type: () => Number }) + public id!: Ref; +} +export function isLocationTBM(loc: LocationBase): loc is LocationTBM { + return loc.type === LocationType.TBM; +} + +export class LocationAddress extends LocationBase { + @prop({ required: true, ref: () => dbAddresses, type: () => Number }) + public id!: Ref; +} + +export function isLocationAddress(loc: LocationBase): loc is LocationAddress { + return loc.type === LocationType.Address; +} + +@modelOptions({ options: { customName: "results" } }) +export class dbComputeResult extends TimeStamps { + @prop({ + required: true, + type: LocationBase, + discriminators: () => [ + { type: LocationTBM, value: LocationType.TBM }, + { type: LocationAddress, value: LocationType.Address }, + ], + }) + public from!: LocationBase; + + @prop({ + required: true, + type: LocationBase, + discriminators: () => [ + { type: LocationTBM, value: LocationType.TBM }, + { type: LocationAddress, value: LocationType.Address }, + ], + }) + public to!: LocationBase; + + @prop({ required: true }) + departureTime!: Date; + + @prop({ required: true, type: () => RunSettings }) + settings!: RunSettings; + + @prop({ required: true }) + journeys!: Journey[]; +} + +export default function init(db: Connection) { + if (getModelForClass(dbComputeResult, { existingConnection: db })) deleteModelWithClass(dbComputeResult); + + return getModelForClass(dbComputeResult, { + existingConnection: db, + }); +} + +export type dbComputeResultModel = ReturnType; diff --git a/src/test/models/sections.model.ts b/src/test/models/sections.model.ts index 48650cfd..7535b573 100644 --- a/src/test/models/sections.model.ts +++ b/src/test/models/sections.model.ts @@ -16,7 +16,7 @@ export enum SectionDomanial { import { deleteModelWithClass, getModelForClass, prop, type ReturnModelType } from "@typegoose/typegoose"; import { TimeStamps } from "@typegoose/typegoose/lib/defaultClasses"; import { modelOptions } from "@typegoose/typegoose/lib/modelOptions"; -import { Mongoose } from "mongoose"; +import { Connection } from "mongoose"; import { TBMEndpoints } from "."; @modelOptions({ options: { customName: TBMEndpoints.Sections } }) @@ -52,10 +52,10 @@ export class dbSections extends TimeStamps { public rg_fv_graph_na!: number; } -export default function init(db: Mongoose): ReturnModelType { - if (getModelForClass(dbSections, { existingMongoose: db })) deleteModelWithClass(dbSections); +export default function init(db: Connection): ReturnModelType { + if (getModelForClass(dbSections, { existingConnection: db })) deleteModelWithClass(dbSections); - return getModelForClass(dbSections, { existingMongoose: db }); + return getModelForClass(dbSections, { existingConnection: db }); } export type dbSectionsModel = ReturnType; diff --git a/src/test/utils/mongoose.ts b/src/test/utils/mongoose.ts index 5d3344a1..298bf6ec 100644 --- a/src/test/utils/mongoose.ts +++ b/src/test/utils/mongoose.ts @@ -1,12 +1,11 @@ -import { connect } from "mongoose"; +import { createConnection } from "mongoose"; -export default async function () { - const client = await connect( - `mongodb://0.0.0.0:27017/bibm`, - //{ useNewUrlParser: true } - ); +export default async function (dbName: string) { + const connection = createConnection(`mongodb://0.0.0.0:27017/${dbName}`); - console.info("Database connected."); + await connection.asPromise(); - return client; + console.info(`Database ${dbName} connected.`); + + return connection; } From 384f7c1db166b446c15412cf5214102426294171 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Wed, 2 Jul 2025 14:27:06 +0000 Subject: [PATCH 164/251] Updating coverage badges --- badges/coverage-branches.svg | 2 +- badges/coverage-functions.svg | 2 +- badges/coverage-lines.svg | 2 +- badges/coverage-statements.svg | 2 +- badges/coverage-total.svg | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/badges/coverage-branches.svg b/badges/coverage-branches.svg index 65e1b085..578a5d1e 100644 --- a/badges/coverage-branches.svg +++ b/badges/coverage-branches.svg @@ -1 +1 @@ -Coverage: branches: 53.48%Coverage: branches53.48% \ No newline at end of file +Coverage: branches: 51.27%Coverage: branches51.27% \ No newline at end of file diff --git a/badges/coverage-functions.svg b/badges/coverage-functions.svg index b445706e..3908d3f6 100644 --- a/badges/coverage-functions.svg +++ b/badges/coverage-functions.svg @@ -1 +1 @@ -Coverage: functions: 46.45%Coverage: functions46.45% \ No newline at end of file +Coverage: functions: 42.95%Coverage: functions42.95% \ No newline at end of file diff --git a/badges/coverage-lines.svg b/badges/coverage-lines.svg index 7ac4e3fb..ba04fa07 100644 --- a/badges/coverage-lines.svg +++ b/badges/coverage-lines.svg @@ -1 +1 @@ -Coverage: lines: 46.25%Coverage: lines46.25% \ No newline at end of file +Coverage: lines: 42.56%Coverage: lines42.56% \ No newline at end of file diff --git a/badges/coverage-statements.svg b/badges/coverage-statements.svg index a3cbf34f..54a21f1f 100644 --- a/badges/coverage-statements.svg +++ b/badges/coverage-statements.svg @@ -1 +1 @@ -Coverage: statements: 44.63%Coverage: statements44.63% \ No newline at end of file +Coverage: statements: 41.18%Coverage: statements41.18% \ No newline at end of file diff --git a/badges/coverage-total.svg b/badges/coverage-total.svg index edc348de..da1b0e61 100644 --- a/badges/coverage-total.svg +++ b/badges/coverage-total.svg @@ -1 +1 @@ -Coverage: total: 47.7%Coverage: total47.7% \ No newline at end of file +Coverage: total: 44.49%Coverage: total44.49% \ No newline at end of file From 3586d6150c0f8b07a5239fb1ba253118eb8a91cc Mon Sep 17 00:00:00 2001 From: Catatomik Date: Wed, 2 Jul 2025 23:05:54 +0200 Subject: [PATCH 165/251] =?UTF-8?q?=F0=9F=9A=A7=20Longer=20journey?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/index.ts b/src/test/index.ts index 736b15dc..4dc3f8aa 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -139,7 +139,7 @@ async function run({ RAPTORInstance, TBMSchedulesModel, resultModel }: Awaited Date: Wed, 2 Jul 2025 21:34:35 +0000 Subject: [PATCH 166/251] Updating coverage badges --- badges/coverage-branches.svg | 2 +- badges/coverage-functions.svg | 2 +- badges/coverage-lines.svg | 2 +- badges/coverage-statements.svg | 2 +- badges/coverage-total.svg | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/badges/coverage-branches.svg b/badges/coverage-branches.svg index 22ae03a3..42458d57 100644 --- a/badges/coverage-branches.svg +++ b/badges/coverage-branches.svg @@ -1 +1 @@ -Coverage: branches: 51.27%Coverage: branches51.27% +Coverage: branches: 52.48%Coverage: branches52.48% \ No newline at end of file diff --git a/badges/coverage-functions.svg b/badges/coverage-functions.svg index 7e59b18f..aa6f2682 100644 --- a/badges/coverage-functions.svg +++ b/badges/coverage-functions.svg @@ -1 +1 @@ -Coverage: functions: 42.95%Coverage: functions42.95% +Coverage: functions: 43.68%Coverage: functions43.68% \ No newline at end of file diff --git a/badges/coverage-lines.svg b/badges/coverage-lines.svg index dac0de4d..13b58455 100644 --- a/badges/coverage-lines.svg +++ b/badges/coverage-lines.svg @@ -1 +1 @@ -Coverage: lines: 42.56%Coverage: lines42.56% +Coverage: lines: 43.12%Coverage: lines43.12% \ No newline at end of file diff --git a/badges/coverage-statements.svg b/badges/coverage-statements.svg index 2658cc27..c6da548d 100644 --- a/badges/coverage-statements.svg +++ b/badges/coverage-statements.svg @@ -1 +1 @@ -Coverage: statements: 41.18%Coverage: statements41.18% +Coverage: statements: 41.71%Coverage: statements41.71% \ No newline at end of file diff --git a/badges/coverage-total.svg b/badges/coverage-total.svg index 18b82ff9..e9e7eca7 100644 --- a/badges/coverage-total.svg +++ b/badges/coverage-total.svg @@ -1 +1 @@ -Coverage: total: 44.49%Coverage: total44.49% +Coverage: total: 45.25%Coverage: total45.25% \ No newline at end of file From f8ffbeea5bf485b69bde35af09ecb05a648b42cf Mon Sep 17 00:00:00 2001 From: Catatomik Date: Thu, 3 Jul 2025 21:49:51 +0200 Subject: [PATCH 167/251] =?UTF-8?q?=F0=9F=9A=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/index.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/test/index.ts b/src/test/index.ts index 4dc3f8aa..99ceac80 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -104,10 +104,10 @@ async function init() { id: tripId, times: schedules.map((schedule) => typeof schedule === "object" && "hor_estime" in schedule - ? ([ - schedule.hor_estime.getTime() || RAPTORData.MAX_SAFE_TIMESTAMP, - schedule.hor_estime.getTime() || RAPTORData.MAX_SAFE_TIMESTAMP, - ] satisfies [unknown, unknown]) + ? ([schedule.hor_estime.getTime() || MAX_SAFE_TIMESTAMP, schedule.hor_estime.getTime() || MAX_SAFE_TIMESTAMP] satisfies [ + unknown, + unknown, + ]) : ([Infinity, Infinity] satisfies [unknown, unknown]), ), })), From 4681b4f8239dc866e31d0d0161a8fb7e95b67d26 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Thu, 3 Jul 2025 21:50:01 +0200 Subject: [PATCH 168/251] =?UTF-8?q?=F0=9F=9A=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/index.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/test/index.ts b/src/test/index.ts index 99ceac80..dc45aad0 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -220,10 +220,7 @@ async function run({ RAPTORInstance, TBMSchedulesModel, resultModel }: Awaited !!journey) - .map((journey) => journeyDBFormatter(journey)), + journeys: results.flat().map((journey) => journeyDBFormatter(journey)), settings, }); From 9c2f85996e09ba65759e02d2f82267a4c68e081f Mon Sep 17 00:00:00 2001 From: Catatomik Date: Thu, 3 Jul 2025 21:50:12 +0200 Subject: [PATCH 169/251] =?UTF-8?q?=F0=9F=9A=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/index.ts b/src/test/index.ts index dc45aad0..78d1bfc0 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -12,7 +12,7 @@ import { DocumentType } from "@typegoose/typegoose"; import { FilterQuery, HydratedDocument } from "mongoose"; import { inspect } from "util"; // eslint-disable-next-line @typescript-eslint/no-unused-vars -import { bufferTime, McRAPTOR, McSharedRAPTOR, RAPTORData, RAPTORRunSettings, SharedRAPTORData, Stop } from "../"; +import { bufferTime, MAX_SAFE_TIMESTAMP, McRAPTOR, McSharedRAPTOR, RAPTORData, RAPTORRunSettings, SharedRAPTORData, Stop } from "../"; import { Journey, JourneyStepBase, JourneyStepFoot, JourneyStepType, JourneyStepVehicle, LocationType } from "./models/result.model"; import { mapAsync, unpackRefType, wait } from "./utils"; import { benchmark } from "./utils/benchmark"; From f0984b1eaad9d041c080e7046c6fa880e7e70b57 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Thu, 3 Jul 2025 21:50:53 +0200 Subject: [PATCH 170/251] =?UTF-8?q?=F0=9F=94=A7=20Test=20in=20source?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jest.config.js | 1 + 1 file changed, 1 insertion(+) diff --git a/jest.config.js b/jest.config.js index 7530fcb9..dd6870c6 100644 --- a/jest.config.js +++ b/jest.config.js @@ -5,6 +5,7 @@ const tsJestTransformCfg = createDefaultPreset().transform; /** @type {import("jest").Config} **/ module.exports = { collectCoverageFrom: ["src/**/*.ts"], + coveragePathIgnorePatterns: ["src/test/"], coverageReporters: ["text", "lcov", "json-summary"], testMatch: ["**/test/**/*.test.ts"], testEnvironment: "node", From 1784ec0b94da6db9eefc5e4ff7bf38ba39b6b546 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Thu, 3 Jul 2025 20:57:30 +0000 Subject: [PATCH 171/251] Updating coverage badges --- badges/coverage-branches.svg | 2 +- badges/coverage-functions.svg | 2 +- badges/coverage-lines.svg | 2 +- badges/coverage-statements.svg | 2 +- badges/coverage-total.svg | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/badges/coverage-branches.svg b/badges/coverage-branches.svg index 42458d57..e6af19fa 100644 --- a/badges/coverage-branches.svg +++ b/badges/coverage-branches.svg @@ -1 +1 @@ -Coverage: branches: 52.48%Coverage: branches52.48% \ No newline at end of file +Coverage: branches: 72.99%Coverage: branches72.99% \ No newline at end of file diff --git a/badges/coverage-functions.svg b/badges/coverage-functions.svg index aa6f2682..ac522e17 100644 --- a/badges/coverage-functions.svg +++ b/badges/coverage-functions.svg @@ -1 +1 @@ -Coverage: functions: 43.68%Coverage: functions43.68% \ No newline at end of file +Coverage: functions: 83.63%Coverage: functions83.63% \ No newline at end of file diff --git a/badges/coverage-lines.svg b/badges/coverage-lines.svg index 01e4d08d..889b8df7 100644 --- a/badges/coverage-lines.svg +++ b/badges/coverage-lines.svg @@ -1 +1 @@ -Coverage: lines: 43.12%Coverage: lines43.12% +Coverage: lines: 88.76%Coverage: lines88.76% \ No newline at end of file diff --git a/badges/coverage-statements.svg b/badges/coverage-statements.svg index c1158288..5181adef 100644 --- a/badges/coverage-statements.svg +++ b/badges/coverage-statements.svg @@ -1 +1 @@ -Coverage: statements: 41.71%Coverage: statements41.71% +Coverage: statements: 86.07%Coverage: statements86.07% \ No newline at end of file diff --git a/badges/coverage-total.svg b/badges/coverage-total.svg index 6f1304c5..2ae34ffe 100644 --- a/badges/coverage-total.svg +++ b/badges/coverage-total.svg @@ -1 +1 @@ -Coverage: total: 45.25%Coverage: total45.25% +Coverage: total: 82.86%Coverage: total82.86% \ No newline at end of file From 976b6b6adeefcc0fa8dea0adc5f07d5889c25431 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Fri, 4 Jul 2025 14:03:19 +0200 Subject: [PATCH 172/251] =?UTF-8?q?=F0=9F=9A=A7=20Align=20to=20BIBM?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/index.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/test/index.ts b/src/test/index.ts index 78d1bfc0..e122a789 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -220,7 +220,12 @@ async function run({ RAPTORInstance, TBMSchedulesModel, resultModel }: Awaited journeyDBFormatter(journey)), + journeys: results + .flat() + // Sort by arrival time + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + .sort((a, b) => a.at(-1)!.label.time - b.at(-1)!.label.time) + .map((journey) => journeyDBFormatter(journey)), settings, }); From ebb6d5a0e8d28b7595e0d6a9d0ec6cdb1a1a2e3b Mon Sep 17 00:00:00 2001 From: Catatomik Date: Sun, 6 Jul 2025 00:23:56 +0200 Subject: [PATCH 173/251] =?UTF-8?q?=F0=9F=90=9B=E2=9A=A1=20Stop=20in=20sch?= =?UTF-8?q?eduled=20routes=20not=20in=20stops=20db?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/index.ts | 54 +++++++++++++++++++++++++++++------------------ 1 file changed, 34 insertions(+), 20 deletions(-) diff --git a/src/test/index.ts b/src/test/index.ts index e122a789..e85809c8 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -14,7 +14,7 @@ import { inspect } from "util"; // eslint-disable-next-line @typescript-eslint/no-unused-vars import { bufferTime, MAX_SAFE_TIMESTAMP, McRAPTOR, McSharedRAPTOR, RAPTORData, RAPTORRunSettings, SharedRAPTORData, Stop } from "../"; import { Journey, JourneyStepBase, JourneyStepFoot, JourneyStepType, JourneyStepVehicle, LocationType } from "./models/result.model"; -import { mapAsync, unpackRefType, wait } from "./utils"; +import { binarySearch, mapAsync, unpackRefType, wait } from "./utils"; import { benchmark } from "./utils/benchmark"; // In meters @@ -43,19 +43,35 @@ async function init() { .lean() .exec()) as ScheduledRoute[]; - const dbStopProjection = { _id: 1, coords: 1 } as const; + const dbStopProjection = { _id: 1 } as const; type Stop = Pick; - const dbStops = (await stopsModel - .find>>( - { - $and: [{ coords: { $not: { $elemMatch: { $eq: Infinity } } } }], - }, - dbStopProjection, - ) - .lean() - // Coords field type lost... - .exec()) as unknown as Stop[]; + const stops = dbScheduledRoutes.reduce<{ id: ScheduledRoute["stops"][number]; connectedRoutes: ScheduledRoute["_id"][] }[]>( + (acc, { _id, stops }) => { + for (const stop of stops) { + let pos = binarySearch(acc, stop, (a, b) => a - b.id); + if (pos < 0) { + pos = -pos - 1; + acc.splice(pos, 0, { id: stop, connectedRoutes: [] }); + } + acc[pos].connectedRoutes.push(_id); + } + + return acc; + }, + ( + (await stopsModel + .find>>( + { + $and: [{ coords: { $not: { $elemMatch: { $eq: Infinity } } } }], + }, + dbStopProjection, + ) + .sort({ _id: 1 }) + .lean() + .exec()) as Stop[] + ).map(({ _id: id }) => ({ id, connectedRoutes: [] })), + ); const dbNonScheduledRoutesProjection: Partial> = { from: 1, to: 1, distance: 1 }; type dbNonScheduledRoute = Pick; @@ -76,21 +92,19 @@ async function init() { .exec()) as NonScheduledRoute[] ).map(({ from, to, distance }) => ({ distance, ...(to === stopId ? { to: from } : { to }) })); - return { dbScheduledRoutes, dbStops, dbNonScheduledRoutes }; + return { dbScheduledRoutes, stops, dbNonScheduledRoutes }; } const b1 = await benchmark(queryData, []); console.log("b1 ended"); if (!b1.lastReturn) throw new Error(`b1 return null`); - const { dbScheduledRoutes, dbStops, dbNonScheduledRoutes } = b1.lastReturn; + const { dbScheduledRoutes, stops, dbNonScheduledRoutes } = b1.lastReturn; async function createRAPTOR() { const RAPTORDataInst = new RAPTORData( - await mapAsync<(typeof dbStops)[number], Stop>(dbStops, async ({ _id, coords }) => ({ - id: _id, - lat: coords[0], - long: coords[1], - connectedRoutes: dbScheduledRoutes.filter((ScheduledRoute) => ScheduledRoute.stops.find((stopId) => stopId === _id)).map(({ _id }) => _id), - transfers: (await dbNonScheduledRoutes(_id, { distance: { $lte: FP_MAX_LEN } })).map(({ to, distance }) => ({ + await mapAsync<(typeof stops)[number], Stop>(stops, async ({ id, connectedRoutes }) => ({ + id, + connectedRoutes, + transfers: (await dbNonScheduledRoutes(id, { distance: { $lte: FP_MAX_LEN } })).map(({ to, distance }) => ({ to, length: distance, })), From 408bf8cb9583c9d7d8aa6be9964dd3729a453316 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Sun, 6 Jul 2025 00:24:09 +0200 Subject: [PATCH 174/251] =?UTF-8?q?=F0=9F=8E=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/index.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/test/index.ts b/src/test/index.ts index e85809c8..33905838 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -3,16 +3,16 @@ import initDB from "./utils/mongoose"; // Needed to solve "Reflect.getMetadata is not a function" error of typegoose import "core-js/features/reflect"; +import { DocumentType } from "@typegoose/typegoose"; +import { FilterQuery, HydratedDocument } from "mongoose"; +import { inspect } from "util"; import NonScheduledRoutesModelInit, { dbFootPaths } from "./models/NonScheduledRoutes.model"; import ResultModelInit from "./models/result.model"; import TBMSchedulesModelInit from "./models/TBM_schedules.model"; import stopsModelInit, { dbTBM_Stops } from "./models/TBM_stops.model"; import TBMScheduledRoutesModelInit, { dbTBM_ScheduledRoutes } from "./models/TBMScheduledRoutes.model"; -import { DocumentType } from "@typegoose/typegoose"; -import { FilterQuery, HydratedDocument } from "mongoose"; -import { inspect } from "util"; // eslint-disable-next-line @typescript-eslint/no-unused-vars -import { bufferTime, MAX_SAFE_TIMESTAMP, McRAPTOR, McSharedRAPTOR, RAPTORData, RAPTORRunSettings, SharedRAPTORData, Stop } from "../"; +import { bufferTime, MAX_SAFE_TIMESTAMP, McRAPTOR, RAPTORData, RAPTORRunSettings, Stop } from "../"; import { Journey, JourneyStepBase, JourneyStepFoot, JourneyStepType, JourneyStepVehicle, LocationType } from "./models/result.model"; import { binarySearch, mapAsync, unpackRefType, wait } from "./utils"; import { benchmark } from "./utils/benchmark"; From 75fdb7bf54352ee46f0290048eb065f51c18851c Mon Sep 17 00:00:00 2001 From: Catatomik Date: Mon, 7 Jul 2025 16:35:10 +0200 Subject: [PATCH 175/251] =?UTF-8?q?=F0=9F=9A=A7=20Fit=20to=20BIBM,=20addre?= =?UTF-8?q?ss=20departure?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/index.ts | 60 +++++++++++++++++++++++++++++++++++++---------- 1 file changed, 48 insertions(+), 12 deletions(-) diff --git a/src/test/index.ts b/src/test/index.ts index 33905838..77cce6d8 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -12,7 +12,7 @@ import TBMSchedulesModelInit from "./models/TBM_schedules.model"; import stopsModelInit, { dbTBM_Stops } from "./models/TBM_stops.model"; import TBMScheduledRoutesModelInit, { dbTBM_ScheduledRoutes } from "./models/TBMScheduledRoutes.model"; // eslint-disable-next-line @typescript-eslint/no-unused-vars -import { bufferTime, MAX_SAFE_TIMESTAMP, McRAPTOR, RAPTORData, RAPTORRunSettings, Stop } from "../"; +import { bufferTime, MAX_SAFE_TIMESTAMP, McRAPTOR, McSharedRAPTOR, RAPTORData, RAPTORRunSettings, SharedID, SharedRAPTORData, Stop } from "../"; import { Journey, JourneyStepBase, JourneyStepFoot, JourneyStepType, JourneyStepVehicle, LocationType } from "./models/result.model"; import { binarySearch, mapAsync, unpackRefType, wait } from "./utils"; import { benchmark } from "./utils/benchmark"; @@ -100,7 +100,7 @@ async function init() { const { dbScheduledRoutes, stops, dbNonScheduledRoutes } = b1.lastReturn; async function createRAPTOR() { - const RAPTORDataInst = new RAPTORData( + const RAPTORDataInst = SharedRAPTORData.makeFromRawData( await mapAsync<(typeof stops)[number], Stop>(stops, async ({ id, connectedRoutes }) => ({ id, connectedRoutes, @@ -128,32 +128,68 @@ async function init() { ] satisfies [unknown, unknown, unknown], ), ); - // RAPTORDataInst.secure = true; - const RAPTORInstance = new McRAPTOR<["bufferTime"], number, number, number>(RAPTORDataInst, [bufferTime]); + RAPTORDataInst.secure = true; + const RAPTORInstance = new McSharedRAPTOR<["bufferTime"]>(RAPTORDataInst, [bufferTime]); - return { RAPTORInstance }; + return { RAPTORInstance, RAPTORDataInst }; } const b2 = await benchmark(createRAPTOR, []); console.log("b2 ended"); if (!b2.lastReturn) throw new Error(`b2 return null`); - const { RAPTORInstance } = b2.lastReturn; + const { RAPTORInstance, RAPTORDataInst } = b2.lastReturn; - return { RAPTORInstance, TBMSchedulesModel, resultModel }; + return { RAPTORInstance, RAPTORDataInst, TBMSchedulesModel, resultModel, stops }; } -async function run({ RAPTORInstance, TBMSchedulesModel, resultModel }: Awaited>) { +async function run({ RAPTORInstance, RAPTORDataInst, TBMSchedulesModel, resultModel, stops }: Awaited>) { + const attachStops = new Map>(); + + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const psIdNumber = stops.at(-1)!.id + 1; + + const distances: Record = { + // Barrière d'Ornano + 974: 100, + }; + + attachStops.set(psIdNumber, { + id: psIdNumber, + connectedRoutes: [], + transfers: Object.keys(distances).map((k) => { + const sId = parseInt(k); + + return { to: sId, length: distances[sId] }; + }), + }); + + Object.keys(distances).forEach((k) => { + const sId = parseInt(k); + + attachStops.set(sId, { + id: sId, + connectedRoutes: [], + transfers: [{ to: psIdNumber, length: distances[sId] }], + }); + }); + + const psId = SharedRAPTORData.serializeId(psIdNumber); + + RAPTORDataInst.attachData(Array.from(attachStops.values()), []); + const args = process.argv.slice(2); - let ps: number; + let ps: number | SharedID; try { ps = JSON.parse(args[0]) as number; } catch (_) { - ps = 2832; + ps = psId; } let pt: number; try { pt = JSON.parse(args[1]) as number; } catch (_) { - pt = 169; + pt = + // Béthanie + 3846; } // https://www.mongodb.com/docs/manual/core/aggregation-pipeline-optimization/#-sort----limit-coalescence @@ -231,7 +267,7 @@ async function run({ RAPTORInstance, TBMSchedulesModel, resultModel }: Awaited Date: Mon, 7 Jul 2025 16:35:37 +0200 Subject: [PATCH 176/251] =?UTF-8?q?=F0=9F=9A=A7=20Consider=20more=20transf?= =?UTF-8?q?ers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/index.ts b/src/test/index.ts index 77cce6d8..f4c62959 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -18,7 +18,7 @@ import { binarySearch, mapAsync, unpackRefType, wait } from "./utils"; import { benchmark } from "./utils/benchmark"; // In meters -const FP_MAX_LEN = 1_000; +const FP_MAX_LEN = 2_000; async function init() { const sourceDB = await initDB("bibm"); From 9474bd8b8c9e57c67fde3f478ac3cf4878e258b3 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Mon, 7 Jul 2025 18:29:19 +0200 Subject: [PATCH 177/251] =?UTF-8?q?=E2=9C=A8=20Max=20transfer=20length?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/index.ts | 7 ++++--- src/test/models/result.model.ts | 3 +++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/test/index.ts b/src/test/index.ts index f4c62959..b3ef2b95 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -18,7 +18,8 @@ import { binarySearch, mapAsync, unpackRefType, wait } from "./utils"; import { benchmark } from "./utils/benchmark"; // In meters -const FP_MAX_LEN = 2_000; +const FP_REQ_MAX_LEN = 2_000; +const FP_RUN_MAX_LEN = 1_000; async function init() { const sourceDB = await initDB("bibm"); @@ -104,7 +105,7 @@ async function init() { await mapAsync<(typeof stops)[number], Stop>(stops, async ({ id, connectedRoutes }) => ({ id, connectedRoutes, - transfers: (await dbNonScheduledRoutes(id, { distance: { $lte: FP_MAX_LEN } })).map(({ to, distance }) => ({ + transfers: (await dbNonScheduledRoutes(id, { distance: { $lte: FP_REQ_MAX_LEN } })).map(({ to, distance }) => ({ to, length: distance, })), @@ -203,7 +204,7 @@ async function run({ RAPTORInstance, RAPTORDataInst, TBMSchedulesModel, resultMo const departureTime = (minSchedule + maxSchedule) / 2; - const settings: RAPTORRunSettings = { walkSpeed: 1.5 }; + const settings: RAPTORRunSettings = { walkSpeed: 1.5, maxTransferLength: FP_RUN_MAX_LEN }; function runRAPTOR() { RAPTORInstance.run(ps, pt, departureTime, settings); diff --git a/src/test/models/result.model.ts b/src/test/models/result.model.ts index a202dc63..35892887 100644 --- a/src/test/models/result.model.ts +++ b/src/test/models/result.model.ts @@ -33,6 +33,9 @@ export type routeId = dbTBM_ScheduledRoutes["_id"]; class RunSettings implements RAPTORRunSettings { @prop({ required: true }) public walkSpeed!: number; + + @prop({ required: true }) + public maxTransferLength!: number; } @modelOptions({ From c57d13f0e96c12a216356e87d02d6b3947225298 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Tue, 8 Jul 2025 10:05:11 +0200 Subject: [PATCH 178/251] =?UTF-8?q?=F0=9F=9A=A7=20Stress=20test?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/index.ts b/src/test/index.ts index b3ef2b95..2315fe93 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -18,8 +18,8 @@ import { binarySearch, mapAsync, unpackRefType, wait } from "./utils"; import { benchmark } from "./utils/benchmark"; // In meters -const FP_REQ_MAX_LEN = 2_000; -const FP_RUN_MAX_LEN = 1_000; +const FP_REQ_MAX_LEN = 3_000; +const FP_RUN_MAX_LEN = 2_000; async function init() { const sourceDB = await initDB("bibm"); From b53bb7c5d4427b45a1217f0ae28fcd1d8e4a8fe4 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Tue, 8 Jul 2025 15:00:11 +0200 Subject: [PATCH 179/251] =?UTF-8?q?=E2=AC=86=EF=B8=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 8 ++++---- pnpm-lock.yaml | 30 +++++++++++++++--------------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/package.json b/package.json index fddfaf4c..86bb9cfb 100644 --- a/package.json +++ b/package.json @@ -26,10 +26,10 @@ "license": "MIT", "dependencies": { "@catatomik/dijkstra": "github:catatomik/dijkstra", - "@typegoose/typegoose": "^12.10.1", - "core-js": "^3.36.0", - "mongodb": "^6.4.0", - "mongoose": "^8.16.1" + "@typegoose/typegoose": "^12.17.0", + "core-js": "^3.44.0", + "mongodb": "^6.17.0", + "mongoose": "^8.16.2" }, "devDependencies": { "@jest/globals": "^30.0.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e21a2761..b935f698 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,17 +12,17 @@ importers: specifier: github:catatomik/dijkstra version: https://codeload.github.com/catatomik/dijkstra/tar.gz/e3304b71e4bda9aefb04d2d18b32e7aa369a4aed '@typegoose/typegoose': - specifier: ^12.10.1 - version: 12.17.0(mongoose@8.16.1) + specifier: ^12.17.0 + version: 12.17.0(mongoose@8.16.2) core-js: - specifier: ^3.36.0 - version: 3.43.0 + specifier: ^3.44.0 + version: 3.44.0 mongodb: - specifier: ^6.4.0 + specifier: ^6.17.0 version: 6.17.0 mongoose: - specifier: ^8.16.1 - version: 8.16.1 + specifier: ^8.16.2 + version: 8.16.2 devDependencies: '@jest/globals': specifier: ^30.0.4 @@ -821,8 +821,8 @@ packages: convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - core-js@3.43.0: - resolution: {integrity: sha512-N6wEbTTZSYOY2rYAn85CuvWWkCK6QweMn7/4Nr3w+gDBeBhk/x4EJeY6FPo4QzDoJZxVTv8U7CMvgWk6pOHHqA==} + core-js@3.44.0: + resolution: {integrity: sha512-aFCtd4l6GvAXwVEh3XbbVqJGHDJt0OZRa+5ePGx3LLwi12WfexqQxcsohb2wgsa/92xtl19Hd66G/L+TaAxDMw==} cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} @@ -1430,8 +1430,8 @@ packages: socks: optional: true - mongoose@8.16.1: - resolution: {integrity: sha512-Q+0TC+KLdY4SYE+u9gk9pdW1tWu/pl0jusyEkMGTgBoAbvwQdfy4f9IM8dmvCwb/blSfp7IfLkob7v76x6ZGpQ==} + mongoose@8.16.2: + resolution: {integrity: sha512-52T4XPhDgJL4cqooBsOORzYBH3ddMwABMEF/LV7TgvD2DEKZlnYTc2HF9ch1U2lcKjhE4pQ+WuInfLFJbguGcQ==} engines: {node: '>=16.20.1'} mpath@0.9.0: @@ -2374,11 +2374,11 @@ snapshots: tslib: 2.8.1 optional: true - '@typegoose/typegoose@12.17.0(mongoose@8.16.1)': + '@typegoose/typegoose@12.17.0(mongoose@8.16.2)': dependencies: lodash: 4.17.21 loglevel: 1.9.2 - mongoose: 8.16.1 + mongoose: 8.16.2 reflect-metadata: 0.2.2 semver: 7.7.2 tslib: 2.8.1 @@ -2760,7 +2760,7 @@ snapshots: convert-source-map@2.0.0: {} - core-js@3.43.0: {} + core-js@3.44.0: {} cross-spawn@7.0.6: dependencies: @@ -3509,7 +3509,7 @@ snapshots: bson: 6.10.4 mongodb-connection-string-url: 3.0.2 - mongoose@8.16.1: + mongoose@8.16.2: dependencies: bson: 6.10.4 kareem: 2.6.3 From 29dcb3d7edd450750321b9186ebe174742c060c5 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Tue, 8 Jul 2025 15:00:17 +0200 Subject: [PATCH 180/251] =?UTF-8?q?=F0=9F=9A=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/index.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/test/index.ts b/src/test/index.ts index 2315fe93..0e7d8880 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -4,7 +4,7 @@ import initDB from "./utils/mongoose"; import "core-js/features/reflect"; import { DocumentType } from "@typegoose/typegoose"; -import { FilterQuery, HydratedDocument } from "mongoose"; +import { FilterQuery } from "mongoose"; import { inspect } from "util"; import NonScheduledRoutesModelInit, { dbFootPaths } from "./models/NonScheduledRoutes.model"; import ResultModelInit from "./models/result.model"; @@ -39,7 +39,7 @@ async function init() { } type ScheduledRoute = Omit & ScheduledRoutesOverwritten; - const dbScheduledRoutes = (await TBMScheduledRoutesModel.find>>({}, dbScheduledRoutesProjection) + const dbScheduledRoutes = (await TBMScheduledRoutesModel.find>>({}, dbScheduledRoutesProjection) .populate("trips.schedules") .lean() .exec()) as ScheduledRoute[]; @@ -62,7 +62,7 @@ async function init() { }, ( (await stopsModel - .find>>( + .find>>( { $and: [{ coords: { $not: { $elemMatch: { $eq: Infinity } } } }], }, @@ -85,7 +85,7 @@ async function init() { //Query must associate (s, from) AND (from, s) forall s in stops ! const dbNonScheduledRoutes = async (stopId: NonScheduledRoutesOverwritten["from"], additionalQuery: FilterQuery = {}) => ( - (await NonScheduledRoutesModel.find>>( + (await NonScheduledRoutesModel.find>>( { $and: [{ $or: [{ from: stopId }, { to: stopId }] }, additionalQuery] }, dbNonScheduledRoutesProjection, ) From 141c0e56f8c1ca7664bee154306df99698ae4bc4 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Wed, 9 Jul 2025 10:17:06 +0200 Subject: [PATCH 181/251] =?UTF-8?q?=F0=9F=9A=A7=20Generalize=20criterion?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/index.ts b/src/test/index.ts index 0e7d8880..51239c3f 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -130,7 +130,7 @@ async function init() { ), ); RAPTORDataInst.secure = true; - const RAPTORInstance = new McSharedRAPTOR<["bufferTime"]>(RAPTORDataInst, [bufferTime]); + const RAPTORInstance = new McSharedRAPTOR(RAPTORDataInst, [bufferTime]); return { RAPTORInstance, RAPTORDataInst }; } From 18284ad11728ba6e82420ccee789d40be5deab11 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Thu, 10 Jul 2025 10:49:12 +0200 Subject: [PATCH 182/251] =?UTF-8?q?=F0=9F=9A=A7=20Dep=20merge=20conflicts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pnpm-lock.yaml | 28 ++++++++++------------------ 1 file changed, 10 insertions(+), 18 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f79eaeef..1c34687e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -512,16 +512,14 @@ packages: '@types/stack-utils@2.0.3': resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} -<<<<<<< HEAD + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + '@types/webidl-conversions@7.0.3': resolution: {integrity: sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==} '@types/whatwg-url@11.0.5': resolution: {integrity: sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==} -======= - '@types/unist@3.0.3': - resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} ->>>>>>> dev '@types/yargs-parser@21.0.3': resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} @@ -1406,17 +1404,15 @@ packages: makeerror@1.0.12: resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} -<<<<<<< HEAD - memory-pager@1.5.0: - resolution: {integrity: sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==} -======= markdown-it@14.1.0: resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} hasBin: true mdurl@2.0.0: resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} ->>>>>>> dev + + memory-pager@1.5.0: + resolution: {integrity: sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==} merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -2523,15 +2519,13 @@ snapshots: '@types/stack-utils@2.0.3': {} -<<<<<<< HEAD + '@types/unist@3.0.3': {} + '@types/webidl-conversions@7.0.3': {} '@types/whatwg-url@11.0.5': dependencies: '@types/webidl-conversions': 7.0.3 -======= - '@types/unist@3.0.3': {} ->>>>>>> dev '@types/yargs-parser@21.0.3': {} @@ -3582,9 +3576,6 @@ snapshots: dependencies: tmpl: 1.0.5 -<<<<<<< HEAD - memory-pager@1.5.0: {} -======= markdown-it@14.1.0: dependencies: argparse: 2.0.1 @@ -3595,7 +3586,8 @@ snapshots: uc.micro: 2.1.0 mdurl@2.0.0: {} ->>>>>>> dev + + memory-pager@1.5.0: {} merge-stream@2.0.0: {} From 4411da191529b436fb95ca40b3608bf18b422b7d Mon Sep 17 00:00:00 2001 From: Catatomik Date: Thu, 10 Jul 2025 10:50:32 +0200 Subject: [PATCH 183/251] =?UTF-8?q?=F0=9F=99=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 78908907..ca33e6f9 100644 --- a/.gitignore +++ b/.gitignore @@ -111,4 +111,11 @@ git_push.sh # Others lib/ -docs/ \ No newline at end of file +docs/ + +# Test +test.sh +*.geojson +flamegraph*.html +isolate-0x*.json +prof_preproc*.json From 2f364312a014aef7297886c7b45ff11ab8c60f3f Mon Sep 17 00:00:00 2001 From: Catatomik Date: Thu, 10 Jul 2025 11:06:50 +0200 Subject: [PATCH 184/251] =?UTF-8?q?=F0=9F=9A=A7=20Time=20type=20generaliza?= =?UTF-8?q?tion?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/index.ts | 17 ++++++++++++++--- src/test/models/result.model.ts | 6 +++--- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/test/index.ts b/src/test/index.ts index 51239c3f..451b4ab9 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -11,8 +11,18 @@ import ResultModelInit from "./models/result.model"; import TBMSchedulesModelInit from "./models/TBM_schedules.model"; import stopsModelInit, { dbTBM_Stops } from "./models/TBM_stops.model"; import TBMScheduledRoutesModelInit, { dbTBM_ScheduledRoutes } from "./models/TBMScheduledRoutes.model"; -// eslint-disable-next-line @typescript-eslint/no-unused-vars -import { bufferTime, MAX_SAFE_TIMESTAMP, McRAPTOR, McSharedRAPTOR, RAPTORData, RAPTORRunSettings, SharedID, SharedRAPTORData, Stop } from "../"; +import { + bufferTime, + MAX_SAFE_TIMESTAMP, + McRAPTOR, + McSharedRAPTOR, + RAPTORData, + RAPTORRunSettings, + SharedID, + SharedRAPTORData, + sharedTimeScal, + Stop, +} from "../"; import { Journey, JourneyStepBase, JourneyStepFoot, JourneyStepType, JourneyStepVehicle, LocationType } from "./models/result.model"; import { binarySearch, mapAsync, unpackRefType, wait } from "./utils"; import { benchmark } from "./utils/benchmark"; @@ -102,6 +112,7 @@ async function init() { async function createRAPTOR() { const RAPTORDataInst = SharedRAPTORData.makeFromRawData( + sharedTimeScal, await mapAsync<(typeof stops)[number], Stop>(stops, async ({ id, connectedRoutes }) => ({ id, connectedRoutes, @@ -130,7 +141,7 @@ async function init() { ), ); RAPTORDataInst.secure = true; - const RAPTORInstance = new McSharedRAPTOR(RAPTORDataInst, [bufferTime]); + const RAPTORInstance = new McSharedRAPTOR(RAPTORDataInst, [bufferTime]); return { RAPTORInstance, RAPTORDataInst }; } diff --git a/src/test/models/result.model.ts b/src/test/models/result.model.ts index 35892887..bb9c30ea 100644 --- a/src/test/models/result.model.ts +++ b/src/test/models/result.model.ts @@ -16,7 +16,7 @@ export enum LocationType { import { deleteModelWithClass, getModelForClass, prop, type Ref } from "@typegoose/typegoose"; import { TimeStamps } from "@typegoose/typegoose/lib/defaultClasses"; import { modelOptions } from "@typegoose/typegoose/lib/modelOptions"; -import { Connection } from "mongoose"; +import { Connection, Schema } from "mongoose"; import { RAPTORRunSettings } from "../../"; import { dbAddresses } from "./addresses.model"; import { dbTBM_Stops } from "./TBM_stops.model"; @@ -92,8 +92,8 @@ export class Criterion { @prop({ required: true }) public name!: string; - @prop({ required: true }) - public value!: number; + @prop({ required: true, type: () => Schema.Types.Mixed }) + public value!: unknown; } export class Journey { From 3644a0be34624b6f9a772e0ed6fe44706d15f6f4 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Thu, 10 Jul 2025 15:25:25 +0200 Subject: [PATCH 185/251] =?UTF-8?q?=F0=9F=9A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/models/NonScheduledRoutes.model.ts | 2 +- src/test/models/TBMScheduledRoutes.model.ts | 2 +- src/test/models/TBM_lines.model.ts | 2 +- src/test/models/TBM_lines_routes.model.ts | 2 +- src/test/models/TBM_schedules.model.ts | 2 +- src/test/models/TBM_stops.model.ts | 2 +- src/test/models/TBM_trips.model.ts | 2 +- src/test/models/addresses.model.ts | 2 +- src/test/models/intersections.model.ts | 2 +- src/test/models/result.model.ts | 10 +++++----- src/test/models/sections.model.ts | 2 +- 11 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/test/models/NonScheduledRoutes.model.ts b/src/test/models/NonScheduledRoutes.model.ts index dad74194..8727b3d4 100644 --- a/src/test/models/NonScheduledRoutes.model.ts +++ b/src/test/models/NonScheduledRoutes.model.ts @@ -28,7 +28,7 @@ export class dbFootPaths { } export default function init(db: Connection): ReturnModelType { - if (getModelForClass(dbFootPaths, { existingConnection: db })) deleteModelWithClass(dbFootPaths); + deleteModelWithClass(dbFootPaths); return getModelForClass(dbFootPaths, { existingConnection: db }); } diff --git a/src/test/models/TBMScheduledRoutes.model.ts b/src/test/models/TBMScheduledRoutes.model.ts index a5a225de..8b987d0a 100644 --- a/src/test/models/TBMScheduledRoutes.model.ts +++ b/src/test/models/TBMScheduledRoutes.model.ts @@ -36,7 +36,7 @@ export default function init(db: Connection): ReturnModelType { - if (getModelForClass(dbTBM_Lines, { existingConnection: db })) deleteModelWithClass(dbTBM_Lines); + deleteModelWithClass(dbTBM_Lines); return getModelForClass(dbTBM_Lines, { existingConnection: db }); } diff --git a/src/test/models/TBM_lines_routes.model.ts b/src/test/models/TBM_lines_routes.model.ts index ecd38727..74e6c7eb 100644 --- a/src/test/models/TBM_lines_routes.model.ts +++ b/src/test/models/TBM_lines_routes.model.ts @@ -36,7 +36,7 @@ export class dbTBM_Lines_routes extends TimeStamps { // for more of what you can do here. export default function init(db: Connection): ReturnModelType { - if (getModelForClass(dbTBM_Lines_routes, { existingConnection: db })) deleteModelWithClass(dbTBM_Lines_routes); + deleteModelWithClass(dbTBM_Lines_routes); return getModelForClass(dbTBM_Lines_routes, { existingConnection: db, diff --git a/src/test/models/TBM_schedules.model.ts b/src/test/models/TBM_schedules.model.ts index ac7027c9..9170d37a 100644 --- a/src/test/models/TBM_schedules.model.ts +++ b/src/test/models/TBM_schedules.model.ts @@ -65,7 +65,7 @@ export class dbTBM_Schedules_rt extends dbTBM_Schedules { } export default function init(db: Connection): readonly [ReturnModelType, ReturnModelType] { - if (getModelForClass(dbTBM_Schedules, { existingConnection: db })) deleteModelWithClass(dbTBM_Schedules); + deleteModelWithClass(dbTBM_Schedules); const dbTBM_SchedulesModel = getModelForClass(dbTBM_Schedules, { existingConnection: db }); return [dbTBM_SchedulesModel, getDiscriminatorModelForClass(dbTBM_SchedulesModel, dbTBM_Schedules_rt)] as const; diff --git a/src/test/models/TBM_stops.model.ts b/src/test/models/TBM_stops.model.ts index 9f3112d4..08fa4374 100644 --- a/src/test/models/TBM_stops.model.ts +++ b/src/test/models/TBM_stops.model.ts @@ -52,7 +52,7 @@ export class dbTBM_Stops extends TimeStamps { // }; export default function init(db: Connection): ReturnModelType { - if (getModelForClass(dbTBM_Stops, { existingConnection: db })) deleteModelWithClass(dbTBM_Stops); + deleteModelWithClass(dbTBM_Stops); return getModelForClass(dbTBM_Stops, { existingConnection: db }); } diff --git a/src/test/models/TBM_trips.model.ts b/src/test/models/TBM_trips.model.ts index 51f2ab4e..583a2c98 100644 --- a/src/test/models/TBM_trips.model.ts +++ b/src/test/models/TBM_trips.model.ts @@ -33,7 +33,7 @@ export class dbTBM_Trips extends TimeStamps { } export default function init(db: Connection): ReturnModelType { - if (getModelForClass(dbTBM_Trips, { existingConnection: db })) deleteModelWithClass(dbTBM_Trips); + deleteModelWithClass(dbTBM_Trips); return getModelForClass(dbTBM_Trips, { existingConnection: db }); } diff --git a/src/test/models/addresses.model.ts b/src/test/models/addresses.model.ts index f3b76d9d..4238797a 100644 --- a/src/test/models/addresses.model.ts +++ b/src/test/models/addresses.model.ts @@ -42,7 +42,7 @@ export class dbAddresses extends TimeStamps { } export default function init(db: Connection): ReturnModelType { - if (getModelForClass(dbAddresses, { existingConnection: db })) deleteModelWithClass(dbAddresses); + deleteModelWithClass(dbAddresses); return getModelForClass(dbAddresses, { existingConnection: db }); } diff --git a/src/test/models/intersections.model.ts b/src/test/models/intersections.model.ts index 293cdeae..13adc1f2 100644 --- a/src/test/models/intersections.model.ts +++ b/src/test/models/intersections.model.ts @@ -29,7 +29,7 @@ export class dbIntersections extends TimeStamps { } export default function init(db: Connection): ReturnModelType { - if (getModelForClass(dbIntersections, { existingConnection: db })) deleteModelWithClass(dbIntersections); + deleteModelWithClass(dbIntersections); return getModelForClass(dbIntersections, { existingConnection: db }); } diff --git a/src/test/models/result.model.ts b/src/test/models/result.model.ts index bb9c30ea..ca52ab58 100644 --- a/src/test/models/result.model.ts +++ b/src/test/models/result.model.ts @@ -49,8 +49,8 @@ export class JourneyStepBase { /** @description JourneyStep type */ public type!: JourneyStepType; - @prop({ required: true }) - public time!: number; + @prop({ required: true, type: () => Schema.Types.Mixed }) + public time!: unknown; } class Transfer { @@ -162,8 +162,8 @@ export class dbComputeResult extends TimeStamps { }) public to!: LocationBase; - @prop({ required: true }) - departureTime!: Date; + @prop({ required: true, type: () => Schema.Types.Mixed }) + departureTime!: unknown; @prop({ required: true, type: () => RunSettings }) settings!: RunSettings; @@ -173,7 +173,7 @@ export class dbComputeResult extends TimeStamps { } export default function init(db: Connection) { - if (getModelForClass(dbComputeResult, { existingConnection: db })) deleteModelWithClass(dbComputeResult); + deleteModelWithClass(dbComputeResult); return getModelForClass(dbComputeResult, { existingConnection: db, diff --git a/src/test/models/sections.model.ts b/src/test/models/sections.model.ts index 7535b573..35ba9206 100644 --- a/src/test/models/sections.model.ts +++ b/src/test/models/sections.model.ts @@ -53,7 +53,7 @@ export class dbSections extends TimeStamps { } export default function init(db: Connection): ReturnModelType { - if (getModelForClass(dbSections, { existingConnection: db })) deleteModelWithClass(dbSections); + deleteModelWithClass(dbSections); return getModelForClass(dbSections, { existingConnection: db }); } From f48aa23e2f2b8cc05a0505aca5436c247948279d Mon Sep 17 00:00:00 2001 From: Catatomik Date: Thu, 10 Jul 2025 15:25:37 +0200 Subject: [PATCH 186/251] =?UTF-8?q?=E2=9C=8F=EF=B8=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/utils/benchmark.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/utils/benchmark.ts b/src/test/utils/benchmark.ts index 4c8bd85e..386af520 100644 --- a/src/test/utils/benchmark.ts +++ b/src/test/utils/benchmark.ts @@ -4,7 +4,7 @@ * @param args The argument(s) to pass to the function {@link f} * @param thisArg A custom "this" to pass to the function {@link f} * @param times Number of times to repeat the benchmark - * @param logStats Wheter to log to the bench to the console at its end, or not + * @param logStats Whether to log to the bench to the console at its end, or not */ // eslint-disable-next-line @typescript-eslint/no-explicit-any export async function benchmark any>( @@ -27,7 +27,7 @@ export async function benchmark any>( const totalDuration = new Duration(durations.reduce((acc, v) => acc + v.ms, 0)); const averageDuration = new Duration(totalDuration.ms / times); // eslint-disable-next-line @typescript-eslint/restrict-template-expressions - if (logStats) console.log(`Benchmark of ${f.name || "anonymous"} : ${averageDuration}`); + if (logStats) console.log(`Benchmark of ${f.name || "anonymous"}: ${averageDuration}`); return { fName: f.name, args, From 0367350ea0e6011019a83449ed2b33563a382f52 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Thu, 10 Jul 2025 15:25:48 +0200 Subject: [PATCH 187/251] =?UTF-8?q?=E2=9E=95=20minimist?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 ++ pnpm-lock.yaml | 16 ++++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/package.json b/package.json index 17300866..420b7cb5 100644 --- a/package.json +++ b/package.json @@ -28,12 +28,14 @@ "@catatomik/dijkstra": "github:catatomik/dijkstra", "@typegoose/typegoose": "^12.17.0", "core-js": "^3.44.0", + "minimist": "^1.2.8", "mongodb": "^6.17.0", "mongoose": "^8.16.2" }, "devDependencies": { "@jest/globals": "^30.0.4", "@tsconfig/node22": "^22.0.2", + "@types/minimist": "^1.2.5", "@types/node": "^22", "eslint": "^9.30.1", "globals": "^16.3.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1c34687e..eff87fc1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -17,6 +17,9 @@ importers: core-js: specifier: ^3.44.0 version: 3.44.0 + minimist: + specifier: ^1.2.8 + version: 1.2.8 mongodb: specifier: ^6.17.0 version: 6.17.0 @@ -30,6 +33,9 @@ importers: '@tsconfig/node22': specifier: ^22.0.2 version: 22.0.2 + '@types/minimist': + specifier: ^1.2.5 + version: 1.2.5 '@types/node': specifier: ^22 version: 22.15.32 @@ -506,6 +512,9 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/minimist@1.2.5': + resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} + '@types/node@22.15.32': resolution: {integrity: sha512-3jigKqgSjsH6gYZv2nEsqdXfZqIFGAV36XYYjf9KGZ3PSG+IhLecqPnI310RvjutyMwifE2hhhNEklOUrvx/wA==} @@ -1440,6 +1449,9 @@ packages: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + minipass@7.1.2: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} @@ -2513,6 +2525,8 @@ snapshots: '@types/json-schema@7.0.15': {} + '@types/minimist@1.2.5': {} + '@types/node@22.15.32': dependencies: undici-types: 6.21.0 @@ -3612,6 +3626,8 @@ snapshots: dependencies: brace-expansion: 2.0.2 + minimist@1.2.8: {} + minipass@7.1.2: {} mongodb-connection-string-url@3.0.2: From 3e572fb75fd79b1e07ca952839864ad0838188fa Mon Sep 17 00:00:00 2001 From: Catatomik Date: Thu, 10 Jul 2025 15:25:55 +0200 Subject: [PATCH 188/251] =?UTF-8?q?=E2=99=BB=EF=B8=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/index.ts | 591 ++++++++++++++++++++++++++++------------------ 1 file changed, 363 insertions(+), 228 deletions(-) diff --git a/src/test/index.ts b/src/test/index.ts index 451b4ab9..9ea3860a 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -4,34 +4,51 @@ import initDB from "./utils/mongoose"; import "core-js/features/reflect"; import { DocumentType } from "@typegoose/typegoose"; +import minimist from "minimist"; import { FilterQuery } from "mongoose"; -import { inspect } from "util"; -import NonScheduledRoutesModelInit, { dbFootPaths } from "./models/NonScheduledRoutes.model"; -import ResultModelInit from "./models/result.model"; -import TBMSchedulesModelInit from "./models/TBM_schedules.model"; -import stopsModelInit, { dbTBM_Stops } from "./models/TBM_stops.model"; -import TBMScheduledRoutesModelInit, { dbTBM_ScheduledRoutes } from "./models/TBMScheduledRoutes.model"; import { bufferTime, + footDistance, + IRAPTORData, MAX_SAFE_TIMESTAMP, McRAPTOR, McSharedRAPTOR, + Ordered, + RAPTOR, RAPTORData, RAPTORRunSettings, SharedID, + SharedRAPTOR, SharedRAPTORData, sharedTimeScal, Stop, + Time, + TimeScal, } from "../"; -import { Journey, JourneyStepBase, JourneyStepFoot, JourneyStepType, JourneyStepVehicle, LocationType } from "./models/result.model"; -import { binarySearch, mapAsync, unpackRefType, wait } from "./utils"; +import BaseRAPTOR from "../base"; +import NonScheduledRoutesModelInit, { dbFootPaths } from "./models/NonScheduledRoutes.model"; +import ResultModelInit, { + Journey, + JourneyStepBase, + JourneyStepFoot, + JourneyStepType, + JourneyStepVehicle, + LocationAddress, + LocationTBM, + LocationType, +} from "./models/result.model"; +import TBMSchedulesModelInit from "./models/TBM_schedules.model"; +import stopsModelInit, { dbTBM_Stops } from "./models/TBM_stops.model"; +import TBMScheduledRoutesModelInit, { dbTBM_ScheduledRoutes } from "./models/TBMScheduledRoutes.model"; +import { binarySearch, mapAsync, unpackRefType } from "./utils"; import { benchmark } from "./utils/benchmark"; // In meters const FP_REQ_MAX_LEN = 3_000; const FP_RUN_MAX_LEN = 2_000; -async function init() { +async function queryData() { + console.debug("Querying data..."); const sourceDB = await initDB("bibm"); const computeDB = await initDB("bibm-compute"); const stopsModel = stopsModelInit(sourceDB); @@ -41,131 +58,342 @@ async function init() { const resultModel = ResultModelInit(computeDB); - async function queryData() { - const dbScheduledRoutesProjection: Partial> = { _id: 1, stops: 1, trips: 1 }; - type dbScheduledRoute = Pick; - interface ScheduledRoutesOverwritten { - stops: unpackRefType; - } - type ScheduledRoute = Omit & ScheduledRoutesOverwritten; - - const dbScheduledRoutes = (await TBMScheduledRoutesModel.find>>({}, dbScheduledRoutesProjection) - .populate("trips.schedules") - .lean() - .exec()) as ScheduledRoute[]; - - const dbStopProjection = { _id: 1 } as const; - type Stop = Pick; - - const stops = dbScheduledRoutes.reduce<{ id: ScheduledRoute["stops"][number]; connectedRoutes: ScheduledRoute["_id"][] }[]>( - (acc, { _id, stops }) => { - for (const stop of stops) { - let pos = binarySearch(acc, stop, (a, b) => a - b.id); - if (pos < 0) { - pos = -pos - 1; - acc.splice(pos, 0, { id: stop, connectedRoutes: [] }); - } - acc[pos].connectedRoutes.push(_id); + const dbScheduledRoutesProjection: Partial> = { _id: 1, stops: 1, trips: 1 }; + type dbScheduledRoute = Pick; + interface ScheduledRoutesOverwritten { + stops: unpackRefType; + } + type ScheduledRoute = Omit & ScheduledRoutesOverwritten; + + const dbScheduledRoutes = (await TBMScheduledRoutesModel.find>>({}, dbScheduledRoutesProjection) + .populate("trips.schedules") + .lean() + .exec()) as ScheduledRoute[]; + + const dbStopProjection = { _id: 1 } as const; + type Stop = Pick; + + const stops = dbScheduledRoutes.reduce<{ id: ScheduledRoute["stops"][number]; connectedRoutes: ScheduledRoute["_id"][] }[]>( + (acc, { _id, stops }) => { + for (const stop of stops) { + let pos = binarySearch(acc, stop, (a, b) => a - b.id); + if (pos < 0) { + pos = -pos - 1; + acc.splice(pos, 0, { id: stop, connectedRoutes: [] }); } + acc[pos].connectedRoutes.push(_id); + } - return acc; - }, - ( - (await stopsModel - .find>>( - { - $and: [{ coords: { $not: { $elemMatch: { $eq: Infinity } } } }], - }, - dbStopProjection, - ) - .sort({ _id: 1 }) - .lean() - .exec()) as Stop[] - ).map(({ _id: id }) => ({ id, connectedRoutes: [] })), - ); - - const dbNonScheduledRoutesProjection: Partial> = { from: 1, to: 1, distance: 1 }; - type dbNonScheduledRoute = Pick; - interface NonScheduledRoutesOverwritten { - from: unpackRefType; - to: unpackRefType; - } - type NonScheduledRoute = Omit & NonScheduledRoutesOverwritten; - - //Query must associate (s, from) AND (from, s) forall s in stops ! - const dbNonScheduledRoutes = async (stopId: NonScheduledRoutesOverwritten["from"], additionalQuery: FilterQuery = {}) => - ( - (await NonScheduledRoutesModel.find>>( - { $and: [{ $or: [{ from: stopId }, { to: stopId }] }, additionalQuery] }, - dbNonScheduledRoutesProjection, + return acc; + }, + ( + (await stopsModel + .find>>( + { + $and: [{ coords: { $not: { $elemMatch: { $eq: Infinity } } } }], + }, + dbStopProjection, ) - .lean() - .exec()) as NonScheduledRoute[] - ).map(({ from, to, distance }) => ({ distance, ...(to === stopId ? { to: from } : { to }) })); - - return { dbScheduledRoutes, stops, dbNonScheduledRoutes }; + .sort({ _id: 1 }) + .lean() + .exec()) as Stop[] + ).map(({ _id: id }) => ({ id, connectedRoutes: [] })), + ); + + const dbNonScheduledRoutesProjection: Partial> = { from: 1, to: 1, distance: 1 }; + type dbNonScheduledRoute = Pick; + interface NonScheduledRoutesOverwritten { + from: unpackRefType; + to: unpackRefType; } - const b1 = await benchmark(queryData, []); - console.log("b1 ended"); - if (!b1.lastReturn) throw new Error(`b1 return null`); - const { dbScheduledRoutes, stops, dbNonScheduledRoutes } = b1.lastReturn; - - async function createRAPTOR() { - const RAPTORDataInst = SharedRAPTORData.makeFromRawData( - sharedTimeScal, - await mapAsync<(typeof stops)[number], Stop>(stops, async ({ id, connectedRoutes }) => ({ - id, - connectedRoutes, - transfers: (await dbNonScheduledRoutes(id, { distance: { $lte: FP_REQ_MAX_LEN } })).map(({ to, distance }) => ({ - to, - length: distance, - })), + type NonScheduledRoute = Omit & NonScheduledRoutesOverwritten; + + //Query must associate (s, from) AND (from, s) forall s in stops ! + const dbNonScheduledRoutes = async (stopId: NonScheduledRoutesOverwritten["from"], additionalQuery: FilterQuery = {}) => + ( + (await NonScheduledRoutesModel.find>>( + { $and: [{ $or: [{ from: stopId }, { to: stopId }] }, additionalQuery] }, + dbNonScheduledRoutesProjection, + ) + .lean() + .exec()) as NonScheduledRoute[] + ).map(({ from, to, distance }) => ({ distance, ...(to === stopId ? { to: from } : { to }) })); + + return { dbScheduledRoutes, stops, dbNonScheduledRoutes, TBMSchedulesModel, resultModel }; +} + +async function computeRAPTORData({ stops, dbNonScheduledRoutes, dbScheduledRoutes }: Awaited>) { + return [ + TimeScal, + await mapAsync<(typeof stops)[number], Stop>(stops, async ({ id, connectedRoutes }) => ({ + id, + connectedRoutes, + transfers: (await dbNonScheduledRoutes(id, { distance: { $lte: FP_REQ_MAX_LEN } })).map(({ to, distance }) => ({ + to, + length: distance, })), - dbScheduledRoutes.map( - ({ _id, stops, trips }) => - [ - _id, - stops, - trips.map(({ tripId, schedules }) => ({ - id: tripId, - times: schedules.map((schedule) => - typeof schedule === "object" && "hor_estime" in schedule - ? ([schedule.hor_estime.getTime() || MAX_SAFE_TIMESTAMP, schedule.hor_estime.getTime() || MAX_SAFE_TIMESTAMP] satisfies [ - unknown, - unknown, - ]) - : ([Infinity, Infinity] satisfies [unknown, unknown]), - ), - })), - ] satisfies [unknown, unknown, unknown], - ), - ); - RAPTORDataInst.secure = true; - const RAPTORInstance = new McSharedRAPTOR(RAPTORDataInst, [bufferTime]); - - return { RAPTORInstance, RAPTORDataInst }; - } - const b2 = await benchmark(createRAPTOR, []); - console.log("b2 ended"); - if (!b2.lastReturn) throw new Error(`b2 return null`); - const { RAPTORInstance, RAPTORDataInst } = b2.lastReturn; + })), + dbScheduledRoutes.map( + ({ _id, stops, trips }) => + [ + _id, + stops, + trips.map(({ tripId, schedules }) => ({ + id: tripId, + times: schedules.map((schedule) => + typeof schedule === "object" && "hor_estime" in schedule + ? ([schedule.hor_estime.getTime() || MAX_SAFE_TIMESTAMP, schedule.hor_estime.getTime() || MAX_SAFE_TIMESTAMP] satisfies [ + unknown, + unknown, + ]) + : ([Infinity, Infinity] satisfies [unknown, unknown]), + ), + })), + ] satisfies [unknown, unknown, unknown], + ), + ] satisfies ConstructorParameters>; +} - return { RAPTORInstance, RAPTORDataInst, TBMSchedulesModel, resultModel, stops }; +function computeSharedRAPTORData([_, stops, routes]: Awaited>) { + return [sharedTimeScal, stops, routes] satisfies Parameters>; } -async function run({ RAPTORInstance, RAPTORDataInst, TBMSchedulesModel, resultModel, stops }: Awaited>) { - const attachStops = new Map>(); +function createRAPTOR(data: ConstructorParameters>) { + const RAPTORDataInst = new RAPTORData(...data); + return [RAPTORDataInst, new RAPTOR(RAPTORDataInst)] as const; +} + +function createSharedRAPTOR(data: Parameters>) { + const SharedRAPTORDataInst = SharedRAPTORData.makeFromRawData(...data); + SharedRAPTORDataInst.secure = true; + return [SharedRAPTORDataInst, new SharedRAPTOR(SharedRAPTORDataInst)] as const; +} + +function createMcRAPTOR, CA extends [V, string][]>( + data: ConstructorParameters>, + criteria: ConstructorParameters>[1], +) { + const RAPTORDataInst = new RAPTORData(...data); + return [RAPTORDataInst, new McRAPTOR(RAPTORDataInst, criteria)] as const; +} + +function createMcSharedRAPTOR, CA extends [V, string][]>( + data: Parameters>, + criteria: ConstructorParameters>[1], +) { + const SharedRAPTORDataInst = SharedRAPTORData.makeFromRawData(...data); + SharedRAPTORDataInst.secure = true; + return [SharedRAPTORDataInst, new McSharedRAPTOR(SharedRAPTORDataInst, criteria)] as const; +} + +type DBJourney = Omit & { + steps: (JourneyStepBase | JourneyStepFoot | JourneyStepVehicle)[]; +}; +function journeyDBFormatter, CA extends [V, string][]>( + journey: NonNullable["getBestJourneys"]>[number][number]>, +): DBJourney { + return { + steps: journey.map((js) => { + if ("transfer" in js) { + return { + ...js, + time: js.label.time, + type: JourneyStepType.Foot, + } satisfies JourneyStepFoot; + } + + if ("route" in js) { + if (typeof js.route.id === "string") throw new Error("Invalid route to retrieve."); + + return { + ...js, + time: js.label.time, + route: js.route.id, + type: JourneyStepType.Vehicle, + } satisfies JourneyStepVehicle; + } + + return { + ...js, + time: js.label.time, + type: JourneyStepType.Base, + } satisfies JourneyStepBase; + }), + criteria: journey[0].label.criteria.map(({ name }) => ({ + name, + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + value: journey.at(-1)!.label.value(name), + })), + }; +} + +async function insertResults, CA extends [V, string][]>( + resultModel: Awaited>["resultModel"], + timeType: Time, + from: LocationAddress | LocationTBM, + to: LocationAddress | LocationTBM, + departureTime: TimeVal, + settings: RAPTORRunSettings, + results: ReturnType["getBestJourneys"]>, +) { + if (!results.length) throw new Error("No journey found"); + + const { _id } = await resultModel.create({ + from, + to, + departureTime, + journeys: results + .flat() + // Sort by arrival time + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + .sort((a, b) => timeType.order(a.at(-1)!.label.time, b.at(-1)!.label.time)) + .map((journey) => journeyDBFormatter(journey)), + settings, + }); + + return _id; +} + +// Main IIFE test function +(async () => { + // Setup params from command line + const args = minimist(process.argv); + + let instanceType: "RAPTOR" | "SharedRAPTOR" | "McRAPTOR" | "McSharedRAPTOR"; + if ("t" in args) { + switch ((args.t as string).toLowerCase()) { + case "r": + instanceType = "RAPTOR"; + break; + + case "sr": + instanceType = "SharedRAPTOR"; + break; + + case "mcr": + instanceType = "McRAPTOR"; + break; + + case "mcsr": + instanceType = "McSharedRAPTOR"; + break; + + default: + throw new Error(`Unexpected instance type "${args.t}"`); + } + } else instanceType = "McSharedRAPTOR"; - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - const psIdNumber = stops.at(-1)!.id + 1; + const createTimes = "createTimes" in args ? (args.createTimes as number) : 1; + const runTimes = "runTimes" in args ? (args.runTimes as number) : 1; + const getResTimes = "getResTimes" in args ? (args.getResTimes as number) : 1; + + const criteria = [] as [] | [typeof footDistance] | [typeof bufferTime] | [typeof footDistance, typeof bufferTime]; + if ("fd" in args && args.fd === true) (criteria as [typeof footDistance]).push(footDistance); + if ("bt" in args && args.bt === true) (criteria as [typeof bufferTime]).push(bufferTime); + if (criteria.length && instanceType !== "McRAPTOR" && instanceType !== "McSharedRAPTOR") + console.warn("Got some criteria but instance type is uni-criteria."); + + const b1 = await benchmark(queryData, []); + const queriedData = b1.lastReturn; + if (!queriedData) throw new Error("No queried data"); + + // Setup source & destination + let from: LocationAddress | LocationTBM; + let ps: number | SharedID; + if ("ps" in args) { + ps = args.ps as number; + from = { type: LocationType.TBM, id: ps }; + } else { + ps = 974; // Barrière d'Ornano + from = { type: LocationType.Address, id: 174287 }; + } + let psInternalId = ps; + + const pt = + "pt" in args + ? (args.pt as number) // Béthanie + : 3846; + + const b2 = await benchmark(computeRAPTORData, [queriedData]); + const rawRAPTORData = b2.lastReturn; + if (!rawRAPTORData) throw new Error("No raw RAPTOR data"); + + const attachStops = new Map>(); const distances: Record = { - // Barrière d'Ornano - 974: 100, + [ps]: 100, }; - attachStops.set(psIdNumber, { - id: psIdNumber, + let RAPTORDataInst: Omit, "attachData"> & { attachData: SharedRAPTORData["attachData"] }; + let RAPTORInstance: BaseRAPTOR< + number, + SharedID, + SharedID, + number, + number, + [] | [[number, "footDistance"]] | [[number, "bufferTime"]] | [[number, "footDistance"], [number, "bufferTime"]] + >; + + if (instanceType === "SharedRAPTOR" || instanceType === "McSharedRAPTOR") { + const b3 = await benchmark(computeSharedRAPTORData, [rawRAPTORData]); + const rawSharedRAPTORData = b3.lastReturn; + if (!rawSharedRAPTORData) throw new Error("No raw Shared RAPTOR data"); + + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + psInternalId = queriedData.stops.at(-1)!.id + 1; + ps = SharedRAPTORData.serializeId(psInternalId); + + const b4 = await (instanceType === "SharedRAPTOR" + ? benchmark>(createSharedRAPTOR, [rawSharedRAPTORData], undefined, createTimes) + : benchmark( + createMcSharedRAPTOR< + number, + number, + [] | [[number, "footDistance"]] | [[number, "bufferTime"]] | [[number, "footDistance"], [number, "bufferTime"]] + >, + [ + rawSharedRAPTORData, + criteria as Parameters< + typeof createMcSharedRAPTOR< + number, + number, + [] | [[number, "footDistance"]] | [[number, "bufferTime"]] | [[number, "footDistance"], [number, "bufferTime"]] + > + >[1], + ], + undefined, + createTimes, + )); + if (!b4.lastReturn) throw new Error("No RAPTOR instance"); + [RAPTORDataInst, RAPTORInstance] = b4.lastReturn as readonly [typeof RAPTORDataInst, typeof RAPTORInstance]; + } else { + const b4 = await (instanceType === "RAPTOR" + ? benchmark>(createRAPTOR, [rawRAPTORData], undefined, createTimes) + : benchmark( + createMcRAPTOR< + number, + number, + [] | [[number, "footDistance"]] | [[number, "bufferTime"]] | [[number, "footDistance"], [number, "bufferTime"]] + >, + [ + rawRAPTORData, + criteria as Parameters< + typeof createMcRAPTOR< + number, + number, + [] | [[number, "footDistance"]] | [[number, "bufferTime"]] | [[number, "footDistance"], [number, "bufferTime"]] + > + >[1], + ], + undefined, + createTimes, + )); + if (!b4.lastReturn) throw new Error("No RAPTOR instance"); + [RAPTORDataInst, RAPTORInstance] = b4.lastReturn as readonly [typeof RAPTORDataInst, typeof RAPTORInstance]; + } + + attachStops.set(psInternalId, { + id: psInternalId, connectedRoutes: [], transfers: Object.keys(distances).map((k) => { const sId = parseInt(k); @@ -180,38 +408,21 @@ async function run({ RAPTORInstance, RAPTORDataInst, TBMSchedulesModel, resultMo attachStops.set(sId, { id: sId, connectedRoutes: [], - transfers: [{ to: psIdNumber, length: distances[sId] }], + transfers: [{ to: psInternalId, length: distances[sId] }], }); }); - const psId = SharedRAPTORData.serializeId(psIdNumber); - RAPTORDataInst.attachData(Array.from(attachStops.values()), []); - const args = process.argv.slice(2); - let ps: number | SharedID; - try { - ps = JSON.parse(args[0]) as number; - } catch (_) { - ps = psId; - } - let pt: number; - try { - pt = JSON.parse(args[1]) as number; - } catch (_) { - pt = - // Béthanie - 3846; - } - // https://www.mongodb.com/docs/manual/core/aggregation-pipeline-optimization/#-sort----limit-coalescence const minSchedule = ( - await TBMSchedulesModel.find({ hor_estime: { $gt: new Date(0) } }, { hor_estime: 1 }) + await queriedData.TBMSchedulesModel.find({ hor_estime: { $gt: new Date(0) } }, { hor_estime: 1 }) .sort({ hor_estime: 1 }) .limit(1) )[0]?.hor_estime?.getTime() ?? Infinity; - const maxSchedule = (await TBMSchedulesModel.find({}, { hor_estime: 1 }).sort({ hor_estime: -1 }).limit(1))[0]?.hor_estime?.getTime() ?? Infinity; + const maxSchedule = + (await queriedData.TBMSchedulesModel.find({}, { hor_estime: 1 }).sort({ hor_estime: -1 }).limit(1))[0]?.hor_estime?.getTime() ?? Infinity; const departureTime = (minSchedule + maxSchedule) / 2; @@ -219,97 +430,21 @@ async function run({ RAPTORInstance, RAPTORDataInst, TBMSchedulesModel, resultMo function runRAPTOR() { RAPTORInstance.run(ps, pt, departureTime, settings); - - return true as const; } - const b3 = await benchmark(runRAPTOR, []); - console.log("b3 ended"); - if (!b3.lastReturn) throw new Error(`b3 return null`); + await benchmark(runRAPTOR, [], undefined, runTimes); function resultRAPTOR() { return RAPTORInstance.getBestJourneys(pt); } - const b4 = await benchmark(resultRAPTOR, []); - console.log("b4 ended"); - - if (!b4.lastReturn) throw new Error(`b4 return null`); - - async function insertResults(results: ReturnType) { - type DBJourney = Omit & { - steps: (JourneyStepBase | JourneyStepFoot | JourneyStepVehicle)[]; - }; - function journeyDBFormatter( - journey: NonNullable>["RAPTORInstance"]["getBestJourneys"]>[number]>[number], - ): DBJourney { - return { - steps: journey.map((js) => { - if ("transfer" in js) { - return { - ...js, - time: js.label.time, - type: JourneyStepType.Foot, - } satisfies JourneyStepFoot; - } - - if ("route" in js) { - if (typeof js.route.id === "string") throw new Error("Invalid route to retrieve."); - - return { - ...js, - time: js.label.time, - route: js.route.id, - type: JourneyStepType.Vehicle, - } satisfies JourneyStepVehicle; - } - - return { - ...js, - time: js.label.time, - type: JourneyStepType.Base, - } satisfies JourneyStepBase; - }), - criteria: journey[0].label.criteria.map(({ name }) => ({ - name, - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - value: journey.at(-1)!.label.value(name), - })), - }; - } - - if (!results.length) throw new Error("No journey found"); - - const { _id } = await resultModel.create({ - from: { type: LocationType.Address, id: 174287 }, - to: { type: LocationType.TBM, id: pt }, - departureTime: new Date(departureTime), - journeys: results - .flat() - // Sort by arrival time - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - .sort((a, b) => a.at(-1)!.label.time - b.at(-1)!.label.time) - .map((journey) => journeyDBFormatter(journey)), - settings, - }); + const b6 = await benchmark(resultRAPTOR, [], undefined, getResTimes); + if (!b6.lastReturn) throw new Error(`No best journeys`); - return _id; - } - - const b5 = await benchmark(insertResults, [b4.lastReturn]); - console.log("inserted", b5.lastReturn); - - return b4.lastReturn; -} - -// Main IIFE test function -(async () => { - const initr = await init(); - - // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition - while (true) { - const r = await run(initr); - console.log(inspect(r, false, 3)); - await wait(10_000); - } + await benchmark( + insertResults, + [queriedData.resultModel, RAPTORDataInst.timeType, from, { type: LocationType.TBM, id: pt }, departureTime, settings, b6.lastReturn], + ); })() - .then(() => true) + .then(() => { + console.log("Main ended"); + }) .catch(console.error); From 03a006764ee71470b9257335ea525715ccc9f1cd Mon Sep 17 00:00:00 2001 From: Catatomik Date: Thu, 10 Jul 2025 15:49:02 +0200 Subject: [PATCH 189/251] =?UTF-8?q?=F0=9F=9A=A7=20Remove=20typegoose=20Mix?= =?UTF-8?q?ed=20warnings?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/models/result.model.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/test/models/result.model.ts b/src/test/models/result.model.ts index ca52ab58..c4894138 100644 --- a/src/test/models/result.model.ts +++ b/src/test/models/result.model.ts @@ -13,7 +13,7 @@ export enum LocationType { Address = "A", } -import { deleteModelWithClass, getModelForClass, prop, type Ref } from "@typegoose/typegoose"; +import { deleteModelWithClass, getModelForClass, prop, Severity, type Ref } from "@typegoose/typegoose"; import { TimeStamps } from "@typegoose/typegoose/lib/defaultClasses"; import { modelOptions } from "@typegoose/typegoose/lib/modelOptions"; import { Connection, Schema } from "mongoose"; @@ -96,6 +96,7 @@ export class Criterion { public value!: unknown; } +@modelOptions({ options: { allowMixed: Severity.ALLOW } }) export class Journey { @prop({ required: true, @@ -140,7 +141,7 @@ export function isLocationAddress(loc: LocationBase): loc is LocationAddress { return loc.type === LocationType.Address; } -@modelOptions({ options: { customName: "results" } }) +@modelOptions({ options: { customName: "results", allowMixed: Severity.ALLOW } }) export class dbComputeResult extends TimeStamps { @prop({ required: true, From fcc66830d2b27ce6dfc362b84e9333dd5319b6e6 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Thu, 10 Jul 2025 15:49:12 +0200 Subject: [PATCH 190/251] =?UTF-8?q?=F0=9F=94=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/utils/benchmark.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/utils/benchmark.ts b/src/test/utils/benchmark.ts index 386af520..a45d079c 100644 --- a/src/test/utils/benchmark.ts +++ b/src/test/utils/benchmark.ts @@ -27,7 +27,7 @@ export async function benchmark any>( const totalDuration = new Duration(durations.reduce((acc, v) => acc + v.ms, 0)); const averageDuration = new Duration(totalDuration.ms / times); // eslint-disable-next-line @typescript-eslint/restrict-template-expressions - if (logStats) console.log(`Benchmark of ${f.name || "anonymous"}: ${averageDuration}`); + if (logStats) console.log(`Benchmark of ${f.name || "anonymous"} (${times} time${times > 1 ? "s" : ""}): ${averageDuration}`); return { fName: f.name, args, From e7e407e9b5f53575ef2aa4c1fdb4fd186d0d7af1 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Thu, 10 Jul 2025 15:50:27 +0200 Subject: [PATCH 191/251] =?UTF-8?q?=F0=9F=9A=A7=20Parametrize?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/index.ts | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/src/test/index.ts b/src/test/index.ts index 9ea3860a..08da9d8b 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -43,10 +43,6 @@ import TBMScheduledRoutesModelInit, { dbTBM_ScheduledRoutes } from "./models/TBM import { binarySearch, mapAsync, unpackRefType } from "./utils"; import { benchmark } from "./utils/benchmark"; -// In meters -const FP_REQ_MAX_LEN = 3_000; -const FP_RUN_MAX_LEN = 2_000; - async function queryData() { console.debug("Querying data..."); const sourceDB = await initDB("bibm"); @@ -122,13 +118,13 @@ async function queryData() { return { dbScheduledRoutes, stops, dbNonScheduledRoutes, TBMSchedulesModel, resultModel }; } -async function computeRAPTORData({ stops, dbNonScheduledRoutes, dbScheduledRoutes }: Awaited>) { +async function computeRAPTORData({ stops, dbNonScheduledRoutes, dbScheduledRoutes }: Awaited>, fpReqLen: number) { return [ TimeScal, await mapAsync<(typeof stops)[number], Stop>(stops, async ({ id, connectedRoutes }) => ({ id, connectedRoutes, - transfers: (await dbNonScheduledRoutes(id, { distance: { $lte: FP_REQ_MAX_LEN } })).map(({ to, distance }) => ({ + transfers: (await dbNonScheduledRoutes(id, { distance: { $lte: fpReqLen } })).map(({ to, distance }) => ({ to, length: distance, })), @@ -259,6 +255,9 @@ async function insertResults, CA extends [V, strin // Setup params from command line const args = minimist(process.argv); + const fpReqLen = "fp-req-len" in args ? (args["fp-req-len"] as number) : 3_000; + const fpRunLen = "fp-run-len" in args ? (args["fp-run-len"] as number) : 2_000; + let instanceType: "RAPTOR" | "SharedRAPTOR" | "McRAPTOR" | "McSharedRAPTOR"; if ("t" in args) { switch ((args.t as string).toLowerCase()) { @@ -293,6 +292,8 @@ async function insertResults, CA extends [V, strin if (criteria.length && instanceType !== "McRAPTOR" && instanceType !== "McSharedRAPTOR") console.warn("Got some criteria but instance type is uni-criteria."); + const saveResults = "save" in args && args.save === true ? true : false; + const b1 = await benchmark(queryData, []); const queriedData = b1.lastReturn; if (!queriedData) throw new Error("No queried data"); @@ -315,7 +316,7 @@ async function insertResults, CA extends [V, strin ? (args.pt as number) // Béthanie : 3846; - const b2 = await benchmark(computeRAPTORData, [queriedData]); + const b2 = await benchmark(computeRAPTORData, [queriedData, fpReqLen]); const rawRAPTORData = b2.lastReturn; if (!rawRAPTORData) throw new Error("No raw RAPTOR data"); @@ -426,7 +427,7 @@ async function insertResults, CA extends [V, strin const departureTime = (minSchedule + maxSchedule) / 2; - const settings: RAPTORRunSettings = { walkSpeed: 1.5, maxTransferLength: FP_RUN_MAX_LEN }; + const settings: RAPTORRunSettings = { walkSpeed: 1.5, maxTransferLength: fpRunLen }; function runRAPTOR() { RAPTORInstance.run(ps, pt, departureTime, settings); @@ -439,10 +440,11 @@ async function insertResults, CA extends [V, strin const b6 = await benchmark(resultRAPTOR, [], undefined, getResTimes); if (!b6.lastReturn) throw new Error(`No best journeys`); - await benchmark( - insertResults, - [queriedData.resultModel, RAPTORDataInst.timeType, from, { type: LocationType.TBM, id: pt }, departureTime, settings, b6.lastReturn], - ); + if (saveResults) + await benchmark( + insertResults, + [queriedData.resultModel, RAPTORDataInst.timeType, from, { type: LocationType.TBM, id: pt }, departureTime, settings, b6.lastReturn], + ); })() .then(() => { console.log("Main ended"); From d64bc27116506183820db1c9a96d5e1bb21e3ef3 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Thu, 10 Jul 2025 15:51:29 +0200 Subject: [PATCH 192/251] =?UTF-8?q?=F0=9F=94=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/index.ts | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/test/index.ts b/src/test/index.ts index 08da9d8b..69ba3ba4 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -254,8 +254,10 @@ async function insertResults, CA extends [V, strin (async () => { // Setup params from command line const args = minimist(process.argv); + console.debug(`Using args`, args); const fpReqLen = "fp-req-len" in args ? (args["fp-req-len"] as number) : 3_000; + console.debug(`Foot paths query max len`, fpReqLen); const fpRunLen = "fp-run-len" in args ? (args["fp-run-len"] as number) : 2_000; let instanceType: "RAPTOR" | "SharedRAPTOR" | "McRAPTOR" | "McSharedRAPTOR"; @@ -281,6 +283,7 @@ async function insertResults, CA extends [V, strin throw new Error(`Unexpected instance type "${args.t}"`); } } else instanceType = "McSharedRAPTOR"; + console.debug("Using instance type", instanceType); const createTimes = "createTimes" in args ? (args.createTimes as number) : 1; const runTimes = "runTimes" in args ? (args.runTimes as number) : 1; @@ -289,10 +292,15 @@ async function insertResults, CA extends [V, strin const criteria = [] as [] | [typeof footDistance] | [typeof bufferTime] | [typeof footDistance, typeof bufferTime]; if ("fd" in args && args.fd === true) (criteria as [typeof footDistance]).push(footDistance); if ("bt" in args && args.bt === true) (criteria as [typeof bufferTime]).push(bufferTime); + console.debug( + "Using criteria", + criteria.map((c) => c.name), + ); if (criteria.length && instanceType !== "McRAPTOR" && instanceType !== "McSharedRAPTOR") console.warn("Got some criteria but instance type is uni-criteria."); const saveResults = "save" in args && args.save === true ? true : false; + console.debug(`Saving results`, saveResults); const b1 = await benchmark(queryData, []); const queriedData = b1.lastReturn; @@ -432,6 +440,7 @@ async function insertResults, CA extends [V, strin function runRAPTOR() { RAPTORInstance.run(ps, pt, departureTime, settings); } + console.log(`Running with: ps=${ps}, pt=${pt}, departure time=${new Date(departureTime).toLocaleString()}, settings=${JSON.stringify(settings)}`); await benchmark(runRAPTOR, [], undefined, runTimes); function resultRAPTOR() { @@ -440,11 +449,13 @@ async function insertResults, CA extends [V, strin const b6 = await benchmark(resultRAPTOR, [], undefined, getResTimes); if (!b6.lastReturn) throw new Error(`No best journeys`); - if (saveResults) - await benchmark( + if (saveResults) { + const b7 = await benchmark( insertResults, [queriedData.resultModel, RAPTORDataInst.timeType, from, { type: LocationType.TBM, id: pt }, departureTime, settings, b6.lastReturn], ); + console.log("Saved result id", b7.lastReturn); + } })() .then(() => { console.log("Main ended"); From 2843652fb0ecd6b1421103b6a21d017a47506999 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Thu, 10 Jul 2025 17:06:20 +0200 Subject: [PATCH 193/251] =?UTF-8?q?=F0=9F=99=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index ca33e6f9..cee9e04b 100644 --- a/.gitignore +++ b/.gitignore @@ -114,8 +114,5 @@ lib/ docs/ # Test -test.sh *.geojson -flamegraph*.html -isolate-0x*.json -prof_preproc*.json +bench/ From e35e9660ce3456836f7f0343959082d2502edfc3 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Thu, 10 Jul 2025 17:06:47 +0200 Subject: [PATCH 194/251] =?UTF-8?q?=F0=9F=94=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/test/index.ts b/src/test/index.ts index 69ba3ba4..25fb4890 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -448,6 +448,7 @@ async function insertResults, CA extends [V, strin } const b6 = await benchmark(resultRAPTOR, [], undefined, getResTimes); if (!b6.lastReturn) throw new Error(`No best journeys`); + console.debug("Best journeys", b6.lastReturn); if (saveResults) { const b7 = await benchmark( From 21985207ab83750f4cabe32c26ec3b48c5ecfbb1 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Thu, 10 Jul 2025 17:06:59 +0200 Subject: [PATCH 195/251] =?UTF-8?q?=F0=9F=90=9B=20Force=20exiting=20at=20t?= =?UTF-8?q?he=20end?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/index.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/test/index.ts b/src/test/index.ts index 25fb4890..5f565145 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -6,6 +6,7 @@ import "core-js/features/reflect"; import { DocumentType } from "@typegoose/typegoose"; import minimist from "minimist"; import { FilterQuery } from "mongoose"; +import { exit } from "process"; import { bufferTime, footDistance, @@ -460,5 +461,6 @@ async function insertResults, CA extends [V, strin })() .then(() => { console.log("Main ended"); + exit(0); }) .catch(console.error); From 618f444346eeacddf03fd7d382fe5dbc644b571a Mon Sep 17 00:00:00 2001 From: Catatomik Date: Thu, 10 Jul 2025 17:07:11 +0200 Subject: [PATCH 196/251] =?UTF-8?q?=E2=9C=A8=20Auto=20benchmark?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bench.sh | 73 ++ package.json | 1 + pnpm-lock.yaml | 1967 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 2041 insertions(+) create mode 100644 bench.sh diff --git a/bench.sh b/bench.sh new file mode 100644 index 00000000..ff51062c --- /dev/null +++ b/bench.sh @@ -0,0 +1,73 @@ +#!/bin/sh + +TIMES=1 +while getopts 'gct:d:' ARG; do + case $ARG in + g) + GLOBAL=true + ;; + c) + # Criteria + CRITERIA=true + ;; + t) + TIMES="$OPTARG" + echo "$TIMES" | grep -E '^[0-9]+$' || { echo "Invalid times to run: $TIMES"; exit 1; } + ;; + d) + echo "$OPTARG" | grep -E '^[0-9]+$' || { echo "Invalid run transfer max len: $OPTARG"; exit 1; } + FOOT_DISTANCE="--fp-run-len $OPTARG" + ;; + *) + echo "Options are: -g (global) -c (criteria) -t (times to run)" + exit 1 + ;; + esac +done + +shift $((OPTIND - 1)) + +echo "Running $TIMES time(s)" + +pnpm run build +mkdir bench 2>/dev/null || true + +if [ -n "$GLOBAL" ]; then + for INSTANCE in \ + 'r' \ + 'sr' \ + 'mcr' \ + 'mcsr' + do + FOLDER="bench/$INSTANCE" + mkdir "$FOLDER" 2>/dev/null || true + echo "Bench instance $INSTANCE" + pnpm exec 0x -D "$FOLDER" lib/test/index.js -t "$INSTANCE" "$FOOT_DISTANCE" --runTimes "$TIMES" 1>"$FOLDER/out.txt" 2>/dev/null + sed -i "s|$(dirname "$PWD")/||g" "$FOLDER/flamegraph.html" + echo "Done at: $FOLDER/flamegraph.html" + done +fi + +if [ -n "$CRITERIA" ]; then + # Multi-criteria specific + for INSTANCE in \ + 'mcr' \ + 'mcsr' + do + for CRITERIA in \ + '--fd' \ + '--bt' \ + '--fd --bt' + do + FOLDER="bench/$INSTANCE$(echo "$CRITERIA" | sed 's/ //g')" + mkdir "$FOLDER" 2>/dev/null || true + echo "Bench instance $INSTANCE with criteria $CRITERIA" + # shellcheck disable=SC2086 + pnpm exec 0x -D "$FOLDER" lib/test/index.js -t "$INSTANCE" "$FOOT_DISTANCE" $CRITERIA --runTimes "$TIMES" 1>"$FOLDER/out.txt" 2>/dev/null + sed -i "s|$(dirname "$PWD")/||g" "$FOLDER/flamegraph.html" + echo "Done at: $FOLDER/flamegraph.html" + done + done +fi + +# UI doc https://github.com/davidmarkclements/0x/blob/master/docs/ui.md diff --git a/package.json b/package.json index 420b7cb5..bb385d10 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,7 @@ "mongoose": "^8.16.2" }, "devDependencies": { + "0x": "^6.0.0", "@jest/globals": "^30.0.4", "@tsconfig/node22": "^22.0.2", "@types/minimist": "^1.2.5", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index eff87fc1..a3248889 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -27,6 +27,9 @@ importers: specifier: ^8.16.2 version: 8.16.2 devDependencies: + 0x: + specifier: ^6.0.0 + version: 6.0.0 '@jest/globals': specifier: ^30.0.4 version: 30.0.4 @@ -66,6 +69,11 @@ importers: packages: + 0x@6.0.0: + resolution: {integrity: sha512-4JrGHSPTaoEL3MZiKYH5BlNv67X2F48FmR3dKJZOoR/Z1CLVtVOwUb/n4PMf7B+sP9RPz+X50EbIFuwtfYguRQ==} + engines: {node: '>=8.5.0'} + hasBin: true + '@ampproject/remapping@2.3.0': resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} @@ -696,11 +704,27 @@ packages: cpu: [x64] os: [win32] + JSONStream@1.3.5: + resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} + hasBin: true + acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + acorn-node@1.8.2: + resolution: {integrity: sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==} + + acorn-walk@7.2.0: + resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} + engines: {node: '>=0.4.0'} + + acorn@7.4.1: + resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} + engines: {node: '>=0.4.0'} + hasBin: true + acorn@8.15.0: resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} engines: {node: '>=0.4.0'} @@ -709,10 +733,17 @@ packages: ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + ansi-escapes@4.3.2: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'} + ansi-regex@2.1.1: + resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} + engines: {node: '>=0.10.0'} + ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -721,6 +752,10 @@ packages: resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} engines: {node: '>=12'} + ansi-styles@2.2.1: + resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} + engines: {node: '>=0.10.0'} + ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} @@ -743,9 +778,19 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + asn1.js@4.10.1: + resolution: {integrity: sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==} + + assert@1.5.1: + resolution: {integrity: sha512-zzw1uCAgLbsKwBfFc8CX78DDg+xZeBksSO3vwVIDDN5i94eOrPsSSyiVhmsSABFDM/OcpE2aagCat9dnWQLG1A==} + async@3.2.6: resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + babel-jest@30.0.4: resolution: {integrity: sha512-UjG2j7sAOqsp2Xua1mS/e+ekddkSu3wpf4nZUSvXNHuVWdaOUXQ77+uyjJLDE9i0atm5x4kds8K9yb5lRsRtcA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -774,6 +819,15 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + bn.js@4.12.2: + resolution: {integrity: sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==} + + bn.js@5.2.2: + resolution: {integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==} + brace-expansion@1.1.12: resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} @@ -784,6 +838,44 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} + brorand@1.1.0: + resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} + + browser-pack@6.1.0: + resolution: {integrity: sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==} + hasBin: true + + browser-process-hrtime@0.1.3: + resolution: {integrity: sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw==} + + browser-resolve@2.0.0: + resolution: {integrity: sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==} + + browserify-aes@1.2.0: + resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} + + browserify-cipher@1.0.1: + resolution: {integrity: sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==} + + browserify-des@1.0.2: + resolution: {integrity: sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==} + + browserify-rsa@4.1.1: + resolution: {integrity: sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ==} + engines: {node: '>= 0.10'} + + browserify-sign@4.2.3: + resolution: {integrity: sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==} + engines: {node: '>= 0.12'} + + browserify-zlib@0.2.0: + resolution: {integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==} + + browserify@17.0.1: + resolution: {integrity: sha512-pxhT00W3ylMhCHwG5yfqtZjNnFuX5h2IJdaBfSo4ChaaBsIp9VLrEMQ1bHV+Xr1uLPXuNDDM1GlJkjli0qkRsw==} + engines: {node: '>= 0.8'} + hasBin: true + browserslist@4.25.1: resolution: {integrity: sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} @@ -803,10 +895,37 @@ packages: buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + buffer-xor@1.0.3: + resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} + + buffer@5.2.1: + resolution: {integrity: sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==} + + builtin-status-codes@3.0.0: + resolution: {integrity: sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==} + + cached-path-relative@1.1.0: + resolution: {integrity: sha512-WF0LihfemtesFcJgO7xfOoOcnWzY/QHR4qeDqV44jPU3HTI54+LnfXK3SA27AVVGCdZFgjjFFaqUA9Jx7dMJZA==} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} + camel-case@3.0.0: + resolution: {integrity: sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==} + camelcase@5.3.1: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} @@ -818,6 +937,10 @@ packages: caniuse-lite@1.0.30001727: resolution: {integrity: sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==} + chalk@1.1.3: + resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} + engines: {node: '>=0.10.0'} + chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} @@ -830,6 +953,10 @@ packages: resolution: {integrity: sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ==} engines: {node: '>=8'} + cipher-base@1.0.6: + resolution: {integrity: sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw==} + engines: {node: '>= 0.10'} + cjs-module-lexer@2.1.0: resolution: {integrity: sha512-UX0OwmYRYQQetfrLEZeewIFFI+wSTofC+pMBLNuH3RUuu/xzG1oz84UCEDOSoQlN3fZ4+AzmV50ZYvGqkMh9yA==} @@ -841,6 +968,10 @@ packages: resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + code-point-at@1.1.0: + resolution: {integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==} + engines: {node: '>=0.10.0'} + collect-v8-coverage@1.0.2: resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} @@ -851,19 +982,121 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + combine-source-map@0.8.0: + resolution: {integrity: sha512-UlxQ9Vw0b/Bt/KYwCFqdEwsQ1eL8d1gibiFb7lxQJFdvTgc2hIZi6ugsg+kyhzhPV+QEpUiEIwInIAIrgoEkrg==} + concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + concat-stream@1.6.2: + resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} + engines: {'0': node >= 0.8} + + concat-stream@2.0.0: + resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} + engines: {'0': node >= 6.0} + + console-browserify@1.2.0: + resolution: {integrity: sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==} + + constants-browserify@1.0.0: + resolution: {integrity: sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==} + + convert-source-map@1.1.3: + resolution: {integrity: sha512-Y8L5rp6jo+g9VEPgvqNfEopjTR4OTYct8lXlS8iVQdmnjDvbdbzYe9rjtFCB9egC86JoNCU61WRY+ScjkZpnIg==} + + convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} core-js@3.44.0: resolution: {integrity: sha512-aFCtd4l6GvAXwVEh3XbbVqJGHDJt0OZRa+5ePGx3LLwi12WfexqQxcsohb2wgsa/92xtl19Hd66G/L+TaAxDMw==} + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + create-ecdh@4.0.4: + resolution: {integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==} + + create-hash@1.1.3: + resolution: {integrity: sha512-snRpch/kwQhcdlnZKYanNF1m0RDlrCdSKQaH87w1FCFPVPNCQ/Il9QJKAX2jVBZddRdaHBMC+zXa9Gw9tmkNUA==} + + create-hash@1.2.0: + resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} + + create-hmac@1.1.7: + resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==} + cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} + crypto-browserify@3.12.1: + resolution: {integrity: sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ==} + engines: {node: '>= 0.10'} + + d3-array@2.12.1: + resolution: {integrity: sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==} + + d3-color@1.4.1: + resolution: {integrity: sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==} + + d3-color@2.0.0: + resolution: {integrity: sha512-SPXi0TSKPD4g9tw0NMZFnR95XVgUZiBH+uUTqQuDu1OsE2zomHU7ho0FISciaPvosimixwHFl3WHLGabv6dDgQ==} + + d3-dispatch@1.0.6: + resolution: {integrity: sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==} + + d3-drag@1.2.5: + resolution: {integrity: sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w==} + + d3-ease@1.0.7: + resolution: {integrity: sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ==} + + d3-fg@6.14.0: + resolution: {integrity: sha512-M4QpFZOEvAq4ZDzwabJp2inL+KXS85T2SQl00zWwjnolaCJR+gHxUbT7Ha4GxTeW1NXwzbykhv/38I1fxQqbyg==} + + d3-format@2.0.0: + resolution: {integrity: sha512-Ab3S6XuE/Q+flY96HXT0jOXcM4EAClYFnRGY5zsjRGNy6qCYrQsMffs7cV5Q9xejb35zxW5hf/guKw34kvIKsA==} + + d3-hierarchy@1.1.9: + resolution: {integrity: sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==} + + d3-interpolate@1.4.0: + resolution: {integrity: sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==} + + d3-interpolate@2.0.1: + resolution: {integrity: sha512-c5UhwwTs/yybcmTpAVqwSFl6vrQ8JZJoT5F7xNFK9pymv5C0Ymcc9/LIJHtYIggg/yS9YHw8i8O8tgb9pupjeQ==} + + d3-scale@3.3.0: + resolution: {integrity: sha512-1JGp44NQCt5d1g+Yy+GeOnZP7xHo0ii8zsQp6PGzd+C1/dl0KGsp9A7Mxwp+1D1o4unbTTxVdU/ZOIEBoeZPbQ==} + + d3-selection@1.4.2: + resolution: {integrity: sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg==} + + d3-time-format@3.0.0: + resolution: {integrity: sha512-UXJh6EKsHBTjopVqZBhFysQcoXSv/5yLONZvkQ5Kk3qbwiUYkdX17Xa1PT6U1ZWXGGfB1ey5L8dKMlFq2DO0Ag==} + + d3-time@2.1.1: + resolution: {integrity: sha512-/eIQe/eR4kCQwq7yxi7z4c6qEXf2IYGcjoWB5OOQy4Tq9Uv39/947qlDcN2TLkiTzQWzvnsuYPB9TrWaNfipKQ==} + + d3-timer@1.0.10: + resolution: {integrity: sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==} + + d3-transition@1.3.2: + resolution: {integrity: sha512-sc0gRU4PFqZ47lPVHloMn9tlPcv8jxgOQg+0zjhfZXMQuvppjG6YuwdMBE0TuqCZjeJkLecku/l9R0JPcRhaDA==} + + d3-zoom@1.8.3: + resolution: {integrity: sha512-VoLXTK4wvy1a0JpH2Il+F2CiOhVu7VRXWF5M/LroMIh3/zBAC3WAt7QoIvPibOavVo20hN6/37vwAsdBejLyKQ==} + + dash-ast@1.0.0: + resolution: {integrity: sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==} + + debounce@1.2.1: + resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} + debug@4.4.1: resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} engines: {node: '>=6.0'} @@ -888,10 +1121,50 @@ packages: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + defined@1.0.1: + resolution: {integrity: sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==} + + deps-sort@2.0.1: + resolution: {integrity: sha512-1orqXQr5po+3KI6kQb9A4jnXT1PBwggGl2d7Sq2xsnOeI9GPcE/tGcF9UiSZtZBM7MukY4cAh7MemS6tZYipfw==} + hasBin: true + + des.js@1.1.0: + resolution: {integrity: sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==} + detect-newline@3.1.0: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} engines: {node: '>=8'} + detective@5.2.1: + resolution: {integrity: sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==} + engines: {node: '>=0.8.0'} + hasBin: true + + diffie-hellman@5.0.3: + resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==} + + domain-browser@1.2.0: + resolution: {integrity: sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==} + engines: {node: '>=0.4', npm: '>=1.2'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + duplexer2@0.1.4: + resolution: {integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==} + + duplexify@4.1.3: + resolution: {integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==} + eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} @@ -903,6 +1176,9 @@ packages: electron-to-chromium@1.5.180: resolution: {integrity: sha512-ED+GEyEh3kYMwt2faNmgMB0b8O5qtATGgR4RmRsIp4T6p7B8vdMbIedYndnvZfsaXvSzegtpfqRMDNCjjiSduA==} + elliptic@6.6.1: + resolution: {integrity: sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==} + emittery@0.13.1: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} engines: {node: '>=12'} @@ -913,17 +1189,39 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} + entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} + env-string@1.0.1: + resolution: {integrity: sha512-/DhCJDf5DSFK32joQiWRpWrT0h7p3hVQfMKxiBb7Nt8C8IF8BYyPtclDnuGGLOoj16d/8udKeiE7JbkotDmorQ==} + error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + escape-string-regexp@2.0.0: resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} engines: {node: '>=8'} @@ -975,14 +1273,27 @@ packages: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} + estree-is-member-expression@1.0.0: + resolution: {integrity: sha512-Ec+X44CapIGExvSZN+pGkmr5p7HwUVQoPQSd458Lqwvaf4/61k/invHSh4BYK8OXnCkfEhWuIoG5hayKLQStIg==} + esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + evp_bytestokey@1.0.3: + resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} + execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} + execspawn@1.0.1: + resolution: {integrity: sha512-s2k06Jy9i8CUkYe0+DxRlvtkZoOkwwfhB+Xxo5HGUtrISVW2m98jO2tr67DGRFxZwkjQqloA3v/tNtjhBRBieg==} + exit-x@0.2.2: resolution: {integrity: sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==} engines: {node: '>= 0.8.0'} @@ -1004,6 +1315,12 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + fast-safe-stringify@2.1.1: + resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + + fast-uri@3.0.6: + resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} + fastq@1.19.1: resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} @@ -1036,10 +1353,18 @@ packages: flatted@3.3.3: resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + foreground-child@3.3.1: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} + fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -1048,18 +1373,32 @@ packages: engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} + get-assigned-identifiers@1.2.0: + resolution: {integrity: sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==} + get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + get-package-type@0.1.0: resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} engines: {node: '>=8.0.0'} + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} @@ -1088,23 +1427,81 @@ packages: resolution: {integrity: sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ==} engines: {node: '>=18'} + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + has-ansi@2.0.0: + resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} + engines: {node: '>=0.10.0'} + has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + has-unicode@2.0.1: + resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} + + hash-base@2.0.2: + resolution: {integrity: sha512-0TROgQ1/SxE6KmxWSvXHvRj90/Xo1JvZShofnYF+f6ZsGtR4eES7WfrQzPalmyagfKZCXpVnitiRebZulWsbiw==} + + hash-base@3.0.5: + resolution: {integrity: sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg==} + engines: {node: '>= 0.10'} + + hash.js@1.1.7: + resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hmac-drbg@1.0.1: + resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} + + hsl-to-rgb-for-reals@1.1.1: + resolution: {integrity: sha512-LgOWAkrN0rFaQpfdWBQlv/VhkOxb5AsBjk6NQVx4yEzWS923T07X0M1Y0VNko2H52HeSpZrZNNMJ0aFqsdVzQg==} + html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + htmlescape@1.1.1: + resolution: {integrity: sha512-eVcrzgbR4tim7c7soKQKtxa/kQM4TzjnlU83rcZ9bHU6t31ehfV7SktN6McWgwPWg+JYMA/O3qpGxBvFq1z2Jg==} + engines: {node: '>=0.10'} + + https-browserify@1.0.0: + resolution: {integrity: sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==} + human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} + hyperscript-attribute-to-property@1.0.2: + resolution: {integrity: sha512-oerMul16jZCmrbNsUw8QgrtDzF8lKgFri1bKQjReLw1IhiiNkI59CWuzZjJDGT79UQ1YiWqXhJMv/tRMVqgtkA==} + + hyperx@2.5.4: + resolution: {integrity: sha512-iOkSh7Yse7lsN/B9y7OsevLWjeXPqGuHQ5SbwaiJM5xAhWFqhoN6erpK1dQsS12OFU36lyai1pnx1mmzWLQqcA==} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} @@ -1130,16 +1527,55 @@ packages: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + inherits@2.0.3: + resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} + inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + inline-source-map@0.6.3: + resolution: {integrity: sha512-1aVsPEsJWMJq/pdMU61CDlm1URcW702MTB4w9/zUjMus6H/Py8o7g68Pr9D4I6QluWGt/KdmswuRhaA05xVR1w==} + + insert-module-globals@7.2.1: + resolution: {integrity: sha512-ufS5Qq9RZN+Bu899eA9QCAYThY+gGW7oRkmb0vC93Vlyu/CFGcH0OYPEjVkDXA5FEbTt1+VWzdoOD3Ny9N+8tg==} + hasBin: true + + internmap@1.0.1: + resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} + + is-arguments@1.2.0: + resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} + engines: {node: '>= 0.4'} + is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + is-boolean-attribute@0.0.1: + resolution: {integrity: sha512-0kXT52Scokg2Miscvsn5UVqg6y1691vcLJcagie1YHJB4zOEuAhMERLX992jtvaStGy2xQTqOtJhvmG/MK1T5w==} + + is-buffer@1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + + is-buffer@2.0.5: + resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} + engines: {node: '>=4'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} + is-fullwidth-code-point@1.0.0: + resolution: {integrity: sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==} + engines: {node: '>=0.10.0'} + is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} @@ -1148,6 +1584,10 @@ packages: resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} engines: {node: '>=6'} + is-generator-function@1.1.0: + resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} + engines: {node: '>= 0.4'} + is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} @@ -1156,10 +1596,28 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + is-stream@2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + + is-wsl@1.1.0: + resolution: {integrity: sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==} + engines: {node: '>=4'} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -1344,6 +1802,9 @@ packages: json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} @@ -1352,6 +1813,18 @@ packages: engines: {node: '>=6'} hasBin: true + jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + + jsonparse@1.3.1: + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} + + jsonstream2@3.0.0: + resolution: {integrity: sha512-8ngq2XB8NjYrpe3+Xtl9lFJl6RoV2dNT4I7iyaHwxUpTBwsj0AlAR7epGfeYVP0z4Z7KxMoSxRgJWrd2jmBT/Q==} + engines: {node: '>=5.10.0'} + hasBin: true + kareem@2.6.3: resolution: {integrity: sha512-C3iHfuGUXK2u8/ipq9LfjFfXFxAZMQJJq7vLS45r3D9Y2xQ/m4S8zaR4zMLFWh9AsNPXmcFfUDhTEO8UIC/V6Q==} engines: {node: '>=12.0.0'} @@ -1359,6 +1832,9 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + labeled-stream-splicer@2.0.2: + resolution: {integrity: sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw==} + leven@3.1.0: resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} engines: {node: '>=6'} @@ -1381,6 +1857,9 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} + lodash.memoize@3.0.4: + resolution: {integrity: sha512-eDn9kqrAmVUC1wmZvlQ6Uhde44n+tXpqPrN8olQJbttgh0oKclk+SF54P47VEGE9CEiMeRwAP8BaM7UHvBkz2A==} + lodash.memoize@4.1.2: resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} @@ -1394,6 +1873,9 @@ packages: resolution: {integrity: sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==} engines: {node: '>= 0.6.0'} + lower-case@1.1.4: + resolution: {integrity: sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==} + lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} @@ -1403,6 +1885,13 @@ packages: lunr@2.3.9: resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} + magic-string@0.23.2: + resolution: {integrity: sha512-oIUZaAxbcxYIp4AyLafV6OVKoB3YouZs0UTCJ8mOKBHNyJgGDaMJ4TgA+VylJh6fx7EQCC52XkbURxxG9IoJXA==} + + make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + make-dir@4.0.0: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} @@ -1417,12 +1906,22 @@ packages: resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} hasBin: true + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + md5.js@1.3.5: + resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} + mdurl@2.0.0: resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} memory-pager@1.5.0: resolution: {integrity: sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==} + merge-source-map@1.0.4: + resolution: {integrity: sha512-PGSmS0kfnTnMJCzJ16BLLCEe6oeYCamKFFdQKshi4BmM6FUwipjVOcBFGxqtQtirtAG4iZvHlqST9CpZKqlRjA==} + merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -1434,10 +1933,20 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} + miller-rabin@4.0.1: + resolution: {integrity: sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==} + hasBin: true + mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} + minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + + minimalistic-crypto-utils@1.0.1: + resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} + minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -1456,6 +1965,14 @@ packages: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} + mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + + module-deps@6.2.3: + resolution: {integrity: sha512-fg7OZaQBcL4/L+AK5f4iVqf9OMbCclXfy/znXRxTVhJSeW5AIlS9AwheYwDaXM3lVW7OBeaeUEY3gbaC6cLlSA==} + engines: {node: '>= 0.8.0'} + hasBin: true + mongodb-connection-string-url@3.0.2: resolution: {integrity: sha512-rMO7CGo/9BFwyZABcKAWL8UJwH/Kc2x0g72uhDWzG48URRax5TCIcJ7Rc3RZqffZzO/Gwff/jyKwCU9TN8gehA==} @@ -1490,6 +2007,9 @@ packages: resolution: {integrity: sha512-52T4XPhDgJL4cqooBsOORzYBH3ddMwABMEF/LV7TgvD2DEKZlnYTc2HF9ch1U2lcKjhE4pQ+WuInfLFJbguGcQ==} engines: {node: '>=16.20.1'} + morphdom@2.7.5: + resolution: {integrity: sha512-z6bfWFMra7kBqDjQGHud1LSXtq5JJC060viEkQFMBX6baIecpkNr2Ywrn2OQfWP3rXiNFQRPoFjD8/TvJcWcDg==} + mpath@0.9.0: resolution: {integrity: sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==} engines: {node: '>=4.0.0'} @@ -1501,6 +2021,19 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + mutexify@1.4.0: + resolution: {integrity: sha512-pbYSsOrSB/AKN5h/WzzLRMFgZhClWccf2XIB4RSMC8JbquiB0e0/SH5AIfdQMdyHmYtv4seU7yV/TvAwPLJ1Yg==} + + nanoassert@1.1.0: + resolution: {integrity: sha512-C40jQ3NzfkP53NsO8kEOFd79p4b9kDXQMwgiY1z8ZwrDZgUyom0AHwGegF4Dm99L+YoYhuaB0ceerUcXmqr1rQ==} + + nanobench@2.1.1: + resolution: {integrity: sha512-z+Vv7zElcjN+OpzAxAquUayFLGK3JI/ubCl0Oh64YQqsTGG09CGqieJVQw4ui8huDnnAgrvTv93qi5UaOoNj8A==} + hasBin: true + + nanohtml@1.10.0: + resolution: {integrity: sha512-r/3AQl+jxAxUIJRiKExUjBtFcE1cm4yTOsTIdVqqlxPNtBxJh522ANrcQYzdNHhPzbPgb7j6qujq6eGehBX0kg==} + napi-postinstall@0.3.0: resolution: {integrity: sha512-M7NqKyhODKV1gRLdkwE7pDsZP2/SC2a2vHkOYh9MCpKMbWVfyVfUw5MaH83Fv6XMjxr5jryUp3IDDL9rlxsTeA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} @@ -1509,12 +2042,19 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + no-case@2.3.2: + resolution: {integrity: sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==} + node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} node-releases@2.0.19: resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + normalize-html-whitespace@0.2.0: + resolution: {integrity: sha512-5CZAEQ4bQi8Msqw0GAT6rrkrjNN4ZKqAG3+jJMwms4O6XoMvh6ekwOueG4mRS1LbPUR1r9EdnhxxfpzMTOdzKw==} + engines: {node: '>= 0.10'} + normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} @@ -1523,6 +2063,26 @@ packages: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} + number-is-nan@1.0.1: + resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + + on-net-listen@1.1.2: + resolution: {integrity: sha512-y1HRYy8s/RlcBvDUwKXSmkODMdx4KSuIvloCnQYJ2LdBBC1asY4HtfhXwe3UWknLakATZDnbzht2Ijw3M1EqFg==} + engines: {node: '>=9.4.0 || ^8.9.4'} + once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} @@ -1530,10 +2090,17 @@ packages: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} + opn@5.5.0: + resolution: {integrity: sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==} + engines: {node: '>=4'} + optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} + os-browserify@0.3.0: + resolution: {integrity: sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==} + p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} @@ -1557,14 +2124,27 @@ packages: package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + pako@1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} + parents@1.0.1: + resolution: {integrity: sha512-mXKF3xkoUt5td2DoxpLmtOmZvko9VfFpwRwkKDHSNvgmpLAeBo18YDhcPbBzJq+QLCHMbGOfzia2cX4U+0v9Mg==} + + parse-asn1@5.1.7: + resolution: {integrity: sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==} + engines: {node: '>= 0.10'} + parse-json@5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -1577,10 +2157,21 @@ packages: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-platform@0.11.15: + resolution: {integrity: sha512-Y30dB6rab1A/nfEKsZxmr01nUotHX0c/ZiIAsCTatEe1CmS5Pm5He7fZ195bPT7RdquoaL8lLxFCMQi/bS7IJg==} + engines: {node: '>= 0.8.0'} + path-scurry@1.11.1: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} + pbkdf2@3.1.3: + resolution: {integrity: sha512-wfRLBZ0feWRhCIkoMB6ete7czJcnNnqRpcoWQBLqatqXXmelSRqfdDK4F3u9T2s2cXas/hQJcryI/4lAL+XTlA==} + engines: {node: '>=0.12'} + picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -1600,6 +2191,10 @@ packages: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} + prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -1613,10 +2208,33 @@ packages: resolution: {integrity: sha512-yC5/EBSOrTtqhCKfLHqoUIAXVRZnukHPwWBJWR7h84Q3Be1DRQZLncwcfLoPA5RPQ65qfiCMqgYwdUuQ//eVpg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + pretty-hrtime@1.0.3: + resolution: {integrity: sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==} + engines: {node: '>= 0.8'} + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + + public-encrypt@4.0.3: + resolution: {integrity: sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==} + + pump@3.0.3: + resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} + + pumpify@2.0.1: + resolution: {integrity: sha512-m7KOje7jZxrmutanlkS1daj1dS6z6BgslzOXmcSEpIlCxM3VJH7lG5QLeck/6hgF6F4crFf01UtQmNsJfweTAw==} + punycode.js@2.3.1: resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} engines: {node: '>=6'} + punycode@1.4.1: + resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} + punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -1624,12 +2242,39 @@ packages: pure-rand@7.0.1: resolution: {integrity: sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ==} + qs@6.14.0: + resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} + engines: {node: '>=0.6'} + + querystring-es3@0.2.1: + resolution: {integrity: sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==} + engines: {node: '>=0.4.x'} + queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + queue-tick@1.0.1: + resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + randomfill@1.0.4: + resolution: {integrity: sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==} + react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + read-only-stream@2.0.0: + resolution: {integrity: sha512-3ALe0bjBVZtkdWKIcThYpQCLbBMd/+Tbh2CDSrAIDO3UsZ4Xs+tnyjv2MjCOMMgBG+AsUOeuP1cgtY1INISc8w==} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + reflect-metadata@0.2.2: resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==} @@ -1637,6 +2282,10 @@ packages: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + resolve-cwd@3.0.0: resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} engines: {node: '>=8'} @@ -1649,13 +2298,34 @@ packages: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} + resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} + hasBin: true + reusify@1.1.0: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + ripemd160@2.0.1: + resolution: {integrity: sha512-J7f4wutN8mdbV08MJnXibYpCOPHR+yzy+iQ/AsjMv2j8cLavQ8VGagDFUwwTAdF8FmRKVeNpbTTEwNHCW1g94w==} + + ripemd160@2.0.2: + resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} + run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true @@ -1665,6 +2335,18 @@ packages: engines: {node: '>=10'} hasBin: true + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + sha.js@2.4.12: + resolution: {integrity: sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==} + engines: {node: '>= 0.10'} + hasBin: true + + shasum-object@1.0.0: + resolution: {integrity: sha512-Iqo5rp/3xVi6M4YheapzZhhGPVs0yZwHj7wvwQ1B9z8H6zk+FEnI7y3Teq7qwnekfEhu8WmG2z0z4iWZaxLWVg==} + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -1673,6 +2355,26 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + shell-quote@1.8.3: + resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} + engines: {node: '>= 0.4'} + + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + sift@17.1.3: resolution: {integrity: sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ==} @@ -1683,6 +2385,12 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + + single-line-log@1.1.2: + resolution: {integrity: sha512-awzaaIPtYFdexLr6TBpcZSGPB6D1RInNO/qNetgaJloPDF/D0GkVtLvGEp8InfmLV7CyLyQ5fIRP+tVN/JmWQA==} + slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} @@ -1690,13 +2398,25 @@ packages: source-map-support@0.5.13: resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} + source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} + sourcemap-codec@1.4.8: + resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} + deprecated: Please use @jridgewell/sourcemap-codec instead + sparse-bitfield@3.0.3: resolution: {integrity: sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==} + split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} @@ -1704,10 +2424,29 @@ packages: resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} engines: {node: '>=10'} + stream-browserify@3.0.0: + resolution: {integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==} + + stream-combiner2@1.1.1: + resolution: {integrity: sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==} + + stream-http@3.2.0: + resolution: {integrity: sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==} + + stream-shift@1.0.3: + resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} + + stream-splicer@2.0.1: + resolution: {integrity: sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg==} + string-length@4.0.2: resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} engines: {node: '>=10'} + string-width@1.0.2: + resolution: {integrity: sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==} + engines: {node: '>=0.10.0'} + string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -1716,6 +2455,16 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@3.0.1: + resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} + engines: {node: '>=0.10.0'} + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -1736,6 +2485,13 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + subarg@1.0.0: + resolution: {integrity: sha512-RIrIdRY0X1xojthNcVtgT9sjpOGagEUKpZdgBUi054OEPFo282yg+zE+t1Rj3+RqKq2xStL7uUHhY+AjbC4BXg==} + + supports-color@2.0.0: + resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} + engines: {node: '>=0.8.0'} + supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -1744,17 +2500,47 @@ packages: resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} engines: {node: '>=10'} + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + synckit@0.11.8: resolution: {integrity: sha512-+XZ+r1XGIJGeQk3VvXhT6xx/VpbHsRzsTkGgF6E5RX9TTXD0118l87puaEBZ566FhqblC6U0d4XnubznJDm30A==} engines: {node: ^14.18.0 || >=16.0.0} + syntax-error@1.4.0: + resolution: {integrity: sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==} + + tachyons@4.12.0: + resolution: {integrity: sha512-2nA2IrYFy3raCM9fxJ2KODRGHVSZNTW3BR0YnlGsLUf1DA3pk3YfWZ/DdfbnZK6zLZS+jUenlUGJsKcA5fUiZg==} + test-exclude@6.0.0: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} + through2@2.0.5: + resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + + through2@3.0.2: + resolution: {integrity: sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==} + + through2@4.0.2: + resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} + + through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + + timers-browserify@1.4.2: + resolution: {integrity: sha512-PIxwAupJZiYU4JmVZYwXp9FKsHMXb5h0ZEFyuXTAn8WLHOlcij+FEcbrvDsom1o5dr1YggEtFbECvGCW2sT53Q==} + engines: {node: '>=0.6.0'} + tmpl@1.0.5: resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + to-buffer@1.2.1: + resolution: {integrity: sha512-tB82LpAIWjhLYbqjx3X4zEeHN6M8CiuOEy2JY8SEQVdYRe3CCHOFaqrBW1doLDrfpWhplcW7BL+bO3/6S3pcDQ==} + engines: {node: '>= 0.4'} + to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -1763,6 +2549,9 @@ packages: resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==} engines: {node: '>=18'} + transform-ast@2.4.4: + resolution: {integrity: sha512-AxjeZAcIOUO2lev2GDe3/xZ1Q0cVGjIMk5IsriTy8zbWlsEnjeB025AhkhBJHoy997mXpLd4R+kRbvnnQVuQHQ==} + ts-api-utils@2.1.0: resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} engines: {node: '>=18.12'} @@ -1799,10 +2588,16 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + tty-browserify@0.0.1: + resolution: {integrity: sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==} + type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} + type-component@0.0.1: + resolution: {integrity: sha512-mDZRBQS2yZkwRQKfjJvQ8UIYJeBNNWCq+HBNstl9N5s9jZ4dkVYXEGkVPsSCEh5Ld4JM1kmrZTzjnrqSAIQ7dw==} + type-detect@4.0.8: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} engines: {node: '>=4'} @@ -1815,6 +2610,13 @@ packages: resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} engines: {node: '>=16'} + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + + typedarray@0.0.6: + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + typedoc@0.28.7: resolution: {integrity: sha512-lpz0Oxl6aidFkmS90VQDQjk/Qf2iw0IUvFqirdONBdj7jPSN9mGXhy66BcGNDxx5ZMyKKiBVAREvPEzT6Uxipw==} engines: {node: '>= 18', pnpm: '>= 10'} @@ -1837,9 +2639,21 @@ packages: uc.micro@2.1.0: resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} + umd@3.0.3: + resolution: {integrity: sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==} + hasBin: true + + undeclared-identifiers@1.1.3: + resolution: {integrity: sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw==} + hasBin: true + undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + unrs-resolver@1.11.0: resolution: {integrity: sha512-uw3hCGO/RdAEAb4zgJ3C/v6KIAFFOtBoxR86b2Ejc5TnH7HrhTWJR2o0A9ullC3eWMegKQCw/arQ/JivywQzkg==} @@ -1849,13 +2663,35 @@ packages: peerDependencies: browserslist: '>= 4.21.0' + upper-case@1.1.3: + resolution: {integrity: sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==} + uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + url@0.11.4: + resolution: {integrity: sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==} + engines: {node: '>= 0.4'} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + util-extend@1.0.3: + resolution: {integrity: sha512-mLs5zAK+ctllYBj+iAQvlDCwoxU/WDOUaJkcFudeiAX6OajC6BKXJUa9a+tbtkC11dz2Ufb7h0lyvIOVn4LADA==} + + util@0.10.4: + resolution: {integrity: sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==} + + util@0.12.5: + resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + v8-to-istanbul@9.3.0: resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} engines: {node: '>=10.12.0'} + vm-browserify@1.1.2: + resolution: {integrity: sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==} + walker@1.0.8: resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} @@ -1867,6 +2703,10 @@ packages: resolution: {integrity: sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==} engines: {node: '>=18'} + which-typed-array@1.1.19: + resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} + engines: {node: '>= 0.4'} + which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -1891,6 +2731,10 @@ packages: resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -1917,6 +2761,39 @@ packages: snapshots: + 0x@6.0.0: + dependencies: + ajv: 8.17.1 + browserify: 17.0.1 + concat-stream: 2.0.0 + d3-fg: 6.14.0 + debounce: 1.2.1 + debug: 4.4.1 + end-of-stream: 1.4.5 + env-string: 1.0.1 + escape-string-regexp: 4.0.0 + execspawn: 1.0.1 + fs-extra: 10.1.0 + has-unicode: 2.0.1 + hsl-to-rgb-for-reals: 1.1.1 + jsonstream2: 3.0.0 + make-dir: 3.1.0 + minimist: 1.2.8 + morphdom: 2.7.5 + nanohtml: 1.10.0 + on-net-listen: 1.1.2 + opn: 5.5.0 + pump: 3.0.3 + pumpify: 2.0.1 + semver: 7.7.2 + single-line-log: 1.1.2 + split2: 4.2.0 + tachyons: 4.12.0 + through2: 4.0.2 + which: 2.0.2 + transitivePeerDependencies: + - supports-color + '@ampproject/remapping@2.3.0': dependencies: '@jridgewell/gen-mapping': 0.3.12 @@ -2702,10 +3579,25 @@ snapshots: '@unrs/resolver-binding-win32-x64-msvc@1.11.0': optional: true + JSONStream@1.3.5: + dependencies: + jsonparse: 1.3.1 + through: 2.3.8 + acorn-jsx@5.3.2(acorn@8.15.0): dependencies: acorn: 8.15.0 + acorn-node@1.8.2: + dependencies: + acorn: 7.4.1 + acorn-walk: 7.2.0 + xtend: 4.0.2 + + acorn-walk@7.2.0: {} + + acorn@7.4.1: {} + acorn@8.15.0: {} ajv@6.12.6: @@ -2715,14 +3607,25 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 + ajv@8.17.1: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.0.6 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + ansi-escapes@4.3.2: dependencies: type-fest: 0.21.3 + ansi-regex@2.1.1: {} + ansi-regex@5.0.1: {} ansi-regex@6.1.0: {} + ansi-styles@2.2.1: {} + ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 @@ -2742,8 +3645,23 @@ snapshots: argparse@2.0.1: {} + asn1.js@4.10.1: + dependencies: + bn.js: 4.12.2 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + + assert@1.5.1: + dependencies: + object.assign: 4.1.7 + util: 0.10.4 + async@3.2.6: {} + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.1.0 + babel-jest@30.0.4(@babel/core@7.28.0): dependencies: '@babel/core': 7.28.0 @@ -2800,6 +3718,12 @@ snapshots: balanced-match@1.0.2: {} + base64-js@1.5.1: {} + + bn.js@4.12.2: {} + + bn.js@5.2.2: {} + brace-expansion@1.1.12: dependencies: balanced-match: 1.0.2 @@ -2813,6 +3737,119 @@ snapshots: dependencies: fill-range: 7.1.1 + brorand@1.1.0: {} + + browser-pack@6.1.0: + dependencies: + JSONStream: 1.3.5 + combine-source-map: 0.8.0 + defined: 1.0.1 + safe-buffer: 5.2.1 + through2: 2.0.5 + umd: 3.0.3 + + browser-process-hrtime@0.1.3: {} + + browser-resolve@2.0.0: + dependencies: + resolve: 1.22.10 + + browserify-aes@1.2.0: + dependencies: + buffer-xor: 1.0.3 + cipher-base: 1.0.6 + create-hash: 1.2.0 + evp_bytestokey: 1.0.3 + inherits: 2.0.4 + safe-buffer: 5.2.1 + + browserify-cipher@1.0.1: + dependencies: + browserify-aes: 1.2.0 + browserify-des: 1.0.2 + evp_bytestokey: 1.0.3 + + browserify-des@1.0.2: + dependencies: + cipher-base: 1.0.6 + des.js: 1.1.0 + inherits: 2.0.4 + safe-buffer: 5.2.1 + + browserify-rsa@4.1.1: + dependencies: + bn.js: 5.2.2 + randombytes: 2.1.0 + safe-buffer: 5.2.1 + + browserify-sign@4.2.3: + dependencies: + bn.js: 5.2.2 + browserify-rsa: 4.1.1 + create-hash: 1.2.0 + create-hmac: 1.1.7 + elliptic: 6.6.1 + hash-base: 3.0.5 + inherits: 2.0.4 + parse-asn1: 5.1.7 + readable-stream: 2.3.8 + safe-buffer: 5.2.1 + + browserify-zlib@0.2.0: + dependencies: + pako: 1.0.11 + + browserify@17.0.1: + dependencies: + JSONStream: 1.3.5 + assert: 1.5.1 + browser-pack: 6.1.0 + browser-resolve: 2.0.0 + browserify-zlib: 0.2.0 + buffer: 5.2.1 + cached-path-relative: 1.1.0 + concat-stream: 1.6.2 + console-browserify: 1.2.0 + constants-browserify: 1.0.0 + crypto-browserify: 3.12.1 + defined: 1.0.1 + deps-sort: 2.0.1 + domain-browser: 1.2.0 + duplexer2: 0.1.4 + events: 3.3.0 + glob: 7.2.3 + hasown: 2.0.2 + htmlescape: 1.1.1 + https-browserify: 1.0.0 + inherits: 2.0.4 + insert-module-globals: 7.2.1 + labeled-stream-splicer: 2.0.2 + mkdirp-classic: 0.5.3 + module-deps: 6.2.3 + os-browserify: 0.3.0 + parents: 1.0.1 + path-browserify: 1.0.1 + process: 0.11.10 + punycode: 1.4.1 + querystring-es3: 0.2.1 + read-only-stream: 2.0.0 + readable-stream: 2.3.8 + resolve: 1.22.10 + shasum-object: 1.0.0 + shell-quote: 1.8.3 + stream-browserify: 3.0.0 + stream-http: 3.2.0 + string_decoder: 1.3.0 + subarg: 1.0.0 + syntax-error: 1.4.0 + through2: 2.0.5 + timers-browserify: 1.4.2 + tty-browserify: 0.0.1 + url: 0.11.4 + util: 0.12.5 + vm-browserify: 1.1.2 + xtend: 4.0.2 + browserslist@4.25.1: dependencies: caniuse-lite: 1.0.30001727 @@ -2832,14 +3869,55 @@ snapshots: buffer-from@1.1.2: {} + buffer-xor@1.0.3: {} + + buffer@5.2.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + builtin-status-codes@3.0.0: {} + + cached-path-relative@1.1.0: {} + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bind@1.0.8: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + callsites@3.1.0: {} + camel-case@3.0.0: + dependencies: + no-case: 2.3.2 + upper-case: 1.1.3 + camelcase@5.3.1: {} camelcase@6.3.0: {} caniuse-lite@1.0.30001727: {} + chalk@1.1.3: + dependencies: + ansi-styles: 2.2.1 + escape-string-regexp: 1.0.5 + has-ansi: 2.0.0 + strip-ansi: 3.0.1 + supports-color: 2.0.0 + chalk@4.1.2: dependencies: ansi-styles: 4.3.0 @@ -2849,6 +3927,11 @@ snapshots: ci-info@4.3.0: {} + cipher-base@1.0.6: + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + cjs-module-lexer@2.1.0: {} cliui@8.0.1: @@ -2859,6 +3942,8 @@ snapshots: co@4.6.0: {} + code-point-at@1.1.0: {} + collect-v8-coverage@1.0.2: {} color-convert@2.0.1: @@ -2867,18 +3952,175 @@ snapshots: color-name@1.1.4: {} + combine-source-map@0.8.0: + dependencies: + convert-source-map: 1.1.3 + inline-source-map: 0.6.3 + lodash.memoize: 3.0.4 + source-map: 0.5.7 + concat-map@0.0.1: {} + concat-stream@1.6.2: + dependencies: + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 2.3.8 + typedarray: 0.0.6 + + concat-stream@2.0.0: + dependencies: + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 3.6.2 + typedarray: 0.0.6 + + console-browserify@1.2.0: {} + + constants-browserify@1.0.0: {} + + convert-source-map@1.1.3: {} + + convert-source-map@1.9.0: {} + convert-source-map@2.0.0: {} core-js@3.44.0: {} + core-util-is@1.0.3: {} + + create-ecdh@4.0.4: + dependencies: + bn.js: 4.12.2 + elliptic: 6.6.1 + + create-hash@1.1.3: + dependencies: + cipher-base: 1.0.6 + inherits: 2.0.4 + ripemd160: 2.0.1 + sha.js: 2.4.12 + + create-hash@1.2.0: + dependencies: + cipher-base: 1.0.6 + inherits: 2.0.4 + md5.js: 1.3.5 + ripemd160: 2.0.2 + sha.js: 2.4.12 + + create-hmac@1.1.7: + dependencies: + cipher-base: 1.0.6 + create-hash: 1.2.0 + inherits: 2.0.4 + ripemd160: 2.0.2 + safe-buffer: 5.2.1 + sha.js: 2.4.12 + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 + crypto-browserify@3.12.1: + dependencies: + browserify-cipher: 1.0.1 + browserify-sign: 4.2.3 + create-ecdh: 4.0.4 + create-hash: 1.2.0 + create-hmac: 1.1.7 + diffie-hellman: 5.0.3 + hash-base: 3.0.5 + inherits: 2.0.4 + pbkdf2: 3.1.3 + public-encrypt: 4.0.3 + randombytes: 2.1.0 + randomfill: 1.0.4 + + d3-array@2.12.1: + dependencies: + internmap: 1.0.1 + + d3-color@1.4.1: {} + + d3-color@2.0.0: {} + + d3-dispatch@1.0.6: {} + + d3-drag@1.2.5: + dependencies: + d3-dispatch: 1.0.6 + d3-selection: 1.4.2 + + d3-ease@1.0.7: {} + + d3-fg@6.14.0: + dependencies: + d3-array: 2.12.1 + d3-dispatch: 1.0.6 + d3-ease: 1.0.7 + d3-hierarchy: 1.1.9 + d3-scale: 3.3.0 + d3-selection: 1.4.2 + d3-zoom: 1.8.3 + escape-string-regexp: 1.0.5 + hsl-to-rgb-for-reals: 1.1.1 + + d3-format@2.0.0: {} + + d3-hierarchy@1.1.9: {} + + d3-interpolate@1.4.0: + dependencies: + d3-color: 1.4.1 + + d3-interpolate@2.0.1: + dependencies: + d3-color: 2.0.0 + + d3-scale@3.3.0: + dependencies: + d3-array: 2.12.1 + d3-format: 2.0.0 + d3-interpolate: 2.0.1 + d3-time: 2.1.1 + d3-time-format: 3.0.0 + + d3-selection@1.4.2: {} + + d3-time-format@3.0.0: + dependencies: + d3-time: 2.1.1 + + d3-time@2.1.1: + dependencies: + d3-array: 2.12.1 + + d3-timer@1.0.10: {} + + d3-transition@1.3.2: + dependencies: + d3-color: 1.4.1 + d3-dispatch: 1.0.6 + d3-ease: 1.0.7 + d3-interpolate: 1.4.0 + d3-selection: 1.4.2 + d3-timer: 1.0.10 + + d3-zoom@1.8.3: + dependencies: + d3-dispatch: 1.0.6 + d3-drag: 1.2.5 + d3-interpolate: 1.4.0 + d3-selection: 1.4.2 + d3-transition: 1.3.2 + + dash-ast@1.0.0: {} + + debounce@1.2.1: {} + debug@4.4.1: dependencies: ms: 2.1.3 @@ -2889,8 +4131,65 @@ snapshots: deepmerge@4.3.1: {} + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + defined@1.0.1: {} + + deps-sort@2.0.1: + dependencies: + JSONStream: 1.3.5 + shasum-object: 1.0.0 + subarg: 1.0.0 + through2: 2.0.5 + + des.js@1.1.0: + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + detect-newline@3.1.0: {} + detective@5.2.1: + dependencies: + acorn-node: 1.8.2 + defined: 1.0.1 + minimist: 1.2.8 + + diffie-hellman@5.0.3: + dependencies: + bn.js: 4.12.2 + miller-rabin: 4.0.1 + randombytes: 2.1.0 + + domain-browser@1.2.0: {} + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + duplexer2@0.1.4: + dependencies: + readable-stream: 2.3.8 + + duplexify@4.1.3: + dependencies: + end-of-stream: 1.4.5 + inherits: 2.0.4 + readable-stream: 3.6.2 + stream-shift: 1.0.3 + eastasianwidth@0.2.0: {} ejs@3.1.10: @@ -2899,20 +4198,46 @@ snapshots: electron-to-chromium@1.5.180: {} + elliptic@6.6.1: + dependencies: + bn.js: 4.12.2 + brorand: 1.1.0 + hash.js: 1.1.7 + hmac-drbg: 1.0.1 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + emittery@0.13.1: {} emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} + end-of-stream@1.4.5: + dependencies: + once: 1.4.0 + entities@4.5.0: {} + env-string@1.0.1: {} + error-ex@1.3.2: dependencies: is-arrayish: 0.2.1 + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + escalade@3.2.0: {} + escape-string-regexp@1.0.5: {} + escape-string-regexp@2.0.0: {} escape-string-regexp@4.0.0: {} @@ -2984,8 +4309,17 @@ snapshots: estraverse@5.3.0: {} + estree-is-member-expression@1.0.0: {} + esutils@2.0.3: {} + events@3.3.0: {} + + evp_bytestokey@1.0.3: + dependencies: + md5.js: 1.3.5 + safe-buffer: 5.2.1 + execa@5.1.1: dependencies: cross-spawn: 7.0.6 @@ -2998,6 +4332,10 @@ snapshots: signal-exit: 3.0.7 strip-final-newline: 2.0.0 + execspawn@1.0.1: + dependencies: + util-extend: 1.0.3 + exit-x@0.2.2: {} expect@30.0.4: @@ -3023,6 +4361,10 @@ snapshots: fast-levenshtein@2.0.6: {} + fast-safe-stringify@2.1.1: {} + + fast-uri@3.0.6: {} + fastq@1.19.1: dependencies: reusify: 1.1.0 @@ -3060,22 +4402,54 @@ snapshots: flatted@3.3.3: {} + for-each@0.3.5: + dependencies: + is-callable: 1.2.7 + foreground-child@3.3.1: dependencies: cross-spawn: 7.0.6 signal-exit: 4.1.0 + fs-extra@10.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + fs.realpath@1.0.0: {} fsevents@2.3.3: optional: true + function-bind@1.1.2: {} + gensync@1.0.0-beta.2: {} + get-assigned-identifiers@1.2.0: {} + get-caller-file@2.0.5: {} + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + get-package-type@0.1.0: {} + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + get-stream@6.0.1: {} glob-parent@5.1.2: @@ -3108,16 +4482,72 @@ snapshots: globals@16.3.0: {} + gopd@1.2.0: {} + graceful-fs@4.2.11: {} graphemer@1.4.0: {} + has-ansi@2.0.0: + dependencies: + ansi-regex: 2.1.1 + has-flag@4.0.0: {} + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + has-unicode@2.0.1: {} + + hash-base@2.0.2: + dependencies: + inherits: 2.0.4 + + hash-base@3.0.5: + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + + hash.js@1.1.7: + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + hmac-drbg@1.0.1: + dependencies: + hash.js: 1.1.7 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + + hsl-to-rgb-for-reals@1.1.1: {} + html-escaper@2.0.2: {} + htmlescape@1.1.1: {} + + https-browserify@1.0.0: {} + human-signals@2.1.0: {} + hyperscript-attribute-to-property@1.0.2: {} + + hyperx@2.5.4: + dependencies: + hyperscript-attribute-to-property: 1.0.2 + + ieee754@1.2.1: {} + ignore@5.3.2: {} ignore@7.0.5: {} @@ -3139,24 +4569,90 @@ snapshots: once: 1.4.0 wrappy: 1.0.2 + inherits@2.0.3: {} + inherits@2.0.4: {} + inline-source-map@0.6.3: + dependencies: + source-map: 0.5.7 + + insert-module-globals@7.2.1: + dependencies: + JSONStream: 1.3.5 + acorn-node: 1.8.2 + combine-source-map: 0.8.0 + concat-stream: 1.6.2 + is-buffer: 1.1.6 + path-is-absolute: 1.0.1 + process: 0.11.10 + through2: 2.0.5 + undeclared-identifiers: 1.1.3 + xtend: 4.0.2 + + internmap@1.0.1: {} + + is-arguments@1.2.0: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + is-arrayish@0.2.1: {} + is-boolean-attribute@0.0.1: {} + + is-buffer@1.1.6: {} + + is-buffer@2.0.5: {} + + is-callable@1.2.7: {} + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + is-extglob@2.1.1: {} + is-fullwidth-code-point@1.0.0: + dependencies: + number-is-nan: 1.0.1 + is-fullwidth-code-point@3.0.0: {} is-generator-fn@2.1.0: {} + is-generator-function@1.1.0: + dependencies: + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + is-glob@4.0.3: dependencies: is-extglob: 2.1.1 is-number@7.0.0: {} + is-regex@1.2.1: + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + is-stream@2.0.1: {} + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.19 + + is-wsl@1.1.0: {} + + isarray@1.0.0: {} + + isarray@2.0.5: {} + isexe@2.0.0: {} istanbul-lib-coverage@3.2.2: {} @@ -3533,16 +5029,37 @@ snapshots: json-schema-traverse@0.4.1: {} + json-schema-traverse@1.0.0: {} + json-stable-stringify-without-jsonify@1.0.1: {} json5@2.2.3: {} + jsonfile@6.1.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + jsonparse@1.3.1: {} + + jsonstream2@3.0.0: + dependencies: + jsonparse: 1.3.1 + through2: 3.0.2 + type-component: 0.0.1 + kareem@2.6.3: {} keyv@4.5.4: dependencies: json-buffer: 3.0.1 + labeled-stream-splicer@2.0.2: + dependencies: + inherits: 2.0.4 + stream-splicer: 2.0.1 + leven@3.1.0: {} levn@0.4.1: @@ -3564,6 +5081,8 @@ snapshots: dependencies: p-locate: 5.0.0 + lodash.memoize@3.0.4: {} + lodash.memoize@4.1.2: {} lodash.merge@4.6.2: {} @@ -3572,6 +5091,8 @@ snapshots: loglevel@1.9.2: {} + lower-case@1.1.4: {} + lru-cache@10.4.3: {} lru-cache@5.1.1: @@ -3580,6 +5101,14 @@ snapshots: lunr@2.3.9: {} + magic-string@0.23.2: + dependencies: + sourcemap-codec: 1.4.8 + + make-dir@3.1.0: + dependencies: + semver: 6.3.1 + make-dir@4.0.0: dependencies: semver: 7.7.2 @@ -3599,10 +5128,22 @@ snapshots: punycode.js: 2.3.1 uc.micro: 2.1.0 + math-intrinsics@1.1.0: {} + + md5.js@1.3.5: + dependencies: + hash-base: 3.0.5 + inherits: 2.0.4 + safe-buffer: 5.2.1 + mdurl@2.0.0: {} memory-pager@1.5.0: {} + merge-source-map@1.0.4: + dependencies: + source-map: 0.5.7 + merge-stream@2.0.0: {} merge2@1.4.1: {} @@ -3612,8 +5153,17 @@ snapshots: braces: 3.0.3 picomatch: 2.3.1 + miller-rabin@4.0.1: + dependencies: + bn.js: 4.12.2 + brorand: 1.1.0 + mimic-fn@2.1.0: {} + minimalistic-assert@1.0.1: {} + + minimalistic-crypto-utils@1.0.1: {} + minimatch@3.1.2: dependencies: brace-expansion: 1.1.12 @@ -3630,6 +5180,26 @@ snapshots: minipass@7.1.2: {} + mkdirp-classic@0.5.3: {} + + module-deps@6.2.3: + dependencies: + JSONStream: 1.3.5 + browser-resolve: 2.0.0 + cached-path-relative: 1.1.0 + concat-stream: 1.6.2 + defined: 1.0.1 + detective: 5.2.1 + duplexer2: 0.1.4 + inherits: 2.0.4 + parents: 1.0.1 + readable-stream: 2.3.8 + resolve: 1.22.10 + stream-combiner2: 1.1.1 + subarg: 1.0.0 + through2: 2.0.5 + xtend: 4.0.2 + mongodb-connection-string-url@3.0.2: dependencies: '@types/whatwg-url': 11.0.5 @@ -3660,6 +5230,8 @@ snapshots: - socks - supports-color + morphdom@2.7.5: {} + mpath@0.9.0: {} mquery@5.0.0: @@ -3670,20 +5242,70 @@ snapshots: ms@2.1.3: {} + mutexify@1.4.0: + dependencies: + queue-tick: 1.0.1 + + nanoassert@1.1.0: {} + + nanobench@2.1.1: + dependencies: + browser-process-hrtime: 0.1.3 + chalk: 1.1.3 + mutexify: 1.4.0 + pretty-hrtime: 1.0.3 + + nanohtml@1.10.0: + dependencies: + acorn-node: 1.8.2 + camel-case: 3.0.0 + convert-source-map: 1.9.0 + estree-is-member-expression: 1.0.0 + hyperx: 2.5.4 + is-boolean-attribute: 0.0.1 + nanoassert: 1.1.0 + nanobench: 2.1.1 + normalize-html-whitespace: 0.2.0 + through2: 2.0.5 + transform-ast: 2.4.4 + napi-postinstall@0.3.0: {} natural-compare@1.4.0: {} + no-case@2.3.2: + dependencies: + lower-case: 1.1.4 + node-int64@0.4.0: {} node-releases@2.0.19: {} + normalize-html-whitespace@0.2.0: {} + normalize-path@3.0.0: {} npm-run-path@4.0.1: dependencies: path-key: 3.1.1 + number-is-nan@1.0.1: {} + + object-inspect@1.13.4: {} + + object-keys@1.1.1: {} + + object.assign@4.1.7: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + has-symbols: 1.1.0 + object-keys: 1.1.1 + + on-net-listen@1.1.2: {} + once@1.4.0: dependencies: wrappy: 1.0.2 @@ -3692,6 +5314,10 @@ snapshots: dependencies: mimic-fn: 2.1.0 + opn@5.5.0: + dependencies: + is-wsl: 1.1.0 + optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -3701,6 +5327,8 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 + os-browserify@0.3.0: {} + p-limit@2.3.0: dependencies: p-try: 2.2.0 @@ -3721,10 +5349,25 @@ snapshots: package-json-from-dist@1.0.1: {} + pako@1.0.11: {} + parent-module@1.0.1: dependencies: callsites: 3.1.0 + parents@1.0.1: + dependencies: + path-platform: 0.11.15 + + parse-asn1@5.1.7: + dependencies: + asn1.js: 4.10.1 + browserify-aes: 1.2.0 + evp_bytestokey: 1.0.3 + hash-base: 3.0.5 + pbkdf2: 3.1.3 + safe-buffer: 5.2.1 + parse-json@5.2.0: dependencies: '@babel/code-frame': 7.27.1 @@ -3732,17 +5375,32 @@ snapshots: json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 + path-browserify@1.0.1: {} + path-exists@4.0.0: {} path-is-absolute@1.0.1: {} path-key@3.1.1: {} + path-parse@1.0.7: {} + + path-platform@0.11.15: {} + path-scurry@1.11.1: dependencies: lru-cache: 10.4.3 minipass: 7.1.2 + pbkdf2@3.1.3: + dependencies: + create-hash: 1.1.3 + create-hmac: 1.1.7 + ripemd160: 2.0.1 + safe-buffer: 5.2.1 + sha.js: 2.4.12 + to-buffer: 1.2.1 + picocolors@1.1.1: {} picomatch@2.3.1: {} @@ -3755,6 +5413,8 @@ snapshots: dependencies: find-up: 4.1.0 + possible-typed-array-names@1.1.0: {} + prelude-ls@1.2.1: {} prettier@3.6.2: {} @@ -3765,20 +5425,87 @@ snapshots: ansi-styles: 5.2.0 react-is: 18.3.1 + pretty-hrtime@1.0.3: {} + + process-nextick-args@2.0.1: {} + + process@0.11.10: {} + + public-encrypt@4.0.3: + dependencies: + bn.js: 4.12.2 + browserify-rsa: 4.1.1 + create-hash: 1.2.0 + parse-asn1: 5.1.7 + randombytes: 2.1.0 + safe-buffer: 5.2.1 + + pump@3.0.3: + dependencies: + end-of-stream: 1.4.5 + once: 1.4.0 + + pumpify@2.0.1: + dependencies: + duplexify: 4.1.3 + inherits: 2.0.4 + pump: 3.0.3 + punycode.js@2.3.1: {} + punycode@1.4.1: {} + punycode@2.3.1: {} pure-rand@7.0.1: {} + qs@6.14.0: + dependencies: + side-channel: 1.1.0 + + querystring-es3@0.2.1: {} + queue-microtask@1.2.3: {} + queue-tick@1.0.1: {} + + randombytes@2.1.0: + dependencies: + safe-buffer: 5.2.1 + + randomfill@1.0.4: + dependencies: + randombytes: 2.1.0 + safe-buffer: 5.2.1 + react-is@18.3.1: {} + read-only-stream@2.0.0: + dependencies: + readable-stream: 2.3.8 + + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + reflect-metadata@0.2.2: {} require-directory@2.1.1: {} + require-from-string@2.0.2: {} + resolve-cwd@3.0.0: dependencies: resolve-from: 5.0.0 @@ -3787,28 +5514,109 @@ snapshots: resolve-from@5.0.0: {} + resolve@1.22.10: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + reusify@1.1.0: {} + ripemd160@2.0.1: + dependencies: + hash-base: 2.0.2 + inherits: 2.0.4 + + ripemd160@2.0.2: + dependencies: + hash-base: 3.0.5 + inherits: 2.0.4 + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-regex: 1.2.1 + semver@6.3.1: {} semver@7.7.2: {} + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + + sha.js@2.4.12: + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + to-buffer: 1.2.1 + + shasum-object@1.0.0: + dependencies: + fast-safe-stringify: 2.1.1 + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 shebang-regex@3.0.0: {} + shell-quote@1.8.3: {} + + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + sift@17.1.3: {} signal-exit@3.0.7: {} signal-exit@4.1.0: {} + simple-concat@1.0.1: {} + + single-line-log@1.1.2: + dependencies: + string-width: 1.0.2 + slash@3.0.0: {} source-map-support@0.5.13: @@ -3816,23 +5624,59 @@ snapshots: buffer-from: 1.1.2 source-map: 0.6.1 + source-map@0.5.7: {} + source-map@0.6.1: {} + sourcemap-codec@1.4.8: {} + sparse-bitfield@3.0.3: dependencies: memory-pager: 1.5.0 + split2@4.2.0: {} + sprintf-js@1.0.3: {} stack-utils@2.0.6: dependencies: escape-string-regexp: 2.0.0 + stream-browserify@3.0.0: + dependencies: + inherits: 2.0.4 + readable-stream: 3.6.2 + + stream-combiner2@1.1.1: + dependencies: + duplexer2: 0.1.4 + readable-stream: 2.3.8 + + stream-http@3.2.0: + dependencies: + builtin-status-codes: 3.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + xtend: 4.0.2 + + stream-shift@1.0.3: {} + + stream-splicer@2.0.1: + dependencies: + inherits: 2.0.4 + readable-stream: 2.3.8 + string-length@4.0.2: dependencies: char-regex: 1.0.2 strip-ansi: 6.0.1 + string-width@1.0.2: + dependencies: + code-point-at: 1.1.0 + is-fullwidth-code-point: 1.0.0 + strip-ansi: 3.0.1 + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -3845,6 +5689,18 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.1.0 + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-ansi@3.0.1: + dependencies: + ansi-regex: 2.1.1 + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -3859,6 +5715,12 @@ snapshots: strip-json-comments@3.1.1: {} + subarg@1.0.0: + dependencies: + minimist: 1.2.8 + + supports-color@2.0.0: {} + supports-color@7.2.0: dependencies: has-flag: 4.0.0 @@ -3867,18 +5729,52 @@ snapshots: dependencies: has-flag: 4.0.0 + supports-preserve-symlinks-flag@1.0.0: {} + synckit@0.11.8: dependencies: '@pkgr/core': 0.2.7 + syntax-error@1.4.0: + dependencies: + acorn-node: 1.8.2 + + tachyons@4.12.0: {} + test-exclude@6.0.0: dependencies: '@istanbuljs/schema': 0.1.3 glob: 7.2.3 minimatch: 3.1.2 + through2@2.0.5: + dependencies: + readable-stream: 2.3.8 + xtend: 4.0.2 + + through2@3.0.2: + dependencies: + inherits: 2.0.4 + readable-stream: 3.6.2 + + through2@4.0.2: + dependencies: + readable-stream: 3.6.2 + + through@2.3.8: {} + + timers-browserify@1.4.2: + dependencies: + process: 0.11.10 + tmpl@1.0.5: {} + to-buffer@1.2.1: + dependencies: + isarray: 2.0.5 + safe-buffer: 5.2.1 + typed-array-buffer: 1.0.3 + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 @@ -3887,6 +5783,16 @@ snapshots: dependencies: punycode: 2.3.1 + transform-ast@2.4.4: + dependencies: + acorn-node: 1.8.2 + convert-source-map: 1.9.0 + dash-ast: 1.0.0 + is-buffer: 2.0.5 + magic-string: 0.23.2 + merge-source-map: 1.0.4 + nanobench: 2.1.1 + ts-api-utils@2.1.0(typescript@5.8.3): dependencies: typescript: 5.8.3 @@ -3913,16 +5819,28 @@ snapshots: tslib@2.8.1: {} + tty-browserify@0.0.1: {} + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 + type-component@0.0.1: {} + type-detect@4.0.8: {} type-fest@0.21.3: {} type-fest@4.41.0: {} + typed-array-buffer@1.0.3: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + + typedarray@0.0.6: {} + typedoc@0.28.7(typescript@5.8.3): dependencies: '@gerrit0/mini-shiki': 3.7.0 @@ -3946,8 +5864,20 @@ snapshots: uc.micro@2.1.0: {} + umd@3.0.3: {} + + undeclared-identifiers@1.1.3: + dependencies: + acorn-node: 1.8.2 + dash-ast: 1.0.0 + get-assigned-identifiers: 1.2.0 + simple-concat: 1.0.1 + xtend: 4.0.2 + undici-types@6.21.0: {} + universalify@2.0.1: {} + unrs-resolver@1.11.0: dependencies: napi-postinstall: 0.3.0 @@ -3978,16 +5908,41 @@ snapshots: escalade: 3.2.0 picocolors: 1.1.1 + upper-case@1.1.3: {} + uri-js@4.4.1: dependencies: punycode: 2.3.1 + url@0.11.4: + dependencies: + punycode: 1.4.1 + qs: 6.14.0 + + util-deprecate@1.0.2: {} + + util-extend@1.0.3: {} + + util@0.10.4: + dependencies: + inherits: 2.0.3 + + util@0.12.5: + dependencies: + inherits: 2.0.4 + is-arguments: 1.2.0 + is-generator-function: 1.1.0 + is-typed-array: 1.1.15 + which-typed-array: 1.1.19 + v8-to-istanbul@9.3.0: dependencies: '@jridgewell/trace-mapping': 0.3.29 '@types/istanbul-lib-coverage': 2.0.6 convert-source-map: 2.0.0 + vm-browserify@1.1.2: {} + walker@1.0.8: dependencies: makeerror: 1.0.12 @@ -3999,6 +5954,16 @@ snapshots: tr46: 5.1.1 webidl-conversions: 7.0.0 + which-typed-array@1.1.19: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + which@2.0.2: dependencies: isexe: 2.0.0 @@ -4024,6 +5989,8 @@ snapshots: imurmurhash: 0.1.4 signal-exit: 4.1.0 + xtend@4.0.2: {} + y18n@5.0.8: {} yallist@3.1.1: {} From c274ad86b44735ae0438b6e81d86638936a5c185 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Fri, 11 Jul 2025 09:35:40 +0200 Subject: [PATCH 197/251] =?UTF-8?q?=F0=9F=9A=A7=20Better=20arg=20opts=20pa?= =?UTF-8?q?rsing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/index.ts | 38 +++++++++++++++++++++++++------------- 1 file changed, 25 insertions(+), 13 deletions(-) diff --git a/src/test/index.ts b/src/test/index.ts index 5f565145..985032e0 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -119,6 +119,16 @@ async function queryData() { return { dbScheduledRoutes, stops, dbNonScheduledRoutes, TBMSchedulesModel, resultModel }; } +function getArgsOptNumber(args: ReturnType, opt: string): number | null { + if (opt in args) { + if (typeof args[opt] === "number") return args[opt]; + + console.warn(`Supplied "${opt}" was not of type number`, args[opt]); + } + + return null; +} + async function computeRAPTORData({ stops, dbNonScheduledRoutes, dbScheduledRoutes }: Awaited>, fpReqLen: number) { return [ TimeScal, @@ -257,9 +267,10 @@ async function insertResults, CA extends [V, strin const args = minimist(process.argv); console.debug(`Using args`, args); - const fpReqLen = "fp-req-len" in args ? (args["fp-req-len"] as number) : 3_000; + const fpReqLen = getArgsOptNumber(args, "fp-req-len") ?? 3_000; console.debug(`Foot paths query max len`, fpReqLen); - const fpRunLen = "fp-run-len" in args ? (args["fp-run-len"] as number) : 2_000; + const fpRunLen = getArgsOptNumber(args, "fp-run-len") ?? 2_000; + console.debug(`Foot paths run max len`, fpReqLen); let instanceType: "RAPTOR" | "SharedRAPTOR" | "McRAPTOR" | "McSharedRAPTOR"; if ("t" in args) { @@ -286,9 +297,9 @@ async function insertResults, CA extends [V, strin } else instanceType = "McSharedRAPTOR"; console.debug("Using instance type", instanceType); - const createTimes = "createTimes" in args ? (args.createTimes as number) : 1; - const runTimes = "runTimes" in args ? (args.runTimes as number) : 1; - const getResTimes = "getResTimes" in args ? (args.getResTimes as number) : 1; + const createTimes = getArgsOptNumber(args, "createTimes") ?? 1; + const runTimes = getArgsOptNumber(args, "runTimes") ?? 1; + const getResTimes = getArgsOptNumber(args, "getResTimes") ?? 1; const criteria = [] as [] | [typeof footDistance] | [typeof bufferTime] | [typeof footDistance, typeof bufferTime]; if ("fd" in args && args.fd === true) (criteria as [typeof footDistance]).push(footDistance); @@ -308,22 +319,23 @@ async function insertResults, CA extends [V, strin if (!queriedData) throw new Error("No queried data"); // Setup source & destination - let from: LocationAddress | LocationTBM; let ps: number | SharedID; + let from: LocationAddress | LocationTBM; - if ("ps" in args) { - ps = args.ps as number; - from = { type: LocationType.TBM, id: ps }; - } else { + const psOpt = getArgsOptNumber(args, "ps"); + if (psOpt === null) { ps = 974; // Barrière d'Ornano from = { type: LocationType.Address, id: 174287 }; + } else { + ps = psOpt; + from = { type: LocationType.TBM, id: ps }; } let psInternalId = ps; const pt = - "pt" in args - ? (args.pt as number) // Béthanie - : 3846; + getArgsOptNumber(args, "pt") ?? + // Béthanie + 3846; const b2 = await benchmark(computeRAPTORData, [queriedData, fpReqLen]); const rawRAPTORData = b2.lastReturn; From df41fed008b0fa2aaf4de3cd858e771f790dfe59 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Fri, 11 Jul 2025 09:38:19 +0200 Subject: [PATCH 198/251] =?UTF-8?q?=F0=9F=92=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/index.ts | 64 ++++++++++++----------------------------------- 1 file changed, 16 insertions(+), 48 deletions(-) diff --git a/src/test/index.ts b/src/test/index.ts index 985032e0..3b4c3caa 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -337,6 +337,8 @@ async function insertResults, CA extends [V, strin // Béthanie 3846; + // Compute RAPTOR data + const b2 = await benchmark(computeRAPTORData, [queriedData, fpReqLen]); const rawRAPTORData = b2.lastReturn; if (!rawRAPTORData) throw new Error("No raw RAPTOR data"); @@ -357,6 +359,8 @@ async function insertResults, CA extends [V, strin >; if (instanceType === "SharedRAPTOR" || instanceType === "McSharedRAPTOR") { + // Shared-specific RAPTOR data computation + const b3 = await benchmark(computeSharedRAPTORData, [rawRAPTORData]); const rawSharedRAPTORData = b3.lastReturn; if (!rawSharedRAPTORData) throw new Error("No raw Shared RAPTOR data"); @@ -364,55 +368,11 @@ async function insertResults, CA extends [V, strin // eslint-disable-next-line @typescript-eslint/no-non-null-assertion psInternalId = queriedData.stops.at(-1)!.id + 1; ps = SharedRAPTORData.serializeId(psInternalId); + // Create RAPTOR + + + // Attach stops - const b4 = await (instanceType === "SharedRAPTOR" - ? benchmark>(createSharedRAPTOR, [rawSharedRAPTORData], undefined, createTimes) - : benchmark( - createMcSharedRAPTOR< - number, - number, - [] | [[number, "footDistance"]] | [[number, "bufferTime"]] | [[number, "footDistance"], [number, "bufferTime"]] - >, - [ - rawSharedRAPTORData, - criteria as Parameters< - typeof createMcSharedRAPTOR< - number, - number, - [] | [[number, "footDistance"]] | [[number, "bufferTime"]] | [[number, "footDistance"], [number, "bufferTime"]] - > - >[1], - ], - undefined, - createTimes, - )); - if (!b4.lastReturn) throw new Error("No RAPTOR instance"); - [RAPTORDataInst, RAPTORInstance] = b4.lastReturn as readonly [typeof RAPTORDataInst, typeof RAPTORInstance]; - } else { - const b4 = await (instanceType === "RAPTOR" - ? benchmark>(createRAPTOR, [rawRAPTORData], undefined, createTimes) - : benchmark( - createMcRAPTOR< - number, - number, - [] | [[number, "footDistance"]] | [[number, "bufferTime"]] | [[number, "footDistance"], [number, "bufferTime"]] - >, - [ - rawRAPTORData, - criteria as Parameters< - typeof createMcRAPTOR< - number, - number, - [] | [[number, "footDistance"]] | [[number, "bufferTime"]] | [[number, "footDistance"], [number, "bufferTime"]] - > - >[1], - ], - undefined, - createTimes, - )); - if (!b4.lastReturn) throw new Error("No RAPTOR instance"); - [RAPTORDataInst, RAPTORInstance] = b4.lastReturn as readonly [typeof RAPTORDataInst, typeof RAPTORInstance]; - } attachStops.set(psInternalId, { id: psInternalId, @@ -436,6 +396,8 @@ async function insertResults, CA extends [V, strin RAPTORDataInst.attachData(Array.from(attachStops.values()), []); + // Run params + // https://www.mongodb.com/docs/manual/core/aggregation-pipeline-optimization/#-sort----limit-coalescence const minSchedule = ( @@ -450,12 +412,16 @@ async function insertResults, CA extends [V, strin const settings: RAPTORRunSettings = { walkSpeed: 1.5, maxTransferLength: fpRunLen }; + // Run + function runRAPTOR() { RAPTORInstance.run(ps, pt, departureTime, settings); } console.log(`Running with: ps=${ps}, pt=${pt}, departure time=${new Date(departureTime).toLocaleString()}, settings=${JSON.stringify(settings)}`); await benchmark(runRAPTOR, [], undefined, runTimes); + // Get results + function resultRAPTOR() { return RAPTORInstance.getBestJourneys(pt); } @@ -464,6 +430,8 @@ async function insertResults, CA extends [V, strin console.debug("Best journeys", b6.lastReturn); if (saveResults) { + // Save results + const b7 = await benchmark( insertResults, [queriedData.resultModel, RAPTORDataInst.timeType, from, { type: LocationType.TBM, id: pt }, departureTime, settings, b6.lastReturn], From a29c09851ed59152bf129cc1525843edf521dd55 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Fri, 11 Jul 2025 09:58:17 +0200 Subject: [PATCH 199/251] =?UTF-8?q?=E2=99=BB=EF=B8=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/index.ts | 82 ++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 66 insertions(+), 16 deletions(-) diff --git a/src/test/index.ts b/src/test/index.ts index 3b4c3caa..469a8f1a 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -343,36 +343,86 @@ async function insertResults, CA extends [V, strin const rawRAPTORData = b2.lastReturn; if (!rawRAPTORData) throw new Error("No raw RAPTOR data"); - const attachStops = new Map>(); - const distances: Record = { - [ps]: 100, - }; - - let RAPTORDataInst: Omit, "attachData"> & { attachData: SharedRAPTORData["attachData"] }; - let RAPTORInstance: BaseRAPTOR< - number, - SharedID, - SharedID, - number, - number, - [] | [[number, "footDistance"]] | [[number, "bufferTime"]] | [[number, "footDistance"], [number, "bufferTime"]] - >; + let rawSharedRAPTORData: Awaited>; if (instanceType === "SharedRAPTOR" || instanceType === "McSharedRAPTOR") { // Shared-specific RAPTOR data computation const b3 = await benchmark(computeSharedRAPTORData, [rawRAPTORData]); - const rawSharedRAPTORData = b3.lastReturn; - if (!rawSharedRAPTORData) throw new Error("No raw Shared RAPTOR data"); + if (!b3.lastReturn) throw new Error("No raw Shared RAPTOR data"); + rawSharedRAPTORData = b3.lastReturn; // eslint-disable-next-line @typescript-eslint/no-non-null-assertion psInternalId = queriedData.stops.at(-1)!.id + 1; ps = SharedRAPTORData.serializeId(psInternalId); + } + // Create RAPTOR + const b4 = await (instanceType === "RAPTOR" + ? benchmark>(createRAPTOR, [rawRAPTORData], undefined, createTimes) + : instanceType === "SharedRAPTOR" + ? // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + benchmark>(createSharedRAPTOR, [rawSharedRAPTORData!], undefined, createTimes) + : instanceType === "McRAPTOR" + ? benchmark( + createMcRAPTOR< + number, + number, + [] | [[number, "footDistance"]] | [[number, "bufferTime"]] | [[number, "footDistance"], [number, "bufferTime"]] + >, + [ + rawRAPTORData, + criteria as Parameters< + typeof createMcRAPTOR< + number, + number, + [] | [[number, "footDistance"]] | [[number, "bufferTime"]] | [[number, "footDistance"], [number, "bufferTime"]] + > + >[1], + ], + undefined, + createTimes, + ) + : benchmark( + createMcSharedRAPTOR< + number, + number, + [] | [[number, "footDistance"]] | [[number, "bufferTime"]] | [[number, "footDistance"], [number, "bufferTime"]] + >, + [ + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + rawSharedRAPTORData!, + criteria as Parameters< + typeof createMcSharedRAPTOR< + number, + number, + [] | [[number, "footDistance"]] | [[number, "bufferTime"]] | [[number, "footDistance"], [number, "bufferTime"]] + > + >[1], + ], + undefined, + createTimes, + )); + if (!b4.lastReturn) throw new Error("No RAPTOR instance"); + const [RAPTORDataInst, RAPTORInstance] = b4.lastReturn as readonly [ + Omit, "attachData"> & { attachData: SharedRAPTORData["attachData"] }, + BaseRAPTOR< + number, + SharedID, + SharedID, + number, + number, + [] | [[number, "footDistance"]] | [[number, "bufferTime"]] | [[number, "footDistance"], [number, "bufferTime"]] + >, + ]; // Attach stops + const attachStops = new Map>(); + const distances: Record = { + [ps]: 100, + }; attachStops.set(psInternalId, { id: psInternalId, From 5143db46682babd77b47ce50871c0de7d951070a Mon Sep 17 00:00:00 2001 From: Catatomik Date: Fri, 11 Jul 2025 10:03:54 +0200 Subject: [PATCH 200/251] =?UTF-8?q?=F0=9F=8E=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/models/index.ts | 61 ++++++++++++++-------------------------- 1 file changed, 21 insertions(+), 40 deletions(-) diff --git a/src/test/models/index.ts b/src/test/models/index.ts index 894bada2..f034400e 100644 --- a/src/test/models/index.ts +++ b/src/test/models/index.ts @@ -1,12 +1,13 @@ -import { dbAddresses, dbAddressesModel } from "./addresses.model"; -import { dbIntersections, dbIntersectionsModel } from "./intersections.model"; -import { dbSections, dbSectionsModel } from "./sections.model"; -import { dbTBM_Lines, dbTBM_LinesModel } from "./TBM_lines.model"; -import { dbTBM_Lines_routes, dbTBM_Lines_routesModel } from "./TBM_lines_routes.model"; -import { dbTBM_Schedules, dbTBM_Schedules_rt, dbTBM_Schedules_rtModel, dbTBM_SchedulesModel } from "./TBM_schedules.model"; -import { dbTBM_Stops, dbTBM_StopsModel } from "./TBM_stops.model"; -import { dbTBM_Trips, dbTBM_TripsModel } from "./TBM_trips.model"; -import { dbTBM_ScheduledRoutes, dbTBM_ScheduledRoutesModel } from "./TBMScheduledRoutes.model"; +import { ReturnModelType } from "@typegoose/typegoose"; +import { dbAddresses } from "./addresses.model"; +import { dbIntersections } from "./intersections.model"; +import { dbSections } from "./sections.model"; +import { dbTBM_Lines } from "./TBM_lines.model"; +import { dbTBM_Lines_routes } from "./TBM_lines_routes.model"; +import { dbTBM_Schedules, dbTBM_Schedules_rt } from "./TBM_schedules.model"; +import { dbTBM_Stops } from "./TBM_stops.model"; +import { dbTBM_Trips } from "./TBM_trips.model"; +import { dbTBM_ScheduledRoutes } from "./TBMScheduledRoutes.model"; enum TBMEndpoints { Addresses = "Addresses", @@ -25,48 +26,28 @@ enum TBMEndpoints { } type TBMClass = E extends TBMEndpoints.Addresses - ? dbAddresses + ? typeof dbAddresses : E extends TBMEndpoints.Intersections - ? dbIntersections + ? typeof dbIntersections : E extends TBMEndpoints.Sections - ? dbSections + ? typeof dbSections : E extends TBMEndpoints.Lines - ? dbTBM_Lines + ? typeof dbTBM_Lines : E extends TBMEndpoints.Lines_routes - ? dbTBM_Lines_routes + ? typeof dbTBM_Lines_routes : E extends TBMEndpoints.Schedules - ? dbTBM_Schedules + ? typeof dbTBM_Schedules : E extends TBMEndpoints.Schedules_rt - ? dbTBM_Schedules_rt + ? typeof dbTBM_Schedules_rt : E extends TBMEndpoints.Stops - ? dbTBM_Stops + ? typeof dbTBM_Stops : E extends TBMEndpoints.Trips - ? dbTBM_Trips + ? typeof dbTBM_Trips : E extends TBMEndpoints.ScheduledRoutes - ? dbTBM_ScheduledRoutes + ? typeof dbTBM_ScheduledRoutes : never; -type TBMModel = E extends TBMEndpoints.Addresses - ? dbAddressesModel - : E extends TBMEndpoints.Intersections - ? dbIntersectionsModel - : E extends TBMEndpoints.Sections - ? dbSectionsModel - : E extends TBMEndpoints.Lines - ? dbTBM_LinesModel - : E extends TBMEndpoints.Lines_routes - ? dbTBM_Lines_routesModel - : E extends TBMEndpoints.Schedules - ? dbTBM_SchedulesModel - : E extends TBMEndpoints.Schedules_rt - ? dbTBM_Schedules_rtModel - : E extends TBMEndpoints.Stops - ? dbTBM_StopsModel - : E extends TBMEndpoints.Trips - ? dbTBM_TripsModel - : E extends TBMEndpoints.ScheduledRoutes - ? dbTBM_ScheduledRoutesModel - : never; +type TBMModel = ReturnModelType>; export { TBMEndpoints }; export type { TBMClass, TBMModel }; From 865ca67e76ba2fb00b797667b4cd3d2f76d7fabb Mon Sep 17 00:00:00 2001 From: Catatomik Date: Fri, 11 Jul 2025 13:34:28 +0200 Subject: [PATCH 201/251] =?UTF-8?q?=F0=9F=9A=A7=20C/C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/index.ts b/src/test/index.ts index 469a8f1a..13c8772e 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -270,7 +270,7 @@ async function insertResults, CA extends [V, strin const fpReqLen = getArgsOptNumber(args, "fp-req-len") ?? 3_000; console.debug(`Foot paths query max len`, fpReqLen); const fpRunLen = getArgsOptNumber(args, "fp-run-len") ?? 2_000; - console.debug(`Foot paths run max len`, fpReqLen); + console.debug(`Foot paths run max len`, fpRunLen); let instanceType: "RAPTOR" | "SharedRAPTOR" | "McRAPTOR" | "McSharedRAPTOR"; if ("t" in args) { From 40f2380c197af72b6a5d0010f3edb949a63ee814 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Fri, 11 Jul 2025 13:35:36 +0200 Subject: [PATCH 202/251] =?UTF-8?q?=E2=9C=A8=20Generalize=20time,=20suppor?= =?UTF-8?q?t=20intervals?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bench.sh | 4 +- src/test/index.ts | 103 ++++++++++++++++++++++++++++++++-------------- 2 files changed, 74 insertions(+), 33 deletions(-) diff --git a/bench.sh b/bench.sh index ff51062c..637c5a3e 100644 --- a/bench.sh +++ b/bench.sh @@ -42,7 +42,7 @@ if [ -n "$GLOBAL" ]; then FOLDER="bench/$INSTANCE" mkdir "$FOLDER" 2>/dev/null || true echo "Bench instance $INSTANCE" - pnpm exec 0x -D "$FOLDER" lib/test/index.js -t "$INSTANCE" "$FOOT_DISTANCE" --runTimes "$TIMES" 1>"$FOLDER/out.txt" 2>/dev/null + pnpm exec 0x -D "$FOLDER" lib/test/index.js -i "$INSTANCE" "$FOOT_DISTANCE" --runTimes "$TIMES" 1>"$FOLDER/out.txt" 2>/dev/null sed -i "s|$(dirname "$PWD")/||g" "$FOLDER/flamegraph.html" echo "Done at: $FOLDER/flamegraph.html" done @@ -63,7 +63,7 @@ if [ -n "$CRITERIA" ]; then mkdir "$FOLDER" 2>/dev/null || true echo "Bench instance $INSTANCE with criteria $CRITERIA" # shellcheck disable=SC2086 - pnpm exec 0x -D "$FOLDER" lib/test/index.js -t "$INSTANCE" "$FOOT_DISTANCE" $CRITERIA --runTimes "$TIMES" 1>"$FOLDER/out.txt" 2>/dev/null + pnpm exec 0x -D "$FOLDER" lib/test/index.js -i "$INSTANCE" "$FOOT_DISTANCE" $CRITERIA --runTimes "$TIMES" 1>"$FOLDER/out.txt" 2>/dev/null sed -i "s|$(dirname "$PWD")/||g" "$FOLDER/flamegraph.html" echo "Done at: $FOLDER/flamegraph.html" done diff --git a/src/test/index.ts b/src/test/index.ts index 13c8772e..2f9af1d1 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -10,8 +10,8 @@ import { exit } from "process"; import { bufferTime, footDistance, + InternalTimeInt, IRAPTORData, - MAX_SAFE_TIMESTAMP, McRAPTOR, McSharedRAPTOR, Ordered, @@ -21,10 +21,13 @@ import { SharedID, SharedRAPTOR, SharedRAPTORData, + sharedTimeIntOrderLow, sharedTimeScal, Stop, Time, + TimeIntOrderLow, TimeScal, + Timestamp, } from "../"; import BaseRAPTOR from "../base"; import NonScheduledRoutesModelInit, { dbFootPaths } from "./models/NonScheduledRoutes.model"; @@ -129,9 +132,15 @@ function getArgsOptNumber(args: ReturnType, opt: string): numbe return null; } -async function computeRAPTORData({ stops, dbNonScheduledRoutes, dbScheduledRoutes }: Awaited>, fpReqLen: number) { +type DataType = "scalar" | "interval"; + +async function computeRAPTORData( + { stops, dbNonScheduledRoutes, dbScheduledRoutes }: Awaited>, + fpReqLen: number, + dataType: DataType, +) { return [ - TimeScal, + dataType === "scalar" ? TimeScal : TimeIntOrderLow, await mapAsync<(typeof stops)[number], Stop>(stops, async ({ id, connectedRoutes }) => ({ id, connectedRoutes, @@ -147,22 +156,28 @@ async function computeRAPTORData({ stops, dbNonScheduledRoutes, dbScheduledRoute stops, trips.map(({ tripId, schedules }) => ({ id: tripId, - times: schedules.map((schedule) => - typeof schedule === "object" && "hor_estime" in schedule - ? ([schedule.hor_estime.getTime() || MAX_SAFE_TIMESTAMP, schedule.hor_estime.getTime() || MAX_SAFE_TIMESTAMP] satisfies [ - unknown, - unknown, - ]) - : ([Infinity, Infinity] satisfies [unknown, unknown]), - ), + times: schedules + .map<[number, number]>((schedule) => + typeof schedule === "object" && "hor_estime" in schedule + ? [schedule.hor_estime.getTime() || TimeScal.MAX_SAFE, schedule.hor_estime.getTime() || TimeScal.MAX_SAFE] + : [TimeScal.MAX, TimeScal.MAX], + ) + // Transform to interval + .map((schedule) => + dataType === "interval" + ? [[schedule[0], schedule[0]] satisfies InternalTimeInt, [schedule[1], schedule[1]] satisfies InternalTimeInt] + : schedule, + ), })), ] satisfies [unknown, unknown, unknown], ), - ] satisfies ConstructorParameters>; + ] as ConstructorParameters>; } -function computeSharedRAPTORData([_, stops, routes]: Awaited>) { - return [sharedTimeScal, stops, routes] satisfies Parameters>; +function computeSharedRAPTORData([_, stops, routes]: Awaited>, dataType: DataType) { + return [dataType === "scalar" ? sharedTimeScal : sharedTimeIntOrderLow, stops, routes] as Parameters< + typeof SharedRAPTORData.makeFromRawData + >; } function createRAPTOR(data: ConstructorParameters>) { @@ -272,9 +287,26 @@ async function insertResults, CA extends [V, strin const fpRunLen = getArgsOptNumber(args, "fp-run-len") ?? 2_000; console.debug(`Foot paths run max len`, fpRunLen); + let dataType: DataType; + if ("d" in args) { + switch ((args.d as string).toLowerCase()) { + case "scal": + dataType = "scalar"; + break; + + case "int": + dataType = "interval"; + break; + + default: + throw new Error(`Unexpected data type "${args.d}"`); + } + } else dataType = "interval"; + console.debug("Using data type", dataType); + let instanceType: "RAPTOR" | "SharedRAPTOR" | "McRAPTOR" | "McSharedRAPTOR"; - if ("t" in args) { - switch ((args.t as string).toLowerCase()) { + if ("i" in args) { + switch ((args.i as string).toLowerCase()) { case "r": instanceType = "RAPTOR"; break; @@ -292,9 +324,9 @@ async function insertResults, CA extends [V, strin break; default: - throw new Error(`Unexpected instance type "${args.t}"`); + throw new Error(`Unexpected instance type "${args.i}"`); } - } else instanceType = "McSharedRAPTOR"; + } else instanceType = "RAPTOR"; console.debug("Using instance type", instanceType); const createTimes = getArgsOptNumber(args, "createTimes") ?? 1; @@ -339,7 +371,7 @@ async function insertResults, CA extends [V, strin // Compute RAPTOR data - const b2 = await benchmark(computeRAPTORData, [queriedData, fpReqLen]); + const b2 = await benchmark(computeRAPTORData, [queriedData, fpReqLen, dataType]); const rawRAPTORData = b2.lastReturn; if (!rawRAPTORData) throw new Error("No raw RAPTOR data"); @@ -348,7 +380,7 @@ async function insertResults, CA extends [V, strin if (instanceType === "SharedRAPTOR" || instanceType === "McSharedRAPTOR") { // Shared-specific RAPTOR data computation - const b3 = await benchmark(computeSharedRAPTORData, [rawRAPTORData]); + const b3 = await benchmark(computeSharedRAPTORData, [rawRAPTORData, dataType]); if (!b3.lastReturn) throw new Error("No raw Shared RAPTOR data"); rawSharedRAPTORData = b3.lastReturn; @@ -360,14 +392,14 @@ async function insertResults, CA extends [V, strin // Create RAPTOR const b4 = await (instanceType === "RAPTOR" - ? benchmark>(createRAPTOR, [rawRAPTORData], undefined, createTimes) + ? benchmark(createRAPTOR, [rawRAPTORData], undefined, createTimes) : instanceType === "SharedRAPTOR" ? // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - benchmark>(createSharedRAPTOR, [rawSharedRAPTORData!], undefined, createTimes) + benchmark(createSharedRAPTOR, [rawSharedRAPTORData!], undefined, createTimes) : instanceType === "McRAPTOR" ? benchmark( createMcRAPTOR< - number, + Timestamp | InternalTimeInt, number, [] | [[number, "footDistance"]] | [[number, "bufferTime"]] | [[number, "footDistance"], [number, "bufferTime"]] >, @@ -375,7 +407,7 @@ async function insertResults, CA extends [V, strin rawRAPTORData, criteria as Parameters< typeof createMcRAPTOR< - number, + Timestamp | InternalTimeInt, number, [] | [[number, "footDistance"]] | [[number, "bufferTime"]] | [[number, "footDistance"], [number, "bufferTime"]] > @@ -386,7 +418,7 @@ async function insertResults, CA extends [V, strin ) : benchmark( createMcSharedRAPTOR< - number, + Timestamp | InternalTimeInt, number, [] | [[number, "footDistance"]] | [[number, "bufferTime"]] | [[number, "footDistance"], [number, "bufferTime"]] >, @@ -395,7 +427,7 @@ async function insertResults, CA extends [V, strin rawSharedRAPTORData!, criteria as Parameters< typeof createMcSharedRAPTOR< - number, + Timestamp | InternalTimeInt, number, [] | [[number, "footDistance"]] | [[number, "bufferTime"]] | [[number, "footDistance"], [number, "bufferTime"]] > @@ -406,9 +438,11 @@ async function insertResults, CA extends [V, strin )); if (!b4.lastReturn) throw new Error("No RAPTOR instance"); const [RAPTORDataInst, RAPTORInstance] = b4.lastReturn as readonly [ - Omit, "attachData"> & { attachData: SharedRAPTORData["attachData"] }, + Omit, "attachData"> & { + attachData: SharedRAPTORData["attachData"]; + }, BaseRAPTOR< - number, + Timestamp | InternalTimeInt, SharedID, SharedID, number, @@ -457,8 +491,9 @@ async function insertResults, CA extends [V, strin )[0]?.hor_estime?.getTime() ?? Infinity; const maxSchedule = (await queriedData.TBMSchedulesModel.find({}, { hor_estime: 1 }).sort({ hor_estime: -1 }).limit(1))[0]?.hor_estime?.getTime() ?? Infinity; + const meanSchedule = (minSchedule + maxSchedule) / 2; - const departureTime = (minSchedule + maxSchedule) / 2; + const departureTime = dataType === "interval" ? ([meanSchedule, meanSchedule] satisfies [unknown, unknown]) : meanSchedule; const settings: RAPTORRunSettings = { walkSpeed: 1.5, maxTransferLength: fpRunLen }; @@ -467,7 +502,9 @@ async function insertResults, CA extends [V, strin function runRAPTOR() { RAPTORInstance.run(ps, pt, departureTime, settings); } - console.log(`Running with: ps=${ps}, pt=${pt}, departure time=${new Date(departureTime).toLocaleString()}, settings=${JSON.stringify(settings)}`); + console.log( + `Running with: ps=${ps}, pt=${pt}, departure time=${new Date(typeof departureTime === "number" ? departureTime : departureTime[0]).toLocaleString()}, settings=${JSON.stringify(settings)}`, + ); await benchmark(runRAPTOR, [], undefined, runTimes); // Get results @@ -483,7 +520,11 @@ async function insertResults, CA extends [V, strin // Save results const b7 = await benchmark( - insertResults, + insertResults< + Timestamp | InternalTimeInt, + number, + [] | [[number, "footDistance"]] | [[number, "bufferTime"]] | [[number, "footDistance"], [number, "bufferTime"]] + >, [queriedData.resultModel, RAPTORDataInst.timeType, from, { type: LocationType.TBM, id: pt }, departureTime, settings, b6.lastReturn], ); console.log("Saved result id", b7.lastReturn); From e057f8e2b67fe00404bdf36531c34d477abce4b0 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Fri, 11 Jul 2025 14:21:10 +0200 Subject: [PATCH 203/251] =?UTF-8?q?=F0=9F=9A=A7=20Criterion=20value=20type?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/index.ts | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/test/index.ts b/src/test/index.ts index 2f9af1d1..b26c3f9b 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -14,7 +14,6 @@ import { IRAPTORData, McRAPTOR, McSharedRAPTOR, - Ordered, RAPTOR, RAPTORData, RAPTORRunSettings, @@ -191,7 +190,7 @@ function createSharedRAPTOR(data: Parameters, CA extends [V, string][]>( +function createMcRAPTOR( data: ConstructorParameters>, criteria: ConstructorParameters>[1], ) { @@ -199,7 +198,7 @@ function createMcRAPTOR, CA extends [V, string][]> return [RAPTORDataInst, new McRAPTOR(RAPTORDataInst, criteria)] as const; } -function createMcSharedRAPTOR, CA extends [V, string][]>( +function createMcSharedRAPTOR( data: Parameters>, criteria: ConstructorParameters>[1], ) { @@ -211,7 +210,7 @@ function createMcSharedRAPTOR, CA extends [V, stri type DBJourney = Omit & { steps: (JourneyStepBase | JourneyStepFoot | JourneyStepVehicle)[]; }; -function journeyDBFormatter, CA extends [V, string][]>( +function journeyDBFormatter( journey: NonNullable["getBestJourneys"]>[number][number]>, ): DBJourney { return { @@ -249,7 +248,7 @@ function journeyDBFormatter, CA extends [V, string }; } -async function insertResults, CA extends [V, string][]>( +async function insertResults( resultModel: Awaited>["resultModel"], timeType: Time, from: LocationAddress | LocationTBM, @@ -335,7 +334,10 @@ async function insertResults, CA extends [V, strin const criteria = [] as [] | [typeof footDistance] | [typeof bufferTime] | [typeof footDistance, typeof bufferTime]; if ("fd" in args && args.fd === true) (criteria as [typeof footDistance]).push(footDistance); - if ("bt" in args && args.bt === true) (criteria as [typeof bufferTime]).push(bufferTime); + if ("bt" in args && args.bt === true) { + if (dataType !== "scalar") console.warn(`Ignoring criterion "${bufferTime.name}" because of incompatible data type`, dataType); + else (criteria as [typeof bufferTime]).push(bufferTime); + } console.debug( "Using criteria", criteria.map((c) => c.name), From 05759383e1542ca3abdbeb1380ec5a2bd4091d67 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Fri, 11 Jul 2025 14:24:38 +0200 Subject: [PATCH 204/251] =?UTF-8?q?=F0=9F=94=8A=20Inspect=20result?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/index.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/test/index.ts b/src/test/index.ts index b26c3f9b..d2168a87 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -7,6 +7,7 @@ import { DocumentType } from "@typegoose/typegoose"; import minimist from "minimist"; import { FilterQuery } from "mongoose"; import { exit } from "process"; +import { inspect } from "util"; import { bufferTime, footDistance, @@ -516,7 +517,7 @@ async function insertResults( } const b6 = await benchmark(resultRAPTOR, [], undefined, getResTimes); if (!b6.lastReturn) throw new Error(`No best journeys`); - console.debug("Best journeys", b6.lastReturn); + console.debug("Best journeys", inspect(b6.lastReturn, false, 6)); if (saveResults) { // Save results From 669e27dafd0f108851106110cf5cddc91ebf7ce8 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Fri, 11 Jul 2025 14:49:00 +0200 Subject: [PATCH 205/251] =?UTF-8?q?=E2=9C=A8=20Delay=20parameter?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bench.sh | 25 +++++++++++++++++-------- src/test/index.ts | 23 +++++++++++++++++++++-- 2 files changed, 38 insertions(+), 10 deletions(-) diff --git a/bench.sh b/bench.sh index 637c5a3e..e3c3dbd8 100644 --- a/bench.sh +++ b/bench.sh @@ -57,15 +57,24 @@ if [ -n "$CRITERIA" ]; then for CRITERIA in \ '--fd' \ '--bt' \ - '--fd --bt' + # Might be very long... + # '--fd --bt' do - FOLDER="bench/$INSTANCE$(echo "$CRITERIA" | sed 's/ //g')" - mkdir "$FOLDER" 2>/dev/null || true - echo "Bench instance $INSTANCE with criteria $CRITERIA" - # shellcheck disable=SC2086 - pnpm exec 0x -D "$FOLDER" lib/test/index.js -i "$INSTANCE" "$FOOT_DISTANCE" $CRITERIA --runTimes "$TIMES" 1>"$FOLDER/out.txt" 2>/dev/null - sed -i "s|$(dirname "$PWD")/||g" "$FOLDER/flamegraph.html" - echo "Done at: $FOLDER/flamegraph.html" + for DELAY in \ + '--delay-pos=1 --delay-neg=0' \ + '--delay-pos=2 --delay-neg=1' \ + '--delay-pos=3 --delay-neg=2' \ + # Might be very long... + # '--fd --bt' + do + FOLDER="bench/$INSTANCE$(echo "$CRITERIA" | sed 's/ //g')$(echo "$DELAY" | sed -E 's/( ?--delay|=)//g')" + mkdir "$FOLDER" 2>/dev/null || true + echo "Bench instance $INSTANCE with criteria $CRITERIA and delays $DELAY" + # shellcheck disable=SC2086 + pnpm exec 0x -D "$FOLDER" lib/test/index.js -i "$INSTANCE" "$FOOT_DISTANCE" $CRITERIA $DELAY --runTimes "$TIMES" 1>"$FOLDER/out.txt" 2>/dev/null + sed -i "s|$(dirname "$PWD")/||g" "$FOLDER/flamegraph.html" + echo "Done at: $FOLDER/flamegraph.html" + done done done fi diff --git a/src/test/index.ts b/src/test/index.ts index d2168a87..3665766e 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -138,6 +138,10 @@ async function computeRAPTORData( { stops, dbNonScheduledRoutes, dbScheduledRoutes }: Awaited>, fpReqLen: number, dataType: DataType, + /** In ms */ + delayPos: number, + /** In ms */ + delayNeg: number, ) { return [ dataType === "scalar" ? TimeScal : TimeIntOrderLow, @@ -165,7 +169,10 @@ async function computeRAPTORData( // Transform to interval .map((schedule) => dataType === "interval" - ? [[schedule[0], schedule[0]] satisfies InternalTimeInt, [schedule[1], schedule[1]] satisfies InternalTimeInt] + ? [ + [schedule[0] - delayNeg, schedule[0] + delayPos] satisfies InternalTimeInt, + [schedule[1] - delayNeg, schedule[1] + delayPos] satisfies InternalTimeInt, + ] : schedule, ), })), @@ -304,6 +311,18 @@ async function insertResults( } else dataType = "interval"; console.debug("Using data type", dataType); + // Delay + + let delayPos = getArgsOptNumber(args, "delay-pos"); + if (!delayPos) delayPos = dataType === "scalar" ? 0 : 3; + else if (dataType === "scalar" && delayPos > 0) console.warn(`Ignoring positive delay of ${delayPos}s because data type is ${dataType}`); + + let delayNeg = getArgsOptNumber(args, "delay-neg"); + if (!delayNeg) delayNeg = dataType === "scalar" ? 0 : 1; + else if (dataType === "scalar" && delayNeg > 0) console.warn(`Ignoring negative delay of ${delayNeg}s because data type is ${dataType}`); + + if (dataType !== "scalar") console.debug(`Using delay of -${delayNeg}s, ${delayPos}s`); + let instanceType: "RAPTOR" | "SharedRAPTOR" | "McRAPTOR" | "McSharedRAPTOR"; if ("i" in args) { switch ((args.i as string).toLowerCase()) { @@ -374,7 +393,7 @@ async function insertResults( // Compute RAPTOR data - const b2 = await benchmark(computeRAPTORData, [queriedData, fpReqLen, dataType]); + const b2 = await benchmark(computeRAPTORData, [queriedData, fpReqLen, dataType, delayPos * 1_000, delayNeg * 1_000]); const rawRAPTORData = b2.lastReturn; if (!rawRAPTORData) throw new Error("No raw RAPTOR data"); From 4395ac64289697bd33eab8dd7634f7e0c2ec9e66 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Fri, 11 Jul 2025 14:54:08 +0200 Subject: [PATCH 206/251] =?UTF-8?q?=F0=9F=9A=A7=20Default=20instance=20typ?= =?UTF-8?q?e?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/index.ts b/src/test/index.ts index 3665766e..daf1fef1 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -345,7 +345,7 @@ async function insertResults( default: throw new Error(`Unexpected instance type "${args.i}"`); } - } else instanceType = "RAPTOR"; + } else instanceType = "McSharedRAPTOR"; console.debug("Using instance type", instanceType); const createTimes = getArgsOptNumber(args, "createTimes") ?? 1; From 683c5bbb18cbdc415352c6ad4d981e6deb51e267 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Fri, 11 Jul 2025 15:00:34 +0200 Subject: [PATCH 207/251] =?UTF-8?q?=F0=9F=90=9B=20Shared=20attached=20data?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/index.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/test/index.ts b/src/test/index.ts index daf1fef1..0d02c8d4 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -393,6 +393,11 @@ async function insertResults( // Compute RAPTOR data + const distances: Record = { + // Need the true ps + [ps]: 100, + }; + const b2 = await benchmark(computeRAPTORData, [queriedData, fpReqLen, dataType, delayPos * 1_000, delayNeg * 1_000]); const rawRAPTORData = b2.lastReturn; if (!rawRAPTORData) throw new Error("No raw RAPTOR data"); @@ -476,9 +481,6 @@ async function insertResults( // Attach stops const attachStops = new Map>(); - const distances: Record = { - [ps]: 100, - }; attachStops.set(psInternalId, { id: psInternalId, From 3da32bfeba047986423fd176c9638caf982b58b4 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Fri, 11 Jul 2025 15:09:21 +0200 Subject: [PATCH 208/251] =?UTF-8?q?=F0=9F=9A=A7=20Shared=20RAPTOR=20data?= =?UTF-8?q?=20secure=20param?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/index.ts | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/test/index.ts b/src/test/index.ts index 0d02c8d4..abbe5c2a 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -194,7 +194,6 @@ function createRAPTOR(data: ConstructorParameters(data: Parameters>) { const SharedRAPTORDataInst = SharedRAPTORData.makeFromRawData(...data); - SharedRAPTORDataInst.secure = true; return [SharedRAPTORDataInst, new SharedRAPTOR(SharedRAPTORDataInst)] as const; } @@ -211,7 +210,6 @@ function createMcSharedRAPTOR( criteria: ConstructorParameters>[1], ) { const SharedRAPTORDataInst = SharedRAPTORData.makeFromRawData(...data); - SharedRAPTORDataInst.secure = true; return [SharedRAPTORDataInst, new McSharedRAPTOR(SharedRAPTORDataInst, criteria)] as const; } @@ -348,6 +346,14 @@ async function insertResults( } else instanceType = "McSharedRAPTOR"; console.debug("Using instance type", instanceType); + let sharedSecure = false; + if ("shared-secure" in args) { + if (instanceType !== "SharedRAPTOR" && instanceType !== "McSharedRAPTOR") + console.warn("Ignoring shared secure because instance type isn't shared"); + else if (args["shared-secure"]) sharedSecure = true; + } + if (instanceType === "SharedRAPTOR" || instanceType === "McSharedRAPTOR") console.debug(`Shared secure`, sharedSecure); + const createTimes = getArgsOptNumber(args, "createTimes") ?? 1; const runTimes = getArgsOptNumber(args, "runTimes") ?? 1; const getResTimes = getArgsOptNumber(args, "getResTimes") ?? 1; @@ -478,6 +484,8 @@ async function insertResults( >, ]; + if (sharedSecure) (RAPTORDataInst as SharedRAPTORData).secure = true; + // Attach stops const attachStops = new Map>(); From fc16acd96b4842010c61ab8935e3f2c04abda046 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Tue, 15 Jul 2025 18:43:41 +0200 Subject: [PATCH 209/251] =?UTF-8?q?=F0=9F=9A=A7=20Sync=20result=20model=20?= =?UTF-8?q?with=20BIBM?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/models/result.model.ts | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/src/test/models/result.model.ts b/src/test/models/result.model.ts index c4894138..e2e2cbe8 100644 --- a/src/test/models/result.model.ts +++ b/src/test/models/result.model.ts @@ -13,11 +13,11 @@ export enum LocationType { Address = "A", } -import { deleteModelWithClass, getModelForClass, prop, Severity, type Ref } from "@typegoose/typegoose"; +import { deleteModelWithClass, getModelForClass, prop, type Ref } from "@typegoose/typegoose"; import { TimeStamps } from "@typegoose/typegoose/lib/defaultClasses"; import { modelOptions } from "@typegoose/typegoose/lib/modelOptions"; -import { Connection, Schema } from "mongoose"; -import { RAPTORRunSettings } from "../../"; +import { Connection } from "mongoose"; +import { InternalTimeInt, RAPTORRunSettings } from "../../"; import { dbAddresses } from "./addresses.model"; import { dbTBM_Stops } from "./TBM_stops.model"; import { dbTBM_ScheduledRoutes } from "./TBMScheduledRoutes.model"; @@ -32,10 +32,10 @@ export type routeId = dbTBM_ScheduledRoutes["_id"]; }) class RunSettings implements RAPTORRunSettings { @prop({ required: true }) - public walkSpeed!: number; + public maxTransferLength!: number; @prop({ required: true }) - public maxTransferLength!: number; + public walkSpeed!: number; } @modelOptions({ @@ -49,8 +49,8 @@ export class JourneyStepBase { /** @description JourneyStep type */ public type!: JourneyStepType; - @prop({ required: true, type: () => Schema.Types.Mixed }) - public time!: unknown; + @prop({ required: true }) + public time!: InternalTimeInt; } class Transfer { @@ -92,11 +92,10 @@ export class Criterion { @prop({ required: true }) public name!: string; - @prop({ required: true, type: () => Schema.Types.Mixed }) + @prop({ required: true }) public value!: unknown; } -@modelOptions({ options: { allowMixed: Severity.ALLOW } }) export class Journey { @prop({ required: true, @@ -141,7 +140,7 @@ export function isLocationAddress(loc: LocationBase): loc is LocationAddress { return loc.type === LocationType.Address; } -@modelOptions({ options: { customName: "results", allowMixed: Severity.ALLOW } }) +@modelOptions({ options: { customName: "results" } }) export class dbComputeResult extends TimeStamps { @prop({ required: true, @@ -163,8 +162,8 @@ export class dbComputeResult extends TimeStamps { }) public to!: LocationBase; - @prop({ required: true, type: () => Schema.Types.Mixed }) - departureTime!: unknown; + @prop({ required: true }) + departureTime!: Date; @prop({ required: true, type: () => RunSettings }) settings!: RunSettings; From 9954d8a8039cf52962c5d5be28f4cb7a0dcac524 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Tue, 15 Jul 2025 18:45:30 +0200 Subject: [PATCH 210/251] =?UTF-8?q?=F0=9F=9A=A7=20Allow=20delay=20to=20be?= =?UTF-8?q?=20unset=20hence=20being=20same=20as=20BIBM?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/index.ts | 62 ++++++++++++++++++++++++++++++----------------- 1 file changed, 40 insertions(+), 22 deletions(-) diff --git a/src/test/index.ts b/src/test/index.ts index abbe5c2a..17c1cb22 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -138,10 +138,8 @@ async function computeRAPTORData( { stops, dbNonScheduledRoutes, dbScheduledRoutes }: Awaited>, fpReqLen: number, dataType: DataType, - /** In ms */ - delayPos: number, - /** In ms */ - delayNeg: number, + /** In ms, [neg, pos] */ + delay: [number, number] | null, ) { return [ dataType === "scalar" ? TimeScal : TimeIntOrderLow, @@ -161,20 +159,36 @@ async function computeRAPTORData( trips.map(({ tripId, schedules }) => ({ id: tripId, times: schedules - .map<[number, number]>((schedule) => + .map<[(typeof schedules)[number], [number, number]]>((schedule) => [ + schedule, typeof schedule === "object" && "hor_estime" in schedule ? [schedule.hor_estime.getTime() || TimeScal.MAX_SAFE, schedule.hor_estime.getTime() || TimeScal.MAX_SAFE] : [TimeScal.MAX, TimeScal.MAX], - ) + ]) // Transform to interval - .map((schedule) => - dataType === "interval" - ? [ - [schedule[0] - delayNeg, schedule[0] + delayPos] satisfies InternalTimeInt, - [schedule[1] - delayNeg, schedule[1] + delayPos] satisfies InternalTimeInt, - ] - : schedule, - ), + .map(([schedule, [arr, dep]]) => { + if (dataType === "interval") { + if (delay) + return [[arr - delay[0], arr + delay[1]] satisfies InternalTimeInt, [dep - delay[0], dep + delay[1]] satisfies InternalTimeInt]; + else { + if (typeof schedule !== "object") + return [ + [arr, arr], + [dep, dep], + ] satisfies [InternalTimeInt, InternalTimeInt]; + + let theo = schedule.hor_theo.getTime() || TimeScal.MAX_SAFE; + let estime = schedule.hor_estime.getTime() || schedule.hor_app.getTime() || TimeScal.MAX_SAFE; + + // Prevent upper bound to be MAX_SAFE + if (theo < TimeScal.MAX_SAFE && estime === TimeScal.MAX_SAFE) estime = theo; + if (estime < TimeScal.MAX_SAFE && theo === TimeScal.MAX_SAFE) theo = estime; + + const int = theo < estime ? [theo, estime] : [estime, theo]; + return [[int[0], int[1]] as const, [int[0], int[1]] as const] satisfies [unknown, unknown]; + } + } else return [arr, dep] satisfies [unknown, unknown]; + }), })), ] satisfies [unknown, unknown, unknown], ), @@ -311,15 +325,19 @@ async function insertResults( // Delay - let delayPos = getArgsOptNumber(args, "delay-pos"); - if (!delayPos) delayPos = dataType === "scalar" ? 0 : 3; - else if (dataType === "scalar" && delayPos > 0) console.warn(`Ignoring positive delay of ${delayPos}s because data type is ${dataType}`); + const delayPos = getArgsOptNumber(args, "delay-pos"); + if (delayPos !== null && dataType === "scalar" && delayPos > 0) + console.warn(`Ignoring positive delay of ${delayPos}s because data type is ${dataType}`); - let delayNeg = getArgsOptNumber(args, "delay-neg"); - if (!delayNeg) delayNeg = dataType === "scalar" ? 0 : 1; - else if (dataType === "scalar" && delayNeg > 0) console.warn(`Ignoring negative delay of ${delayNeg}s because data type is ${dataType}`); + const delayNeg = getArgsOptNumber(args, "delay-neg"); + if (delayNeg !== null && dataType === "scalar" && delayNeg > 0) + console.warn(`Ignoring negative delay of ${delayNeg}s because data type is ${dataType}`); - if (dataType !== "scalar") console.debug(`Using delay of -${delayNeg}s, ${delayPos}s`); + /** [neg, pos] */ + let delay: [number, number] | null = null; + if (delayNeg !== null || delayPos !== null) delay = [delayNeg ?? 0, delayPos ?? 0]; + + if (dataType !== "scalar") console.debug(delay ? `Using delay of -${delay[0]}s, ${delay[1]}s` : `Using natural delay`); let instanceType: "RAPTOR" | "SharedRAPTOR" | "McRAPTOR" | "McSharedRAPTOR"; if ("i" in args) { @@ -404,7 +422,7 @@ async function insertResults( [ps]: 100, }; - const b2 = await benchmark(computeRAPTORData, [queriedData, fpReqLen, dataType, delayPos * 1_000, delayNeg * 1_000]); + const b2 = await benchmark(computeRAPTORData, [queriedData, fpReqLen, dataType, delay]); const rawRAPTORData = b2.lastReturn; if (!rawRAPTORData) throw new Error("No raw RAPTOR data"); From 2862bb3f35291798049384b6bbd391304ec423a9 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Tue, 15 Jul 2025 18:46:01 +0200 Subject: [PATCH 211/251] =?UTF-8?q?=F0=9F=9A=A7=20Adapt=20to=20result=20mo?= =?UTF-8?q?del?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/index.ts | 45 +++++++++++++++------------------------------ 1 file changed, 15 insertions(+), 30 deletions(-) diff --git a/src/test/index.ts b/src/test/index.ts index 17c1cb22..4b5ed56e 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -230,36 +230,21 @@ function createMcSharedRAPTOR( type DBJourney = Omit & { steps: (JourneyStepBase | JourneyStepFoot | JourneyStepVehicle)[]; }; -function journeyDBFormatter( +function journeyDBFormatter( journey: NonNullable["getBestJourneys"]>[number][number]>, ): DBJourney { return { - steps: journey.map((js) => { - if ("transfer" in js) { - return { - ...js, - time: js.label.time, - type: JourneyStepType.Foot, - } satisfies JourneyStepFoot; - } - - if ("route" in js) { - if (typeof js.route.id === "string") throw new Error("Invalid route to retrieve."); - - return { - ...js, - time: js.label.time, - route: js.route.id, - type: JourneyStepType.Vehicle, - } satisfies JourneyStepVehicle; - } - - return { - ...js, - time: js.label.time, - type: JourneyStepType.Base, - } satisfies JourneyStepBase; - }), + steps: journey.map((js) => ({ + ...js, + time: typeof js.label.time === "number" ? [js.label.time, js.label.time] : js.label.time, + ...("transfer" in js + ? { type: JourneyStepType.Foot } + : "route" in js + ? { route: js.route.id, type: JourneyStepType.Vehicle } + : { + type: JourneyStepType.Base, + }), + })), criteria: journey[0].label.criteria.map(({ name }) => ({ name, // eslint-disable-next-line @typescript-eslint/no-non-null-assertion @@ -268,7 +253,7 @@ function journeyDBFormatter( }; } -async function insertResults( +async function insertResults( resultModel: Awaited>["resultModel"], timeType: Time, from: LocationAddress | LocationTBM, @@ -282,7 +267,7 @@ async function insertResults( const { _id } = await resultModel.create({ from, to, - departureTime, + departureTime: typeof departureTime !== "number" ? departureTime[0] : departureTime, journeys: results .flat() // Sort by arrival time @@ -543,7 +528,7 @@ async function insertResults( (await queriedData.TBMSchedulesModel.find({}, { hor_estime: 1 }).sort({ hor_estime: -1 }).limit(1))[0]?.hor_estime?.getTime() ?? Infinity; const meanSchedule = (minSchedule + maxSchedule) / 2; - const departureTime = dataType === "interval" ? ([meanSchedule, meanSchedule] satisfies [unknown, unknown]) : meanSchedule; + const departureTime = dataType === "interval" ? ([maxUpdatedAt, maxUpdatedAt] satisfies [unknown, unknown]) : maxUpdatedAt; const settings: RAPTORRunSettings = { walkSpeed: 1.5, maxTransferLength: fpRunLen }; From 067ae6c311020a23ad7f11138c82698fa27cee9a Mon Sep 17 00:00:00 2001 From: Catatomik Date: Tue, 15 Jul 2025 18:46:15 +0200 Subject: [PATCH 212/251] =?UTF-8?q?=F0=9F=9A=A7=20Default=20departure=20ti?= =?UTF-8?q?me=20calculation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/index.ts | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/test/index.ts b/src/test/index.ts index 4b5ed56e..d10141b4 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -518,15 +518,7 @@ async function insertResults Date: Tue, 15 Jul 2025 18:46:43 +0200 Subject: [PATCH 213/251] =?UTF-8?q?=F0=9F=9A=A7=20Allow=20bufferTime=20wit?= =?UTF-8?q?h=20any=20time=20type?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/index.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/test/index.ts b/src/test/index.ts index d10141b4..0cbeab09 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -363,10 +363,8 @@ async function insertResults c.name), From 95ca59b19d7eab3bf1949b23c6f89059a1f7482c Mon Sep 17 00:00:00 2001 From: Catatomik Date: Wed, 16 Jul 2025 14:17:51 +0200 Subject: [PATCH 214/251] =?UTF-8?q?=F0=9F=9A=A7=20Stop=20attaching?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/index.ts | 45 ++++++++++++++++++++++----------------------- 1 file changed, 22 insertions(+), 23 deletions(-) diff --git a/src/test/index.ts b/src/test/index.ts index 0cbeab09..1b57b481 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -143,14 +143,17 @@ async function computeRAPTORData( ) { return [ dataType === "scalar" ? TimeScal : TimeIntOrderLow, - await mapAsync<(typeof stops)[number], Stop>(stops, async ({ id, connectedRoutes }) => ({ - id, - connectedRoutes, - transfers: (await dbNonScheduledRoutes(id, { distance: { $lte: fpReqLen } })).map(({ to, distance }) => ({ - to, - length: distance, - })), - })), + await mapAsync<(typeof stops)[number], ReturnType>[1]["at"]>>( + stops, + async ({ id, connectedRoutes }) => [ + id, + connectedRoutes, + (await dbNonScheduledRoutes(id, { distance: { $lte: fpReqLen } })).map(({ to, distance }) => ({ + to, + length: distance, + })), + ], + ), dbScheduledRoutes.map( ({ _id, stops, trips }) => [ @@ -472,13 +475,13 @@ async function insertResults, "attachData"> & { - attachData: SharedRAPTORData["attachData"]; + Omit, "attachData"> & { + attachStops: SharedRAPTORData["attachStops"]; }, BaseRAPTOR< Timestamp | InternalTimeInt, SharedID, - SharedID, + number, number, number, [] | [[number, "footDistance"]] | [[number, "bufferTime"]] | [[number, "footDistance"], [number, "bufferTime"]] @@ -489,29 +492,25 @@ async function insertResults>(); + const attachStops = new Map>>(); - attachStops.set(psInternalId, { - id: psInternalId, - connectedRoutes: [], - transfers: Object.keys(distances).map((k) => { + attachStops.set(psInternalId, [ + psInternalId, + [], + Object.keys(distances).map((k) => { const sId = parseInt(k); return { to: sId, length: distances[sId] }; }), - }); + ]); Object.keys(distances).forEach((k) => { const sId = parseInt(k); - attachStops.set(sId, { - id: sId, - connectedRoutes: [], - transfers: [{ to: psInternalId, length: distances[sId] }], - }); + attachStops.set(sId, [sId, [], [{ to: psInternalId, length: distances[sId] }]]); }); - RAPTORDataInst.attachData(Array.from(attachStops.values()), []); + RAPTORDataInst.attachStops(Array.from(attachStops.values())); // Run params From 81eeeb78e61c79e06b688299ec53d12d54886114 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Wed, 16 Jul 2025 15:00:26 +0200 Subject: [PATCH 215/251] =?UTF-8?q?=F0=9F=9A=A7=20Types?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/index.ts b/src/test/index.ts index 1b57b481..d46ba484 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -143,7 +143,7 @@ async function computeRAPTORData( ) { return [ dataType === "scalar" ? TimeScal : TimeIntOrderLow, - await mapAsync<(typeof stops)[number], ReturnType>[1]["at"]>>( + await mapAsync<(typeof stops)[number], ConstructorParameters>[1][number]>( stops, async ({ id, connectedRoutes }) => [ id, From 1717676906fddb47bb0e95f2ef39cc631b8db466 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Thu, 17 Jul 2025 18:26:31 +0200 Subject: [PATCH 216/251] =?UTF-8?q?=F0=9F=9A=A7=20Post=20treatment?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/index.ts | 56 ++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 48 insertions(+), 8 deletions(-) diff --git a/src/test/index.ts b/src/test/index.ts index d46ba484..c1c9dc2a 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -13,8 +13,10 @@ import { footDistance, InternalTimeInt, IRAPTORData, + Journey, McRAPTOR, McSharedRAPTOR, + measureJourney, RAPTOR, RAPTORData, RAPTORRunSettings, @@ -24,6 +26,7 @@ import { sharedTimeIntOrderLow, sharedTimeScal, Stop, + successProbaInt, Time, TimeIntOrderLow, TimeScal, @@ -32,7 +35,7 @@ import { import BaseRAPTOR from "../base"; import NonScheduledRoutesModelInit, { dbFootPaths } from "./models/NonScheduledRoutes.model"; import ResultModelInit, { - Journey, + Journey as DBJourney, JourneyStepBase, JourneyStepFoot, JourneyStepType, @@ -230,12 +233,38 @@ function createMcSharedRAPTOR( return [SharedRAPTORDataInst, new McSharedRAPTOR(SharedRAPTORDataInst, criteria)] as const; } -type DBJourney = Omit & { +type InstanceType = "RAPTOR" | "SharedRAPTOR" | "McRAPTOR" | "McSharedRAPTOR"; + +function isTimeTypeInternalInt(timeType: unknown): timeType is Time { + return timeType === TimeIntOrderLow; +} + +function postTreatment( + timeType: Time, + instanceType: InstanceType, + results: ReturnType["getBestJourneys"]>, + pt: SharedID, +) { + if (isTimeTypeInternalInt(timeType)) { + if (instanceType === "McRAPTOR" || instanceType === "McSharedRAPTOR") { + // Add success proba as post treatment + results = results.map((journeys) => + journeys.map((journey) => + measureJourney(successProbaInt, timeType, journey as unknown as Journey, pt), + ), + ) as unknown as typeof results; + } + } + + return results; +} + +type DBJourneyReal = Omit & { steps: (JourneyStepBase | JourneyStepFoot | JourneyStepVehicle)[]; }; function journeyDBFormatter( - journey: NonNullable["getBestJourneys"]>[number][number]>, -): DBJourney { + journey: NonNullable["getBestJourneys"]>[number][number]>, +): DBJourneyReal { return { steps: journey.map((js) => ({ ...js, @@ -263,7 +292,7 @@ async function insertResults["getBestJourneys"]>, + results: ReturnType["getBestJourneys"]>, ) { if (!results.length) throw new Error("No journey found"); @@ -327,7 +356,7 @@ async function insertResults, + [RAPTORDataInst.timeType, instanceType, b6.lastReturn, pt], + ); + if (!b7.lastReturn) throw new Error(`No post treatment`); + console.debug("Post treatment", inspect(b7.lastReturn, false, 6)); + if (saveResults) { // Save results - const b7 = await benchmark( + const b8 = await benchmark( insertResults< Timestamp | InternalTimeInt, number, @@ -551,7 +591,7 @@ async function insertResults, [queriedData.resultModel, RAPTORDataInst.timeType, from, { type: LocationType.TBM, id: pt }, departureTime, settings, b6.lastReturn], ); - console.log("Saved result id", b7.lastReturn); + console.log("Saved result id", b8.lastReturn); } })() .then(() => { From 3e191e7295b532ab6742912ad9e4ecb3edc3ab3e Mon Sep 17 00:00:00 2001 From: Catatomik Date: Mon, 21 Jul 2025 09:34:12 +0200 Subject: [PATCH 217/251] =?UTF-8?q?=F0=9F=9A=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/index.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/test/index.ts b/src/test/index.ts index c1c9dc2a..d990da37 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -28,7 +28,7 @@ import { Stop, successProbaInt, Time, - TimeIntOrderLow, + TimeInt, TimeScal, Timestamp, } from "../"; @@ -145,7 +145,7 @@ async function computeRAPTORData( delay: [number, number] | null, ) { return [ - dataType === "scalar" ? TimeScal : TimeIntOrderLow, + dataType === "scalar" ? TimeScal : TimeInt, await mapAsync<(typeof stops)[number], ConstructorParameters>[1][number]>( stops, async ({ id, connectedRoutes }) => [ @@ -236,7 +236,7 @@ function createMcSharedRAPTOR( type InstanceType = "RAPTOR" | "SharedRAPTOR" | "McRAPTOR" | "McSharedRAPTOR"; function isTimeTypeInternalInt(timeType: unknown): timeType is Time { - return timeType === TimeIntOrderLow; + return timeType === TimeInt; } function postTreatment( @@ -304,7 +304,7 @@ async function insertResults timeType.order(a.at(-1)!.label.time, b.at(-1)!.label.time)) + .sort((a, b) => timeType.strict.order(a.at(-1)!.label.time, b.at(-1)!.label.time)) .map((journey) => journeyDBFormatter(journey)), settings, }); From 49c2eebee2a8053e1f1ff2949f1598654ed3ba88 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Mon, 21 Jul 2025 11:52:53 +0200 Subject: [PATCH 218/251] =?UTF-8?q?=F0=9F=9A=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/index.ts | 35 +++++++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 8 deletions(-) diff --git a/src/test/index.ts b/src/test/index.ts index d990da37..77167184 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -10,6 +10,8 @@ import { exit } from "process"; import { inspect } from "util"; import { bufferTime, + convertBackJourneyStep, + convertJourneyStep, footDistance, InternalTimeInt, IRAPTORData, @@ -236,22 +238,39 @@ function createMcSharedRAPTOR( type InstanceType = "RAPTOR" | "SharedRAPTOR" | "McRAPTOR" | "McSharedRAPTOR"; function isTimeTypeInternalInt(timeType: unknown): timeType is Time { - return timeType === TimeInt; + return typeof timeType === "object" && timeType !== null && "MAX_SAFE" in timeType && timeType.MAX_SAFE === TimeInt.MAX_SAFE; } function postTreatment( - timeType: Time, + data: IRAPTORData, instanceType: InstanceType, results: ReturnType["getBestJourneys"]>, pt: SharedID, ) { + const timeType = data.timeType; + if (isTimeTypeInternalInt(timeType)) { if (instanceType === "McRAPTOR" || instanceType === "McSharedRAPTOR") { // Add success proba as post treatment results = results.map((journeys) => - journeys.map((journey) => - measureJourney(successProbaInt, timeType, journey as unknown as Journey, pt), - ), + journeys.map((journey) => { + const measured = measureJourney( + successProbaInt, + timeType, + (instanceType === "McSharedRAPTOR" + ? journey.map((js) => convertJourneyStep(data as SharedRAPTORData)(js)) + : journey) as unknown as Journey, + pt, + ); + + return instanceType === "McSharedRAPTOR" + ? measured.map((js) => + convertBackJourneyStep( + data as unknown as SharedRAPTORData, + )(js), + ) + : measured; + }), ) as unknown as typeof results; } } @@ -504,7 +523,7 @@ async function insertResults, "attachData"> & { + Omit, "attachStops"> & { attachStops: SharedRAPTORData["attachStops"]; }, BaseRAPTOR< @@ -575,7 +594,7 @@ async function insertResults, - [RAPTORDataInst.timeType, instanceType, b6.lastReturn, pt], + [RAPTORDataInst, instanceType, b6.lastReturn, pt], ); if (!b7.lastReturn) throw new Error(`No post treatment`); console.debug("Post treatment", inspect(b7.lastReturn, false, 6)); @@ -589,7 +608,7 @@ async function insertResults, - [queriedData.resultModel, RAPTORDataInst.timeType, from, { type: LocationType.TBM, id: pt }, departureTime, settings, b6.lastReturn], + [queriedData.resultModel, RAPTORDataInst.timeType, from, { type: LocationType.TBM, id: pt }, departureTime, settings, b7.lastReturn], ); console.log("Saved result id", b8.lastReturn); } From 646381fb7383fab65c080c7e9f89f3b19118ef20 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Mon, 21 Jul 2025 12:37:27 +0000 Subject: [PATCH 219/251] Updating coverage badges --- badges/coverage-branches.svg | 2 +- badges/coverage-functions.svg | 2 +- badges/coverage-lines.svg | 2 +- badges/coverage-statements.svg | 2 +- badges/coverage-total.svg | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/badges/coverage-branches.svg b/badges/coverage-branches.svg index c1b22689..71acff9e 100644 --- a/badges/coverage-branches.svg +++ b/badges/coverage-branches.svg @@ -1 +1 @@ -Coverage: branches: 86.87%Coverage: branches86.87% \ No newline at end of file +Coverage: branches: 85.13%Coverage: branches85.13% \ No newline at end of file diff --git a/badges/coverage-functions.svg b/badges/coverage-functions.svg index cc4cf054..fd6da43f 100644 --- a/badges/coverage-functions.svg +++ b/badges/coverage-functions.svg @@ -1 +1 @@ -Coverage: functions: 94.84%Coverage: functions94.84% \ No newline at end of file +Coverage: functions: 93.87%Coverage: functions93.87% \ No newline at end of file diff --git a/badges/coverage-lines.svg b/badges/coverage-lines.svg index cb75e386..6e59e213 100644 --- a/badges/coverage-lines.svg +++ b/badges/coverage-lines.svg @@ -1 +1 @@ -Coverage: lines: 96.05%Coverage: lines96.05% \ No newline at end of file +Coverage: lines: 95.7%Coverage: lines95.7% \ No newline at end of file diff --git a/badges/coverage-statements.svg b/badges/coverage-statements.svg index 2e3f83fb..6195b1ae 100644 --- a/badges/coverage-statements.svg +++ b/badges/coverage-statements.svg @@ -1 +1 @@ -Coverage: statements: 94.87%Coverage: statements94.87% \ No newline at end of file +Coverage: statements: 94.61%Coverage: statements94.61% \ No newline at end of file diff --git a/badges/coverage-total.svg b/badges/coverage-total.svg index 07a364e8..dd00fea7 100644 --- a/badges/coverage-total.svg +++ b/badges/coverage-total.svg @@ -1 +1 @@ -Coverage: total: 93.16%Coverage: total93.16% \ No newline at end of file +Coverage: total: 92.33%Coverage: total92.33% \ No newline at end of file From 859f16a5d598b599447951012fc01c549d54e21f Mon Sep 17 00:00:00 2001 From: Catatomik Date: Tue, 22 Jul 2025 10:06:16 +0200 Subject: [PATCH 220/251] =?UTF-8?q?=F0=9F=8E=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/utils/Workers.ts | 12 ++++++------ src/test/utils/index.ts | 23 +++++++++++++---------- 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/src/test/utils/Workers.ts b/src/test/utils/Workers.ts index e9d8a6f7..a7bbd778 100644 --- a/src/test/utils/Workers.ts +++ b/src/test/utils/Workers.ts @@ -2,7 +2,7 @@ import { Worker } from "worker_threads"; import { Duration } from "./benchmark"; import { Queue, unpackQueue } from "./Queue"; import { TypedEventEmitter } from "./TypedEmitter"; -import { resolveCb, rejectCb, Deferred } from "."; +import { ResolveCb, RejectCb, Deferred } from "."; const nsPerMs = BigInt(1e6); enum Status { @@ -17,7 +17,7 @@ interface poolWorker { work: queuedJob | null; } -type queuedJob = [T, resolveCb, rejectCb]; +type queuedJob = [T, ResolveCb, RejectCb]; // eslint-disable-next-line @typescript-eslint/consistent-type-definitions type workerPoolEvents = { @@ -73,12 +73,12 @@ export class WorkerPool unknown, F extends (...a } } - run(data: Parameters, res: resolveCb>>, rej: rejectCb): void; + run(data: Parameters, res: ResolveCb>>, rej: RejectCb): void; run(data: Parameters): Promise>>; - async run(data: Parameters, res?: resolveCb>>, rej?: rejectCb) { + async run(data: Parameters, res?: ResolveCb>>, rej?: RejectCb) { let def: Deferred>> | null = null; - let resolve: resolveCb>>; - let reject: rejectCb; + let resolve: ResolveCb>>; + let reject: RejectCb; if (!res || !rej) { def = new Deferred>>(); diff --git a/src/test/utils/index.ts b/src/test/utils/index.ts index 57def1b9..b6faac74 100644 --- a/src/test/utils/index.ts +++ b/src/test/utils/index.ts @@ -1,13 +1,13 @@ import { Ref } from "@typegoose/typegoose"; import { RefType } from "@typegoose/typegoose/lib/types"; -export type resolveCb = (value: T) => void; -export type rejectCb = (reason?: unknown) => void; +type ResolveCb = (value: T) => void; +type RejectCb = (reason?: unknown) => void; -export class Deferred { +class Deferred { public promise: Promise; - public resolve!: resolveCb; - public reject!: rejectCb; + public resolve!: ResolveCb; + public reject!: RejectCb; constructor() { this.promise = new Promise((resolve, reject) => { @@ -20,7 +20,7 @@ export class Deferred { /** * @description Checks unicity of a value in an array */ -export function unique(v: T, i: number, arr: T[]): boolean { +function unique(v: T, i: number, arr: T[]): boolean { return arr.indexOf(v) === i; } @@ -35,7 +35,7 @@ export function unique(v: T, i: number, arr: T[]): boolean { * - a positive number of `a` is after `b`. * @returns The index of el if positive ; index of insertion if negative */ -export function binarySearch(arr: T[], el: C, compare: (a: C, b: T) => number) { +function binarySearch(arr: T[], el: C, compare: (a: C, b: T) => number) { let low = 0; let high = arr.length - 1; while (low <= high) { @@ -52,7 +52,7 @@ export function binarySearch(arr: T[], el: C, compare: (a: C, b: T) => num return ~low; // ~x == -x-1 } -export function binaryFilter(arr: T[], el: C, compare: (a: C, b: T) => number): T[] { +function binaryFilter(arr: T[], el: C, compare: (a: C, b: T) => number): T[] { const binarySearchResult = binarySearch(arr, el, compare); if (binarySearchResult < 0) return []; let low = binarySearchResult; @@ -66,11 +66,11 @@ export function binaryFilter(arr: T[], el: C, compare: (a: C, b: T) => num return arr.slice(low, high + 1); } -export async function mapAsync(array: I[], callback: (value: I, index: number, array: I[]) => Promise): Promise { +async function mapAsync(array: I[], callback: (value: I, index: number, array: I[]) => Promise): Promise { return await Promise.all(array.map(callback)); } -export function wait(ms = 1000): Promise { +function wait(ms = 1000): Promise { const defP = new Deferred(); setTimeout(() => { @@ -94,3 +94,6 @@ export type unpackRefType = ? D["_id"][] : never : never; + +export { Deferred, unique, binarySearch, binaryFilter, mapAsync, wait }; +export type { ResolveCb, RejectCb }; From e606a71b4f06487322080f618794b0aa6acc60a7 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Tue, 22 Jul 2025 10:06:56 +0200 Subject: [PATCH 221/251] =?UTF-8?q?=F0=9F=8E=A8=20Types?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/index.ts | 17 ++++++----------- src/test/utils/index.ts | 17 +++++++++-------- 2 files changed, 15 insertions(+), 19 deletions(-) diff --git a/src/test/index.ts b/src/test/index.ts index 77167184..384aa234 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -49,7 +49,7 @@ import ResultModelInit, { import TBMSchedulesModelInit from "./models/TBM_schedules.model"; import stopsModelInit, { dbTBM_Stops } from "./models/TBM_stops.model"; import TBMScheduledRoutesModelInit, { dbTBM_ScheduledRoutes } from "./models/TBMScheduledRoutes.model"; -import { binarySearch, mapAsync, unpackRefType } from "./utils"; +import { binarySearch, mapAsync, UnpackRefs } from "./utils"; import { benchmark } from "./utils/benchmark"; async function queryData() { @@ -63,11 +63,9 @@ async function queryData() { const resultModel = ResultModelInit(computeDB); - const dbScheduledRoutesProjection: Partial> = { _id: 1, stops: 1, trips: 1 }; + const dbScheduledRoutesProjection = { _id: 1, stops: 1, trips: 1 } satisfies Partial>; type dbScheduledRoute = Pick; - interface ScheduledRoutesOverwritten { - stops: unpackRefType; - } + type ScheduledRoutesOverwritten = UnpackRefs; type ScheduledRoute = Omit & ScheduledRoutesOverwritten; const dbScheduledRoutes = (await TBMScheduledRoutesModel.find>>({}, dbScheduledRoutesProjection) @@ -75,7 +73,7 @@ async function queryData() { .lean() .exec()) as ScheduledRoute[]; - const dbStopProjection = { _id: 1 } as const; + const dbStopProjection = { _id: 1 } satisfies Partial>; type Stop = Pick; const stops = dbScheduledRoutes.reduce<{ id: ScheduledRoute["stops"][number]; connectedRoutes: ScheduledRoute["_id"][] }[]>( @@ -105,12 +103,9 @@ async function queryData() { ).map(({ _id: id }) => ({ id, connectedRoutes: [] })), ); - const dbNonScheduledRoutesProjection: Partial> = { from: 1, to: 1, distance: 1 }; + const dbNonScheduledRoutesProjection = { from: 1, to: 1, distance: 1 } satisfies Partial>; type dbNonScheduledRoute = Pick; - interface NonScheduledRoutesOverwritten { - from: unpackRefType; - to: unpackRefType; - } + type NonScheduledRoutesOverwritten = UnpackRefs; type NonScheduledRoute = Omit & NonScheduledRoutesOverwritten; //Query must associate (s, from) AND (from, s) forall s in stops ! diff --git a/src/test/utils/index.ts b/src/test/utils/index.ts index b6faac74..a7b53383 100644 --- a/src/test/utils/index.ts +++ b/src/test/utils/index.ts @@ -80,20 +80,21 @@ function wait(ms = 1000): Promise { return defP.promise; } -export type unpackRefType = - T extends Ref - ? D extends { +type UnpackRefs = Omit & { + [P in K]: D[P] extends Ref + ? T extends { _id?: RefType; } - ? D["_id"] + ? T["_id"] : never - : T extends Ref[] - ? D extends { + : D[P] extends Ref[] + ? T extends { _id?: RefType; } - ? D["_id"][] + ? T["_id"][] : never : never; +}; export { Deferred, unique, binarySearch, binaryFilter, mapAsync, wait }; -export type { ResolveCb, RejectCb }; +export type { ResolveCb, RejectCb, UnpackRefs }; From 29605513d3d777e235898bf7d31072f8218ed029 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Tue, 22 Jul 2025 10:07:17 +0200 Subject: [PATCH 222/251] =?UTF-8?q?=F0=9F=9A=A7=20Scheduled=20routes=20mod?= =?UTF-8?q?el=20make=20PK=20a=20FK?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/models/TBMScheduledRoutes.model.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/test/models/TBMScheduledRoutes.model.ts b/src/test/models/TBMScheduledRoutes.model.ts index 8b987d0a..20522e9d 100644 --- a/src/test/models/TBMScheduledRoutes.model.ts +++ b/src/test/models/TBMScheduledRoutes.model.ts @@ -7,6 +7,7 @@ import { TimeStamps } from "@typegoose/typegoose/lib/defaultClasses"; import { modelOptions } from "@typegoose/typegoose/lib/modelOptions"; import { Connection } from "mongoose"; import { TBMEndpoints } from "."; +import { dbTBM_Lines_routes } from "./TBM_lines_routes.model"; import { dbTBM_Schedules_rt, default as TBMSchedulesRtInit } from "./TBM_schedules.model"; import { dbTBM_Stops, default as TBMStopsInit } from "./TBM_stops.model"; @@ -21,9 +22,9 @@ export class TripOfScheduledRoute { @modelOptions({ options: { customName: TBMEndpoints.ScheduledRoutes } }) export class dbTBM_ScheduledRoutes extends TimeStamps { - @prop({ required: true }) + @prop({ required: true, ref: () => dbTBM_Lines_routes, type: () => Number }) // routeId - public _id!: number; + public _id!: Ref; @prop({ required: true, type: () => TripOfScheduledRoute }) public trips!: TripOfScheduledRoute[]; From 5e3959b0b4d60bb8b77fd029fa9fdf09f8a3e644 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Tue, 22 Jul 2025 10:07:26 +0200 Subject: [PATCH 223/251] =?UTF-8?q?=E2=9C=A8=20Lint=20scheduled=20routes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/lintScheduledRoutes.ts | 66 +++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 src/test/lintScheduledRoutes.ts diff --git a/src/test/lintScheduledRoutes.ts b/src/test/lintScheduledRoutes.ts new file mode 100644 index 00000000..8783e877 --- /dev/null +++ b/src/test/lintScheduledRoutes.ts @@ -0,0 +1,66 @@ +import initDB from "./utils/mongoose"; + +// Needed to solve "Reflect.getMetadata is not a function" error of typegoose +import "core-js/features/reflect"; + +import TBMScheduledRoutesModelInit, { dbTBM_ScheduledRoutes } from "./models/TBMScheduledRoutes.model"; +import TBMLinesRoutesModelInit from "./models/TBM_lines.model"; +import TBMLinesModelInit from "./models/TBM_lines_routes.model"; + +import { UnpackRefs } from "./utils"; +import { benchmark } from "./utils/benchmark"; + +(async () => { + async function queryData() { + console.debug("Querying data..."); + const sourceDB = await initDB("bibm"); + + TBMLinesRoutesModelInit(sourceDB); + const TBMLinesRoutesModel = TBMLinesModelInit(sourceDB); + + const dbScheduledRoutesProjection = { _id: 1, stops: 1, trips: 1 } satisfies Partial>; + type dbScheduledRoute = Pick; + type ScheduledRoutesOverwritten = UnpackRefs; + type ScheduledRoute = Omit & ScheduledRoutesOverwritten; + const TBMScheduledRoutesModel = TBMScheduledRoutesModelInit(sourceDB); + + return { + dbScheduledRoutes: ( + TBMScheduledRoutesModel.find({}, dbScheduledRoutesProjection).populate("trips.schedules").lean() as ReturnType< + typeof TBMScheduledRoutesModel.find + > + ).cursor(), + TBMScheduledRoutesModel, + TBMLinesRoutesModel, + }; + } + + async function lintScheduledRoutes({ dbScheduledRoutes, TBMScheduledRoutesModel, TBMLinesRoutesModel }: Awaited>) { + // Lint schedules routes + console.debug("Linting..."); + + for await (const scheduledRoute of dbScheduledRoutes) + for (const [tripIndex, trip] of scheduledRoute.trips.entries()) + for (const [i, schedule] of trip.schedules.entries()) + if (typeof schedule !== "object" || (schedule.rs_sv_arret_p !== Infinity && schedule.rs_sv_arret_p !== scheduledRoute.stops[i])) { + const scheduledRoutePop = await TBMScheduledRoutesModel.populate(scheduledRoute, "_id"); + scheduledRoutePop._id = await TBMLinesRoutesModel.populate(scheduledRoutePop._id, "rs_sv_ligne_a"); + + console.log( + `Route ${typeof scheduledRoutePop._id === "object" ? `${typeof scheduledRoutePop._id.rs_sv_ligne_a === "object" ? scheduledRoutePop._id.rs_sv_ligne_a.libelle : scheduledRoutePop._id.rs_sv_ligne_a} ${scheduledRoutePop._id.libelle} (${scheduledRoutePop._id._id})` : scheduledRoutePop._id}, trip idx ${tripIndex} (${trip.tripId}): at idx ${i}, schedule's stop ${typeof schedule === "object" ? (schedule.rs_sv_arret_p as number) : `${schedule} [NOT POPULATED]`} !== stop ${scheduledRoute.stops[i]}`, + ); + } + } + + const b1 = await benchmark(queryData, []); + if (!b1.lastReturn) throw new Error("No queried data"); + + await benchmark(lintScheduledRoutes, [b1.lastReturn]); + + console.debug("Done."); +})() + .then(() => process.exit(0)) + .catch((err: unknown) => { + console.error(err); + process.exit(1); + }); From bee623eee2bb959b992f26a15efbbbbdfe6415f2 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Tue, 22 Jul 2025 10:23:12 +0200 Subject: [PATCH 224/251] =?UTF-8?q?=E2=9A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/lintScheduledRoutes.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/lintScheduledRoutes.ts b/src/test/lintScheduledRoutes.ts index 8783e877..63c6b211 100644 --- a/src/test/lintScheduledRoutes.ts +++ b/src/test/lintScheduledRoutes.ts @@ -43,8 +43,8 @@ import { benchmark } from "./utils/benchmark"; for (const [tripIndex, trip] of scheduledRoute.trips.entries()) for (const [i, schedule] of trip.schedules.entries()) if (typeof schedule !== "object" || (schedule.rs_sv_arret_p !== Infinity && schedule.rs_sv_arret_p !== scheduledRoute.stops[i])) { - const scheduledRoutePop = await TBMScheduledRoutesModel.populate(scheduledRoute, "_id"); - scheduledRoutePop._id = await TBMLinesRoutesModel.populate(scheduledRoutePop._id, "rs_sv_ligne_a"); + const scheduledRoutePop = await TBMScheduledRoutesModel.populate(scheduledRoute, { path: "_id", options: { lean: true } }); + scheduledRoutePop._id = await TBMLinesRoutesModel.populate(scheduledRoutePop._id, { path: "rs_sv_ligne_a", options: { lean: true } }); console.log( `Route ${typeof scheduledRoutePop._id === "object" ? `${typeof scheduledRoutePop._id.rs_sv_ligne_a === "object" ? scheduledRoutePop._id.rs_sv_ligne_a.libelle : scheduledRoutePop._id.rs_sv_ligne_a} ${scheduledRoutePop._id.libelle} (${scheduledRoutePop._id._id})` : scheduledRoutePop._id}, trip idx ${tripIndex} (${trip.tripId}): at idx ${i}, schedule's stop ${typeof schedule === "object" ? (schedule.rs_sv_arret_p as number) : `${schedule} [NOT POPULATED]`} !== stop ${scheduledRoute.stops[i]}`, From de66f08f8a8c650c2364cb991ae91d1fa0ada7bc Mon Sep 17 00:00:00 2001 From: Catatomik Date: Tue, 22 Jul 2025 15:23:14 +0200 Subject: [PATCH 225/251] =?UTF-8?q?=F0=9F=8E=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/lintScheduledRoutes.ts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/test/lintScheduledRoutes.ts b/src/test/lintScheduledRoutes.ts index 63c6b211..19c0c17f 100644 --- a/src/test/lintScheduledRoutes.ts +++ b/src/test/lintScheduledRoutes.ts @@ -25,11 +25,7 @@ import { benchmark } from "./utils/benchmark"; const TBMScheduledRoutesModel = TBMScheduledRoutesModelInit(sourceDB); return { - dbScheduledRoutes: ( - TBMScheduledRoutesModel.find({}, dbScheduledRoutesProjection).populate("trips.schedules").lean() as ReturnType< - typeof TBMScheduledRoutesModel.find - > - ).cursor(), + dbScheduledRoutes: TBMScheduledRoutesModel.find({}, dbScheduledRoutesProjection).populate("trips.schedules").lean().cursor(), TBMScheduledRoutesModel, TBMLinesRoutesModel, }; From 6f053a657f0a360ac98010b0dbf0163cd07bc2eb Mon Sep 17 00:00:00 2001 From: Catatomik Date: Tue, 22 Jul 2025 15:23:20 +0200 Subject: [PATCH 226/251] =?UTF-8?q?=F0=9F=94=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/lintScheduledRoutes.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/lintScheduledRoutes.ts b/src/test/lintScheduledRoutes.ts index 19c0c17f..2e533861 100644 --- a/src/test/lintScheduledRoutes.ts +++ b/src/test/lintScheduledRoutes.ts @@ -43,7 +43,7 @@ import { benchmark } from "./utils/benchmark"; scheduledRoutePop._id = await TBMLinesRoutesModel.populate(scheduledRoutePop._id, { path: "rs_sv_ligne_a", options: { lean: true } }); console.log( - `Route ${typeof scheduledRoutePop._id === "object" ? `${typeof scheduledRoutePop._id.rs_sv_ligne_a === "object" ? scheduledRoutePop._id.rs_sv_ligne_a.libelle : scheduledRoutePop._id.rs_sv_ligne_a} ${scheduledRoutePop._id.libelle} (${scheduledRoutePop._id._id})` : scheduledRoutePop._id}, trip idx ${tripIndex} (${trip.tripId}): at idx ${i}, schedule's stop ${typeof schedule === "object" ? (schedule.rs_sv_arret_p as number) : `${schedule} [NOT POPULATED]`} !== stop ${scheduledRoute.stops[i]}`, + `Route ${typeof scheduledRoutePop._id === "object" ? `${typeof scheduledRoutePop._id.rs_sv_ligne_a === "object" ? scheduledRoutePop._id.rs_sv_ligne_a.libelle : scheduledRoutePop._id.rs_sv_ligne_a} ${scheduledRoutePop._id.libelle} (${scheduledRoutePop._id._id})` : scheduledRoutePop._id}, trip idx ${tripIndex} (${trip.tripId}): at idx ${i}, schedule's stop ${typeof schedule === "object" ? `${schedule.rs_sv_arret_p as number} / ${schedule.hor_theo.toLocaleString()}` : `${schedule} [NOT POPULATED]`} !== stop ${scheduledRoute.stops[i]}`, ); } } From df5819572f7332aeb67b33b8bd8105833b22de4e Mon Sep 17 00:00:00 2001 From: Catatomik Date: Tue, 22 Jul 2025 16:51:28 +0200 Subject: [PATCH 227/251] =?UTF-8?q?=E2=9C=A8=20Combinations=20type?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/utils/index.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/test/utils/index.ts b/src/test/utils/index.ts index a7b53383..03a0c124 100644 --- a/src/test/utils/index.ts +++ b/src/test/utils/index.ts @@ -96,5 +96,7 @@ type UnpackRefs = Omit & { : never; }; -export { Deferred, unique, binarySearch, binaryFilter, mapAsync, wait }; -export type { ResolveCb, RejectCb, UnpackRefs }; +type Combinations = T extends [infer E, ...infer R] ? [E, ...Combinations] | Combinations : T extends [] ? [] : never; + +export { binaryFilter, binarySearch, Deferred, mapAsync, unique, wait }; +export type { Combinations, RejectCb, ResolveCb, UnpackRefs }; From 9c6b9c904fceac6dcf84a6ff38f2eed75206e724 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Tue, 22 Jul 2025 16:52:25 +0200 Subject: [PATCH 228/251] =?UTF-8?q?=F0=9F=9A=A7=20Generalize=20post=20crit?= =?UTF-8?q?eria=20as=20argument=20&=20add=20SPI=20criterion?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/index.ts | 152 ++++++++++++++++++++-------------------------- 1 file changed, 67 insertions(+), 85 deletions(-) diff --git a/src/test/index.ts b/src/test/index.ts index 384aa234..4e11e7b5 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -12,6 +12,7 @@ import { bufferTime, convertBackJourneyStep, convertJourneyStep, + Criterion, footDistance, InternalTimeInt, IRAPTORData, @@ -49,7 +50,7 @@ import ResultModelInit, { import TBMSchedulesModelInit from "./models/TBM_schedules.model"; import stopsModelInit, { dbTBM_Stops } from "./models/TBM_stops.model"; import TBMScheduledRoutesModelInit, { dbTBM_ScheduledRoutes } from "./models/TBMScheduledRoutes.model"; -import { binarySearch, mapAsync, UnpackRefs } from "./utils"; +import { binarySearch, Combinations, mapAsync, UnpackRefs } from "./utils"; import { benchmark } from "./utils/benchmark"; async function queryData() { @@ -232,42 +233,33 @@ function createMcSharedRAPTOR( type InstanceType = "RAPTOR" | "SharedRAPTOR" | "McRAPTOR" | "McSharedRAPTOR"; -function isTimeTypeInternalInt(timeType: unknown): timeType is Time { - return typeof timeType === "object" && timeType !== null && "MAX_SAFE" in timeType && timeType.MAX_SAFE === TimeInt.MAX_SAFE; -} - -function postTreatment( +function postTreatment( + postCriteria: Criterion[], data: IRAPTORData, instanceType: InstanceType, - results: ReturnType["getBestJourneys"]>, + results: ReturnType["getBestJourneys"]>, pt: SharedID, ) { const timeType = data.timeType; - if (isTimeTypeInternalInt(timeType)) { - if (instanceType === "McRAPTOR" || instanceType === "McSharedRAPTOR") { - // Add success proba as post treatment - results = results.map((journeys) => - journeys.map((journey) => { - const measured = measureJourney( - successProbaInt, - timeType, - (instanceType === "McSharedRAPTOR" - ? journey.map((js) => convertJourneyStep(data as SharedRAPTORData)(js)) - : journey) as unknown as Journey, - pt, - ); - - return instanceType === "McSharedRAPTOR" - ? measured.map((js) => - convertBackJourneyStep( - data as unknown as SharedRAPTORData, - )(js), - ) - : measured; - }), - ) as unknown as typeof results; - } + for (const postCriterion of postCriteria) { + // Add success proba as post treatment + results = results.map((journeys) => + journeys.map((journey) => { + const measured = measureJourney( + postCriterion, + timeType, + (instanceType === "McSharedRAPTOR" + ? journey.map((js) => convertJourneyStep(data as SharedRAPTORData)(js)) + : journey) as unknown as Journey, + pt, + ); + + return instanceType === "McSharedRAPTOR" + ? measured.map((js) => convertBackJourneyStep(data as SharedRAPTORData)(js)) + : measured; + }), + ) as unknown as typeof results; } return results; @@ -407,14 +399,32 @@ async function insertResults; + const postCriteria: (typeof footDistance | typeof bufferTime | typeof successProbaInt)[] = []; + if ("fd" in args) { + if (args.fd === true) (criteria as [typeof footDistance]).push(footDistance); + else if (args.fd === "post") postCriteria.push(footDistance); + } + if ("bt" in args) { + if (args.bt === true) (criteria as [typeof bufferTime]).push(bufferTime); + else if (args.bt === "post") postCriteria.push(bufferTime); + } + if ("spi" in args) { + if (dataType !== "interval") console.warn(`Ignoring "${successProbaInt.name}" criterion because data type isn't interval`); + else { + if (args.spi === true) (criteria as [typeof successProbaInt]).push(successProbaInt); + else if (args.spi === "post") postCriteria.push(successProbaInt); + } + } console.debug( "Using criteria", criteria.map((c) => c.name), ); + console.debug( + "Using post-criteria (measurement)", + postCriteria.map((c) => c.name), + ); if (criteria.length && instanceType !== "McRAPTOR" && instanceType !== "McSharedRAPTOR") console.warn("Got some criteria but instance type is uni-criteria."); @@ -471,6 +481,8 @@ async function insertResults; + const b4 = await (instanceType === "RAPTOR" ? benchmark(createRAPTOR, [rawRAPTORData], undefined, createTimes) : instanceType === "SharedRAPTOR" @@ -478,40 +490,17 @@ async function insertResults, [rawSharedRAPTORData!], undefined, createTimes) : instanceType === "McRAPTOR" ? benchmark( - createMcRAPTOR< - Timestamp | InternalTimeInt, - number, - [] | [[number, "footDistance"]] | [[number, "bufferTime"]] | [[number, "footDistance"], [number, "bufferTime"]] - >, - [ - rawRAPTORData, - criteria as Parameters< - typeof createMcRAPTOR< - Timestamp | InternalTimeInt, - number, - [] | [[number, "footDistance"]] | [[number, "bufferTime"]] | [[number, "footDistance"], [number, "bufferTime"]] - > - >[1], - ], + createMcRAPTOR, + [rawRAPTORData, criteria as Parameters>[1]], undefined, createTimes, ) : benchmark( - createMcSharedRAPTOR< - Timestamp | InternalTimeInt, - number, - [] | [[number, "footDistance"]] | [[number, "bufferTime"]] | [[number, "footDistance"], [number, "bufferTime"]] - >, + createMcSharedRAPTOR, [ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion rawSharedRAPTORData!, - criteria as Parameters< - typeof createMcSharedRAPTOR< - Timestamp | InternalTimeInt, - number, - [] | [[number, "footDistance"]] | [[number, "bufferTime"]] | [[number, "footDistance"], [number, "bufferTime"]] - > - >[1], + criteria as Parameters>[1], ], undefined, createTimes, @@ -521,14 +510,7 @@ async function insertResults, "attachStops"> & { attachStops: SharedRAPTORData["attachStops"]; }, - BaseRAPTOR< - Timestamp | InternalTimeInt, - SharedID, - number, - number, - number, - [] | [[number, "footDistance"]] | [[number, "bufferTime"]] | [[number, "footDistance"], [number, "bufferTime"]] - >, + BaseRAPTOR, ]; if (sharedSecure) (RAPTORDataInst as SharedRAPTORData).secure = true; @@ -583,28 +565,28 @@ async function insertResults, - [RAPTORDataInst, instanceType, b6.lastReturn, pt], - ); + const b7 = await benchmark(postTreatment, [ + postCriteria as Criterion[], + RAPTORDataInst, + instanceType, + b6.lastReturn, + pt, + ]); if (!b7.lastReturn) throw new Error(`No post treatment`); console.debug("Post treatment", inspect(b7.lastReturn, false, 6)); if (saveResults) { // Save results - const b8 = await benchmark( - insertResults< - Timestamp | InternalTimeInt, - number, - [] | [[number, "footDistance"]] | [[number, "bufferTime"]] | [[number, "footDistance"], [number, "bufferTime"]] - >, - [queriedData.resultModel, RAPTORDataInst.timeType, from, { type: LocationType.TBM, id: pt }, departureTime, settings, b7.lastReturn], - ); + const b8 = await benchmark(insertResults, [ + queriedData.resultModel, + RAPTORDataInst.timeType, + from, + { type: LocationType.TBM, id: pt }, + departureTime, + settings, + b7.lastReturn, + ]); console.log("Saved result id", b8.lastReturn); } })() From 800bd3b76cd48525c4dc67f2c4d4f24772edfd5c Mon Sep 17 00:00:00 2001 From: Catatomik Date: Tue, 22 Jul 2025 17:31:47 +0200 Subject: [PATCH 229/251] =?UTF-8?q?=E2=9C=A8=20Add=20CLI=20help?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/index.ts | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/test/index.ts b/src/test/index.ts index 4e11e7b5..89c4a09f 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -318,12 +318,40 @@ async function insertResults: maximum foot paths' length to retrieve and store un RAPTOR data + --fp-run-len=: maximum foot paths' length to consider during itineraries search + (-d[ ] | --d=): time data type, scalar or interval + --delay-pos=: positive delay (in sec), interval time only + --delay-neg=: negative delay (in sec), interval time only + (-i[ ] | --i=): instance type, RAPTOR or SharedRAPTOR or MultiCriteriaRAPTOR or MultiCriteriaSharedRAPTOR + --shared-secure: with a Shared instance type, check all RAPTOR data calls + --createTimes=: number of times to run the instance creation step + --runTimes=: number of times to run the itinerary search step + --getResTimes=: number of times to run the results retrieval step + --fd, --bt, --spi: add criterion to a MultiCriteria instance, foot distance or buffer time or success probability (interval time) + --fd=post, --bt=post, --spi=post: add post-criterion (measurement) to a MultiCriteria instance, foot distance or buffer time or success probability (interval time) + --save: save results in database + --ps=: source stop in source database for the itinerary query + --pt=: target stop in source database for the itinerary query +`); +} + // Main IIFE test function (async () => { // Setup params from command line const args = minimist(process.argv); console.debug(`Using args`, args); + if (("h" in args && args.h === true) || ("help" in args && args.help === true) || args._.includes("h") || args._.includes("help")) { + man(); + + return; + } + const fpReqLen = getArgsOptNumber(args, "fp-req-len") ?? 3_000; console.debug(`Foot paths query max len`, fpReqLen); const fpRunLen = getArgsOptNumber(args, "fp-run-len") ?? 2_000; From 804b8116adb5b9da5522773cfc837f882c8eebe6 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Tue, 22 Jul 2025 17:41:38 +0200 Subject: [PATCH 230/251] =?UTF-8?q?=E2=9C=A8=20Bench=20format=20+=20data?= =?UTF-8?q?=20type=20+=20spi=20criterion?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bench.sh | 87 +++++++++++++++++++++++++++++++------------------------- 1 file changed, 48 insertions(+), 39 deletions(-) diff --git a/bench.sh b/bench.sh index e3c3dbd8..e14258d6 100644 --- a/bench.sh +++ b/bench.sh @@ -12,10 +12,16 @@ while getopts 'gct:d:' ARG; do ;; t) TIMES="$OPTARG" - echo "$TIMES" | grep -E '^[0-9]+$' || { echo "Invalid times to run: $TIMES"; exit 1; } + echo "$TIMES" | grep -E '^[0-9]+$' || { + echo "Invalid times to run: $TIMES" + exit 1 + } ;; d) - echo "$OPTARG" | grep -E '^[0-9]+$' || { echo "Invalid run transfer max len: $OPTARG"; exit 1; } + echo "$OPTARG" | grep -E '^[0-9]+$' || { + echo "Invalid run transfer max len: $OPTARG" + exit 1 + } FOOT_DISTANCE="--fp-run-len $OPTARG" ;; *) @@ -33,50 +39,53 @@ pnpm run build mkdir bench 2>/dev/null || true if [ -n "$GLOBAL" ]; then - for INSTANCE in \ - 'r' \ - 'sr' \ - 'mcr' \ - 'mcsr' - do - FOLDER="bench/$INSTANCE" - mkdir "$FOLDER" 2>/dev/null || true - echo "Bench instance $INSTANCE" - pnpm exec 0x -D "$FOLDER" lib/test/index.js -i "$INSTANCE" "$FOOT_DISTANCE" --runTimes "$TIMES" 1>"$FOLDER/out.txt" 2>/dev/null - sed -i "s|$(dirname "$PWD")/||g" "$FOLDER/flamegraph.html" - echo "Done at: $FOLDER/flamegraph.html" + for DTYPE in \ + 'scal' \ + 'int'; do + for INSTANCE in \ + 'r' \ + 'sr' \ + 'mcr' \ + 'mcsr'; do + FOLDER="bench/$DTYPE-$INSTANCE" + mkdir "$FOLDER" 2>/dev/null || true + echo "Bench instance $INSTANCE" + pnpm exec 0x -D "$FOLDER" lib/test/index.js -d "$DTYPE" -i "$INSTANCE" "$FOOT_DISTANCE" --runTimes "$TIMES" 1>"$FOLDER/out.txt" 2>"$FOLDER/err.txt" + sed -i "s|$(dirname "$PWD")/||g" "$FOLDER/flamegraph.html" + echo "Done at: $FOLDER/flamegraph.html" + done done fi if [ -n "$CRITERIA" ]; then # Multi-criteria specific - for INSTANCE in \ - 'mcr' \ - 'mcsr' - do - for CRITERIA in \ - '--fd' \ - '--bt' \ - # Might be very long... - # '--fd --bt' - do - for DELAY in \ - '--delay-pos=1 --delay-neg=0' \ - '--delay-pos=2 --delay-neg=1' \ - '--delay-pos=3 --delay-neg=2' \ - # Might be very long... - # '--fd --bt' - do - FOLDER="bench/$INSTANCE$(echo "$CRITERIA" | sed 's/ //g')$(echo "$DELAY" | sed -E 's/( ?--delay|=)//g')" - mkdir "$FOLDER" 2>/dev/null || true - echo "Bench instance $INSTANCE with criteria $CRITERIA and delays $DELAY" - # shellcheck disable=SC2086 - pnpm exec 0x -D "$FOLDER" lib/test/index.js -i "$INSTANCE" "$FOOT_DISTANCE" $CRITERIA $DELAY --runTimes "$TIMES" 1>"$FOLDER/out.txt" 2>/dev/null - sed -i "s|$(dirname "$PWD")/||g" "$FOLDER/flamegraph.html" - echo "Done at: $FOLDER/flamegraph.html" + for DTYPE in \ + 'scal' \ + 'int'; do + for INSTANCE in \ + 'mcr' \ + 'mcsr'; do + for CRITERIA in \ + '--fd' \ + '--bt' \ + '--spi' \ + '--bt --spi'; do + # '--fd --bt' # Might be very long... + for DELAY in \ + '--delay-pos=1 --delay-neg=0' \ + '--delay-pos=2 --delay-neg=1' \ + '--delay-pos=3 --delay-neg=2'; do + FOLDER="bench/$DTYPE-$INSTANCE$(echo "$CRITERIA" | sed 's/ //g')$(echo "$DELAY" | sed -E 's/( ?--delay|=)//g')" + mkdir "$FOLDER" 2>/dev/null || true + echo "Bench instance $INSTANCE with criteria $CRITERIA and delays $DELAY" + # shellcheck disable=SC2086 + pnpm exec 0x -D "$FOLDER" lib/test/index.js -d "$DTYPE" -i "$INSTANCE" "$FOOT_DISTANCE" $CRITERIA $DELAY --runTimes "$TIMES" 1>"$FOLDER/out.txt" 2>"$FOLDER/err.txt" + sed -i "s|$(dirname "$PWD")/||g" "$FOLDER/flamegraph.html" + echo "Done at: $FOLDER/flamegraph.html" + done done done done fi -# UI doc https://github.com/davidmarkclements/0x/blob/master/docs/ui.md +# flamegraph UI doc https://github.com/davidmarkclements/0x/blob/master/docs/ui.md From 974ba11bd3341dc4a5147cde8351d2c0f5d36467 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Tue, 22 Jul 2025 17:48:22 +0200 Subject: [PATCH 231/251] =?UTF-8?q?=F0=9F=94=8A=20bench?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bench.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bench.sh b/bench.sh index e14258d6..95055c05 100644 --- a/bench.sh +++ b/bench.sh @@ -49,7 +49,7 @@ if [ -n "$GLOBAL" ]; then 'mcsr'; do FOLDER="bench/$DTYPE-$INSTANCE" mkdir "$FOLDER" 2>/dev/null || true - echo "Bench instance $INSTANCE" + echo "Bench data type $DTYPE with instance $INSTANCE" pnpm exec 0x -D "$FOLDER" lib/test/index.js -d "$DTYPE" -i "$INSTANCE" "$FOOT_DISTANCE" --runTimes "$TIMES" 1>"$FOLDER/out.txt" 2>"$FOLDER/err.txt" sed -i "s|$(dirname "$PWD")/||g" "$FOLDER/flamegraph.html" echo "Done at: $FOLDER/flamegraph.html" @@ -77,7 +77,7 @@ if [ -n "$CRITERIA" ]; then '--delay-pos=3 --delay-neg=2'; do FOLDER="bench/$DTYPE-$INSTANCE$(echo "$CRITERIA" | sed 's/ //g')$(echo "$DELAY" | sed -E 's/( ?--delay|=)//g')" mkdir "$FOLDER" 2>/dev/null || true - echo "Bench instance $INSTANCE with criteria $CRITERIA and delays $DELAY" + echo "Bench data type $DTYPE with instance $INSTANCE, criteria $CRITERIA and delays $DELAY" # shellcheck disable=SC2086 pnpm exec 0x -D "$FOLDER" lib/test/index.js -d "$DTYPE" -i "$INSTANCE" "$FOOT_DISTANCE" $CRITERIA $DELAY --runTimes "$TIMES" 1>"$FOLDER/out.txt" 2>"$FOLDER/err.txt" sed -i "s|$(dirname "$PWD")/||g" "$FOLDER/flamegraph.html" From 1e689b744fa8fee97a07608a7aa71c2b9032f543 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Tue, 22 Jul 2025 16:07:38 +0000 Subject: [PATCH 232/251] Updating coverage badges --- badges/coverage-branches.svg | 2 +- badges/coverage-lines.svg | 2 +- badges/coverage-statements.svg | 2 +- badges/coverage-total.svg | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/badges/coverage-branches.svg b/badges/coverage-branches.svg index 55363300..4c73bfc3 100644 --- a/badges/coverage-branches.svg +++ b/badges/coverage-branches.svg @@ -1 +1 @@ -Coverage: branches: 84.96%Coverage: branches84.96% +Coverage: branches: 84.96%Coverage: branches84.96% \ No newline at end of file diff --git a/badges/coverage-lines.svg b/badges/coverage-lines.svg index cd683938..9b447b68 100644 --- a/badges/coverage-lines.svg +++ b/badges/coverage-lines.svg @@ -1 +1 @@ -Coverage: lines: 95.72%Coverage: lines95.72% +Coverage: lines: 95.72%Coverage: lines95.72% \ No newline at end of file diff --git a/badges/coverage-statements.svg b/badges/coverage-statements.svg index f6dc7edb..990778a4 100644 --- a/badges/coverage-statements.svg +++ b/badges/coverage-statements.svg @@ -1 +1 @@ -Coverage: statements: 94.49%Coverage: statements94.49% +Coverage: statements: 94.49%Coverage: statements94.49% \ No newline at end of file diff --git a/badges/coverage-total.svg b/badges/coverage-total.svg index 49d86f56..660ef3b9 100644 --- a/badges/coverage-total.svg +++ b/badges/coverage-total.svg @@ -1 +1 @@ -Coverage: total: 92.26%Coverage: total92.26% +Coverage: total: 92.26%Coverage: total92.26% \ No newline at end of file From e1e8360e324272dbd794ce3657d4006c75809715 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Wed, 23 Jul 2025 11:22:40 +0200 Subject: [PATCH 233/251] =?UTF-8?q?=F0=9F=9A=9A=20Reorganize=20bench?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 - bench/.gitignore | 2 ++ bench.sh => bench/bench.sh | 6 ++++-- 3 files changed, 6 insertions(+), 3 deletions(-) create mode 100644 bench/.gitignore rename bench.sh => bench/bench.sh (91%) diff --git a/.gitignore b/.gitignore index cee9e04b..aa3824bd 100644 --- a/.gitignore +++ b/.gitignore @@ -115,4 +115,3 @@ docs/ # Test *.geojson -bench/ diff --git a/bench/.gitignore b/bench/.gitignore new file mode 100644 index 00000000..a53dce00 --- /dev/null +++ b/bench/.gitignore @@ -0,0 +1,2 @@ +/results/ +*.html \ No newline at end of file diff --git a/bench.sh b/bench/bench.sh similarity index 91% rename from bench.sh rename to bench/bench.sh index 95055c05..08547b9f 100644 --- a/bench.sh +++ b/bench/bench.sh @@ -1,5 +1,7 @@ #!/bin/sh +RESULTS_FOLDER="results/" + TIMES=1 while getopts 'gct:d:' ARG; do case $ARG in @@ -47,7 +49,7 @@ if [ -n "$GLOBAL" ]; then 'sr' \ 'mcr' \ 'mcsr'; do - FOLDER="bench/$DTYPE-$INSTANCE" + FOLDER="$RESULTS_FOLDER/$DTYPE-$INSTANCE" mkdir "$FOLDER" 2>/dev/null || true echo "Bench data type $DTYPE with instance $INSTANCE" pnpm exec 0x -D "$FOLDER" lib/test/index.js -d "$DTYPE" -i "$INSTANCE" "$FOOT_DISTANCE" --runTimes "$TIMES" 1>"$FOLDER/out.txt" 2>"$FOLDER/err.txt" @@ -75,7 +77,7 @@ if [ -n "$CRITERIA" ]; then '--delay-pos=1 --delay-neg=0' \ '--delay-pos=2 --delay-neg=1' \ '--delay-pos=3 --delay-neg=2'; do - FOLDER="bench/$DTYPE-$INSTANCE$(echo "$CRITERIA" | sed 's/ //g')$(echo "$DELAY" | sed -E 's/( ?--delay|=)//g')" + FOLDER="$RESULTS_FOLDER/$DTYPE-$INSTANCE$(echo "$CRITERIA" | sed 's/ //g')$(echo "$DELAY" | sed -E 's/( ?--delay|=)//g')" mkdir "$FOLDER" 2>/dev/null || true echo "Bench data type $DTYPE with instance $INSTANCE, criteria $CRITERIA and delays $DELAY" # shellcheck disable=SC2086 From de3089353ebec8c1038e2889f108cbaf0afdd2f9 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Wed, 23 Jul 2025 11:22:54 +0200 Subject: [PATCH 234/251] =?UTF-8?q?=E2=9C=A8=20Python=20notebook=20to=20dr?= =?UTF-8?q?aw=20benchmark=20stats?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bench/analyze.ipynb | 257 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 257 insertions(+) create mode 100644 bench/analyze.ipynb diff --git a/bench/analyze.ipynb b/bench/analyze.ipynb new file mode 100644 index 00000000..cd3cef40 --- /dev/null +++ b/bench/analyze.ipynb @@ -0,0 +1,257 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "7eb589b8", + "metadata": {}, + "source": [ + "# Import data & parse" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "b2c179db", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Loading ./results/int-sr/out.txt ... Done.\n", + "Loading ./results/scal-r/out.txt ... Done.\n", + "Loading ./results/int-mcsr/out.txt ... Done.\n", + "Loading ./results/scal-sr/out.txt ... Done.\n", + "Loading ./results/scal-mcr/out.txt ... Done.\n", + "Loading ./results/int-r/out.txt ... Done.\n", + "Loading ./results/int-mcr/out.txt ... Done.\n", + "Loading ./results/scal-mcsr/out.txt ... Done.\n" + ] + } + ], + "source": [ + "from os import listdir\n", + "from os.path import join, isdir, isfile\n", + "from typing import TypedDict\n", + "import json\n", + "\n", + "DATA_PREFIX = \"Using data type \"\n", + "INSTANCE_PREFIX = \"Using instance type \"\n", + "CRITERIA_PREFIX = \"Using criteria \"\n", + "FP_RUN_MAX_LEN_PREFIX = \"Foot paths run max len \"\n", + "BENCHMARK_PREFIX = \"Benchmark of \"\n", + "\n", + "UNKNOWN_LITERAL = \"Unknown\"\n", + "\n", + "\n", + "def parse_bench_time(bench_time: str) -> int:\n", + " \"\"\"00:00:093.9852490000003\"\"\"\n", + " total_ms = 0\n", + "\n", + " for i, part in enumerate(bench_time.split(\":\")):\n", + " total_ms += round(float(part)) * (\n", + " 60 * 1_000 if i == 0 else 1_000 if i == 1 else 1\n", + " )\n", + "\n", + " return total_ms\n", + "\n", + "\n", + "class Result(TypedDict):\n", + " data: str\n", + " instance: str\n", + " criteria: list[str]\n", + " fp_run_max_len: int\n", + "\n", + " # Benchmarks\n", + " compute_data: tuple[int, int]\n", + " create_instance: tuple[int, int]\n", + " run: tuple[int, int]\n", + " result: tuple[int, int]\n", + " post_treatment: tuple[int, int]\n", + "\n", + "\n", + "results: dict[str, Result] = {}\n", + "\n", + "RESULTS_FOLDER = \"./results\"\n", + "\n", + "for node in listdir(RESULTS_FOLDER):\n", + " node_path = join(RESULTS_FOLDER, node)\n", + " if isdir(node_path):\n", + " for file in listdir(node_path):\n", + " file_path = join(node_path, file)\n", + " if file == \"out.txt\" and isfile(file_path):\n", + " print(f\"Loading {file_path} ...\", end=\" \")\n", + " try:\n", + " with open(file_path) as raw_output:\n", + " result = Result(\n", + " data=UNKNOWN_LITERAL,\n", + " instance=UNKNOWN_LITERAL,\n", + " criteria=[UNKNOWN_LITERAL],\n", + " fp_run_max_len=-1,\n", + " compute_data=(0, -1),\n", + " create_instance=(0, -1),\n", + " run=(0, -1),\n", + " result=(0, -1),\n", + " post_treatment=(0, -1),\n", + " )\n", + "\n", + " for line in raw_output:\n", + " line = line[:-1]\n", + "\n", + " if line.startswith(DATA_PREFIX):\n", + " result[\"data\"] = line[len(DATA_PREFIX) :]\n", + " elif line.startswith(INSTANCE_PREFIX):\n", + " result[\"instance\"] = line[len(INSTANCE_PREFIX) :]\n", + " elif line.startswith(CRITERIA_PREFIX):\n", + " result[\"criteria\"] = json.loads(\n", + " line[len(CRITERIA_PREFIX) :]\n", + " )\n", + " elif line.startswith(FP_RUN_MAX_LEN_PREFIX):\n", + " result[\"fp_run_max_len\"] = json.loads(\n", + " line[len(FP_RUN_MAX_LEN_PREFIX) :]\n", + " )\n", + "\n", + " elif line.startswith(BENCHMARK_PREFIX):\n", + " # Benchmarks\n", + " line = line[len(BENCHMARK_PREFIX) :]\n", + "\n", + " fun_name = line.split(\" \")[0]\n", + " line = line[len(fun_name + \" (\") :]\n", + "\n", + " times = int(line.split(\" \")[0])\n", + " line = line[len(str(times) + \" times): \") :]\n", + "\n", + " duration = parse_bench_time(line)\n", + "\n", + " if fun_name.startswith(\"compute\"):\n", + " result[\"compute_data\"] = (times, duration)\n", + " elif fun_name.startswith(\"create\"):\n", + " result[\"create_instance\"] = (times, duration)\n", + " elif fun_name.startswith(\"run\"):\n", + " result[\"run\"] = (times, duration)\n", + " elif fun_name.startswith(\"result\"):\n", + " result[\"result\"] = (times, duration)\n", + " elif fun_name.startswith(\"postTreatment\"):\n", + " result[\"post_treatment\"] = (times, duration)\n", + "\n", + " results[node] = result\n", + " print(\"Done.\")\n", + " except Exception as exc:\n", + " print(f\"Error: {exc}\")" + ] + }, + { + "cell_type": "markdown", + "id": "bfb38243", + "metadata": {}, + "source": [ + "# Format data" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "1a4ee960", + "metadata": {}, + "outputs": [], + "source": [ + "results_list = sorted(results.items(), key=lambda result: result[0])" + ] + }, + { + "cell_type": "markdown", + "id": "01d3903c", + "metadata": {}, + "source": [ + "# Plot" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "01778364", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAsAAAAIBCAYAAABHmwn+AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQAAkf9JREFUeJzs3XdYFMcbB/Dv0XuTqiBgFyHYwIIF/Rl7jTH2mqLGaIymWRI1icHE2BKJGhO7MRqjJjassaDYRSGoiAICQUFAer/5/UFYPQHlEO6Q+36e5564u7Oz7044eG9uZlYmhBAgIiIiItIQWuoOgIiIiIhIlZgAExEREZFGYQJMRERERBqFCTARERERaRQmwERERESkUZgAExEREZFGYQJMRERERBqFCTARERERaRQmwERERESkUZgAE1GFnThxAjKZDDt37lR3KOUyf/58yGQyPHz4UN2hICAgAM2bN4eBgQFkMhkePXqk7pCUJpPJMH/+fHWHQUSkNCbARNXUhg0bIJPJFF62trbo0qULDh48qO7w6AUkJSXhjTfegKGhIfz9/bF582YYGxurO6yXRlRUlML7QktLC1ZWVujVqxeCgoLKPO/GjRuQyWQwMDAo8wOHr6+vQt1WVlbw8vLCunXrIJfLpQ995Xk96Z9//sGoUaNQp04d6Ovro3bt2hg5ciT++eefEjE8/d7X0dFBnTp1MG7cOMTFxb1Q2xFRER11B0BEz/bFF1/A1dUVQgg8ePAAGzZsQO/evbF371707dtX3eFRBVy8eBHp6en48ssv0a1bN3WHU2HZ2dnQ0VHfn5Hhw4ejd+/eKCwsRHh4OH788Ud06dIFFy9ehIeHR4nyW7Zsgb29PVJSUrBz50689dZbpdbr6OgIPz8/AEBiYiI2bdqEN998E+Hh4fjggw+wefNmhfKzZs2CiYkJ5syZU2p9u3btwvDhw2FlZYU333wTrq6uiIqKwi+//IKdO3fit99+w6BBg0qcV/zez8nJwblz57BhwwYEBgYiNDQUBgYGyjYXET1JEFG1tH79egFAXLx4UWF/cnKy0NXVFSNGjFBTZI/9/fffAoD4/fff1R3KM2VkZAghhJg3b54AIBITE9Uaz8aNG0v9f1texfejqSIjIwUAsXjxYoX9Bw8eFADE5MmTS5wjl8uFi4uLmDFjhhg0aJDw9fUtte7OnTuLZs2aKezLzMwUjo6OwtjYWOTl5ZU4p1mzZqJz586l1hcRESGMjIxEkyZNREJCgsKxxMRE0aRJE2FsbCzu3Lkj7S/rvf/JJ58IAGL79u2lXouIyo9DIIheMhYWFjA0NCzR8yaXy7F8+XI0a9YMBgYGsLOzw8SJE5GSkqJQzsXFBX379kVgYCC8vb1hYGCAevXqYdOmTSWu9ejRI3zwwQdwcXGBvr4+HB0dMWbMmBJjaOVyORYuXAhHR0cYGBjgf//7HyIiIhTK+Pr6wt3dHdevX0fnzp1hZGSEBg0aSOOHT548iTZt2sDQ0BCNGzfG0aNHFc6Pjo7Gu+++i8aNG8PQ0BC1atXCkCFDEBUVpVCu+OvjkydP4t1334WtrS0cHR3LbM/o6Gg0aNAA7u7uePDgAQDg9u3bGDx4MOzt7WFgYABHR0cMGzYMqampZdZT7Pfff0erVq1gaGgIa2trjBo1SuFra19fX4wdOxYA4OXlBZlMhnHjxpVZX/G45bCwMIwYMQKWlpbo0KGDVJevr2+Jc8aNGwcXFxdpu3jIwHfffYeffvoJ9evXh76+Pry8vHDx4sUS55qYmCAuLg4DBw6EiYkJbGxs8OGHH6KwsFCh7NNjgItjjYiIwLhx42BhYQFzc3OMHz8eWVlZCudmZ2dj2rRpsLa2hqmpKfr374+4uLgXGlfcsWNHAMCdO3dKHDtz5gyioqIwbNgwDBs2DKdOnUJsbGy56jUyMkLbtm2RmZmJxMREpWJavHgxsrKy8NNPP8HGxkbhmLW1NdasWYPMzEx8++23z63rWfdHRMrhEAiiai41NRUPHz6EEAIJCQn44YcfkJGRgVGjRimUmzhxIjZs2IDx48dj2rRpiIyMxMqVK3H16lWcOXMGurq6UtmIiAi8/vrrePPNNzF27FisW7cO48aNQ6tWrdCsWTMAQEZGBjp27IgbN25gwoQJaNmyJR4+fIi//voLsbGxsLa2lupbtGgRtLS08OGHHyI1NRXffvstRo4cifPnzyvEmJKSgr59+2LYsGEYMmQIVq1ahWHDhmHr1q2YPn06Jk2ahBEjRmDx4sV4/fXXERMTA1NTUwBFwwbOnj2LYcOGwdHREVFRUVi1ahV8fX0RFhYGIyMjhWu9++67sLGxweeff47MzMxS2/bOnTvo2rUrrKyscOTIEVhbWyMvLw89evRAbm4upk6dCnt7e8TFxWHfvn149OgRzM3Ny/x/Vdz+Xl5e8PPzw4MHD7BixQqcOXMGV69ehYWFBebMmYPGjRvjp59+kr7irl+//nN/DoYMGYKGDRvi66+/hhDiueVL8+uvvyI9PR0TJ06ETCbDt99+i9deew13795V+PkoLCxEjx490KZNG3z33Xc4evQolixZgvr162Py5MnPvc4bb7wBV1dX+Pn54cqVK/j5559ha2uLb775Riozbtw47NixA6NHj0bbtm1x8uRJ9OnTp0L3Vaz4w5ClpWWJY1u3bkX9+vXh5eUFd3d3GBkZYdu2bfjoo4/KVffdu3ehra0NCwsLpWLau3cvXFxcpOT1aZ06dYKLiwv279//3LqedX9EpCR1d0ETUemKvwZ9+qWvry82bNigUPb06dMCgNi6davC/oCAgBL7nZ2dBQBx6tQpaV9CQoLQ19cXM2fOlPZ9/vnnAoDYtWtXidjkcrkQ4vEQiKZNm4rc3Fzp+IoVKwQAERISIu3r3LmzACB+/fVXad/NmzcFAKGlpSXOnTsn7T906JAAINavXy/ty8rKKhFHUFCQACA2bdpUot06dOggCgoKFMo/OQTixo0bonbt2sLLy0skJydLZa5evVqhYR15eXnC1tZWuLu7i+zsbGn/vn37BADx+eefl4ixPEMgimMePnx4iWOdO3cu9av3sWPHCmdnZ2m7eMhArVq1FO71zz//FADE3r17Fc4FIL744guFOlu0aCFatWqlsA+AmDdvXolYJ0yYoFBu0KBBolatWtL25cuXBQAxffp0hXLjxo0rUWdpiu9nwYIFIjExUdy/f1+cPn1aeHl5lfr/Li8vT9SqVUvMmTNH2jdixAjh6elZou7OnTuLJk2aiMTEROnnZNq0aQKA6NevX6nxlDUE4tGjRwKAGDBgwDPvp3///gKASEtLE0I8/vk4evSoSExMFDExMWLnzp3CxsZG6Ovri5iYmGfWR0TPxyEQRNWcv78/jhw5giNHjmDLli3o0qUL3nrrLezatUsq8/vvv8Pc3ByvvvoqHj58KL1atWoFExMT/P333wp1urm5KfRI2djYoHHjxrh79660748//oCnp2epk3OenuE+fvx46OnpSdvFdT9ZHwCYmJhg2LBh0nbjxo1hYWGBpk2bok2bNtL+4n8/eb6hoaH07/z8fCQlJaFBgwawsLDAlStXSsT49ttvQ1tbu8R+AAgNDUXnzp3h4uKCo0ePKvSoFffwHjp0qMTX9s9y6dIlJCQk4N1331WYoNSnTx80adKkXD18zzJp0qQXOh8Ahg4dqnCvZf1/Ku16HTt2LLVcaUo7NykpCWlpaQCKloADinrpnzR16tRy1V9s3rx5sLGxgb29vfRtxZIlS/D6668rlDt48CCSkpIwfPhwad/w4cNx7dq1UldhuHnzJmxsbGBjY4OmTZvihx9+QJ8+fbBu3Tql4ktPTwcA6VuMshQfL26fYt26dYONjQ2cnJzw+uuvw9jYGH/99dczh/QQUflwCARRNeft7Y3WrVtL28OHD0eLFi3w3nvvoW/fvtDT08Pt27eRmpoKW1vbUutISEhQ2K5bt26JMpaWlgrjhe/cuYPBgweXK8an6ytOsp4ef+zo6FgieTY3N4eTk1OJfU+fn52dDT8/P6xfvx5xcXEKwwBKG5vr6upaZrz9+vWDnZ0dDh06BBMTkxLnzZgxA0uXLsXWrVvRsWNH9O/fH6NGjXrm8Ifo6GgARUn905o0aYLAwMAyzy2PZ91PeZX3/5OBgUGJ8apP/3xU9DpmZmaIjo6GlpZWiXtq0KBBueov9s4772DIkCHIycnB8ePH8f3335cYpwwUrf7g6uoKfX19aWx6/fr1YWRkhK1bt+Lrr79WKO/i4oK1a9dKS6Y1bNiwzPfWsxQntsWJcFnKSpT9/f3RqFEjpKamYt26dTh16hT09fWVjoOISmICTPSS0dLSQpcuXbBixQrcvn0bzZo1g1wuh62tLbZu3VrqOU8nM2X1jIoKji0tb31llSvP+VOnTsX69esxffp0tGvXDubm5pDJZBg2bBjkcnmJc5/sMX7a4MGDsXHjRmzduhUTJ04scXzJkiUYN24c/vzzTxw+fBjTpk2Dn58fzp07p7bet9LuRyaTlfr/rLQkEHjx/0/lVdk/X2Vp2LChtIxc3759oa2tjU8//RRdunSRPjSmpaVh7969yMnJQcOGDUvU8euvv2LhwoUKH8yMjY0rZXk6c3NzODg44Pr1688sd/36ddSpUwdmZmYK+5/88Dtw4EB06NABI0aMwK1bt0p8cCMi5TABJnoJFRQUACiaqAYU9WYdPXoUPj4+z0z8lFG/fn2EhoZWSl2VYefOnRg7diyWLFki7cvJyanQE9QWL14MHR0dvPvuuzA1NcWIESNKlPHw8ICHhwfmzp2Ls2fPwsfHB6tXr8ZXX31Vap3Ozs4AgFu3bqFr164Kx27duiUdr0yWlpalDkso7o2urpydnSGXyxEZGamQlD69coiy5syZg7Vr12Lu3LnSMItdu3YhJycHq1atUpi4CRT9f5k7dy7OnDkjraxR2fr27Yu1a9ciMDCw1GucPn0aUVFRpX4Qe5K2tjb8/PzQpUsXrFy5Ep9++mmVxEukKTgGmOglk5+fj8OHD0NPTw9NmzYFUDTrvrCwEF9++WWJ8gUFBRVKEgcPHoxr165h9+7dJY5Vdk9eeWhra5e47g8//FBmb+ezyGQy/PTTT3j99dcxduxY/PXXX9KxtLQ06QNGMQ8PD2hpaSE3N7fMOlu3bg1bW1usXr1aodzBgwdx48aNF17hoDT169fHzZs3FZbmunbtGs6cOVPp16pMPXr0AAD8+OOPCvt/+OGHF6rXwsICEydOxKFDhxAcHAygaPhDvXr1MGnSJLz++usKrw8//BAmJiZlfnNSGT766CMYGhpi4sSJSEpKUjiWnJyMSZMmwcjIqFyrUfj6+sLb2xvLly9HTk5OVYVMpBHYA0xUzR08eBA3b94EUDSW99dff8Xt27fx6aefSl+Zdu7cGRMnToSfnx+Cg4PRvXt36Orq4vbt2/j999+xYsWKEhODnuejjz7Czp07MWTIEEyYMAGtWrVCcnIy/vrrL6xevRqenp6Vfq/P0rdvX2zevBnm5uZwc3NDUFAQjh49ilq1alWoPi0tLWzZsgUDBw7EG2+8gQMHDqBr1644fvw43nvvPQwZMgSNGjVCQUEBNm/eDG1t7WeOidbV1cU333yD8ePHo3Pnzhg+fLi0DJqLiws++OCDit56mSZMmIClS5eiR48eePPNN5GQkIDVq1ejWbNmJSZUVSetWrXC4MGDsXz5ciQlJUnLoIWHhwMoOclSGe+//z6WL1+ORYsWYenSpfj7778xbdq0Usvq6+ujR48e+P333/H9998rLAVXWRo2bIiNGzdi5MiR8PDwKPEkuIcPH2Lbtm3lWgoPKHpfDhkyBBs2bKiUiZFEmooJMFE19/nnn0v/NjAwQJMmTbBq1aoSX5muXr0arVq1wpo1azB79mzo6OjAxcUFo0aNgo+Pj9LXNTExwenTpzFv3jzs3r0bGzduhK2tLf73v/+pZRzsihUroK2tja1btyInJwc+Pj44evSo1JtYEbq6uti5cyd69eqFAQMG4OjRo/D09ESPHj2wd+9exMXFwcjICJ6enjh48CDatm37zPrGjRsHIyMjLFq0CJ988gmMjY0xaNAgfPPNN0qvH1seTZs2xaZNm/D5559jxowZcHNzw+bNm/Hrr7/ixIkTlX69yrRp0ybY29tj27Zt2L17N7p164bt27ejcePGL/SY39q1a2PEiBHYvHkzvLy8IJfL0a9fvzLL9+vXD3/88QcOHjyI/v37V/i6zzJkyBA0adIEfn5+UtJbq1YtdOnSBbNnz4a7u3u563rttddQv359fPfdd89c6YSInk0m1PFdJhER0VOCg4PRokULbNmyBSNHjlR3OERUg3EMMBERqVx2dnaJfcuXL4eWlhY6deqkhoiISJNwCAQREanct99+i8uXL6NLly7Q0dHBwYMHcfDgQbzzzjsl1oUmIqpsHAJBREQqd+TIESxYsABhYWHIyMhA3bp1MXr0aMyZMwc6OuybIaKqxQSYiIiIiDQKxwATERERkUZhAkxEREREGoUDrVSooKAAV69ehZ2dHbS0+NmDiIiIqpZcLseDBw/QokULjq9/AltCha5evQpvb291h0FEREQa5sKFC/Dy8lJ3GNUGE2AVsrOzA1D0Q+jg4KDmaIiIiKimi4+Ph7e3t5SDUBEmwCrg7+8Pf39/5OXlAQAcHBzU8ihZIiIi0kwceqmIraECU6ZMQVhYGE6cOKHuUIiIiIg0HhNgIiIiItIoTICJiIiISKNwDDAREWksuVwuzc8gehnp6upCW1tb3WG8dNSeAG8KisKak3eRmJGLpg5mWNC/GZo7WZRZ/mR4IpYdCcftB+nQ19WGt4sV5vRpCicrI6lM0J0kfLU/DLcfZMDBwgDvdWmAIa2dXui6ALD/ejyWHLmF2JRsuNYyxqe9mqBLE9sXuX0iIlKTvLw8REZGQi6XqzsUohdiYWEBe3t7yGQydYfy0lBrArz32r/4at8NfDXIHS2cLLDuTCTG/HIexz/0hbWJfonyMclZeHvTJbzVwRUrhjVHek4BvtgXhklbLmP/tI5SmQkbLmJkm7pYMaw5zkQk4dNdIbA1M0DnRjYVui4AXI5OxrTfruLjHo3xv6a2+DP4X7yz+RL2Te2IxvamVddIRERU6YQQiI+Ph7a2NpycnDhDnl5KQghkZWUhISEBALjEqhLUmgD/HBiJYd5OeOO/3tmFAz1w/GYCdlyKwbu+DUqUD4lLhVwu8GH3xtDSKvqU807Henh78yXkF8qhq62FLeej4WRliLl93QAADWxNcTEqGb8ERkoJsLLXBYB1Z6LQuZENJnauDwCY2b0xTt9+iI1BUfh6kEflNgwREVWpgoICZGVloXbt2jAyMnr+CUTVlKGhIQAgISEBtra2HA5RTmr7yJtXIEdoXCp8Glg/DkZLBp8G1rgS/QgAMHPHNQxdEyQd96hjDi2ZDL9fjkGhXCAtJx+7r8ahQwNr6GoX3crV6EcKdQJAp0Y2uBqdUu7rluZqdEqp9V75r97S5ObmIi0tTXqlp6c/u1GIiEglCgsLAQB6enpqjoToxRV/iMvPz1dzJC8PtfUAp2TloVAuSgw5sDHRx53ETACArZk+hBDSMScrI2x60xvv/XoFs3eHolAu0LKuBdaPf/x44cSM3FLrTM8tQE5+IVKz85973dIU1av4i9LGRA8PM3LLPMfPzw8LFiwo8zgREakXx0xSTcCfY+VV60FPn/RsgqVDm0vbCek5mLUrBINbOuLPKT7Y/k5b6Gpr4d2tlxUS5epi1qxZSE1NlV5hYWHqDomIiIhI46ktAbY00oO2lqxED2piRi5sypiItjkoGqYGOpjVuync65ijTb1aWP7fRLerMY8AFPXkllanqb4ODHS1K3Tdx/UqLpWTmJFX5qQ5ANDX14eZmZn0MjXlZDl1KJQLBN1Jwp/BcQi6k4RCefX7sERERJVvw4YNsLCwUGsMLi4uWL58uVpjoJLUlgDr6WjBvY45zkY8lPbJ5QJnI5LQ0tmi1HOy8wpLdPNr/7dd3APcwtkCZyOSFMoE3n6IFs6WFb5uUb2WCucU1ZuIlv/VS9VTQGg8OnxzHMPXnsP7vwVj+Npz6PDNcQSExqs7NCIiqkHKSrYvXryId955R/UB0TOpdQjEWx1cse1iDHZejkVEQjrm7AlFVl4BhrQqWp3hm4CbmLE9WCrftYktrsc+woqjtxH5MBOhcan4cOd11LEwRLPa5gCAUW2ccS85C34HbiAiIQObg6KwPyQeb3ZwLfd1AWDG9mB8E3BT2p7g44KT4YlYe+ouIhIysOxIOELiUjG2nUvVNhJVWEBoPCZvuYL41ByF/fdTczB5yxUmwUT0wvgNk3JexklaL/qgFBsbG640Ug2pNQHu51kbc3o3xbIj4ei9IhBh8WnYOMEbNqZFwwoS0nIR9yhbKt++gTVWDGuBw2H30ef70xi77gL0tLWwcYI3DHSLlv1wsjLCunFeOH37IXqvOI21pyOx6DUPaQm08lwXAOIeZSMh7fEwiVbOVlgxrAW2XbiH3itO42BoPH4a3ZprAFdThXKBBXvDUNqfouJ9C/aG8Y8VEVWYOr5h8vX1xdSpUzF9+nRYWlrCzs4Oa9euRWZmJsaPHw9TU1M0aNAABw8eVDgvNDQUvXr1gomJCezs7DB69Gg8fPj4W82AgAB06NABFhYWqFWrFvr27Ys7d+5Ix6OioiCTybBr1y506dIFRkZG8PT0RFBQEJ5FJpNh1apV6N+/P4yNjbFw4cJSe0r37Nmj8A3v/Pnz0bx5c2zevBkuLi4wNzfHsGHDnrua0oYNG1C3bl0YGRlh0KBBSEpS/EZ43LhxGDhwoMK+6dOnw9fXV9r29fXFe++9h+nTp8Pa2ho9evQAACxduhQeHh4wNjaGk5MT3n33XWRkZAAATpw4gfHjxyM1NRUymQwymQzz588HUHIIxL179zBgwACYmJjAzMwMb7zxBh48ePDC907KUfuT4Ma2d8HY9i6lHlvyhmeJff09a6O/Z+1n1tmufi0ceL9jha8LANsntiuxr88rDujzCheZfhlciEwu0fP7JAEgPjUHFyKT0a5+LdUFRkQ1QvE3TE9/hC7+hmnVqJbo6V41fy82btyIjz/+GBcuXMD27dsxefJk7N69G4MGDcLs2bOxbNkyjB49Gvfu3YORkREePXqErl274q233sKyZcuQnZ2NTz75BG+88QaOHz8OAMjMzMSMGTPwyiuvICMjA59//jkGDRqE4OBghYeEzJkzB9999x0aNmyIOXPmYPjw4YiIiICOTtnpxPz587Fo0SIsX74cOjo60jWf586dO9izZw/27duHlJQUvPHGG1i0aBEWLlxYavnz58/jzTffhJ+fHwYOHIiAgADMmzdPiZZ9bOPGjZg8eTLOnDkj7dPS0sL3338PV1dX3L17F++++y4+/vhj/Pjjj2jfvj2WL1+Ozz//HLdu3QIAmJiYlKhXLpdLye/JkydRUFCAKVOmYOjQoThx4kSF752Up/YEmKgqJKSXnfxWpBwRUbHnfcMkQ9E3TK+62UNbq/KXp/L09MTcuXMBFK02tGjRIlhbW+Ptt98GAHz++edYtWoVrl+/jrZt22LlypVo0aIFvv76a6mOdevWwcnJCeHh4WjUqBEGDx6scI1169bBxsYGYWFhcHd3l/Z/+OGH6NOnDwBgwYIFaNasGSIiItCkSZMy4x0xYgTGjx+v9H3K5XJs2LBBmkA+evRoHDt2rMwkcMWKFejZsyc+/vhjAECjRo1w9uxZBAQEKH3thg0b4ttvv1XYN336dOnfLi4u+OqrrzBp0iT8+OOP0NPTg7m5OWQyGezt7cus99ixYwgJCUFkZCScnIqGXW7atAnNmjXDxYsX4eXlVaF7J+VV62XQiCrK1tSgUssRERVT5humqvDKK69I/9bW1katWrXg4fH4iaR2dnYAID0e99q1a/j7779hYmIivYoT1uJhDrdv38bw4cNRr149mJmZwcXFBUDR1/VlXbv4sbvF1ylL69atK3KbcHFxUVg9ycHB4ZnXunHjBtq0aaOwr127kt/mlkerVq1K7Dt69Cj+97//oU6dOjA1NcXo0aORlJSErKysctd748YNODk5SckvALi5ucHCwgI3btyQ9il776Q89gBTjeTtagUHcwPcT80ptZdGBsDe3ADerlaqDo2IXnLq/oZJV1dXYVsmkynsKx5LK5fLAQAZGRno168fvvnmmxJ1FSex/fr1g7OzM9auXYvatWtDLpfD3d29xASwZ12nLMbGxgrbWlpaJdbuL21yXGn3+bxrPU95r/10zFFRUejbty8mT56MhQsXwsrKCoGBgXjzzTeRl5dX6ZPcquLeSRETYBXw9/eHv7//C88kpfLT1pJhXj83TN5yBTJAIQku/kJyXj+3Kvl6kohqtpftG6aWLVvijz/+gIuLS6ljdZOSknDr1i2sXbsWHTsWzZ8JDAyssnhsbGyQnp6OzMxMKdEMDg5+4XqbNm2K8+fPK+w7d+5ciWuHhoYq7AsODi6RcD7t8uXLkMvlWLJkiTQmeseOHQpl9PT0pEdsPyvGmJgYxMTESL3AYWFhePToEdzc3J55LlUuDoFQgSlTpiAsLExhgDtVvZ7uDlg1qiXszRX/CNmbG1TpBBUiqtmKv2Eq6+OzDIBDNfqGacqUKUhOTsbw4cNx8eJF3LlzB4cOHcL48eNRWFgIS0tL1KpVCz/99BMiIiJw/PhxzJgxo8riadOmDYyMjDB79mzcuXMHv/76KzZs2PDC9U6bNg0BAQH47rvvcPv2baxcubLE+N+uXbvi0qVL2LRpE27fvo158+aVSIhL06BBA+Tn5+OHH37A3bt3sXnzZqxevVqhjIuLCzIyMnDs2DE8fPiw1KER3bp1g4eHB0aOHIkrV67gwoULGDNmDDp37lzhoSJUMUyAqUbr6e6AwE+6YtvbbbFiWHNse7stAj/pyuSXiCqs+BsmACWS4Or4DVPt2rVx5swZFBYWonv37vDw8MD06dNhYWEBLS0taGlp4bfffsPly5fh7u6ODz74AIsXL66yeKysrLBlyxYcOHAAHh4e2LZtm7Rk2Ito27Yt1q5dixUrVsDT0xOHDx+WJgsW69GjBz777DN8/PHH8PLyQnp6OsaMGfPcuj09PbF06VJ88803cHd3x9atW+Hn56dQpn379pg0aRKGDh0KGxubEpPogKKhDH/++ScsLS3RqVMndOvWDfXq1cP27dtf7OZJaTLx9GAYqjKxsbFwcnJCTEwMHB0d1R0OEZHGysnJQWRkJFxdXWFgULGhCgGh8ViwN0xhQpyDuQHm9XPjh2xSqWf9PDP3KB3HABMREVVAT3cHvOpmjwuRyUhIz4GtadGwh+rS80tEZWMCTEREVEHaWjI+TIfoJcQxwERERESkUZgAExEREZFGYQJMRERERBqFCTARERERaRQmwCrg7+8PNzc3+Pr6qjsUIiIiIo3HBFgF+CQ4IiIiouqDCTARERERaRQmwERERESkUZgAExERvYQSExOhp6eHzMxM5Ofnw9jYGPfu3VN3WEQvBSbAREREL6GgoCB4enrC2NgYV65cgZWVFerWrVtm+fz8fBVGR1S9MQEmIiJ6CZ09exY+Pj4AgMDAQOnfxWQyGVatWoX+/fvD2NgYCxcuxIYNG2BhYaFQbs+ePZDJZNL2/Pnz0bx5c2zevBkuLi4wNzfHsGHDkJ6eXuX3RKQqTICJiIgq6My9M+i1pRcclzqi15ZeOHPvTJVe7969e7CwsICFhQWWLl2KNWvWwMLCArNnz8aePXtgYWGBd999Vyo/f/58DBo0CCEhIZgwYUK5r3Pnzh3s2bMH+/btw759+3Dy5EksWrSoKm6JSC101B0AERHRy+jMvTPw3egLIQQKRSHuZ9zH0cijODH2BHzq+jz3/IqoXbs2goODkZaWhtatW+P8+fMwNjZG8+bNsX//ftStWxcmJiZS+REjRmD8+PFKX0cul2PDhg0wNTUFAIwePRrHjh3DwoULK+1eiNSJPcAqwAdhEBHVPF+d+kpKfgGgUBRCCIGvTn1VZdfU0dGBi4sLbt68CS8vL7zyyiu4f/8+7Ozs0KlTJ7i4uMDa2loq37p16wpdx8XFRUp+AcDBwQEJCQkvHD9RdcEeYBWYMmUKpkyZgtjYWDg5Oak7HCIiqgQhCSFS8lusUBQiJCGkyq7ZrFkzREdHIz8/H3K5HCYmJigoKEBBQQFMTEzg7OyMf/75RypvbGyscL6WlhaEEAr7Spscp6urq7Atk8kgl8sr8U6I1Is9wERERBXgYesBbZm2wj5tmTY8bD2q7JoHDhxAcHAw7O3tsWXLFgQHB8Pd3R3Lly9HcHAwDhw48MzzbWxskJ6ejszMTGlfcHBwlcVLVF0xASYiIqqAuZ3mQiaTSUmwtkwbMpkMn3X+rMqu6ezsDBMTEzx48AADBgyAk5MT/vnnHwwePBgNGjSAs7PzM89v06YNjIyMMHv2bNy5cwe//vorNmzYUGXxElVXTICJiIgqwKeuD06MPYFX672KOqZ18Gq9V3Fy3Em0d2pfpdc9ceIEvLy8YGBggAsXLsDR0REODg7lOtfKygpbtmzBgQMH4OHhgW3btmH+/PlVGi9RdSQTTw8GoipTPAY4JiYGjo6O6g6HiEhj5eTkIDIyEq6urjAwMFB3OEQv5Fk/z8w9SsceYCIiIiLSKEyAiYiIiEijMAEmIiIiIgDAqehT6LetH2ovqQ3ZAhn23Nzz3HNORJ1AyzUtof+VPhp83wAbgjeUWXZR4CLIFsgwPWB6pcVcEUyAiYiIiAgAkJmXCU87T/j39i9X+ciUSPT5tQ+6uHRB8MRgTG87HW/99RYORRwqUfZi3EWsubwGr9i9UtlhK40PwlABf39/+Pv7Iy8vT92hEBHREzgPnGqCyvw57tWwF3o17FXu8qsvrYarhSuW9FgCAGhq0xSB9wKx7Nwy9GjQQyqXkZeBkbtGYm2/tVX6tMTyYg+wCkyZMgVhYWE4ceKEukMhIiIA2tpFa/eyY4JqgqysLAAln+CnCkGxQehWr5vCvh71eyAoNkhh35QDU9CnYZ8SZdWFPcBERKRxdHR0YGRkhMTEROjq6kJLi/1B9PIRQiArKwsJCQmwsLCQPtiVJj09HWlpadK2vr4+9PX1XziG+xn3YWdsp7DPzsQOablpyM7PhqGuIX4L/Q1X4q/g4tsXX/h6lYUJMBERaRyZTAYHBwdERkYiOjpa3eEQvRALCwvY29s/s4ybm5vC9rx581TyEJSY1Bi8H/A+jow+AgOd6rPmNhNgIiLSSHp6emjYsCGHQdBLTVdX95k9v8XCwsJQp04dabsyen8BwN7EHg8yHyjse5DxAGb6ZjDUNcTl+MtIyExAyzUtpeOFohCnok9h5YWVyJ2bC22t58df2ZgAExGRxtLS0uKT4EgjmJqawszMrNLrbefYDgciDijsO3L3CNo5tgMA/M/1fwiZHKJwfPyf49HEugk+8flELckvUE0S4E1BUVhz8i4SM3LR1MEMC/o3Q3Mni1LLLjsSjhXHbpfYb6irjRtf9pS291+Px5IjtxCbkg3XWsb4tFcTdGliKx0XQmDZkXBsuxiDtOx8tHaxxFcDPeBqbVxpsRIRERG9TDLyMhCRHCFtR6ZEIvh+MKwMrVDXvC5mHZ2FuPQ4bBq0CQAwqfUkrLy4Eh8f+RgTWkzA8cjj2PHPDuwfsR8AYKpvCndbd4VrGOsao5ZhrRL7VUnto/73XvsXX+27gfe7NcT+qR3g5mCKMb+cx8OM3FLLv9OpHi7M+Z/Cq6GtCXp7OEhlLkcnY9pvVzG0tRMOTOuA7s3s8M7mS7h1P10qs/rkXaw/G4WFA92xZ4oPDHV1MGbdeeTkF1ZarEREREQvk0v/XkKLNS3QYk0LAMCMwzPQYk0LfP735wCA+Ix43Eu9J5V3tXTF/hH7ceTuEXiu9sSSoCX4uf/PCkugVUcyoeZFEAf4n4Gnozm+GFD0KUAuF2i36BjGtnfBu74Nnnt+2L9p6P39aeyY2A7erlYAgCm/XkF2XiHWjfOSyg30PwO32mb4epAHhBDw/voY3u7oinc61QcApOXko/VXR/HdEE/096xdJbHGxsbCyckJMTExcHR0fG55IiIiohfB3KN0au0BziuQIzQuFT4NrKV9Wloy+DSwxpXoRwCAmTuuYeiaoDJqALZfvId61sZS8gsAV6NTFOoEgE6NbHAlOgUAEJOcjcT0XIUyZga6aO5kIZWpSKxPy83NRVpamvRKT08vtRwRERERqY5aE+CUrDwUygWsTRRnItqY6CPxv2EFtmb6qGNhWOr5OfmF2BP8L97wclLYn5iRC2sTvafq1JOGKiRm5EjXKeu6FYn1aX5+fjA3N5deTy9BQkRERESqp/YxwM/zSc8mWDq0eanHDv1zH5m5BRjcsnp26c+aNQupqanSKywsTN0hEREREWk8ta4CYWmkB20tWYlJZIkZuSV6Z0uz/WIMujaxhY1pyV7ZhxmK6zomZuRJvbc2JgbSdWzNDJ4okws3h9KXCKlIrE8/ZeXJJ7AQERERkXqotQdYT0cL7nXMcTbiobRPLhc4G5GEls4Wzzw3JjkLQXeTMPSp4Q8A0MLZUqFOAAi8nYiWzpYAACcrQ9iY6uNsRJJ0PD0nH8Exj6QylRkrEREREVUfah8C8VYHV2y7GIOdl2MRkZCOOXtCkZVXgCGtihLbbwJuYsb24BLn7bgUA1tTffg2ti1xbIKPC06GJ2LtqbuISMjAsiPhCIlLxdh2LgCKHoE5wccVPxy/jSNhD3Dzfhpm7LgGOzN9dHd7/DzrEWvPYePZqHLHSkRERETVn9ofhNHPszaSM/Ow7Eg4EtNz0bS2GTZO8JaGNSSk5SLuUbbCOXK5wM7LsXi9lSO0tWQl6mzlbIUVw1pgyeFbWHzoFlysjfDT6NZobG8qlZnUuR6y8wowa1cI0nLy4eViiY3jvWGg+/iJJNFJWUjOfDyU4nmxEhEREVH1p/Z1gDUJ1+IjIiIiVWLuUTq1D4EgIiIiIlIlJsBEREREpFGYAKuAv78/3Nzc4Ovrq+5QiIiIiDQeE2AVmDJlCsLCwnDixAl1h0JERESk8ZgAExEREZFGYQJMRERERBqFCTARERERaRQmwERERESkUZgAExEREZFGYQJMRERERBqFCTARERERaRQmwERERESkUZgAqwCfBEdERERUfTABVgE+CY6IiIio+mACTEREREQaRUfdAVDlKZQLXIhMRkJ6DmxNDeDtagVtLZm6wyIiIiKqVpgA1xABofFYsDcM8ak50j4HcwPM6+eGnu4OaoyMiIiIqHrhEIgaICA0HpO3XFFIfgHgfmoOJm+5goDQeDVFRkRERFT9MAF+yRXKBRbsDYMo5VjxvgV7w1AoL60EERERkeZhAvySuxCZXKLn90kCQHxqDi5EJqsuKCIiIqJqjAnwSy4hvezktyLliIiIiGo6JsAvOVtTg0otR0RERFTTMQFWgap8Epy3qxUczA1Q1mJnMhStBuHtalXp1yYiIiJ6GTEBVoGqfBKctpYM8/q5AUCJJLh4e14/N64HTERERPQfJsA1QE93B6wa1RL25orDHOzNDbBqVEuuA0xERET0BD4Io4bo6e6AV93s+SQ4IiIioudgAlyDaGvJ0K5+LXWHQURERFStcQgEEREREWkUJsBEREREpFGYABMRERGRRmECTEREREQahQkwEREREWkUJsAqUJVPgiMiIiIi5TABVoGqfBIcERERESmHCTARERERaRQmwERERESkUZgAExEREZFGUfujkDcFRWHNybtIzMhFUwczLOjfDM2dLMosL4TA2tN3se1CDOJSsmFprIvRbZ3xXteGUpmgO0n4an8Ybj/IgIOFAd7r0gBDWju90HUBYP/1eCw5cguxKdlwrWWMT3s1QZcmti9y+0RERESkYmrtAd577V98te8G3u/WEPundoCbgynG/HIeDzNyyzxnwd4w/HYxBrN7N8WxmZ3x8xgveD6RuMYkZ2HChotoV68WDrzfARN8XPHprhCcDE98oetejk7GtN+uYmhrJxyY1gHdm9nhnc2XcOt+eqW0BRERERGphloT4J8DIzHM2wlvtHZCQztTLBzoAUM9bey4FFNq+YiEdGw5F421Y1rjVTc7OFkZwcPRHB0b2khltpyPhpOVIeb2dUMDW1OMbe+CXu72+CUwssLXBYB1Z6LQuZENJnaujwa2ppjZvTGa1TbHxqCoSmsPIiIiIqp6akuA8wrkCI1LhU8D68fBaMng08AaV6IfAQBm7riGoWuCpONHbySgrpURjt9IQIdvjsNn0XF8svM6HmXlSWWuRj9SqBMAOjWywdXolHJftzRXo1NKrffKf/WWJjc3F2lpadIrPZ29xURERETqprYEOCUrD4VyAWsTfYX9Nib6SPxvKIKtmT7qWBhKx+4lZyH2UTb2h8Rj6RvN8d0QT4TEpWLylitSmcSM3FLrTM8tQE5+YbmuW5qievWeOkfvmcMm/Pz8YG5uLr3c3NzKLEtEREREqlGtV4H4pGcTLB3aXNoWQiCvQI6lb3jC29UK7erXwrevv4Kgu0m4k5ihvkDLMGvWLKSmpkqvsLAwdYdEREREpPHUtgqEpZEetLVkJXpQEzNyYfNU72wxG1MD6GjJUM/GRNrXwLbo3/8+ykZ9GxPYmOiXWqepvg4MdLWhJZMpfV0A/9Wbp7AvMSOvRE/yk/T19aGv//h4WlpamWWJiIiISDXU1gOsp6MF9zrmOBvxUNonlwucjUhCS2eLUs9p7WyJArlAdFKmtO9uYtG/i4dKtHC2wNmIJIXzAm8/RAtnywpft6heS4VziupNRMv/6iUiIiKil4Nah0C81cEV2y7GYOflWEQkpGPOnlBk5RVgSKuiNXu/CbiJGduDpfIdGljDvY4ZPtp5HaFxqQiJTcXs3SHo2NBa6hUe1cYZ95Kz4HfgBiISMrA5KAr7Q+LxZgfXcl8XAGZsD8Y3ATel7Qk+LjgZnoi1p+4iIiEDy46EIyQuFWPbuVRtIxERERFRpVLrgzD6edZGcmYelh0JR2J6LprWNsPGCd6wMS0aNpCQlou4R9lSeS0tGX4Z64V5f/6DoWuCYKinA9/GNpjbp6lUxsnKCOvGeeHLfWFYfyYK9uYGWPSaBzo3sin3dQEg7lE2ZDKZtN3K2QorhrXAksO3sPjQLbhYG+Gn0a3R2N60KpuIiIiIiCqZTAgh1B2EpoiNjYWTkxNiYmLg6Oio7nCIiIiohmPuUbpqvQoEEREREVFlYwJMRERERBqFCTARERERaRQmwCrg7+8PNzc3+Pr6qjsUIiIiojKdij6Fftv6ofaS2pAtkGHPzT3PPedE1Am0XNMS+l/po8H3DbAheIPCcb/TfvBa6wVTP1PYLrbFwN8G4tbDW1VzA+XEBFgFpkyZgrCwMJw4cULdoRARERGVKTMvE552nvDv7V+u8pEpkejzax90cemC4InBmN52Ot766y0cijgklTkZfRJTvKbg3JvncGT0EeTL89F9S3dk5mU+o+aqpdZl0IiIiIio+ujVsBd6NexV7vKrL62Gq4UrlvRYAgBoatMUgfcCsezcMvRo0AMAEDAqQOGcDQM2wPY7W1yOv4xOzp0qL3glsAeYiIiIiCokKDYI3ep1U9jXo34PBMUGlXlOam4qAMDK0KpKY3sW9gATERER1XDp6elIS0uTtvX19aGvr/+MM8rnfsZ92BnbKeyzM7FDWm4asvOzYahrqHBMLuSYHjAdPk4+cLd1f+HrVxR7gImIiIhqODc3N5ibm0svPz8/tcQxZf8UhCaE4rfXf1PL9YuxB5iIiIiohgsLC0OdOnWk7cro/QUAexN7PMh8oLDvQcYDmOmblej9fe/Ae9h3ex9OjTsFRzP1PpWOCTARERFRDWdqagozM7NKr7edYzsciDigsO/I3SNo59hO2hZCYOrBqdh9czdOjD0BV0vXSo9DWRwCQUREREQAgIy8DATfD0bw/WAARcucBd8Pxr3UewCAWUdnYczuMVL5Sa0n4W7KXXx85GPcfHgTP178ETv+2YEP2n4glZlyYAq2XN+CX1/7Fab6prifcR/3M+4jOz9bpff2JPYAExEREREA4NK/l9BlYxdpe8bhGQCAsZ5jsWHgBsRnxEvJMAC4Wrpi/4j9+ODQB1hxfgUczRzxc/+fpSXQAGDVpVUAAN+NvgrXWj9gPcY1H1dl9/IsMiGEUMuVNYi/vz/8/f2Rl5eHO3fuICYmBo6O6h37QkRERDVfbGwsnJycmHs8hUMgVIBPgiMiIiKqPpgAExEREZFGYQJMRERERBqFCTARERERaRQmwERERESkUZgAExEREZFGYQJMRERERBqFCTARERERaRQmwCrg7+8PNzc3+Pr6qjsUIiIiIo3HBFgF+CAMIiIiouqDCTARERERaRQmwERERESkUXSUKXzjxg389ttvOH36NKKjo5GVlQUbGxu0aNECPXr0wODBg6Gvr19VsRIRERERvbBy9QBfuXIF3bp1Q4sWLRAYGIg2bdpg+vTp+PLLLzFq1CgIITBnzhzUrl0b33zzDXJzc6s6biIiIiKiCilXD/DgwYPx0UcfYefOnbCwsCizXFBQEFasWIElS5Zg9uzZlRUjEREREVGlKVcCHB4eDl1d3eeWa9euHdq1a4f8/PwXDoyIiIiIqCqUawjE85LfR48eKVWeiIiIiEhdlF4F4ptvvsH27dul7TfeeAO1atVCnTp1cO3atUoNjoiIiIiosimdAK9evRpOTk4AgCNHjuDIkSM4ePAgevXqhY8++qjSA6wJ+CQ4IiIioupDJoQQypxgaGiI8PBwODk54f3330dOTg7WrFmD8PBwtGnTBikpKVUV60svNjYWTk5OiImJgaOjo7rDISIiohqOuUfplO4BtrS0RExMDAAgICAA3bp1AwAIIVBYWFi50RERERERVTKlHoQBAK+99hpGjBiBhg0bIikpCb169QIAXL16FQ0aNKj0AImIiIiIKpPSCfCyZcvg4uKCmJgYfPvttzAxMQEAxMfH49133630AImIiIiIKpPSY4CrwqagKKw5eReJGblo6mCGBf2bobmTRallY5Kz0PHbv0vs3/Vue7Ssaylt778ejyVHbiE2JRuutYzxaa8m6NLEVjouhMCyI+HYdjEGadn5aO1iia8GesDV2rjSYn0ax+EQERGRKjH3KJ3SPcAA8O+//yIwMBAJCQmQy+UKx6ZNm6ZUXXuv/Yuv9t3AV4Pc0cLJAuvORGLML+dx/ENfWJvol3ne1rfaoKGdibRtaaQn/ftydDKm/XYVH/dojP81tcWfwf/inc2XsG9qRzS2NwUArD55F+vPRmHJEE84WRlhyeFwjFl3Hkc+6AwDXe1KjZWIiIiIqg+lE+ANGzZg4sSJ0NPTQ61atSCTyaRjMplM6QT458BIDPN2whuti5ZWWzjQA8dvJmDHpRi861v2mGILI13YmhqUemzdmSh0bmSDiZ3rAwBmdm+M07cfYmNQFL4e5AEhBNadicTUrg3QvZk9AGDpUE+0/uooDoc9QH/P2pUaKxERERFVH0qvAvHZZ5/h888/R2pqKqKiohAZGSm97t69q1RdeQVyhMalwqeB9eOAtGTwaWCNK9GPAAAzd1zD0DVBJc59e+MltPryCF5fdRZHwh4oHLsanaJQJwB0amSDK9FFS7TFJGcjMT1XoYyZgS6aO1lIZSoSKxERERFVf0r3AGdlZWHYsGHQ0lI6dy4hJSsPhXJRYviAjYk+7iRmAgBszfTx5DBlY30dzO3TFK2cLaElk+Fg6H28s/kSfhrdGq+62QEAEjNyYW2i91SdeniYkfvf8RzpOk9fN/G/MhWJ9Wm5ubnIzX1cX3p6eukNQUREREQqo3QC/Oabb+L333/Hp59+WhXxlPBJzyYK21bGenirYz1p29PJAglpOfjp1B0pAa4u/Pz8sGDBAnWHQURERERPUDoB9vPzQ9++fREQEAAPDw/o6uoqHF+6dGm567I00oO2lkzqmS2WmJFbonf2WZrXtcDpiIfSto2JPh5m5D1VZ57Ue2tjYiBdx9bM4IkyuXBzMKu0WGfNmoUZM2ZI23FxcXBzcyv3fRERERFR5VN6HIOfnx8OHTqEBw8eICQkBFevXpVewcHBStWlp6MF9zrmOPtE8iqXC5yNSEJLZ4ty1xP2bxpsTR8noS2cLRXqBIDA24lo6Vy0TJqTlSFsTPVxNiJJOp6ek4/gmEdSmcqIVV9fH2ZmZtLL1NS03PdERERERFVD6R7gJUuWYN26dRg3blylBPBWB1fM/P0aPBwt0NzJHL8ERiErrwBDWhWttPBNwE08SM3B0qHNAQA7L8dCV1uGZrXNAQCH/rmPHZdisGjwK1KdE3xcMHTNOaw9dRddmthi77V/ERKXCr/XisrIZDJM8HHFD8dvw8XaGE5WhlhyOBx2Zvro/sQwihFrz6FHM3uMbe9SrliJiIiIqPpTOgHW19eHj49PpQXQz7M2kjPzsOxIOBLTc9G0thk2TvCGzX89uglpuYh7lK1wzg/HIxCXkg0dLRnq2Zpg5YiW6O3hIB1v5WyFFcNaYMnhW1h86BZcrI3w0+jW0hrAADCpcz1k5xVg1q4QpOXkw8vFEhvHeyusARydlIXkzMdDKZ4XKxERERFVf0o/Cc7Pzw/x8fH4/vvvqyqmGotPYyEiIiJVYu5ROqV7gC9cuIDjx49j3759aNasWYlJcLt27aq04IiIiIiIKpvSCbCFhQVee+21qoiFiIiIiKjKKZ0Ar1+/viriICIiIiJSiRd/nBs9l7+/P9zc3ODr66vuUIiIiIg0XoUS4C+++AI//vijwr4ff/wRX3zxRaUEVdNMmTIFYWFhOHHihLpDISIiItJ4FUqA169fj927dyvs++OPP7Bhw4bKiImIiIiIqMooPQYYACIjI0vsO3bs2AsHQ0RERERU1TgGmIiIiIg0itIJcEBAAAIDA6Vtf39/NG/eHCNGjEBKSkqlBkdEREREVNmUToA/+ugjpKWlAQBCQkIwc+ZM9O7dG5GRkZgxY0alB0hEREREVJmUHgMcGRkJNzc3AEUT3/r27Yuvv/4aV65cQe/evSs9QCIiIiKiyqR0D7Cenh6ysrIAAEePHkX37t0BAFZWVlLPMBERERFRdaV0D3CHDh0wY8YM+Pj44MKFC9i+fTsAIDw8HI6OjpUeIBERERFRZVK6B3jlypXQ0dHBzp07sWrVKtSpUwcAcPDgQfTs2bPSA6wJ+CQ4IiIioupDJoQQ6g5CU8TGxsLJyQkxMTHsLSciIqIqx9yjdOXqAc7MzFSqUmXLExERERGpSrkS4AYNGmDRokWIj48vs4wQAkeOHEGvXr3w/fffV1qARERERKTZMjMz8dlnn6F9+/Zo0KAB6tWrp/BSVrkmwZ04cQKzZ8/G/Pnz4enpidatW6N27dowMDBASkoKwsLCEBQUBB0dHcyaNQsTJ05UOhAiIiIiotK89dZbOHnyJEaPHg0HBwfIZLIXqk+pMcD37t3D77//jtOnTyM6OhrZ2dmwtrZGixYt0KNHD/Tq1Qva2tovFFBNxnE4REREpEo1JfewsLDA/v374ePjUyn1KbUMWt26dTFz5kzMnDmzUi5ORERERPQ8lpaWsLKyqrT6lF4GjYiIiIhIlb788kt8/vnn0sPYXpTSD8IgIiIiIlKlJUuW4M6dO7Czs4OLiwt0dXUVjl+5ckWp+pgAExEREVG1NnDgwEqtjwmwCvj7+8Pf3x95eXnqDoWIiIjopTNv3rxKrY9jgFVgypQpCAsLw4kTJ9QdChEREZHGq1AP8KNHj3DhwgUkJCRALpcrHBszZkylBEZEREREqnUq+hQWn12My/9eRnxGPHYP3Y2BTQY+85wTUScw49AM/JP4D5zMnDC301yMaz5OoYz/BX8sPrsY9zPuw9PeEz/0+gHedbzLHZeWltYz1/4tLCwsd11ABRLgvXv3YuTIkcjIyICZmZlCMDKZjAkwERER0UsqMy8TnnaemNB8Al7b8dpzy0emRKLPr30wqdUkbH1tK45FHsNbf70FBxMH9GjQAwCwPXQ7ZhyegdV9VqONYxssP7ccPbb0wK33bsHW2LZcce3evVthOz8/H1evXsXGjRuxYMEC5W9UKKlhw4bi/fffF5mZmcqeqvFiYmIEABETE1Ml9QdGB4qem3uKOkvqiJ6be4rA6MAquc7Lhu1SNrZN6dguZWPblI7tUja2TelU1S4vkntgPsTuG7ufWebjwx+LZv7NFPYN/X2o6LG5h7TtvdZbTNk/RdoulBeK2ktqC7/TfkrH9LStW7eK/v37K32e0j3AcXFxmDZtGoyMjJTPtqnKnLl3Br4bfSGEQKEoxP2M+zgaeRQnxp6AT93KeWrKy4jtUja2TenYLmVj25SO7VI2tk3palK7BMUGoVu9bgr7etTvgemHpgMA8grzcPnfy5jVYZZ0XEumhW71uiEoNuiFr9+2bVu88847Sp+n9CS4Hj164NKlS0pfiKrWV6e+kt5IAFAoCiGEwFenvlJzZOrFdikb26Z0bJeysW1Kx3YpG9umdOpol/T0dKSlpUmv3NzcSqn3fsZ92BnbKeyzM7FDWm4asvOz8TDrIQpFYckyxna4n3H/ha6dnZ2N77//HnXq1FH6XKV7gPv06YOPPvoIYWFh8PDwKLEQcf/+/ZUOgl5cSEKI9EYqVigKEZIQoqaIqge2S9nYNqVju5SNbVM6tkvZ2DalU0e7uLm5KWzPmzcP8+fPr7LrVTZLS0uFeWdCCKSnp8PIyAhbtmxRuj6lE+C3334bAPDFF1+UOCaTyZSehUeVw8PWA/cz7iu8obRl2vCw9VBjVOrHdikb26Z0bJeysW1Kx3YpG9umdOpol7CwMIWeUn19/Uqp197EHg8yHyjse5DxAGb6ZjDUNYS2lja0Zdoly2Q+gL2Jfbmvs3z5coVtLS0t2NjYoE2bNrC0tFQ6bqWHQMjl8jJfTH5L5+/vDzc3N/j6+lbZNeZ2mguZTAZtmTaAojeSTCbDZ50/q7JrvgzYLmVj25SO7VI2tk3p2C5lY9uUTh3tYmpqCjMzM+lVWQlwO8d2OBZ5TGHfkbtH0M6xHQBAT1sPrWq3wrG7j8vIhRzH7h6TyjxPQUEBoqOj8b///Q9jx47F2LFjMXr0aPTs2bNCyS/AB2GohCoehOFT1wcnxp7Aq/VeRR3TOni13qs4Oe4k2ju1r7JrvgzYLmVj25SO7VI2tk3p2C5lY9uUrjq3S0ZeBoLvByP4fjCAomXOgu8H417qPQDArKOzMGb34yVvJ7WehLspd/HxkY9x8+FN/HjxR+z4Zwc+aPuBVGZG2xlYe2UtNgZvxI3EG5i8bzIy8zMxvvn4csWko6ODxYsXo6CgoNLuUyaEEMqedPLkSXz33Xe4ceMGgKJxJR999BE6duxYaYHVRLGxsXByckJMTAwcHR3VHQ4RERHVcMrmHieiTqDLxi4l9o/1HIsNAzdg3J5xiHoUhRPjTiic88GhDxCWGAZHM0d81umzEg/CWHlhpfQgjOb2zfF9z+/RxrFNue9jwIABeO211zB27Nhyn/MsSifAW7Zswfjx4/Haa6/Bx6doqY4zZ85g9+7d2LBhA0aMGFEpgdVETICJiIhIlWpK7rF69WosWLAAI0eORKtWrWBsbKxwXNlFGJROgJs2bYp33nkHH3zwgcL+pUuXYu3atVKvMJVUU34IiYiI6OVQU3IPLa2yR+1WZBEGpccA3717F/369Suxv3///oiMjFS2OiIiIiKiZ6rsRRiUXgbNyckJx44dQ4MGDRT2Hz16FE5OTkoHAACbgqKw5uRdJGbkoqmDGRb0b4bmThbPPS/qYSb6fH8aWloyhMzvoXBs//V4LDlyC7Ep2XCtZYxPezVBlyaPnzcthMCyI+HYdjEGadn5aO1iia8GesDV2vjpy1RKrERERERUce+99x6++OILWFlZvXBdSvcAz5w5E9OmTcPkyZOxefNmbN68GZMmTcL06dPx4YcfKh3A3mv/4qt9N/B+t4bYP7UD3BxMMeaX83iY8ewnlOQXyjHtt6vwci3ZCJejkzHtt6sY2toJB6Z1QPdmdnhn8yXcup8ulVl98i7Wn43CwoHu2DPFB4a6Ohiz7jxy8sv+FFHRWImIiIhIebGxsdK/f/31V2RkZAAAPDw8EBMTU+F6lU6AJ0+ejN9++w0hISGYPn06pk+fjtDQUGzfvh0TJ05UOoCfAyMxzNsJb7R2QkM7Uywc6AFDPW3suPTsm/ru8C3UtzFBHw+HEsfWnYlC50Y2mNi5PhrYmmJm98ZoVtscG4OiABT1/q47E4mpXRugezN7NHUww9KhnniQlovDYQ9K1PeisRIRERGR8po0aQJnZ2eMGDECOTk5UtIbFRWF/Pz8CtdboXWABw0ahMDAQCQlJSEpKQmBgYEYMGCA0vXkFcgRGpcKnwbWjwPSksGngTWuRD8CAMzccQ1D1wQpnHc24iEOhMTjiwHNSq33anSKQp0A0KmRDa5EpwAAYpKzkZieq1DGzEAXzZ0spDIVifVpubm5Cs/dTk9PL7UcEREREZX06NEj/P7772jVqhXkcjl69+6NRo0aITc3F4cOHcKDB2V3XD6LWh+EkZKVh0K5gLWJ4tNIbEz0kfjfsAJbM33UsTB8fE5mHj78/Rq+e90Tpga6pdabmJELaxO9p+rUk4YqJGbkSNcp67oVifVpfn5+MDc3l15PP4ebiIiIiMqWn58Pb29vzJw5E4aGhrh69SrWr18PbW1trFu3Dq6urmjcuLHS9ZZrEpyVlRXCw8NhbW0NS0tLyGSyMssmJycrHcSzfNKzicL2p7uuo3/zOmhTr1alXqcqzJo1CzNmzJC24+LimAQTERERlZOFhQWaN28OHx8f5OXlITs7Gz4+PtDR0cH27dtRp04dXLx4Uel6y5UAL1u2DKamptK/n5UAK8PSSA/aWrISk8gSM3JL9M4WO3snCUdvJGDt6bsAisbzygVQf/YB+A3ywBteTrAx0cfDjLyn6syTem9tTAyk69iaGShc183BrNJi1dfXV3jWdlpaWqnliIiIiKikuLg4BAUF4ezZsygoKECrVq3g5eWFvLw8XLlyBY6OjujQoYPS9ZYrAX7ysXPjxo1T+iJl0dPRgnsdc5yNeIgezewBAHK5wNmIJIxp71zqObvfbY9C+ePtI2H3sfrkXfwxuT3s/0tmWzhb4mzEQ7zZwVUqF3g7ES2dLQEATlaGsDHVx9mIJDSrbQ4ASM/JR3DMI4xqW/p1KxIrEREREVWctbU1+vXrh379+mH16tU4deoUbty4gTFjxuDDDz/E6NGj4e3tjZMnTypVr9JjgLW1tZGQkFBif1JSErS1tZWtDm91cMW2izHYeTkWEQnpmLMnFFl5BRjSqmhN4W8CbmLG9mCpfANbUzS2f/yyMzOATAY0tjeFuVHRmOAJPi44GZ6ItafuIiIhA8uOhCMkLhVj27kAKHpiyAQfV/xw/DaOhD3AzftpmLHjGuzM9NHdzU661oi157DxbFS5YyUiIiKiqmNubo433ngDurq6OH78OCIjI/Huu+8qXY/SD8Io68nJubm50NPTK/XYs/TzrI3kzDwsOxKOxPRcNK1tho0TvGFjWjR0ICEtF3GPspWqs5WzFVYMa4Elh29h8aFbcLE2wk+jW6OxvalUZlLnesjOK8CsXSFIy8mHl4slNo73hoHu4yQ+OikLyZmPh1I8L1YiIiIiqhrXr19HnTp1AADOzs7Q1dWFvb09hg4dqnRdMlFWRvuU77//HgDwwQcf4Msvv4SJiYl0rLCwEKdOnUJUVBSuXr2qdBCaoqY8j5uIiIheDsw9SlfuHuBly5YBKOoBXr16tcJwBz09Pbi4uGD16tWVHyERERERUSUqdwIcGRkJAOjSpQt27doFS0vLKguKiIiIiKiqKD0G+O+//66KOIiIiIiIVELpBBgoGk/y119/4d69e8jLU1xvd+nSpZUSWE3i7+8Pf3//Em1FRERERKqndAJ87Ngx9O/fH/Xq1cPNmzfh7u6OqKgoCCHQsmXLqojxpTdlyhRMmTJFGohOREREROqj9DrAs2bNwocffoiQkBAYGBjgjz/+QExMDDp37owhQ4ZURYxERERERJVG6QS4+OkbAKCjo4Ps7GyYmJjgiy++wDfffFPpARIRERERVSalE2BjY2NpLKuDgwPu3LkjHXv48GHlRUZEREREVAWUHgPctm1bBAYGomnTpujduzdmzpyJkJAQ7Nq1C23btq2KGImIiIiIKo3SCfDSpUuRkZEBAFiwYAEyMjKwfft2NGzYkCtAEBEREVG1p1QCXFhYiNjYWLzyyisAioZD8OlvRERERPQyUWoMsLa2Nrp3746UlJSqioeIiIiIqEopPQnO3d0dd+/erYpYiIiIiIiqnNIJ8FdffYUPP/wQ+/btQ3x8PNLS0hReVJK/vz/c3Nzg6+ur7lCIiIiINJ5MCCGUOUFL63HOLJPJpH8LISCTyVBYWFh50dUwxU+Ci4mJgaOjo7rDISIiohqOuUfplF4F4u+//66KOIiIiIiIVELpBLhz585VEQcRERERkUoonQCfOnXqmcc7depU4WCIiIiIiKqa0glwaRO5nhwLzDHARERERFSdKb0KREpKisIrISEBAQEB8PLywuHDh6siRiIiIiKiSqN0D7C5uXmJfa+++ir09PQwY8YMXL58uVICIyIiIiKqCkr3AJfFzs4Ot27dqqzqiIiIiIiqhNI9wNevX1fYFkIgPj4eixYtQvPmzSsrrhrF398f/v7+yMvLU3coRERERBqvQg/CkMlkePq0tm3bYt26dWjSpEmlBliTcDFqopdDoVzgQmQyEtJzYGtqAG9XK2hryZ5/IhFRNcPco3RK9wBHRkYqbGtpacHGxgYGBgaVFhQRkboEhMZjwd4wxKfmSPsczA0wr58bero7qDEyIiKqLEonwM7OzlURBxGR2gWExmPylit4+mux+6k5mLzlClaNaskkmIioBlBqEpxcLse6devQt29fuLu7w8PDA/3798emTZtKDIkgInqZFMoFFuwNK5H8ApD2LdgbhkI5f9cREb3syp0ACyHQv39/vPXWW4iLi4OHhweaNWuG6OhojBs3DoMGDarKOImIqtSFyGSFYQ9PEwDiU3NwITJZdUEREVGVKPcQiA0bNuDUqVM4duwYunTponDs+PHjGDhwIDZt2oQxY8ZUepBERFUtIb3s5Lci5YiIqPoqdw/wtm3bMHv27BLJLwB07doVn376KbZu3VqpwRERqYqtafkm8pa3HBERVV/lToCvX7+Onj17lnm8V69euHbtWqUERUSkat6uVnAwN0BZi53JULQahLerlSrDIiKiKlDuBDg5ORl2dnZlHrezs0NKSkqlBEVEpGraWjLM6+cGACWS4OLtef3cuB4wEVENUO4EuLCwEDo6ZQ8Z1tbWRkFBQaUEVdP4+/vDzc0Nvr6+6g6FiJ6hp7sDVo1qCXtzxWEO9uYGXAKNiKgGKfeT4LS0tNCrVy/o6+uXejw3NxcBAQEoLCys1ABrEj6NhejlwCfBEVFNwdyjdOVeBWLs2LHPLcMVIIioJtDWkqFd/VrqDoOIiKpIuRPg9evXV2UcREREREQqofSjkImIiEgRh80QvVyqRQK8KSgKa07eRWJGLpo6mGFB/2Zo7mRRatk7iRmYszsEEQkZSMspgJ2ZPgZ41sH73RpCV/vxnL791+Ox5MgtxKZkw7WWMT7t1QRdmthKx4UQWHYkHNsuxiAtOx+tXSzx1UAPuFobV1qsRERU8wWExmPB3jCFJwk6mBtgXj83TpwkqqbKvQpEVdl77V98te8G3u/WEPundoCbgynG/HIeDzNySy2vq6WF11o6YtOENjg+szM+79sMv128h2VHwqUyl6OTMe23qxja2gkHpnVA92Z2eGfzJdy6ny6VWX3yLtafjcLCge7YM8UHhro6GLPuPHLyy57Ep2ysRERUswWExmPylislHqN9PzUHk7dcQUBovJoiI6JnUXsC/HNgJIZ5O+GN1k5oaGeKhQM9YKinjR2XYkotX7eWEd5o7QS32mZwtDTCq252GNC8Di5GJUtl1p2JQudGNpjYuT4a2JpiZvfGaFbbHBuDogAU9f6uOxOJqV0boHszezR1MMPSoZ54kJaLw2EPKi1WIiKquQrlAgv2hqG0pZSK9y3YG4ZCebkWWyIiFVJrApxXIEdoXCp8GlhL+7S0ZPBpYI0r0Y8AADN3XMPQNUFl1hH1MBMnwxPRxvXxjO2r0SkKdQJAp0Y2uBJd9KCOmORsJKbnKpQxM9BFcycLqUxFYiUiIs1xITK5RM/vkwSA+NQcXIhMLrMMEamHWscAp2TloVAuYG2iuLawjYk+7iRmAgBszfRR2lLFr/14BqH/piGvQI7h3nUx49VG0rHEjFxYm+g9VaeeNFQhMSNHus7T100sYzhDeWJ9Wm5uLnJzH9eXnp5eajkiInr5JKSXnfxWpBwRqU61mAT3LJ/0bFLq/pUjWiIztwBh8WnwO3ATP52+i0md66s4umfz8/PDggUL1B0GERFVAVtTg+cXUqIcEamOWodAWBrpQVtLVmISWWJGbone2afVtjBEQztTDGheB5/0aozlR8OlcVY2Jvp4mJH3VJ15Uu+tjYmBdJ3yXrcisc6aNQupqanSKyws7Jn3RERELw9vVys4mBugrMXOZChaDcLb1UqVYRFROag1AdbT0YJ7HXOcjXgo7ZPLBc5GJKGls0W565HLgYJCAfl/QyVaOFsq1AkAgbcT0dLZEgDgZGUIG1N9nI1Iko6n5+QjOOaRVKYyYtXX14eZmZn0MjU1Lfc9ERFR9aatJcO8fm4AUCIJLt6e18+N6wETVUNqXwXirQ6u2HYxBjsvxyIiIR1z9oQiK68AQ1o5AQC+CbiJGduDpfJ7rsZh3/V/EZGQjntJWdh3/V98e+gm+r7iIK0DPMHHBSfDE7H21F1EJGRg2ZFwhMSlYmw7FwCATCbDBB9X/HD8No6EPcDN+2mYseMa7Mz00d3NTrrWiLXnsPFsVLljJSIizdLT3QGrRrWEvbniMAd7cwOsGtWS6wATVVNqHwPcz7M2kjPzsOxIOBLTc9G0thk2TvCGjWnRsIKEtFzEPcqWymtrybD65B1EJmZCAKhjYYgx7VzwZgdXqUwrZyusGNYCSw7fwuJDt+BibYSfRrdGY/vHPbCTOtdDdl4BZu0KQVpOPrxcLLFxvDcMdLWlMtFJWUjOfDyU4nmxEhGR5unp7oBX3ez5JDiqMfwv+GPx2cW4n3Efnvae+KHXD/Cu411q2fzCfPgF+mHjtY2IS4tDY+vG+KbbN+jZoKdUplBeiPkn5mNLyBbcz7iP2qa1Mc5zHOZ2mguZTD3vE5kobYkFqhKxsbFwcnJCTEwMHB0d1R0OERER1XDK5h7bQ7djzJ4xWN1nNdo4tsHyc8vxe9jvuPXeLdga25Yo/8mRT7AlZAvW9luLJtZNcCjiEGYcnoGzE86ihUMLAMDXp7/G0qCl2DhwI5rZNsOlfy9h/J/jsbDrQkxrM63S77k81D4EgoiIiIiqh6XnluLtlm9jfIvxcLNxw+q+q2Gka4R1V9eVWn7z9c2Y3WE2ejfsjXqW9TDZazJ6N+yNJUFLpDJnY85iQOMB6NOoD1wsXPC62+voXr87LsRdUNVtlcAEmIiIiIiQV5iHy/9eRrd63aR9WjItdKvXDUGxpT+ULLcwFwY6imPgDXUMEXgvUNpu79QexyKPITwpHABw7f41BN4LRK8GvargLspH7WOAiYiIiKhqpaenIy0tTdrW19eHvr7iHKaHWQ9RKAphZ2ynsN/O2A43H94std4e9Xtg6bml6OTcCfWt6uPY3WPYdWMXCkWhVObTDp8iLTcNTVY2gbaWNgrlhVjYdSFGvjKyEu9QOewBVgF/f3+4ubnB19dX3aEQERGRBnJzc4O5ubn08vPzq5R6V/RcgYZWDdHEvwn0vtTDewffw/jm46Ele5xi7vhnB7aGbMWvg3/FlXeuYOPAjfgu6DtsDN5YKTFUBHuAVWDKlCmYMmWKNBCdiIiISJXCwsJQp04dafvp3l8AsDayhrZMGw8yHyjsf5D5APYm9qXWa2Nsgz3D9iCnIAdJWUmobVobnx79FPUs60llPjryET71+RTD3IcBADzsPBCdGg2/QD+MbT62Mm5PaewBJiIiIqrhTE1NFR7OVVoCrKeth1a1W+HY3WPSPrmQ49jdY2jn2O6Z9RvoGKCOWR0UyAvwx40/MKDxAOlYVn6WQo8wAGjLtCEX8he8q4pjDzARERERAQBmtJ2BsXvGonXt1vCu443l55YjMz8T45uPBwCM2T0GdUzrwK9b0RCK87HnEZceh+b2zRGXFof5J+dDLuT42Odjqc5+jfph4emFqGteF81sm+Fq/FUsPbcUE5pPUMs9AkyAiYiIiOg/Q92HIjErEZ+f+Bz3M+6juX1zBIwMgJ1J0cS4e6n3FHpzcwpyMPf4XNxNuQsTPRP0btgbmwdthoWBhVTmh14/4LO/P8O7B95FQmYCapvWxsRWE/F5589VfXsSPghDhfggDCIiIlIl5h6l4xhgIiIiItIoTICJiIiISKNwDDCRBiuUC1yITEZCeg5sTQ3g7WoFbS2ZusMiIiKqUkyAiTRUQGg8FuwNQ3xqjrTPwdwA8/q5oae7gxojIyIiqlocAqECfBIcVTcBofGYvOWKQvILAPdTczB5yxUEhMarKTIiIqKqxwRYBaZMmYKwsDCcOHFC3aEQoVAusGBvGEpb/qV434K9YSiUc4EYIiKqmZgAE2mYC5HJJXp+nyQAxKfm4EJksuqCIiIiUiEmwEQaJiG97OS3IuWIiIheNkyAiTSMralBpZYjIiJ62TABJtIw3q5WcDA3QFmLnclQtBqEt6uVKsMiIiJSGSbARBpGW0uGef3cAKBEEly8Pa+fG9cDJiKiGosJMJEG6unugFWjWsLeXHGYg725AVaNasl1gImIqEbjgzCINFRPdwe86mbPJ8EREZHGYQJMpMG0tWRoV7+WusMgIiJSKQ6BUAE+CY6IiIio+mACrAJ8EhwRERFR9cEEmIiIiIg0ChNgIiIiItIoTICJiIiISKMwASYiIiIijcIEmIiIiIg0ChNgIiIiItIoTICJiIiISKMwAVYBPgiDiIiIqPpgAqwCfBAGERERUfXBBJiIiIiINAoTYCIiIiLSKEyAiYiIiEijMAEmIiIiIo2io+4AAGBTUBTWnLyLxIxcNHUww4L+zdDcyaLUskF3kvBLYCSuxT5CRk4BXKyNMbFTPQxsUUeh3P7r8Vhy5BZiU7LhWssYn/Zqgi5NbKXjQggsOxKObRdjkJadj9YulvhqoAdcrY0rLVYiIiIiqn7U3gO899q/+GrfDbzfrSH2T+0ANwdTjPnlPB5m5JZa/sq9FDR1MMXqUS0RML0jhrRyxIwdwTh244FU5nJ0Mqb9dhVDWzvhwLQO6N7MDu9svoRb99OlMqtP3sX6s1FYONAde6b4wFBXB2PWnUdOfmGlxUpERERE1Y/aE+CfAyMxzNsJb7R2QkM7Uywc6AFDPW3suBRTavkpXRpgZvfGaOVsBedaxpjQwRWdG9kgIPS+VGbdmSh0bmSDiZ3ro4GtKWZ2b4xmtc2xMSgKQFHv77ozkZjatQG6N7NHUwczLB3qiQdpuTgc9qDU61YkViKimqZQLhB0Jwl/Bsch6E4SCuVC3SERESlNrUMg8grkCI1Lxbu+9aV9Wloy+DSwxpXoRwCAmTuuITYlC9sntiuznvScAjSwNZG2r0an4M2O9RTKdGpkg8P/FCXJMcnZSEzPhU8Da+m4mYEumjtZ4Ep0Cvp71q5QrE/Lzc1Fbu7j3uH09PRSyxERvQwCQuOxYG8Y4lNzpH0O5gaY188NPd0d1BgZEZFy1NoDnJKVh0K5gLWJvsJ+GxN9JP43rMDWTB91LAzLrGPf9X9xPTYVQ1o7SfsSM3JhbaL3VJ160lCFxIwc6TplXbcisT7Nz88P5ubm0svNza3M+yAiqs4CQuMxecsVheQXAO6n5mDylisICI1XU2RERMpT+xCI5/mkZxMsHdq81GNn7zzER79fh99rHmhkZ6rawMph1qxZSE1NlV5hYWHqDomISGmFcoEFe8NQ2mCH4n0L9oZxOAQRvTTUmgBbGulBW0tWYhJZYkZuid7Zp527m4S3Nl7CZ33dMLiVo8IxGxN9PMzIe6rOPKn31sbEQLpOea9bkVj19fVhZmYmvUxNq1+STkT0PBcik0v0/D5JAIhPzcGFyGTVBUVE9ALUmgDr6WjBvY45zkY8lPbJ5QJnI5LQ0tmizPOC7iRhwoaL+LRXE4xoU7fE8RbOlgp1AkDg7US0dLYEADhZGcLGVB9nI5Kk4+k5+QiOeSSVqaxYiYhedgnpZSe/FSlHRKRuah8C8VYHV2y7GIOdl2MRkZCOOXtCkZVXgCGtisb0fhNwEzO2B0vlz955iAkbLmJcexf0dLdHQnoOEtJz8CjrcY/vBB8XnAxPxNpTdxGRkIFlR8IREpeKse1cAAAymQwTfFzxw/HbOBL2ADfvp2HGjmuwM9NHdzc7qZ4Ra89h49mocsdKRFQT2ZoaVGo5IiJ1U/uDMPp51kZyZh6WHQlHYnoumtY2w8YJ3rAxLRpWkJCWi7hH2VL5Py7HITu/ED+euIMfT9yR9rdxtZJWimjlbIUVw1pgyeFbWHzoFlysjfDT6NZobP94CMKkzvWQnVeAWbtCkJaTDy8XS2wc7w0DXW2pTHRSFpIzHyfWz4uViKgm8na1goO5Ae6n5pQ6DlgGwN7cAN6uVqoOjYioQmRCCM5aUJHY2Fg4OTkhJiYGjo6Ozz+BiKiaKF4FAoBCEiz777+rRrXkUmhE1RBzj9KpfQgEERFVfz3dHbBqVEvYmysOc7A3N2DyS0QvHbUPgSAiopdDT3cHvOpmjwuRyUhIz4GtadGwB20t2fNPJiKqRpgAExFRuWlrydCufi11h0FE9EI4BEIF/P394ebmBl9fX3WHQkRERKTxmACrwJQpUxAWFoYTJ06oOxQiIiIijccEmIiIiIg0ChNgIiIiItIoTICJiIiISKMwASYiIiIijcIEmIiIiIg0ChNgIiIiItIoTICJiIiISKMwASYiIiIijcIEWAX4JDgiIiKi6oMJsArwSXBERERE1QcTYCIiIiLSKEyAiYiIiEijMAEmIiIiIo3CBJiIiIiINAoTYCIiIiKS+F/wh8tyFxh8ZYA2P7fBhbgLZZbNL8zHFye/QP3v68PgKwN4rvZEQERAiXJxaXEYtWsUan1bC4YLDeGxygOX/r1UlbfxTDpquzIRERGRhiqUC1yITEZCeg5sTQ3g7WoFbS2ZusPC9tDtmHF4Blb3WY02jm2w/Nxy9NjSA7feuwVbY9sS5ecen4stIVuwtt9aNLFugkMRhzBo+yCcnXAWLRxaAABSslPgs84HXVy74ODIg7AxssHt5NuwNLBU9e1JZEIIobara5jY2Fg4OTkhJiYGjo6O6g6HiIiI1CAgNB4L9oYhPjVH2udgboB5/dzQ092hUq+lbO7R5uc28KrthZW9VwIA5EIOp2VOmOo9FZ92+LRE+dpLamNOxzmY4j1F2jd4x2AY6hhiy2tbAACfHv0UZ2LO4PT405V0Vy+OQyBUgA/CICIiIqAo+Z285YpC8gsA91NzMHnLFQSExqspMiCvMA+X/72MbvW6Sfu0ZFroVq8bgmKDSj0ntzAXBjoGCvsMdQwReC9Q2v7r1l9o7dAaQ34fAtvFtmixpgXWXl5bNTdRTkyAVYAPwiAiIqJCucCCvWEo7av34n0L9oahUF75X86np6cjLS1NeuXm5pYo8zDrIQpFIeyM7RT22xnb4X7G/VLr7VG/B5aeW4rbSbchF3IcuXMEu27sQnzG40T+bspdrLq0Cg2tGuLQqEOY3HoypgVMw8bgjZV7k0pgAkxERESkAhcik0v0/D5JAIhPzcGFyORKv7abmxvMzc2ll5+fX6XUu6LnCjS0aogm/k2g96Ue3jv4HsY3Hw8t2eMUUy7kaOnQEl//72u0cGiBd1q9g7dbvo3Vl1dXSgwVwUlwRERERCqQkF528luRcsoICwtDnTp1pG19ff0SZayNrKEt08aDzAcK+x9kPoC9iX2p9doY22DPsD3IKchBUlYSapvWxqdHP0U9y3pSGQdTB7jZuCmc19S6Kf648ceL3NILYQ8wERERkQrYmho8v5AS5ZRhamoKMzMz6VVaAqynrYdWtVvh2N1j0j65kOPY3WNo59jumfUb6BigjlkdFMgL8MeNPzCg8QDpmI+TD24l3VIoH54UDmdz5xe8q4pjAkxERESkAt6uVnAwN0BZi53JULQahLerlSrDUjCj7QysvbIWG4M34kbiDUzeNxmZ+ZkY33w8AGDM7jGYdXSWVP587HnsurELd1Pu4nT0afTc2hNyIcfHPh9LZT5o+wHOxZ7D16e/RkRyBH4N+RU/XfkJU7ymlLi+qnAIBBEREZEKaGvJMK+fGyZvuQIZoDAZrjgpntfPTa3rAQ91H4rErER8fuJz3M+4j+b2zREwMgB2JkUT4+6l3lMY35tTkIO5x+fibspdmOiZoHfD3tg8aDMsDCykMl51vLB76G7MOjYLX5z8Aq6WrljeYzlGvjJS1bcn4TrAKsR1gImIiKg6rwOsKdgDTERERKRCPd0d8KqbfbV8EpymYAJMREREpGLaWjK0q19L3WFoLE6CUwE+CY6IiIio+mACrAJ8EhwRERFR9cEEmIiIiIg0ChNgIiIiItIoTICJiIiISKOofRWITUFRWHPyLhIzctHUwQwL+jdDcyeLUsvm5Bdizu5QhMalIiIxA12b2GLtmNYlygXdScJX+8Nw+0EGHCwM8F6XBhjS2qnC1y22/3o8lhy5hdiUbLjWMsanvZqgSxPbit46EREREamBWnuA9177F1/tu4H3uzXE/qkd4OZgijG/nMfDjNxSy8uFgIGuFsb5uMCngXWpZWKSszBhw0W0q1cLB97vgAk+rvh0VwhOhidW+LoAcDk6GdN+u4qhrZ1wYFoHdG9mh3c2X8Kt++kv1ghEREREpFJqTYB/DozEMG8nvNHaCQ3tTLFwoAcM9bSx41JMqeWN9HSwcJAHhnvXhY2JfqlltpyPhpOVIeb2dUMDW1OMbe+CXu72+CUwssLXBYB1Z6LQuZENJnaujwa2ppjZvTGa1TbHxqCoF2oDIiIiIlIttSXAeQVyhMalKvTkamnJ4NPAGleiHwEAZu64hqFrgpSq92r0oxK9w50a2eBqdEq5r1t6vSml1nvlv3qJiIiI6OWgtjHAKVl5KJQLWD/Vk2tjoo87iZkAAFszfQghlKo3MSO31DrTcwuQk1+I1Oz851637Hr1njpH75nDJnJzc5Gb+/h4ejqHSxARERGpm9onwT3LJz2bqDuEF+Ln54cFCxaoOwwiIiIieoLahkBYGulBW0tWogc1MSO3zPG95WFjol9qnab6OjDQ1a7wdYvqzXvqnLwSPclPmjVrFlJTU6VXWFhYBe6IiIiIiCqT2hJgPR0tuNcxx9mIh9I+uVzgbEQSWjpbVLjeFs4WOBuRpLAv8PZDtHC2fKHrtnC2VDinqN5EtPyv3tLo6+vDzMxMepmamlbgjoiIiIioMql1FYi3Orhi28UY7Lwci4iEdMzZE4qsvAIMaVW0Zu83ATcxY3uwwjm3H6Tjn39TkZqdh/ScfPzzbyr++TdVOj6qjTPuJWfB78ANRCRkYHNQFPaHxOPNDq7lvi4AzNgejG8CbkrbE3xccDI8EWtP3UVEQgaWHQlHSFwqxrZzqZrGISIiIqIqodYxwP08ayM5Mw/LjoQjMT0XTWubYeMEb9iYFg0rSEjLRdyjbIVzxq2/qLCvz/eBAICoRX0AAE5WRlg3zgtf7gvD+jNRsDc3wKLXPNC5kU25rwsAcY+yIZPJpO1WzlZYMawFlhy+hcWHbsHF2gg/jW6Nxvbs1SUiIiJ6mciEssssUIXFxsbCyckJMTExcHR0VHc4REREVMMx9yidWodAEBERERGpGhNgIiIiItIoTICJiIiISKMwAVYBf39/uLm5wdfXV92hEBEREWk8JsAqMGXKFISFheHEiRPqDoWIiIhI4zEBJiIiIiKNotZ1gImIiKhmK5QLXIhMRkJ6DmxNDeDtagVtLdnzTySqQkyAiYiIqEoEhMZjwd4wxKfmSPsczA0wr58bero7qDEy0nQcAkFERESVLiA0HpO3XFFIfgHgfmoOJm+5goDQeDVFRsQEmIiIiCpZoVxgwd4wlPao2eJ9C/aGoVDOh9GSejABJiIiokp1ITK5RM/vkwSA+NQcXIhMVl1QRE9gAkxERESVKiG97OS3IuWIKhsTYCIiIqpUtqYGlVqOqLIxAVYBPgmOiIg0iberFRzMDVDWYmcyFK0G4e1qpcqwiCRMgFWAT4IjIiJNoq0lw7x+bgBQIgku3p7Xz43rAZPaMAEmIiKiStfT3QGrRrWEvbniMAd7cwOsGtWS6wCTWvFBGERERFQlero74FU3ez4JjqodJsBERERUZbS1ZGhXv5a6wyBSwCEQRERERKRRmAATERERkUZhAkxEREREGoUJMBERERFpFCbARERERKRRmACrAJ8ER0RERFR9MAFWAT4JjoiIiKj6YAJMRERERBqFCTARERERaRQ+CU6F5HI5ACA+Pl7NkRAREZEmKM45inMQKsIEWIUePHgAAPD29lZzJERERKRJHjx4gLp166o7jGpDJoQQ6g5CUxQUFODq1auws7ODllbVjD5JT0+Hm5sbwsLCYGpqWiXXeBmxXcrGtikd26VsbJvSsV3KxrYpnSraRS6X48GDB2jRogV0dNjvWYwJcA2TlpYGc3NzpKamwszMTN3hVBtsl7KxbUrHdikb26Z0bJeysW1Kx3ZRH06CIyIiIiKNwgSYiIiIiDQKE+AaRl9fH/PmzYO+vr66Q6lW2C5lY9uUju1SNrZN6dguZWPblI7toj4cA0xEREREGoU9wERERESkUZgAExEREZFGYQJMRERERBqFCTARERERaRQmwERERESkUZgAv2S4aEfp2C7PxzYqHdtFUXF7sF1IWXK5XN0hVBtPv3/YNtUPE+CXRPGbKSYmRs2RVC/F7RIXF6fmSKqf4ra5ceMGAEAmk6kznGqjuF3++ecfAGyXYsXtEhoaCoDt8qTitgkJCeEHgycUt8XZs2chhICWFlOKpwUGBgIA26Ya4v+Rl4RMJsOuXbvg6ekpJTRU1C47duxA3bp1cfv2bXWHU63IZDLs3bsX//vf/3Du3Dl1h1NtFLeLp6cnzp49q+5wqo0n26X4jzYVkclk+Ouvv+Dp6YmgoCD25v1HJpPhyJEj6NChA/bu3avucKoVmUyGo0ePolOnTvjzzz/VHQ6VQkfdAVD5xMXFYffu3Vi0aBGaNm2q7nCqjcTERJw+fRrff/89GjZsqO5wqgUhBGQyGWJiYvDbb79h3rx5aNu2rbrDqjZiYmJw+PBhrFy5Eu3bt1d3ONXGv//+i+vXr2PlypXo0KGDusOpVh4+fIjo6GgsX76cPzNPiIqKwqlTp/D999+jf//+6g6nWomMjMSNGzewYsUKDBgwQN3hUCnYA/wSuHz5MqZOnYqoqCh069aNvQ//uXz5Mvr164eLFy/C19eXX03+RyaT4fz585g9ezaio6PRuXNnABzTCQBXr17FO++8gzNnzsDLywsA2wUo+mq/e/fu2LRpE5o0aQKA7VIsJCQEDRo0wA8//ABXV1d1h1NthISEYMKECfjtt99Qv359ABznWuzWrVvo27cvFi1aBDs7OwBsm+qICfBL4PLlywgPD8f169eRm5sLLS0tvplQ9AlbW1sboaGh0NLSgkwmQ2FhobrDqhbi4uJw7tw5XLp0SRoaIpPJND6piYmJQXp6Om7cuIHY2FgAHOsKAJmZmWjcuDHu3buHBw8eqDucakVPTw/9+/fHvXv38OjRIwDg75n/WFpa4t9//8XFixcBgH+bntCpUydkZGQgJCQEANumWhJU7cjlciGEEJGRkSI3N1cIIcS2bduEm5ub6NGjh7h9+7ZCOU1RfL8xMTHSvn379glPT0/RsmVLER0dLYQQorCwUC3xVTeHDx8Wr7zyiujVq5c4e/astF+Tfm6K7zUiIkLad/z4cdGpUyfh7e0tTpw4oa7Q1Kq4XUJDQ8WtW7eEEEJcvXpVDBw4UDg5OYlDhw6pMzy1Km6bmzdvSr9rwsPDxYgRI4SBgYE4efKkEEJzfs886/fFrVu3xMiRI4Wbm5v45ZdfpP2a0jbFitvo2rVr4u7du0KIor/f7733nrC3txf+/v5SWU1rm+qMCXA1U/xG2r17t2jatKn46aefRHZ2thBCiHXr1olOnTqJoUOHijt37iiUr+mK7/PPP/8UHh4eYseOHdIvkj179ghfX1/RpUsXce/ePSGEEAUFBWqLVd3y8vKkfwcEBAgvLy8xfPhwce7cOTVGpXpP/szUr19f+Pv7S/sCAgJEz549Rffu3cWpU6fUGabKFbfBrl27RJ06dcS3334r/v33XyGEEOfPnxfDhw8XHh4e4vDhw+oMUy2e/P3r7Ows/P39RVJSkhCiKNkbNWqUqFWrlvj777+FEDU/mSm+v/z8fIX9T25HRUWJUaNGifbt24v169dL+zXtb9Pu3buFg4OD+Prrr0VycrIQQojbt2+L999/XzRu3FisWrWqxDmkXkyAq6EDBw4IQ0ND8cMPPyj0XAkhxM8//yw6deokRo4cKcLDw9UUoXrs2bNHGBsbi2+//VbqtSr2559/ik6dOolu3bqJyMhI9QSoBk/+Ii0sLJT+MMXExIidO3cKIYraxsvLS4waNUqcPn1aLXGqy549e4SRkZH44YcfxM2bNxWOBQQEiB49eojevXuLY8eOqSlC9Th27JgwNjYWq1evFgkJCQrHgoKCxPDhw0Xz5s3F/v371RSh+uzbt08YGxuLH374QcTHxysci4qKEiNGjBB2dnY1/gPCzz//LJo2bSp9C1n8u6W4cyE6OlrMmzdPFBQUiH/++UeMGjVKdOrUSSHR0xT79+8XRkZGYs2aNeL+/fsKx6KiosS0adOEm5ubWLZsmXoCpFIxAa5msrOzRd++fcWHH36osP/JXr0NGzYIDw8PMWHCBIX9NVlCQoJo3ry5+Pbbb4UQRb+Ms7KyxN69e6Xe8IMHD4rmzZuLfv36ifz8/Br5Kbu4RyYzM1Pad+rUKakNhCj6hWtpaSnmzp0r7fvrr79Ew4YNxVtvvSV9o1DTJScniw4dOgg/Pz8hhBC5ubkiJSVFbN68Wdy4cUMIUTQcol27dmLw4MEiKytLneGqRPF7YuLEiWLMmDEKx57s1bt06ZLo06ePaN++vcjMzKyR76XSZGRkiFdffVV8+umnQoii38dxcXFi5cqV4q+//hLZ2dkiPj5eDBgwQNSrV09kZWXVyLaRy+Vi//79olmzZqJjx45SElz838jISGFrayumT58u/U4KCwsTAwYMED169BCPHj1SW+yqlpubK15//XXpb3ZWVpa4c+eOWLhwodixY4d48OCBiI+PF2+++abw8vISKSkp6g2YJEyAq5n09HTRuHFjsXbtWiFEya/yixOfzZs3i6ioKJXHpy737t0TjRo1En///be4f/+++OKLL0Tnzp2Fjo6OaNOmjdi7d68QoijRq+ntEhcXJxo2bCjCwsLEjh07hIGBgThy5IgQQoiHDx8KCwsLMXHixBJfzx44cEAan6YJ4uPjRb169cQff/wh0tLSxNy5c0XHjh2Fvr6+qFevntizZ48QQohDhw5JQ2c0gVwuFx07dhTTp08XQpT8Gr/4/XP58mURGxur8vjUKSsrS3Ts2FEsWrRI3Lp1S8ycOVN07dpVWFhYiBYtWog5c+YIIYqGQ8TFxak52qpVUFAgjh49Kjw9PUW7du2k5DcpKUnUqlVLvPXWWyWS/5s3b9b4dnlaVlaWaNOmjZg+fbq4c+eOmDp1qujSpYtwcHAQTZo0EZ988okQomgc+dO9w6ReTICrofbt2yv0zhQnwaGhocLf37/EeKyaqPgXa1RUlEhPTxdCCNGuXTvh6uoqbGxsxKBBg8Ty5ctFdHS0cHd3F7NmzVJnuCqVm5srBg8eLKytrYWWlpbYuHGjdOzevXti48aNJYZGaKrx48cLExMTYW1tLQYOHChWrlwphCj6WRo3bpyao1OfCRMmCA8PD5GamiqEePw7JiYmRixYsEBjPigVv0/++ecf6VuBDz74QNja2goTExMxePBgsX79epGZmSlGjRolhg8frs5wVa6goEAcOXKkRBIcEBCg8DumJvaCP+1Z9/jTTz8JAwMDYW5uLgYPHiw2bdokhBBi6tSponv37qoKkZTEZdDUSPy3JFVubi5ycnIAFK0V2LdvX4SEhMDf3x8AoK2tDQDYtGkT1q9fj7S0NPUErCLivwc57NmzB7169cK2bdsgl8tx6tQpTJs2DYsWLcL69esxZcoU1K1bF82aNYOuri5E0Qc6dYdf5fT09DB27FgkJSXB1NQUr7zyinTMyckJY8aMUVjaSxMfwVlQUAAAWLlyJTZt2oRly5Zhy5YtmDhxIgCgcePGsLe3r/HLWRW/H5KSkhSWNxs2bBh0dHTwwQcfID09Xfods3r1amzZsgUGBgZqiVeVin/P7N69G927d8dff/2Fhw8fYunSpdiyZQt27tyJnTt3YvTo0TAyMoKRkRH09fWRn5+vEb9ngKK/PZ07d8bixYuRlZUFX19f5OXloUePHgpLetX0pQTlcjlkMpn0e6VYfn4+AODtt9/G1atXsXv3buzcuRMjRoyQytSqVUv6+07VjBqTbxJFX9n37dtXdOrUSWzevFkIIURKSooYO3asaNWqlRg8eLD4+uuvxfDhw4WZmZkIDg5Wc8Sq8ayJgMXS09PF7NmzhZWVVYlJcTVdYmKi2LFjhxg+fLiwtrYuc3KbpvXMPDkRMC4uTpoIWOzBgwdi7ty5wsLCQoSFhak0TnXZtWuXaNGihXB2dhbTpk2TllFcuXKlaNOmjWjUqJEYPXq06NWrl7CwsBBXr15Vb8Aq9KzJgMViY2PF7Nmzhbm5uQgNDVVxhKpV/F5KTEwUGRkZIjExUQhR9K3T4cOHhaenp2jbtm2JiXE1WXknAxZ/myJE0VCQ2bNnCzMzMxESEqL6oKlcmACr0dmzZ4WFhYWYNGmSGDVqlNDS0hIzZswQBQUFIjU1VaxatUp0795dtG3bVgwdOlRj3khlTQR8cjz0gQMHRK9evYSLi4u4cuWKqkNUueI/TElJSdKSVUIUJXyDBg0S1tbWCmv9bt26tcZ+ja3MRMDPPvtM2nfixAkxcOBAUa9ePY1J8kJDQ4WTk5P44osvxPLly4W9vb3o06ePdP/nz58XM2fOFK+//rqYOXOmNAygpnvWZMAnf8+cPn1adOrUSTRp0qTG/8wUt8m+fftEp06dxCuvvCJ8fHxEQECAEKJoInZxEtyxY0eRk5OjznBVoryTAT/44APpnCtXroh+/foJNze3Gv8z87JjAqxiT/ZWHTp0SHzxxRfS9o4dO4RMJhPTp09X+OOem5urEZ+0iz1vImBSUpKIi4sTK1askHqzNMGuXbtE27ZthbOzs5g5c6a4fPmyEKLoZ+q1114TtWrVEj///LN4//33hZmZWY1um/JOBHzy/RYVFSW2bNmikCjXNHK5XOGew8PDFf44h4aGiqZNm4o+ffqICxcuqCPEauN5kwGLl1P8888/NWZpxb/++ksYGxuLRYsWiT///FO8+eabQltbW+zatUsIUZQEHz16VNStW1djxrYqOxkwLy9PnD59WqMm1r6smACrUPGb5MKFC2Lr1q1iwoQJ0rJexYqT4I8++kihp0/TlDURMCQkRKxZs0ajlqwSQoiLFy8KGxsb8dlnn4mFCxcKZ2dnMWjQIIX1a8eMGSMaNWokPD09peS4plJ2IqCmKL7nv//+W8ydO1cMHTpUvPPOOwplrl+/Lpo0aSIGDhyocesfP42TAR+LjIwUHTt2FN9//70QouhDpouLi2jcuLHQ0tISO3bsEEIUvff+/vvvGv1B8mnlnQxILxcmwCr2559/Ci0tLdGyZUshk8lE586dS4wr27lzp5DJZGLu3Lk1fgZ/8S+PnJwcaX3awsJC8fXXX4sWLVpIs/aLffzxx6JVq1bS05lqot9++03hq+iIiAixePFi8eWXX0r7Ll68KFq1aiUGDBigkMTcuXNHY9aZ/Ouvv4RMJhPm5ub8qvEJAQEBQiaTie7duwt9fX3h6Ogofv/9d4UyISEhws7OTgwfPlyjPkw+fPhQYSmqw4cPixYtWogJEyaItLQ0af+cOXNEw4YNNaoT4u7du2LWrFkiOTlZxMXFicaNG4u3335b3L9/X/Ts2VMYGBiIX3/9Vd1hqs2TQ0CeTII1+amjLzsmwCpQ/Mv33r17YuTIkeKnn34SGRkZ4vfffxcODg5iypQpJcbe7dmzR/zzzz/qCFflOBHwsZiYGNGhQwfp67Pk5GRRp04dYWhoKKZOnapQ9vz586Jly5Zi8ODB4sCBA+oIV604EbCkyMhIMXfuXLF69WohRFGi26VLF9G7d29p3eNi//zzT5kTTGsiTgZUVPy+iI6Olh6oVPzh4MMPPxT9+vWTPhRMnTpVWFlZCSsrK5Gamlrj31OcDKgZmACryPnz58Xo0aNF165dFcaTbd++XdSpU0dMnjy5xKNaNQEnApZU3CN3/fp1kZycLIKCgkTdunVFhw4dSvxRvnjxonB1dRUjR45UGDdeE3Ei4LNdv35ddOnSRbi5uYmTJ09K+4ODg0XXrl1Fjx49xJ9//qnGCNWHkwEVFb+X9uzZI9q0aSO+++476dvGgoIC0bNnT4UP3FOnThXbtm0TycnJaolXlTgZUHMwAVaRP/74Q9SvX1+YmJiIgwcPKhzbsWOHcHFxEaNHjxbh4eFqilB1OBHw+VJTU4WHh4cYPny4SEpKEkFBQcLJyUmMGzdOXL9+XaHs5cuXNSbR40TAsoWEhIjXXntNmJqaikWLFikcu3btmujRo4do27at2L9/v5oiVB1OBny+vXv3Cn19feHv719iScDZs2cLY2Nj8f3334u3335b2NraatR7iZMBNQMTYBU6fPiwaN68uRg4cKAICgpSOLZlyxbRrFkzER8fr6boVIMTAcvv4sWLonXr1mLChAkiOTlZBAYGSkmwJvSEC8GJgKV51tfPt27dEiNHjhTNmzcX69evVzh2+fJlMWDAABEdHV3FEaofJwM+W2pqqujevbuYP3++wv7i8axRUVFi4sSJolGjRsLHx6fGDwd5EicDag4mwCpQPL5KCCEOHjwovLy8xPDhw8W5c+cUyj05CaMm40TA8rty5Ypo3ry5QhJcr149MXjw4Bo9RpwTAUtX/F54+tuQJ7cjIyPFqFGjRPv27UskwcVjFjUBJwOWLSEhQdStW1f89NNPpR4v/gARHx+vMX+XinEyoOZgAlzJynoqVUxMjPRUqj///FN4eXmJUaNGKUzcqckTCzgRsOKeTIJTUlLE33//Ldzd3UVcXJy6Q6sSnAhYuvI+kaqgoED8888/YtSoUaJTp05i1apVaotZXTgZUFHx79+rV6+Ke/fuidTUVNGqVSuxePHiEmUvXrwovv32W40ZcsbJgJqLCfALUuapVHPnzpX2/fXXX6Jhw4birbfekpb/quk4EbDirly5Ilq3bi3eeOMN8ejRoxrfW8WJgIrK+0Sq6dOnS7+TwsLCxIABA0SPHj3Eo0eP1Ba7qnEyoKLiJG337t2idu3a0t+hSZMmSRNHn0zkZs+eLbp166ZRE944GVAzMQGuBOV9KtXTX+UfOHBAYyYvCcGJgC/qwoULolOnThozLpoTARUp+0QqIYS4efNmjf2moCycDFjSvn37hKGhoVi7dq2IiYmR9r/++uvCxsZGzJs3TyxatEi8/fbbwtTUVFy7dk2N0aoWJwNqLibAlUDZp1Jp8phWTgR8MZrybUExTgRUVN4nUmnCV7OcDFg+2dnZYsiQIWL27NlCiKJvK8PDw8V3330nDh8+LF5//XXRr18/4e7uLgYNGlTiw2VNxsmAmo0JcCXhU6mejRMBqaI0dSJgWfhEKk4GVEZWVpZo3bq1mDp1qkhKShLvvfee6NSpk7C3txfOzs7iu+++E1lZWSItLa3GD616GicDajYtUKVo164dtm/fjt69e+PVV19FYGBgqeWEECqOTPWevEe5XI6CggLo6uoiNjYWf/zxB3r27Im5c+ciIiICK1euVGgrExMTdYRM1ViLFi2wbt06XLlyBR9++CGaNWuGX375Bbdu3YKFhYW6w6tSxe+lhw8fIjMzEw8fPoSuri46d+6MxYsXIysrC507d0ZeXh60tbVRUFCg5oir3i+//AJ3d3fk5eVBR0dHuufCwkLo6Ojg3r17mD9/PpycnDBr1izUq1cP69evx+rVq6U69PT01BW+yhkaGmLq1Kn4+eef4erqiri4OLz55puIj4/HgAEDsH//fujq6sLU1BSGhobqDrdKFb+fgoODERMTA319fdjY2CA1NbVE2UuXLuG7775DQUEB7O3tYWpqqupwqYoxAa6g4jdScnIy4uPjYW1tjSFDhmDLli3o2LEjBg0ahKCgIKn8r7/+isjISMhkMnWFXGXkcjkAICsrCwAgk8lw+vRp3L17F1paWtDR0UF0dDReeeUVBAcHAwD69++Pzz77DOfPn8fGjRuRk5MjnUv0tOIk+Pr165g4cSJatGiBCxcuoHbt2uoOrcoIISCTybB//34MHjwY7du3x8CBA3Ho0CHo6enB19cXixcvRnZ2Nrp164bc3Fzo6OioO+wqJYSAg4MDtLS00K1bNykJLv4AEBUVBS8vL6SmpkImk8HNzQ2zZ8+GpaUl9uzZU2qiownGjBmDS5cuYefOndi1axdGjRoFoOhDg5OTEwoLC9UcYdUrfj/t2bMHffr0wU8//QQzMzN4eXnhm2++QVBQkELnze7du3H48GGkp6erMWqqUmrre64B+FSqxzgRkFRB0yYC8olUJXEy4Iu7ceOGmD17tjA3N9eosfScDEhPYgKsBD6VqmycCEiqoikTAflEqrJxMmDFXbp0SQwfPlw0bdpUBAcHqzscleFkQHqaTAgNGJT6grZv3w5PT080adIEAHDnzh3s3r0bOTk5mDt3LoCi8UKTJk2Co6Mjpk2bhq5duwIA7t69Cysrqxo/VhEA9u7diwEDBsDMzAwnTpxA8+bN1R0S0UsrMjISa9euxUcffYTs7Gx07doVnTp1wpdffolx48bhxIkTWLduHYYPH67uUNUiPz8fJ06cwEcffQQjIyOcOHECenp6KCwshLa2trrDq7ays7Nx6dIluLi4wMnJSd3hqEx2djY6deqEdu3aYf78+Zg3bx6uX7+O8PBw6OvrY+rUqXj33XdRUFAAHR2dGj8emjgG+LliY2OxcuVKGBsbAwBSUlLQuXNnfP7550hISJDKtW7dGj/++CNiYmLw448/4uDBgwCAevXqaUTyC3AiINGLKH5f3Lt3D/n5+XB1dcX7778PS0tLLFu2DI0aNcKSJUtgZ2eHhg0bwsjICO+99x7S0tJq/HtKcDJgpTE0NETHjh01KvkFOBmQSmIC/ByOjo44fPgwnJycEBISAgDYuXMnbGxscPXqVWlSFwB4e3tjzZr/t3fvMVXX/x/Anwcw4hww9HA5pxJpHbwQBxTZ2pibECk4bLgGNGYcFWcFjmLJsg02uxGjgCVpmqJBxCAslk4mpoEk5OQWBgQ4CQoZqGWOEM4Bznn//vDrp85PcXLziOf52Nz83N6f1+c49Xk+e794f47GxkYUFhZKTWEPK8FGQKJpIf7XoHPkyBFER0cjJycHJpMJ7u7uMBqNaGlpgaenp1kn+p49e3Dx4kXMnTv3of47JdgMSNOEzYBkxmKTL2YZrkp1Z2wEJJoeXJFqfGwGpJlgrc2AdBMD8ARwVSo2AhLNBK5INT42A9JMsNZmQPoXm+Am6Oeff0ZcXBz8/f2RmZmJX3/9FTqdDsuXL8d7770Hb29vS5c4I9gISDRzrl69ioCAAKSmpmLr1q23HRf/mwbQ398PhUJhVT+Un82ANBOstRmQ/sU5wBNkjatSsRGQaHoJrkg1LsFmQLoPrLUZkP7FADwJ1rYqFRsBiaaP4IpU4xJsBiSi+4RTIKagrq4OycnJKC4uhlqttnQ5M25gYAArV66Ej48Pdu/ejQsXLiA6OhohISF48803odVqpXMbGxsxb948PPXUUxasmOjBVFZWhqioKOTk5CAsLAxPPvkkACAqKgpVVVVISEiAg4MDOjs7UVxcjOrqavj6+lq46vvj2LFjiIyMRHZ2NoKDg7F06VLpWEpKCnbt2oX09HQ0NzfjyJEjqKmpgUajsWDFRDQbMQBPkV6vx6OPPmrpMu6b+vp6xMfHw9fXV5oDHRMTg5CQEGzfvh0+Pj6WLpHogabX66HT6eDl5YW0tDQMDQ2ht7cXR48eha+vL/bv3w+DwYCuri54eXnh3XffNfty+TAbGBhAVFQUAgMDsXPnTmn/rcUtfv/9d6Snp6OyshKurq7YvXs3F9whoknhD0ucImsKv8DNeb779+9HXFwckpOTkZmZiaKiIuh0Ovzzzz8PdSMg0XQQQqCrqwsqlQrXrl3jilT/YTAY0N7ejsjISLP9t1Z28/DwwL59+6yyGZCIphfnANOEWWMjINF04YpU/2IzIBFZCgMwTYq1NQISTSeuSMVmQCKyLM4BpimxtkZAopnQ3t6OgoIC7NmzB9XV1VYzl57NgERkKQzANGXW1ghINJ0aGhqQlZWFpqYmFBUVwc/Pz9Il3RdsBiQiS2ITHE0Zwy/R5Hl7eyM+Pt7qVqRiMyARWRLfABMRkUV8+eWXeO211zBnzhyEhIRg/fr10Ol0eOONN9Dc3Izvv/8ednZ8T0NE04//shARkUXodDoEBASgt7cXq1evhslkAmDeDMgATEQzgW+AiYjogWCtzYBEdP/xqzUREVncf5sBq6qqGH6JaEbxDTAREVnc8PAw6uvrra4ZkIgsgwGYiIiIiKwKV4IjIiIiIqvCAExEREREVoUBmIiIiIisCgMwEREREVkVBmAiIiIisioMwERERERkVRiAiYim4PTp05DJZLh+/bqlS5Fs2rQJ69evt3QZREQPLAZgIpqVNm3aBJlMJv1SKpUICwvDL7/8YunSiIjoAccATESzVlhYGPr6+tDX14cffvgBdnZ2WLdunaXLshij0QiTyWTpMoiIHngMwEQ0a9nb20OlUkGlUmHZsmV4++230dPTg6tXr0rn9PT0IDo6Gs7Ozpg/fz4iIiLQ3d0tHb81XSAzMxNqtRpKpRLbtm3D6OiodI7BYMCOHTuwYMEC2NvbQ6PR4ODBg2a1NDQ0ICAgAHK5HIGBgejo6JCOvfPOO1i2bBkOHToEDw8PODo6IiEhAUajER999BFUKhXc3NyQlpZmNmZ2dja0Wi0UCgUWLFiAhIQEDA4OSsfz8vLg7OyMo0ePwtvbG/b29vjjjz9u+5zq6urg6uqKjIyMO36O3d3dkMlkKC0tRXBwMORyOfz8/HD27FnpnL/++gsxMTF44oknIJfLodVqUVRUZDZOUFAQEhMTkZSUhHnz5sHd3R0HDhzAjRs3sHnzZjg5OUGj0eD48eNm17W0tGDt2rVwdHSEu7s7YmNj8eeff96xViKi6cAATEQPhcHBQXz11VfQaDRQKpUAgNHRUYSGhsLJyQlnzpxBTU0NHB0dERYWhpGREenayspKdHZ2orKyEvn5+cjLy0NeXp50XKfToaioCDk5OWhra8Pnn38OR0dHs/unpKQgKysL9fX1sLOzQ1xcnNnxzs5OHD9+HOXl5SgqKsLBgwcRHh6OS5cuoaqqChkZGUhNTcW5c+eka2xsbJCTk4PW1lbk5+ejoqICb731ltm4Q0NDyMjIQG5uLlpbW+Hm5mZ2vKKiAqtXr0ZaWhp27Nhx188wJSUFycnJaGpqwqJFixATE4OxsTEAgF6vx4oVK1BWVoaWlha88soriI2NRW1trdkY+fn5cHFxQW1tLRITExEfH4+oqCgEBgaisbERa9asQWxsLIaGhgAA169fx3PPPYfly5ejvr4e5eXluHz5MqKjo+9aKxHRlAgiollo48aNwtbWVigUCqFQKAQAoVarRUNDg3ROQUGBWLx4sTCZTNI+g8EgHBwcxIkTJ6RxFi5cKMbGxqRzoqKixEsvvSSEEKKjo0MAECdPnrxjHZWVlQKAOHXqlLSvrKxMABDDw8NCCCF27twp5HK5GBgYkM4JDQ0Vnp6ewmg0SvsWL14s0tPTx33mw4cPC6VSKW1/8cUXAoBoamq67bOJiIgQpaWlwtHRURQXF487phBCdHV1CQAiNzdX2tfa2ioAiLa2tnGvCw8PF9u3b5e2V61aJVauXCltj42NCYVCIWJjY6V9fX19AoA4e/asEEKI999/X6xZs8Zs3J6eHgFAdHR03LVuIqLJsrNY8iYimqLg4GDs3bsXAPD333/js88+w9q1a1FbW4uFCxfi/PnzuHjxIpycnMyu0+v16OzslLafeeYZ2NraSttqtRrNzc0AgKamJtja2mLVqlV3rcXX19fsegC4cuUKPDw8AACenp5mdbi7u8PW1hY2NjZm+65cuSJtnzp1Cunp6Whvb8fAwADGxsag1+sxNDQEuVwOAHjkkUfM7n3LuXPncOzYMXzzzTf3/BMhxnuGJUuWwGg04sMPP0RJSQl6e3sxMjICg8Eg1XGnMWxtbaFUKqHVas2e8da4AHD+/HlUVlbe9kYduPnWfNGiRfdUOxHRRDAAE9GspVAooNFopO3c3Fw89thjOHDgAD744AMMDg5ixYoVKCwsvO1aV1dX6fdz5swxOyaTyaRmMgcHh3uq5b9jyGQyADBrSLvTPe523+7ubqxbtw7x8fFIS0vD/PnzUV1djS1btmBkZEQKng4ODtL9/uvpp5+GUqnEoUOHEB4eftu9JvoMH3/8MXbt2oVPPvlEmpeclJRkNpXkXp7z/487ODiIF1544Y7zk2+FcCKi6cYATEQPDZlMBhsbGwwPDwMA/P398fXXX8PNzQ1z586d1JharRYmkwlVVVV4/vnnp7Pcu2poaIDJZEJWVpb0lrikpOSer3dxcUFpaSmCgoIQHR2NkpKSewrB46mpqUFERARefvllADcD7IULF+Dt7T3pMYGbf0bffvstPD09YWfH/5KI6P5gExwRzVoGgwH9/f3o7+9HW1sbEhMTpTeKALBhwwa4uLggIiICZ86cQVdXF06fPo3XX38dly5duqd7eHp6YuPGjYiLi8N3330njTGRMDoZGo0Go6Oj+PTTT/Hbb7+hoKAA+/btm9AYbm5uqKioQHt7u1lD22R4eXnh5MmT+Omnn9DW1oZXX30Vly9fnvR4t2zbtg3Xrl1DTEwM6urq0NnZiRMnTmDz5s0wGo1THp+I6E4YgIlo1iovL4darYZarcazzz6Luro6HD58GEFBQQAAuVyOH3/8ER4eHnjxxRexdOlSbNmyBXq9fkJvhPfu3YvIyEgkJCRgyZIl2Lp1K27cuDFDT3WTn58fsrOzkZGRAR8fHxQWFiI9PX3C46hUKlRUVKC5uRkbNmyYdKhMTU2Fv78/QkNDERQUBJVKNS2rzT3++OOoqamB0WjEmjVroNVqkZSUBGdnZ7P50URE00kmhBCWLoKIiIiI6H7h12siIiIisioMwERERERkVRiAiYiIiMiqMAATERERkVVhACYiIiIiq8IATERERERWhQGYiIiIiKwKAzARERERWRUGYCIiIiKyKgzARERERGRVGICJiIiIyKowABMRERGRVfk/9gF1TkW5uSAAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from math import floor\n", + "import matplotlib.pyplot as plt\n", + "from matplotlib.ticker import AutoMinorLocator\n", + "\n", + "\n", + "def format_ms(ms: float):\n", + " return f\"{floor(ms / 1000)}:{ms % 1000}\"\n", + "\n", + "\n", + "fig, ax = plt.subplots(figsize=(7, 5))\n", + "\n", + "ax_sc = ax.scatter(\n", + " range(len(results_list)),\n", + " [result[\"run\"][1] for (_, result) in results_list],\n", + " label=\"mean run duration\",\n", + ")\n", + "_ = ax.set_xticks(\n", + " range(len(results_list)),\n", + " [result_name for (result_name, _) in results_list],\n", + " rotation=45,\n", + " ha=\"right\",\n", + ")\n", + "ax.tick_params(axis=\"y\", labelcolor=ax_sc.get_facecolors())\n", + "ax.yaxis.set_major_formatter(lambda x, _: format_ms(x))\n", + "ax.yaxis.set_minor_locator(AutoMinorLocator())\n", + "ax.set_ylabel(\"Duration (s:ms)\")\n", + "ax.set_xlabel(\"Benchmark name\")\n", + "\n", + "ax2 = ax.twinx()\n", + "ax2_sc = ax2.scatter(\n", + " range(len(results_list)),\n", + " [result[\"run\"][0] for (_, result) in results_list],\n", + " s=15,\n", + " color=\"green\",\n", + " label=\"#run\",\n", + ")\n", + "ax2.tick_params(axis=\"y\", labelcolor=ax2_sc.get_facecolors())\n", + "ax2.set_ylabel(\"#run\")\n", + "\n", + "_ = fig.legend(\n", + " loc=\"upper right\",\n", + " # https://stackoverflow.com/a/47370214\n", + " bbox_to_anchor=(1, 1),\n", + " bbox_transform=ax.transAxes,\n", + ")\n", + "_ = ax.set_title(\"Benchmarks of running RAPTOR\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.5" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From c30025c78fd01d1eae4ed173b1fce4dc1151bd90 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Wed, 23 Jul 2025 17:22:36 +0200 Subject: [PATCH 235/251] =?UTF-8?q?=F0=9F=90=9B=20Bench=20folders?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bench/bench.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/bench/bench.sh b/bench/bench.sh index 08547b9f..382796f9 100644 --- a/bench/bench.sh +++ b/bench/bench.sh @@ -1,6 +1,6 @@ #!/bin/sh -RESULTS_FOLDER="results/" +RESULTS_FOLDER="$(dirname "$(realpath "$0")")/results" TIMES=1 while getopts 'gct:d:' ARG; do @@ -14,13 +14,13 @@ while getopts 'gct:d:' ARG; do ;; t) TIMES="$OPTARG" - echo "$TIMES" | grep -E '^[0-9]+$' || { + echo "$TIMES" | grep -E '^[0-9]+$' >/dev/null || { echo "Invalid times to run: $TIMES" exit 1 } ;; d) - echo "$OPTARG" | grep -E '^[0-9]+$' || { + echo "$OPTARG" | grep -E '^[0-9]+$' >/dev/null || { echo "Invalid run transfer max len: $OPTARG" exit 1 } @@ -38,7 +38,7 @@ shift $((OPTIND - 1)) echo "Running $TIMES time(s)" pnpm run build -mkdir bench 2>/dev/null || true +mkdir "$RESULTS_FOLDER" 2>/dev/null || true if [ -n "$GLOBAL" ]; then for DTYPE in \ From 524cc474e8a0bc70a87369fb3365f88d30174a19 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Wed, 23 Jul 2025 17:24:25 +0200 Subject: [PATCH 236/251] =?UTF-8?q?=E2=9C=A8=20Execution=20trace=20for=20b?= =?UTF-8?q?enchs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/McRAPTOR.ts | 5 +++++ src/base.ts | 25 ++++++++++++++++++++++++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/McRAPTOR.ts b/src/McRAPTOR.ts index a7f87635..6ae15188 100644 --- a/src/McRAPTOR.ts +++ b/src/McRAPTOR.ts @@ -139,6 +139,7 @@ export default class McRAPTOR Bpi.values().some((jsPi) => (jsPi.compare(jsPt) ?? 1) > 0))) ) this.marked.add(pi); + this.trace(`added ${added}, new sz=${this.bags[this.k].get(pi)!.size}`); // Step 3: populating route bag with previous round & update // Update current route bag with possible new earliest catchable trips thanks to this round @@ -153,9 +154,13 @@ export default class McRAPTOR): void { + if (stop.transfers.length) this.trace("fp b sz", this.bags[this.k].get(stopId)!.size); + for (const pJourneyStep of this.bags[this.k].get(stopId)!) { // Prevent chaining transfers if ("transfer" in pJourneyStep) continue; diff --git a/src/base.ts b/src/base.ts index 1f8c7501..babe21ee 100644 --- a/src/base.ts +++ b/src/base.ts @@ -21,11 +21,17 @@ export default class BaseRAPTOR(); + protected runBeginTs = 0; + /** * @description Creates a new RAPTOR instance for a defined network. */ constructor(protected readonly data: IRAPTORData) {} + protected trace(msg: string, ...args: unknown[]) { + console.log(`[${performance.now() - this.runBeginTs}] ${msg}`, ...args); + } + /** * Getter on stops from {@link data} */ @@ -83,6 +89,7 @@ export default class BaseRAPTOR) { + this.trace("begin mark"); Q.clear(); for (const p of this.marked) { const connectedRoutes = this.stops.get(p)!.connectedRoutes; @@ -94,6 +101,7 @@ export default class BaseRAPTOR */ const Q = new Map(); for (this.k = 1; this.k < rounds; this.k++) { + this.trace(`begin round ${this.k}`); + + this.trace(`begin begin round`); this.beginRound(); + this.trace(`end begin round`); this.mark(Q); // Traverse each route - for (const [r, p] of Q) this.traverseRoute(this.routes.get(r)!, p); + this.trace(`begin traverse route`); + for (const [r, p] of Q) { + this.traverseRoute(this.routes.get(r)!, p); + } + this.trace(`end traverse route`); // Look at foot-paths + this.trace(`begin fp lookup`); if (this.k === 1) // Mark source so foot paths from it are considered in first round this.marked.add(ps); @@ -134,10 +154,13 @@ export default class BaseRAPTOR, initRound: number): Journey { From e1abc4131a4c56b5bbe7857017ed7d2696ea5a39 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Wed, 23 Jul 2025 17:24:35 +0200 Subject: [PATCH 237/251] =?UTF-8?q?=E2=9C=A8=20Bench=20exec=20traces?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bench/analyze.ipynb | 150 +++++++++++++++++++++++++++++++------------- 1 file changed, 106 insertions(+), 44 deletions(-) diff --git a/bench/analyze.ipynb b/bench/analyze.ipynb index cd3cef40..290bd42e 100644 --- a/bench/analyze.ipynb +++ b/bench/analyze.ipynb @@ -10,28 +10,14 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "id": "b2c179db", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Loading ./results/int-sr/out.txt ... Done.\n", - "Loading ./results/scal-r/out.txt ... Done.\n", - "Loading ./results/int-mcsr/out.txt ... Done.\n", - "Loading ./results/scal-sr/out.txt ... Done.\n", - "Loading ./results/scal-mcr/out.txt ... Done.\n", - "Loading ./results/int-r/out.txt ... Done.\n", - "Loading ./results/int-mcr/out.txt ... Done.\n", - "Loading ./results/scal-mcsr/out.txt ... Done.\n" - ] - } - ], + "outputs": [], "source": [ "from os import listdir\n", "from os.path import join, isdir, isfile\n", + "import re\n", "from typing import TypedDict\n", "import json\n", "\n", @@ -66,6 +52,8 @@ " compute_data: tuple[int, int]\n", " create_instance: tuple[int, int]\n", " run: tuple[int, int]\n", + " # {round, {step, [begin, end]}}\n", + " run_steps: dict[int, dict[str, tuple[float, float]]]\n", " result: tuple[int, int]\n", " post_treatment: tuple[int, int]\n", "\n", @@ -91,10 +79,13 @@ " compute_data=(0, -1),\n", " create_instance=(0, -1),\n", " run=(0, -1),\n", + " run_steps={},\n", " result=(0, -1),\n", " post_treatment=(0, -1),\n", " )\n", "\n", + " k = 0\n", + "\n", " for line in raw_output:\n", " line = line[:-1]\n", "\n", @@ -134,10 +125,47 @@ " elif fun_name.startswith(\"postTreatment\"):\n", " result[\"post_treatment\"] = (times, duration)\n", "\n", + " elif (\n", + " matches := re.search(\n", + " r\"^\\[(?P\\d+.\\d+)\\] (?Pbegin|end) (?P.+)$\",\n", + " line,\n", + " )\n", + " ) is not None:\n", + " step_name, step_kind, step_time = matches.group(\n", + " \"step_name\", \"step_kind\", \"step_time\"\n", + " )\n", + "\n", + " if step_name.startswith(\"round \"):\n", + " k = int(step_name[len(\"round \") :])\n", + "\n", + " run_steps_k = result[\"run_steps\"].setdefault(k, {})\n", + " (begin, end) = run_steps_k.setdefault(step_name, (0, 0))\n", + "\n", + " run_steps_k[step_name] = (\n", + " (begin + float(step_time), end)\n", + " if step_kind == \"begin\"\n", + " else (\n", + " begin,\n", + " end + float(step_time),\n", + " )\n", + " )\n", + "\n", + " if step_name == \"end\":\n", + " k = 0\n", + "\n", + " for k, run_steps_k in result[\"run_steps\"].items():\n", + " for step_name, (begin, end) in run_steps_k.items():\n", + " run_steps_k[step_name] = (\n", + " begin / result[\"run\"][0],\n", + " end / result[\"run\"][0],\n", + " )\n", + "\n", " results[node] = result\n", " print(\"Done.\")\n", " except Exception as exc:\n", - " print(f\"Error: {exc}\")" + " print(f\"Error: {exc}\")\n", + "\n", + "# results" ] }, { @@ -150,7 +178,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "id": "1a4ee960", "metadata": {}, "outputs": [], @@ -168,60 +196,94 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "id": "01778364", "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAsAAAAIBCAYAAABHmwn+AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQAAkf9JREFUeJzs3XdYFMcbB/Dv0XuTqiBgFyHYwIIF/Rl7jTH2mqLGaIymWRI1icHE2BKJGhO7MRqjJjassaDYRSGoiAICQUFAer/5/UFYPQHlEO6Q+36e5564u7Oz7044eG9uZlYmhBAgIiIiItIQWuoOgIiIiIhIlZgAExEREZFGYQJMRERERBqFCTARERERaRQmwERERESkUZgAExEREZFGYQJMRERERBqFCTARERERaRQmwERERESkUZgAE1GFnThxAjKZDDt37lR3KOUyf/58yGQyPHz4UN2hICAgAM2bN4eBgQFkMhkePXqk7pCUJpPJMH/+fHWHQUSkNCbARNXUhg0bIJPJFF62trbo0qULDh48qO7w6AUkJSXhjTfegKGhIfz9/bF582YYGxurO6yXRlRUlML7QktLC1ZWVujVqxeCgoLKPO/GjRuQyWQwMDAo8wOHr6+vQt1WVlbw8vLCunXrIJfLpQ995Xk96Z9//sGoUaNQp04d6Ovro3bt2hg5ciT++eefEjE8/d7X0dFBnTp1MG7cOMTFxb1Q2xFRER11B0BEz/bFF1/A1dUVQgg8ePAAGzZsQO/evbF371707dtX3eFRBVy8eBHp6en48ssv0a1bN3WHU2HZ2dnQ0VHfn5Hhw4ejd+/eKCwsRHh4OH788Ud06dIFFy9ehIeHR4nyW7Zsgb29PVJSUrBz50689dZbpdbr6OgIPz8/AEBiYiI2bdqEN998E+Hh4fjggw+wefNmhfKzZs2CiYkJ5syZU2p9u3btwvDhw2FlZYU333wTrq6uiIqKwi+//IKdO3fit99+w6BBg0qcV/zez8nJwblz57BhwwYEBgYiNDQUBgYGyjYXET1JEFG1tH79egFAXLx4UWF/cnKy0NXVFSNGjFBTZI/9/fffAoD4/fff1R3KM2VkZAghhJg3b54AIBITE9Uaz8aNG0v9f1texfejqSIjIwUAsXjxYoX9Bw8eFADE5MmTS5wjl8uFi4uLmDFjhhg0aJDw9fUtte7OnTuLZs2aKezLzMwUjo6OwtjYWOTl5ZU4p1mzZqJz586l1hcRESGMjIxEkyZNREJCgsKxxMRE0aRJE2FsbCzu3Lkj7S/rvf/JJ58IAGL79u2lXouIyo9DIIheMhYWFjA0NCzR8yaXy7F8+XI0a9YMBgYGsLOzw8SJE5GSkqJQzsXFBX379kVgYCC8vb1hYGCAevXqYdOmTSWu9ejRI3zwwQdwcXGBvr4+HB0dMWbMmBJjaOVyORYuXAhHR0cYGBjgf//7HyIiIhTK+Pr6wt3dHdevX0fnzp1hZGSEBg0aSOOHT548iTZt2sDQ0BCNGzfG0aNHFc6Pjo7Gu+++i8aNG8PQ0BC1atXCkCFDEBUVpVCu+OvjkydP4t1334WtrS0cHR3LbM/o6Gg0aNAA7u7uePDgAQDg9u3bGDx4MOzt7WFgYABHR0cMGzYMqampZdZT7Pfff0erVq1gaGgIa2trjBo1SuFra19fX4wdOxYA4OXlBZlMhnHjxpVZX/G45bCwMIwYMQKWlpbo0KGDVJevr2+Jc8aNGwcXFxdpu3jIwHfffYeffvoJ9evXh76+Pry8vHDx4sUS55qYmCAuLg4DBw6EiYkJbGxs8OGHH6KwsFCh7NNjgItjjYiIwLhx42BhYQFzc3OMHz8eWVlZCudmZ2dj2rRpsLa2hqmpKfr374+4uLgXGlfcsWNHAMCdO3dKHDtz5gyioqIwbNgwDBs2DKdOnUJsbGy56jUyMkLbtm2RmZmJxMREpWJavHgxsrKy8NNPP8HGxkbhmLW1NdasWYPMzEx8++23z63rWfdHRMrhEAiiai41NRUPHz6EEAIJCQn44YcfkJGRgVGjRimUmzhxIjZs2IDx48dj2rRpiIyMxMqVK3H16lWcOXMGurq6UtmIiAi8/vrrePPNNzF27FisW7cO48aNQ6tWrdCsWTMAQEZGBjp27IgbN25gwoQJaNmyJR4+fIi//voLsbGxsLa2lupbtGgRtLS08OGHHyI1NRXffvstRo4cifPnzyvEmJKSgr59+2LYsGEYMmQIVq1ahWHDhmHr1q2YPn06Jk2ahBEjRmDx4sV4/fXXERMTA1NTUwBFwwbOnj2LYcOGwdHREVFRUVi1ahV8fX0RFhYGIyMjhWu9++67sLGxweeff47MzMxS2/bOnTvo2rUrrKyscOTIEVhbWyMvLw89evRAbm4upk6dCnt7e8TFxWHfvn149OgRzM3Ny/x/Vdz+Xl5e8PPzw4MHD7BixQqcOXMGV69ehYWFBebMmYPGjRvjp59+kr7irl+//nN/DoYMGYKGDRvi66+/hhDiueVL8+uvvyI9PR0TJ06ETCbDt99+i9deew13795V+PkoLCxEjx490KZNG3z33Xc4evQolixZgvr162Py5MnPvc4bb7wBV1dX+Pn54cqVK/j5559ha2uLb775Riozbtw47NixA6NHj0bbtm1x8uRJ9OnTp0L3Vaz4w5ClpWWJY1u3bkX9+vXh5eUFd3d3GBkZYdu2bfjoo4/KVffdu3ehra0NCwsLpWLau3cvXFxcpOT1aZ06dYKLiwv279//3LqedX9EpCR1d0ETUemKvwZ9+qWvry82bNigUPb06dMCgNi6davC/oCAgBL7nZ2dBQBx6tQpaV9CQoLQ19cXM2fOlPZ9/vnnAoDYtWtXidjkcrkQ4vEQiKZNm4rc3Fzp+IoVKwQAERISIu3r3LmzACB+/fVXad/NmzcFAKGlpSXOnTsn7T906JAAINavXy/ty8rKKhFHUFCQACA2bdpUot06dOggCgoKFMo/OQTixo0bonbt2sLLy0skJydLZa5evVqhYR15eXnC1tZWuLu7i+zsbGn/vn37BADx+eefl4ixPEMgimMePnx4iWOdO3cu9av3sWPHCmdnZ2m7eMhArVq1FO71zz//FADE3r17Fc4FIL744guFOlu0aCFatWqlsA+AmDdvXolYJ0yYoFBu0KBBolatWtL25cuXBQAxffp0hXLjxo0rUWdpiu9nwYIFIjExUdy/f1+cPn1aeHl5lfr/Li8vT9SqVUvMmTNH2jdixAjh6elZou7OnTuLJk2aiMTEROnnZNq0aQKA6NevX6nxlDUE4tGjRwKAGDBgwDPvp3///gKASEtLE0I8/vk4evSoSExMFDExMWLnzp3CxsZG6Ovri5iYmGfWR0TPxyEQRNWcv78/jhw5giNHjmDLli3o0qUL3nrrLezatUsq8/vvv8Pc3ByvvvoqHj58KL1atWoFExMT/P333wp1urm5KfRI2djYoHHjxrh79660748//oCnp2epk3OenuE+fvx46OnpSdvFdT9ZHwCYmJhg2LBh0nbjxo1hYWGBpk2bok2bNtL+4n8/eb6hoaH07/z8fCQlJaFBgwawsLDAlStXSsT49ttvQ1tbu8R+AAgNDUXnzp3h4uKCo0ePKvSoFffwHjp0qMTX9s9y6dIlJCQk4N1331WYoNSnTx80adKkXD18zzJp0qQXOh8Ahg4dqnCvZf1/Ku16HTt2LLVcaUo7NykpCWlpaQCKloADinrpnzR16tRy1V9s3rx5sLGxgb29vfRtxZIlS/D6668rlDt48CCSkpIwfPhwad/w4cNx7dq1UldhuHnzJmxsbGBjY4OmTZvihx9+QJ8+fbBu3Tql4ktPTwcA6VuMshQfL26fYt26dYONjQ2cnJzw+uuvw9jYGH/99dczh/QQUflwCARRNeft7Y3WrVtL28OHD0eLFi3w3nvvoW/fvtDT08Pt27eRmpoKW1vbUutISEhQ2K5bt26JMpaWlgrjhe/cuYPBgweXK8an6ytOsp4ef+zo6FgieTY3N4eTk1OJfU+fn52dDT8/P6xfvx5xcXEKwwBKG5vr6upaZrz9+vWDnZ0dDh06BBMTkxLnzZgxA0uXLsXWrVvRsWNH9O/fH6NGjXrm8Ifo6GgARUn905o0aYLAwMAyzy2PZ91PeZX3/5OBgUGJ8apP/3xU9DpmZmaIjo6GlpZWiXtq0KBBueov9s4772DIkCHIycnB8ePH8f3335cYpwwUrf7g6uoKfX19aWx6/fr1YWRkhK1bt+Lrr79WKO/i4oK1a9dKS6Y1bNiwzPfWsxQntsWJcFnKSpT9/f3RqFEjpKamYt26dTh16hT09fWVjoOISmICTPSS0dLSQpcuXbBixQrcvn0bzZo1g1wuh62tLbZu3VrqOU8nM2X1jIoKji0tb31llSvP+VOnTsX69esxffp0tGvXDubm5pDJZBg2bBjkcnmJc5/sMX7a4MGDsXHjRmzduhUTJ04scXzJkiUYN24c/vzzTxw+fBjTpk2Dn58fzp07p7bet9LuRyaTlfr/rLQkEHjx/0/lVdk/X2Vp2LChtIxc3759oa2tjU8//RRdunSRPjSmpaVh7969yMnJQcOGDUvU8euvv2LhwoUKH8yMjY0rZXk6c3NzODg44Pr1688sd/36ddSpUwdmZmYK+5/88Dtw4EB06NABI0aMwK1bt0p8cCMi5TABJnoJFRQUACiaqAYU9WYdPXoUPj4+z0z8lFG/fn2EhoZWSl2VYefOnRg7diyWLFki7cvJyanQE9QWL14MHR0dvPvuuzA1NcWIESNKlPHw8ICHhwfmzp2Ls2fPwsfHB6tXr8ZXX31Vap3Ozs4AgFu3bqFr164Kx27duiUdr0yWlpalDkso7o2urpydnSGXyxEZGamQlD69coiy5syZg7Vr12Lu3LnSMItdu3YhJycHq1atUpi4CRT9f5k7dy7OnDkjraxR2fr27Yu1a9ciMDCw1GucPn0aUVFRpX4Qe5K2tjb8/PzQpUsXrFy5Ep9++mmVxEukKTgGmOglk5+fj8OHD0NPTw9NmzYFUDTrvrCwEF9++WWJ8gUFBRVKEgcPHoxr165h9+7dJY5Vdk9eeWhra5e47g8//FBmb+ezyGQy/PTTT3j99dcxduxY/PXXX9KxtLQ06QNGMQ8PD2hpaSE3N7fMOlu3bg1bW1usXr1aodzBgwdx48aNF17hoDT169fHzZs3FZbmunbtGs6cOVPp16pMPXr0AAD8+OOPCvt/+OGHF6rXwsICEydOxKFDhxAcHAygaPhDvXr1MGnSJLz++usKrw8//BAmJiZlfnNSGT766CMYGhpi4sSJSEpKUjiWnJyMSZMmwcjIqFyrUfj6+sLb2xvLly9HTk5OVYVMpBHYA0xUzR08eBA3b94EUDSW99dff8Xt27fx6aefSl+Zdu7cGRMnToSfnx+Cg4PRvXt36Orq4vbt2/j999+xYsWKEhODnuejjz7Czp07MWTIEEyYMAGtWrVCcnIy/vrrL6xevRqenp6Vfq/P0rdvX2zevBnm5uZwc3NDUFAQjh49ilq1alWoPi0tLWzZsgUDBw7EG2+8gQMHDqBr1644fvw43nvvPQwZMgSNGjVCQUEBNm/eDG1t7WeOidbV1cU333yD8ePHo3Pnzhg+fLi0DJqLiws++OCDit56mSZMmIClS5eiR48eePPNN5GQkIDVq1ejWbNmJSZUVSetWrXC4MGDsXz5ciQlJUnLoIWHhwMoOclSGe+//z6WL1+ORYsWYenSpfj7778xbdq0Usvq6+ujR48e+P333/H9998rLAVXWRo2bIiNGzdi5MiR8PDwKPEkuIcPH2Lbtm3lWgoPKHpfDhkyBBs2bKiUiZFEmooJMFE19/nnn0v/NjAwQJMmTbBq1aoSX5muXr0arVq1wpo1azB79mzo6OjAxcUFo0aNgo+Pj9LXNTExwenTpzFv3jzs3r0bGzduhK2tLf73v/+pZRzsihUroK2tja1btyInJwc+Pj44evSo1JtYEbq6uti5cyd69eqFAQMG4OjRo/D09ESPHj2wd+9exMXFwcjICJ6enjh48CDatm37zPrGjRsHIyMjLFq0CJ988gmMjY0xaNAgfPPNN0qvH1seTZs2xaZNm/D5559jxowZcHNzw+bNm/Hrr7/ixIkTlX69yrRp0ybY29tj27Zt2L17N7p164bt27ejcePGL/SY39q1a2PEiBHYvHkzvLy8IJfL0a9fvzLL9+vXD3/88QcOHjyI/v37V/i6zzJkyBA0adIEfn5+UtJbq1YtdOnSBbNnz4a7u3u563rttddQv359fPfdd89c6YSInk0m1PFdJhER0VOCg4PRokULbNmyBSNHjlR3OERUg3EMMBERqVx2dnaJfcuXL4eWlhY6deqkhoiISJNwCAQREanct99+i8uXL6NLly7Q0dHBwYMHcfDgQbzzzjsl1oUmIqpsHAJBREQqd+TIESxYsABhYWHIyMhA3bp1MXr0aMyZMwc6OuybIaKqxQSYiIiIiDQKxwATERERkUZhAkxEREREGoUDrVSooKAAV69ehZ2dHbS0+NmDiIiIqpZcLseDBw/QokULjq9/AltCha5evQpvb291h0FEREQa5sKFC/Dy8lJ3GNUGE2AVsrOzA1D0Q+jg4KDmaIiIiKimi4+Ph7e3t5SDUBEmwCrg7+8Pf39/5OXlAQAcHBzU8ihZIiIi0kwceqmIraECU6ZMQVhYGE6cOKHuUIiIiIg0HhNgIiIiItIoTICJiIiISKNwDDAREWksuVwuzc8gehnp6upCW1tb3WG8dNSeAG8KisKak3eRmJGLpg5mWNC/GZo7WZRZ/mR4IpYdCcftB+nQ19WGt4sV5vRpCicrI6lM0J0kfLU/DLcfZMDBwgDvdWmAIa2dXui6ALD/ejyWHLmF2JRsuNYyxqe9mqBLE9sXuX0iIlKTvLw8REZGQi6XqzsUohdiYWEBe3t7yGQydYfy0lBrArz32r/4at8NfDXIHS2cLLDuTCTG/HIexz/0hbWJfonyMclZeHvTJbzVwRUrhjVHek4BvtgXhklbLmP/tI5SmQkbLmJkm7pYMaw5zkQk4dNdIbA1M0DnRjYVui4AXI5OxrTfruLjHo3xv6a2+DP4X7yz+RL2Te2IxvamVddIRERU6YQQiI+Ph7a2NpycnDhDnl5KQghkZWUhISEBALjEqhLUmgD/HBiJYd5OeOO/3tmFAz1w/GYCdlyKwbu+DUqUD4lLhVwu8GH3xtDSKvqU807Henh78yXkF8qhq62FLeej4WRliLl93QAADWxNcTEqGb8ERkoJsLLXBYB1Z6LQuZENJnauDwCY2b0xTt9+iI1BUfh6kEflNgwREVWpgoICZGVloXbt2jAyMnr+CUTVlKGhIQAgISEBtra2HA5RTmr7yJtXIEdoXCp8Glg/DkZLBp8G1rgS/QgAMHPHNQxdEyQd96hjDi2ZDL9fjkGhXCAtJx+7r8ahQwNr6GoX3crV6EcKdQJAp0Y2uBqdUu7rluZqdEqp9V75r97S5ObmIi0tTXqlp6c/u1GIiEglCgsLAQB6enpqjoToxRV/iMvPz1dzJC8PtfUAp2TloVAuSgw5sDHRx53ETACArZk+hBDSMScrI2x60xvv/XoFs3eHolAu0LKuBdaPf/x44cSM3FLrTM8tQE5+IVKz85973dIU1av4i9LGRA8PM3LLPMfPzw8LFiwo8zgREakXx0xSTcCfY+VV60FPn/RsgqVDm0vbCek5mLUrBINbOuLPKT7Y/k5b6Gpr4d2tlxUS5epi1qxZSE1NlV5hYWHqDomIiIhI46ktAbY00oO2lqxED2piRi5sypiItjkoGqYGOpjVuync65ijTb1aWP7fRLerMY8AFPXkllanqb4ODHS1K3Tdx/UqLpWTmJFX5qQ5ANDX14eZmZn0MjXlZDl1KJQLBN1Jwp/BcQi6k4RCefX7sERERJVvw4YNsLCwUGsMLi4uWL58uVpjoJLUlgDr6WjBvY45zkY8lPbJ5QJnI5LQ0tmi1HOy8wpLdPNr/7dd3APcwtkCZyOSFMoE3n6IFs6WFb5uUb2WCucU1ZuIlv/VS9VTQGg8OnxzHMPXnsP7vwVj+Npz6PDNcQSExqs7NCIiqkHKSrYvXryId955R/UB0TOpdQjEWx1cse1iDHZejkVEQjrm7AlFVl4BhrQqWp3hm4CbmLE9WCrftYktrsc+woqjtxH5MBOhcan4cOd11LEwRLPa5gCAUW2ccS85C34HbiAiIQObg6KwPyQeb3ZwLfd1AWDG9mB8E3BT2p7g44KT4YlYe+ouIhIysOxIOELiUjG2nUvVNhJVWEBoPCZvuYL41ByF/fdTczB5yxUmwUT0wvgNk3JexklaL/qgFBsbG640Ug2pNQHu51kbc3o3xbIj4ei9IhBh8WnYOMEbNqZFwwoS0nIR9yhbKt++gTVWDGuBw2H30ef70xi77gL0tLWwcYI3DHSLlv1wsjLCunFeOH37IXqvOI21pyOx6DUPaQm08lwXAOIeZSMh7fEwiVbOVlgxrAW2XbiH3itO42BoPH4a3ZprAFdThXKBBXvDUNqfouJ9C/aG8Y8VEVWYOr5h8vX1xdSpUzF9+nRYWlrCzs4Oa9euRWZmJsaPHw9TU1M0aNAABw8eVDgvNDQUvXr1gomJCezs7DB69Gg8fPj4W82AgAB06NABFhYWqFWrFvr27Ys7d+5Ix6OioiCTybBr1y506dIFRkZG8PT0RFBQEJ5FJpNh1apV6N+/P4yNjbFw4cJSe0r37Nmj8A3v/Pnz0bx5c2zevBkuLi4wNzfHsGHDnrua0oYNG1C3bl0YGRlh0KBBSEpS/EZ43LhxGDhwoMK+6dOnw9fXV9r29fXFe++9h+nTp8Pa2ho9evQAACxduhQeHh4wNjaGk5MT3n33XWRkZAAATpw4gfHjxyM1NRUymQwymQzz588HUHIIxL179zBgwACYmJjAzMwMb7zxBh48ePDC907KUfuT4Ma2d8HY9i6lHlvyhmeJff09a6O/Z+1n1tmufi0ceL9jha8LANsntiuxr88rDujzCheZfhlciEwu0fP7JAEgPjUHFyKT0a5+LdUFRkQ1QvE3TE9/hC7+hmnVqJbo6V41fy82btyIjz/+GBcuXMD27dsxefJk7N69G4MGDcLs2bOxbNkyjB49Gvfu3YORkREePXqErl274q233sKyZcuQnZ2NTz75BG+88QaOHz8OAMjMzMSMGTPwyiuvICMjA59//jkGDRqE4OBghYeEzJkzB9999x0aNmyIOXPmYPjw4YiIiICOTtnpxPz587Fo0SIsX74cOjo60jWf586dO9izZw/27duHlJQUvPHGG1i0aBEWLlxYavnz58/jzTffhJ+fHwYOHIiAgADMmzdPiZZ9bOPGjZg8eTLOnDkj7dPS0sL3338PV1dX3L17F++++y4+/vhj/Pjjj2jfvj2WL1+Ozz//HLdu3QIAmJiYlKhXLpdLye/JkydRUFCAKVOmYOjQoThx4kSF752Up/YEmKgqJKSXnfxWpBwRUbHnfcMkQ9E3TK+62UNbq/KXp/L09MTcuXMBFK02tGjRIlhbW+Ptt98GAHz++edYtWoVrl+/jrZt22LlypVo0aIFvv76a6mOdevWwcnJCeHh4WjUqBEGDx6scI1169bBxsYGYWFhcHd3l/Z/+OGH6NOnDwBgwYIFaNasGSIiItCkSZMy4x0xYgTGjx+v9H3K5XJs2LBBmkA+evRoHDt2rMwkcMWKFejZsyc+/vhjAECjRo1w9uxZBAQEKH3thg0b4ttvv1XYN336dOnfLi4u+OqrrzBp0iT8+OOP0NPTg7m5OWQyGezt7cus99ixYwgJCUFkZCScnIqGXW7atAnNmjXDxYsX4eXlVaF7J+VV62XQiCrK1tSgUssRERVT5humqvDKK69I/9bW1katWrXg4fH4iaR2dnYAID0e99q1a/j7779hYmIivYoT1uJhDrdv38bw4cNRr149mJmZwcXFBUDR1/VlXbv4sbvF1ylL69atK3KbcHFxUVg9ycHB4ZnXunHjBtq0aaOwr127kt/mlkerVq1K7Dt69Cj+97//oU6dOjA1NcXo0aORlJSErKysctd748YNODk5SckvALi5ucHCwgI3btyQ9il776Q89gBTjeTtagUHcwPcT80ptZdGBsDe3ADerlaqDo2IXnLq/oZJV1dXYVsmkynsKx5LK5fLAQAZGRno168fvvnmmxJ1FSex/fr1g7OzM9auXYvatWtDLpfD3d29xASwZ12nLMbGxgrbWlpaJdbuL21yXGn3+bxrPU95r/10zFFRUejbty8mT56MhQsXwsrKCoGBgXjzzTeRl5dX6ZPcquLeSRETYBXw9/eHv7//C88kpfLT1pJhXj83TN5yBTJAIQku/kJyXj+3Kvl6kohqtpftG6aWLVvijz/+gIuLS6ljdZOSknDr1i2sXbsWHTsWzZ8JDAyssnhsbGyQnp6OzMxMKdEMDg5+4XqbNm2K8+fPK+w7d+5ciWuHhoYq7AsODi6RcD7t8uXLkMvlWLJkiTQmeseOHQpl9PT0pEdsPyvGmJgYxMTESL3AYWFhePToEdzc3J55LlUuDoFQgSlTpiAsLExhgDtVvZ7uDlg1qiXszRX/CNmbG1TpBBUiqtmKv2Eq6+OzDIBDNfqGacqUKUhOTsbw4cNx8eJF3LlzB4cOHcL48eNRWFgIS0tL1KpVCz/99BMiIiJw/PhxzJgxo8riadOmDYyMjDB79mzcuXMHv/76KzZs2PDC9U6bNg0BAQH47rvvcPv2baxcubLE+N+uXbvi0qVL2LRpE27fvo158+aVSIhL06BBA+Tn5+OHH37A3bt3sXnzZqxevVqhjIuLCzIyMnDs2DE8fPiw1KER3bp1g4eHB0aOHIkrV67gwoULGDNmDDp37lzhoSJUMUyAqUbr6e6AwE+6YtvbbbFiWHNse7stAj/pyuSXiCqs+BsmACWS4Or4DVPt2rVx5swZFBYWonv37vDw8MD06dNhYWEBLS0taGlp4bfffsPly5fh7u6ODz74AIsXL66yeKysrLBlyxYcOHAAHh4e2LZtm7Rk2Ito27Yt1q5dixUrVsDT0xOHDx+WJgsW69GjBz777DN8/PHH8PLyQnp6OsaMGfPcuj09PbF06VJ88803cHd3x9atW+Hn56dQpn379pg0aRKGDh0KGxubEpPogKKhDH/++ScsLS3RqVMndOvWDfXq1cP27dtf7OZJaTLx9GAYqjKxsbFwcnJCTEwMHB0d1R0OEZHGysnJQWRkJFxdXWFgULGhCgGh8ViwN0xhQpyDuQHm9XPjh2xSqWf9PDP3KB3HABMREVVAT3cHvOpmjwuRyUhIz4GtadGwh+rS80tEZWMCTEREVEHaWjI+TIfoJcQxwERERESkUZgAExEREZFGYQJMRERERBqFCTARERERaRQmwCrg7+8PNzc3+Pr6qjsUIiIiIo3HBFgF+CQ4IiIiouqDCTARERERaRQmwERERESkUZgAExERvYQSExOhp6eHzMxM5Ofnw9jYGPfu3VN3WEQvBSbAREREL6GgoCB4enrC2NgYV65cgZWVFerWrVtm+fz8fBVGR1S9MQEmIiJ6CZ09exY+Pj4AgMDAQOnfxWQyGVatWoX+/fvD2NgYCxcuxIYNG2BhYaFQbs+ePZDJZNL2/Pnz0bx5c2zevBkuLi4wNzfHsGHDkJ6eXuX3RKQqTICJiIgq6My9M+i1pRcclzqi15ZeOHPvTJVe7969e7CwsICFhQWWLl2KNWvWwMLCArNnz8aePXtgYWGBd999Vyo/f/58DBo0CCEhIZgwYUK5r3Pnzh3s2bMH+/btw759+3Dy5EksWrSoKm6JSC101B0AERHRy+jMvTPw3egLIQQKRSHuZ9zH0cijODH2BHzq+jz3/IqoXbs2goODkZaWhtatW+P8+fMwNjZG8+bNsX//ftStWxcmJiZS+REjRmD8+PFKX0cul2PDhg0wNTUFAIwePRrHjh3DwoULK+1eiNSJPcAqwAdhEBHVPF+d+kpKfgGgUBRCCIGvTn1VZdfU0dGBi4sLbt68CS8vL7zyyiu4f/8+7Ozs0KlTJ7i4uMDa2loq37p16wpdx8XFRUp+AcDBwQEJCQkvHD9RdcEeYBWYMmUKpkyZgtjYWDg5Oak7HCIiqgQhCSFS8lusUBQiJCGkyq7ZrFkzREdHIz8/H3K5HCYmJigoKEBBQQFMTEzg7OyMf/75RypvbGyscL6WlhaEEAr7Spscp6urq7Atk8kgl8sr8U6I1Is9wERERBXgYesBbZm2wj5tmTY8bD2q7JoHDhxAcHAw7O3tsWXLFgQHB8Pd3R3Lly9HcHAwDhw48MzzbWxskJ6ejszMTGlfcHBwlcVLVF0xASYiIqqAuZ3mQiaTSUmwtkwbMpkMn3X+rMqu6ezsDBMTEzx48AADBgyAk5MT/vnnHwwePBgNGjSAs7PzM89v06YNjIyMMHv2bNy5cwe//vorNmzYUGXxElVXTICJiIgqwKeuD06MPYFX672KOqZ18Gq9V3Fy3Em0d2pfpdc9ceIEvLy8YGBggAsXLsDR0REODg7lOtfKygpbtmzBgQMH4OHhgW3btmH+/PlVGi9RdSQTTw8GoipTPAY4JiYGjo6O6g6HiEhj5eTkIDIyEq6urjAwMFB3OEQv5Fk/z8w9SsceYCIiIiLSKEyAiYiIiEijMAEmIiIiIgDAqehT6LetH2ovqQ3ZAhn23Nzz3HNORJ1AyzUtof+VPhp83wAbgjeUWXZR4CLIFsgwPWB6pcVcEUyAiYiIiAgAkJmXCU87T/j39i9X+ciUSPT5tQ+6uHRB8MRgTG87HW/99RYORRwqUfZi3EWsubwGr9i9UtlhK40PwlABf39/+Pv7Iy8vT92hEBHREzgPnGqCyvw57tWwF3o17FXu8qsvrYarhSuW9FgCAGhq0xSB9wKx7Nwy9GjQQyqXkZeBkbtGYm2/tVX6tMTyYg+wCkyZMgVhYWE4ceKEukMhIiIA2tpFa/eyY4JqgqysLAAln+CnCkGxQehWr5vCvh71eyAoNkhh35QDU9CnYZ8SZdWFPcBERKRxdHR0YGRkhMTEROjq6kJLi/1B9PIRQiArKwsJCQmwsLCQPtiVJj09HWlpadK2vr4+9PX1XziG+xn3YWdsp7DPzsQOablpyM7PhqGuIX4L/Q1X4q/g4tsXX/h6lYUJMBERaRyZTAYHBwdERkYiOjpa3eEQvRALCwvY29s/s4ybm5vC9rx581TyEJSY1Bi8H/A+jow+AgOd6rPmNhNgIiLSSHp6emjYsCGHQdBLTVdX95k9v8XCwsJQp04dabsyen8BwN7EHg8yHyjse5DxAGb6ZjDUNcTl+MtIyExAyzUtpeOFohCnok9h5YWVyJ2bC22t58df2ZgAExGRxtLS0uKT4EgjmJqawszMrNLrbefYDgciDijsO3L3CNo5tgMA/M/1fwiZHKJwfPyf49HEugk+8flELckvUE0S4E1BUVhz8i4SM3LR1MEMC/o3Q3Mni1LLLjsSjhXHbpfYb6irjRtf9pS291+Px5IjtxCbkg3XWsb4tFcTdGliKx0XQmDZkXBsuxiDtOx8tHaxxFcDPeBqbVxpsRIRERG9TDLyMhCRHCFtR6ZEIvh+MKwMrVDXvC5mHZ2FuPQ4bBq0CQAwqfUkrLy4Eh8f+RgTWkzA8cjj2PHPDuwfsR8AYKpvCndbd4VrGOsao5ZhrRL7VUnto/73XvsXX+27gfe7NcT+qR3g5mCKMb+cx8OM3FLLv9OpHi7M+Z/Cq6GtCXp7OEhlLkcnY9pvVzG0tRMOTOuA7s3s8M7mS7h1P10qs/rkXaw/G4WFA92xZ4oPDHV1MGbdeeTkF1ZarEREREQvk0v/XkKLNS3QYk0LAMCMwzPQYk0LfP735wCA+Ix43Eu9J5V3tXTF/hH7ceTuEXiu9sSSoCX4uf/PCkugVUcyoeZFEAf4n4Gnozm+GFD0KUAuF2i36BjGtnfBu74Nnnt+2L9p6P39aeyY2A7erlYAgCm/XkF2XiHWjfOSyg30PwO32mb4epAHhBDw/voY3u7oinc61QcApOXko/VXR/HdEE/096xdJbHGxsbCyckJMTExcHR0fG55IiIiohfB3KN0au0BziuQIzQuFT4NrKV9Wloy+DSwxpXoRwCAmTuuYeiaoDJqALZfvId61sZS8gsAV6NTFOoEgE6NbHAlOgUAEJOcjcT0XIUyZga6aO5kIZWpSKxPy83NRVpamvRKT08vtRwRERERqY5aE+CUrDwUygWsTRRnItqY6CPxv2EFtmb6qGNhWOr5OfmF2BP8L97wclLYn5iRC2sTvafq1JOGKiRm5EjXKeu6FYn1aX5+fjA3N5deTy9BQkRERESqp/YxwM/zSc8mWDq0eanHDv1zH5m5BRjcsnp26c+aNQupqanSKywsTN0hEREREWk8ta4CYWmkB20tWYlJZIkZuSV6Z0uz/WIMujaxhY1pyV7ZhxmK6zomZuRJvbc2JgbSdWzNDJ4okws3h9KXCKlIrE8/ZeXJJ7AQERERkXqotQdYT0cL7nXMcTbiobRPLhc4G5GEls4Wzzw3JjkLQXeTMPSp4Q8A0MLZUqFOAAi8nYiWzpYAACcrQ9iY6uNsRJJ0PD0nH8Exj6QylRkrEREREVUfah8C8VYHV2y7GIOdl2MRkZCOOXtCkZVXgCGtihLbbwJuYsb24BLn7bgUA1tTffg2ti1xbIKPC06GJ2LtqbuISMjAsiPhCIlLxdh2LgCKHoE5wccVPxy/jSNhD3Dzfhpm7LgGOzN9dHd7/DzrEWvPYePZqHLHSkRERETVn9ofhNHPszaSM/Ow7Eg4EtNz0bS2GTZO8JaGNSSk5SLuUbbCOXK5wM7LsXi9lSO0tWQl6mzlbIUVw1pgyeFbWHzoFlysjfDT6NZobG8qlZnUuR6y8wowa1cI0nLy4eViiY3jvWGg+/iJJNFJWUjOfDyU4nmxEhEREVH1p/Z1gDUJ1+IjIiIiVWLuUTq1D4EgIiIiIlIlJsBEREREpFGYAKuAv78/3Nzc4Ovrq+5QiIiIiDQeE2AVmDJlCsLCwnDixAl1h0JERESk8ZgAExEREZFGYQJMRERERBqFCTARERERaRQmwERERESkUZgAExEREZFGYQJMRERERBqFCTARERERaRQmwERERESkUZgAqwCfBEdERERUfTABVgE+CY6IiIio+mACTEREREQaRUfdAVDlKZQLXIhMRkJ6DmxNDeDtagVtLZm6wyIiIiKqVpgA1xABofFYsDcM8ak50j4HcwPM6+eGnu4OaoyMiIiIqHrhEIgaICA0HpO3XFFIfgHgfmoOJm+5goDQeDVFRkRERFT9MAF+yRXKBRbsDYMo5VjxvgV7w1AoL60EERERkeZhAvySuxCZXKLn90kCQHxqDi5EJqsuKCIiIqJqjAnwSy4hvezktyLliIiIiGo6JsAvOVtTg0otR0RERFTTMQFWgap8Epy3qxUczA1Q1mJnMhStBuHtalXp1yYiIiJ6GTEBVoGqfBKctpYM8/q5AUCJJLh4e14/N64HTERERPQfJsA1QE93B6wa1RL25orDHOzNDbBqVEuuA0xERET0BD4Io4bo6e6AV93s+SQ4IiIioudgAlyDaGvJ0K5+LXWHQURERFStcQgEEREREWkUJsBEREREpFGYABMRERGRRmECTEREREQahQkwEREREWkUJsAqUJVPgiMiIiIi5TABVoGqfBIcERERESmHCTARERERaRQmwERERESkUZgAExEREZFGUfujkDcFRWHNybtIzMhFUwczLOjfDM2dLMosL4TA2tN3se1CDOJSsmFprIvRbZ3xXteGUpmgO0n4an8Ybj/IgIOFAd7r0gBDWju90HUBYP/1eCw5cguxKdlwrWWMT3s1QZcmti9y+0RERESkYmrtAd577V98te8G3u/WEPundoCbgynG/HIeDzNyyzxnwd4w/HYxBrN7N8WxmZ3x8xgveD6RuMYkZ2HChotoV68WDrzfARN8XPHprhCcDE98oetejk7GtN+uYmhrJxyY1gHdm9nhnc2XcOt+eqW0BRERERGphloT4J8DIzHM2wlvtHZCQztTLBzoAUM9bey4FFNq+YiEdGw5F421Y1rjVTc7OFkZwcPRHB0b2khltpyPhpOVIeb2dUMDW1OMbe+CXu72+CUwssLXBYB1Z6LQuZENJnaujwa2ppjZvTGa1TbHxqCoSmsPIiIiIqp6akuA8wrkCI1LhU8D68fBaMng08AaV6IfAQBm7riGoWuCpONHbySgrpURjt9IQIdvjsNn0XF8svM6HmXlSWWuRj9SqBMAOjWywdXolHJftzRXo1NKrffKf/WWJjc3F2lpadIrPZ29xURERETqprYEOCUrD4VyAWsTfYX9Nib6SPxvKIKtmT7qWBhKx+4lZyH2UTb2h8Rj6RvN8d0QT4TEpWLylitSmcSM3FLrTM8tQE5+YbmuW5qievWeOkfvmcMm/Pz8YG5uLr3c3NzKLEtEREREqlGtV4H4pGcTLB3aXNoWQiCvQI6lb3jC29UK7erXwrevv4Kgu0m4k5ihvkDLMGvWLKSmpkqvsLAwdYdEREREpPHUtgqEpZEetLVkJXpQEzNyYfNU72wxG1MD6GjJUM/GRNrXwLbo3/8+ykZ9GxPYmOiXWqepvg4MdLWhJZMpfV0A/9Wbp7AvMSOvRE/yk/T19aGv//h4WlpamWWJiIiISDXU1gOsp6MF9zrmOBvxUNonlwucjUhCS2eLUs9p7WyJArlAdFKmtO9uYtG/i4dKtHC2wNmIJIXzAm8/RAtnywpft6heS4VziupNRMv/6iUiIiKil4Nah0C81cEV2y7GYOflWEQkpGPOnlBk5RVgSKuiNXu/CbiJGduDpfIdGljDvY4ZPtp5HaFxqQiJTcXs3SHo2NBa6hUe1cYZ95Kz4HfgBiISMrA5KAr7Q+LxZgfXcl8XAGZsD8Y3ATel7Qk+LjgZnoi1p+4iIiEDy46EIyQuFWPbuVRtIxERERFRpVLrgzD6edZGcmYelh0JR2J6LprWNsPGCd6wMS0aNpCQlou4R9lSeS0tGX4Z64V5f/6DoWuCYKinA9/GNpjbp6lUxsnKCOvGeeHLfWFYfyYK9uYGWPSaBzo3sin3dQEg7lE2ZDKZtN3K2QorhrXAksO3sPjQLbhYG+Gn0a3R2N60KpuIiIiIiCqZTAgh1B2EpoiNjYWTkxNiYmLg6Oio7nCIiIiohmPuUbpqvQoEEREREVFlYwJMRERERBqFCTARERERaRQmwCrg7+8PNzc3+Pr6qjsUIiIiojKdij6Fftv6ofaS2pAtkGHPzT3PPedE1Am0XNMS+l/po8H3DbAheIPCcb/TfvBa6wVTP1PYLrbFwN8G4tbDW1VzA+XEBFgFpkyZgrCwMJw4cULdoRARERGVKTMvE552nvDv7V+u8pEpkejzax90cemC4InBmN52Ot766y0cijgklTkZfRJTvKbg3JvncGT0EeTL89F9S3dk5mU+o+aqpdZl0IiIiIio+ujVsBd6NexV7vKrL62Gq4UrlvRYAgBoatMUgfcCsezcMvRo0AMAEDAqQOGcDQM2wPY7W1yOv4xOzp0qL3glsAeYiIiIiCokKDYI3ep1U9jXo34PBMUGlXlOam4qAMDK0KpKY3sW9gATERER1XDp6elIS0uTtvX19aGvr/+MM8rnfsZ92BnbKeyzM7FDWm4asvOzYahrqHBMLuSYHjAdPk4+cLd1f+HrVxR7gImIiIhqODc3N5ibm0svPz8/tcQxZf8UhCaE4rfXf1PL9YuxB5iIiIiohgsLC0OdOnWk7cro/QUAexN7PMh8oLDvQcYDmOmblej9fe/Ae9h3ex9OjTsFRzP1PpWOCTARERFRDWdqagozM7NKr7edYzsciDigsO/I3SNo59hO2hZCYOrBqdh9czdOjD0BV0vXSo9DWRwCQUREREQAgIy8DATfD0bw/WAARcucBd8Pxr3UewCAWUdnYczuMVL5Sa0n4W7KXXx85GPcfHgTP178ETv+2YEP2n4glZlyYAq2XN+CX1/7Fab6prifcR/3M+4jOz9bpff2JPYAExEREREA4NK/l9BlYxdpe8bhGQCAsZ5jsWHgBsRnxEvJMAC4Wrpi/4j9+ODQB1hxfgUczRzxc/+fpSXQAGDVpVUAAN+NvgrXWj9gPcY1H1dl9/IsMiGEUMuVNYi/vz/8/f2Rl5eHO3fuICYmBo6O6h37QkRERDVfbGwsnJycmHs8hUMgVIBPgiMiIiKqPpgAExEREZFGYQJMRERERBqFCTARERERaRQmwERERESkUZgAExEREZFGYQJMRERERBqFCTARERERaRQmwCrg7+8PNzc3+Pr6qjsUIiIiIo3HBFgF+CAMIiIiouqDCTARERERaRQmwERERESkUXSUKXzjxg389ttvOH36NKKjo5GVlQUbGxu0aNECPXr0wODBg6Gvr19VsRIRERERvbBy9QBfuXIF3bp1Q4sWLRAYGIg2bdpg+vTp+PLLLzFq1CgIITBnzhzUrl0b33zzDXJzc6s6biIiIiKiCilXD/DgwYPx0UcfYefOnbCwsCizXFBQEFasWIElS5Zg9uzZlRUjEREREVGlKVcCHB4eDl1d3eeWa9euHdq1a4f8/PwXDoyIiIiIqCqUawjE85LfR48eKVWeiIiIiEhdlF4F4ptvvsH27dul7TfeeAO1atVCnTp1cO3atUoNjoiIiIiosimdAK9evRpOTk4AgCNHjuDIkSM4ePAgevXqhY8++qjSA6wJ+CQ4IiIioupDJoQQypxgaGiI8PBwODk54f3330dOTg7WrFmD8PBwtGnTBikpKVUV60svNjYWTk5OiImJgaOjo7rDISIiohqOuUfplO4BtrS0RExMDAAgICAA3bp1AwAIIVBYWFi50RERERERVTKlHoQBAK+99hpGjBiBhg0bIikpCb169QIAXL16FQ0aNKj0AImIiIiIKpPSCfCyZcvg4uKCmJgYfPvttzAxMQEAxMfH49133630AImIiIiIKpPSY4CrwqagKKw5eReJGblo6mCGBf2bobmTRallY5Kz0PHbv0vs3/Vue7Ssaylt778ejyVHbiE2JRuutYzxaa8m6NLEVjouhMCyI+HYdjEGadn5aO1iia8GesDV2rjSYn0ax+EQERGRKjH3KJ3SPcAA8O+//yIwMBAJCQmQy+UKx6ZNm6ZUXXuv/Yuv9t3AV4Pc0cLJAuvORGLML+dx/ENfWJvol3ne1rfaoKGdibRtaaQn/ftydDKm/XYVH/dojP81tcWfwf/inc2XsG9qRzS2NwUArD55F+vPRmHJEE84WRlhyeFwjFl3Hkc+6AwDXe1KjZWIiIiIqg+lE+ANGzZg4sSJ0NPTQ61atSCTyaRjMplM6QT458BIDPN2whuti5ZWWzjQA8dvJmDHpRi861v2mGILI13YmhqUemzdmSh0bmSDiZ3rAwBmdm+M07cfYmNQFL4e5AEhBNadicTUrg3QvZk9AGDpUE+0/uooDoc9QH/P2pUaKxERERFVH0qvAvHZZ5/h888/R2pqKqKiohAZGSm97t69q1RdeQVyhMalwqeB9eOAtGTwaWCNK9GPAAAzd1zD0DVBJc59e+MltPryCF5fdRZHwh4oHLsanaJQJwB0amSDK9FFS7TFJGcjMT1XoYyZgS6aO1lIZSoSKxERERFVf0r3AGdlZWHYsGHQ0lI6dy4hJSsPhXJRYviAjYk+7iRmAgBszfTx5DBlY30dzO3TFK2cLaElk+Fg6H28s/kSfhrdGq+62QEAEjNyYW2i91SdeniYkfvf8RzpOk9fN/G/MhWJ9Wm5ubnIzX1cX3p6eukNQUREREQqo3QC/Oabb+L333/Hp59+WhXxlPBJzyYK21bGenirYz1p29PJAglpOfjp1B0pAa4u/Pz8sGDBAnWHQURERERPUDoB9vPzQ9++fREQEAAPDw/o6uoqHF+6dGm567I00oO2lkzqmS2WmJFbonf2WZrXtcDpiIfSto2JPh5m5D1VZ57Ue2tjYiBdx9bM4IkyuXBzMKu0WGfNmoUZM2ZI23FxcXBzcyv3fRERERFR5VN6HIOfnx8OHTqEBw8eICQkBFevXpVewcHBStWlp6MF9zrmOPtE8iqXC5yNSEJLZ4ty1xP2bxpsTR8noS2cLRXqBIDA24lo6Vy0TJqTlSFsTPVxNiJJOp6ek4/gmEdSmcqIVV9fH2ZmZtLL1NS03PdERERERFVD6R7gJUuWYN26dRg3blylBPBWB1fM/P0aPBwt0NzJHL8ERiErrwBDWhWttPBNwE08SM3B0qHNAQA7L8dCV1uGZrXNAQCH/rmPHZdisGjwK1KdE3xcMHTNOaw9dRddmthi77V/ERKXCr/XisrIZDJM8HHFD8dvw8XaGE5WhlhyOBx2Zvro/sQwihFrz6FHM3uMbe9SrliJiIiIqPpTOgHW19eHj49PpQXQz7M2kjPzsOxIOBLTc9G0thk2TvCGzX89uglpuYh7lK1wzg/HIxCXkg0dLRnq2Zpg5YiW6O3hIB1v5WyFFcNaYMnhW1h86BZcrI3w0+jW0hrAADCpcz1k5xVg1q4QpOXkw8vFEhvHeyusARydlIXkzMdDKZ4XKxERERFVf0o/Cc7Pzw/x8fH4/vvvqyqmGotPYyEiIiJVYu5ROqV7gC9cuIDjx49j3759aNasWYlJcLt27aq04IiIiIiIKpvSCbCFhQVee+21qoiFiIiIiKjKKZ0Ar1+/viriICIiIiJSiRd/nBs9l7+/P9zc3ODr66vuUIiIiIg0XoUS4C+++AI//vijwr4ff/wRX3zxRaUEVdNMmTIFYWFhOHHihLpDISIiItJ4FUqA169fj927dyvs++OPP7Bhw4bKiImIiIiIqMooPQYYACIjI0vsO3bs2AsHQ0RERERU1TgGmIiIiIg0itIJcEBAAAIDA6Vtf39/NG/eHCNGjEBKSkqlBkdEREREVNmUToA/+ugjpKWlAQBCQkIwc+ZM9O7dG5GRkZgxY0alB0hEREREVJmUHgMcGRkJNzc3AEUT3/r27Yuvv/4aV65cQe/evSs9QCIiIiKiyqR0D7Cenh6ysrIAAEePHkX37t0BAFZWVlLPMBERERFRdaV0D3CHDh0wY8YM+Pj44MKFC9i+fTsAIDw8HI6OjpUeIBERERFRZVK6B3jlypXQ0dHBzp07sWrVKtSpUwcAcPDgQfTs2bPSA6wJ+CQ4IiIioupDJoQQ6g5CU8TGxsLJyQkxMTHsLSciIqIqx9yjdOXqAc7MzFSqUmXLExERERGpSrkS4AYNGmDRokWIj48vs4wQAkeOHEGvXr3w/fffV1qARERERKTZMjMz8dlnn6F9+/Zo0KAB6tWrp/BSVrkmwZ04cQKzZ8/G/Pnz4enpidatW6N27dowMDBASkoKwsLCEBQUBB0dHcyaNQsTJ05UOhAiIiIiotK89dZbOHnyJEaPHg0HBwfIZLIXqk+pMcD37t3D77//jtOnTyM6OhrZ2dmwtrZGixYt0KNHD/Tq1Qva2tovFFBNxnE4REREpEo1JfewsLDA/v374ePjUyn1KbUMWt26dTFz5kzMnDmzUi5ORERERPQ8lpaWsLKyqrT6lF4GjYiIiIhIlb788kt8/vnn0sPYXpTSD8IgIiIiIlKlJUuW4M6dO7Czs4OLiwt0dXUVjl+5ckWp+pgAExEREVG1NnDgwEqtjwmwCvj7+8Pf3x95eXnqDoWIiIjopTNv3rxKrY9jgFVgypQpCAsLw4kTJ9QdChEREZHGq1AP8KNHj3DhwgUkJCRALpcrHBszZkylBEZEREREqnUq+hQWn12My/9eRnxGPHYP3Y2BTQY+85wTUScw49AM/JP4D5zMnDC301yMaz5OoYz/BX8sPrsY9zPuw9PeEz/0+gHedbzLHZeWltYz1/4tLCwsd11ABRLgvXv3YuTIkcjIyICZmZlCMDKZjAkwERER0UsqMy8TnnaemNB8Al7b8dpzy0emRKLPr30wqdUkbH1tK45FHsNbf70FBxMH9GjQAwCwPXQ7ZhyegdV9VqONYxssP7ccPbb0wK33bsHW2LZcce3evVthOz8/H1evXsXGjRuxYMEC5W9UKKlhw4bi/fffF5mZmcqeqvFiYmIEABETE1Ml9QdGB4qem3uKOkvqiJ6be4rA6MAquc7Lhu1SNrZN6dguZWPblI7tUja2TelU1S4vkntgPsTuG7ufWebjwx+LZv7NFPYN/X2o6LG5h7TtvdZbTNk/RdoulBeK2ktqC7/TfkrH9LStW7eK/v37K32e0j3AcXFxmDZtGoyMjJTPtqnKnLl3Br4bfSGEQKEoxP2M+zgaeRQnxp6AT93KeWrKy4jtUja2TenYLmVj25SO7VI2tk3palK7BMUGoVu9bgr7etTvgemHpgMA8grzcPnfy5jVYZZ0XEumhW71uiEoNuiFr9+2bVu88847Sp+n9CS4Hj164NKlS0pfiKrWV6e+kt5IAFAoCiGEwFenvlJzZOrFdikb26Z0bJeysW1Kx3YpG9umdOpol/T0dKSlpUmv3NzcSqn3fsZ92BnbKeyzM7FDWm4asvOz8TDrIQpFYckyxna4n3H/ha6dnZ2N77//HnXq1FH6XKV7gPv06YOPPvoIYWFh8PDwKLEQcf/+/ZUOgl5cSEKI9EYqVigKEZIQoqaIqge2S9nYNqVju5SNbVM6tkvZ2DalU0e7uLm5KWzPmzcP8+fPr7LrVTZLS0uFeWdCCKSnp8PIyAhbtmxRuj6lE+C3334bAPDFF1+UOCaTyZSehUeVw8PWA/cz7iu8obRl2vCw9VBjVOrHdikb26Z0bJeysW1Kx3YpG9umdOpol7CwMIWeUn19/Uqp197EHg8yHyjse5DxAGb6ZjDUNYS2lja0Zdoly2Q+gL2Jfbmvs3z5coVtLS0t2NjYoE2bNrC0tFQ6bqWHQMjl8jJfTH5L5+/vDzc3N/j6+lbZNeZ2mguZTAZtmTaAojeSTCbDZ50/q7JrvgzYLmVj25SO7VI2tk3p2C5lY9uUTh3tYmpqCjMzM+lVWQlwO8d2OBZ5TGHfkbtH0M6xHQBAT1sPrWq3wrG7j8vIhRzH7h6TyjxPQUEBoqOj8b///Q9jx47F2LFjMXr0aPTs2bNCyS/AB2GohCoehOFT1wcnxp7Aq/VeRR3TOni13qs4Oe4k2ju1r7JrvgzYLmVj25SO7VI2tk3p2C5lY9uUrjq3S0ZeBoLvByP4fjCAomXOgu8H417qPQDArKOzMGb34yVvJ7WehLspd/HxkY9x8+FN/HjxR+z4Zwc+aPuBVGZG2xlYe2UtNgZvxI3EG5i8bzIy8zMxvvn4csWko6ODxYsXo6CgoNLuUyaEEMqedPLkSXz33Xe4ceMGgKJxJR999BE6duxYaYHVRLGxsXByckJMTAwcHR3VHQ4RERHVcMrmHieiTqDLxi4l9o/1HIsNAzdg3J5xiHoUhRPjTiic88GhDxCWGAZHM0d81umzEg/CWHlhpfQgjOb2zfF9z+/RxrFNue9jwIABeO211zB27Nhyn/MsSifAW7Zswfjx4/Haa6/Bx6doqY4zZ85g9+7d2LBhA0aMGFEpgdVETICJiIhIlWpK7rF69WosWLAAI0eORKtWrWBsbKxwXNlFGJROgJs2bYp33nkHH3zwgcL+pUuXYu3atVKvMJVUU34IiYiI6OVQU3IPLa2yR+1WZBEGpccA3717F/369Suxv3///oiMjFS2OiIiIiKiZ6rsRRiUXgbNyckJx44dQ4MGDRT2Hz16FE5OTkoHAACbgqKw5uRdJGbkoqmDGRb0b4bmThbPPS/qYSb6fH8aWloyhMzvoXBs//V4LDlyC7Ep2XCtZYxPezVBlyaPnzcthMCyI+HYdjEGadn5aO1iia8GesDV2vjpy1RKrERERERUce+99x6++OILWFlZvXBdSvcAz5w5E9OmTcPkyZOxefNmbN68GZMmTcL06dPx4YcfKh3A3mv/4qt9N/B+t4bYP7UD3BxMMeaX83iY8ewnlOQXyjHtt6vwci3ZCJejkzHtt6sY2toJB6Z1QPdmdnhn8yXcup8ulVl98i7Wn43CwoHu2DPFB4a6Ohiz7jxy8sv+FFHRWImIiIhIebGxsdK/f/31V2RkZAAAPDw8EBMTU+F6lU6AJ0+ejN9++w0hISGYPn06pk+fjtDQUGzfvh0TJ05UOoCfAyMxzNsJb7R2QkM7Uywc6AFDPW3suPTsm/ru8C3UtzFBHw+HEsfWnYlC50Y2mNi5PhrYmmJm98ZoVtscG4OiABT1/q47E4mpXRugezN7NHUww9KhnniQlovDYQ9K1PeisRIRERGR8po0aQJnZ2eMGDECOTk5UtIbFRWF/Pz8CtdboXWABw0ahMDAQCQlJSEpKQmBgYEYMGCA0vXkFcgRGpcKnwbWjwPSksGngTWuRD8CAMzccQ1D1wQpnHc24iEOhMTjiwHNSq33anSKQp0A0KmRDa5EpwAAYpKzkZieq1DGzEAXzZ0spDIVifVpubm5Cs/dTk9PL7UcEREREZX06NEj/P7772jVqhXkcjl69+6NRo0aITc3F4cOHcKDB2V3XD6LWh+EkZKVh0K5gLWJ4tNIbEz0kfjfsAJbM33UsTB8fE5mHj78/Rq+e90Tpga6pdabmJELaxO9p+rUk4YqJGbkSNcp67oVifVpfn5+MDc3l15PP4ebiIiIiMqWn58Pb29vzJw5E4aGhrh69SrWr18PbW1trFu3Dq6urmjcuLHS9ZZrEpyVlRXCw8NhbW0NS0tLyGSyMssmJycrHcSzfNKzicL2p7uuo3/zOmhTr1alXqcqzJo1CzNmzJC24+LimAQTERERlZOFhQWaN28OHx8f5OXlITs7Gz4+PtDR0cH27dtRp04dXLx4Uel6y5UAL1u2DKamptK/n5UAK8PSSA/aWrISk8gSM3JL9M4WO3snCUdvJGDt6bsAisbzygVQf/YB+A3ywBteTrAx0cfDjLyn6syTem9tTAyk69iaGShc183BrNJi1dfXV3jWdlpaWqnliIiIiKikuLg4BAUF4ezZsygoKECrVq3g5eWFvLw8XLlyBY6OjujQoYPS9ZYrAX7ysXPjxo1T+iJl0dPRgnsdc5yNeIgezewBAHK5wNmIJIxp71zqObvfbY9C+ePtI2H3sfrkXfwxuT3s/0tmWzhb4mzEQ7zZwVUqF3g7ES2dLQEATlaGsDHVx9mIJDSrbQ4ASM/JR3DMI4xqW/p1KxIrEREREVWctbU1+vXrh379+mH16tU4deoUbty4gTFjxuDDDz/E6NGj4e3tjZMnTypVr9JjgLW1tZGQkFBif1JSErS1tZWtDm91cMW2izHYeTkWEQnpmLMnFFl5BRjSqmhN4W8CbmLG9mCpfANbUzS2f/yyMzOATAY0tjeFuVHRmOAJPi44GZ6ItafuIiIhA8uOhCMkLhVj27kAKHpiyAQfV/xw/DaOhD3AzftpmLHjGuzM9NHdzU661oi157DxbFS5YyUiIiKiqmNubo433ngDurq6OH78OCIjI/Huu+8qXY/SD8Io68nJubm50NPTK/XYs/TzrI3kzDwsOxKOxPRcNK1tho0TvGFjWjR0ICEtF3GPspWqs5WzFVYMa4Elh29h8aFbcLE2wk+jW6OxvalUZlLnesjOK8CsXSFIy8mHl4slNo73hoHu4yQ+OikLyZmPh1I8L1YiIiIiqhrXr19HnTp1AADOzs7Q1dWFvb09hg4dqnRdMlFWRvuU77//HgDwwQcf4Msvv4SJiYl0rLCwEKdOnUJUVBSuXr2qdBCaoqY8j5uIiIheDsw9SlfuHuBly5YBKOoBXr16tcJwBz09Pbi4uGD16tWVHyERERERUSUqdwIcGRkJAOjSpQt27doFS0vLKguKiIiIiKiqKD0G+O+//66KOIiIiIiIVELpBBgoGk/y119/4d69e8jLU1xvd+nSpZUSWE3i7+8Pf3//Em1FRERERKqndAJ87Ngx9O/fH/Xq1cPNmzfh7u6OqKgoCCHQsmXLqojxpTdlyhRMmTJFGohOREREROqj9DrAs2bNwocffoiQkBAYGBjgjz/+QExMDDp37owhQ4ZURYxERERERJVG6QS4+OkbAKCjo4Ps7GyYmJjgiy++wDfffFPpARIRERERVSalE2BjY2NpLKuDgwPu3LkjHXv48GHlRUZEREREVAWUHgPctm1bBAYGomnTpujduzdmzpyJkJAQ7Nq1C23btq2KGImIiIiIKo3SCfDSpUuRkZEBAFiwYAEyMjKwfft2NGzYkCtAEBEREVG1p1QCXFhYiNjYWLzyyisAioZD8OlvRERERPQyUWoMsLa2Nrp3746UlJSqioeIiIiIqEopPQnO3d0dd+/erYpYiIiIiIiqnNIJ8FdffYUPP/wQ+/btQ3x8PNLS0hReVJK/vz/c3Nzg6+ur7lCIiIiINJ5MCCGUOUFL63HOLJPJpH8LISCTyVBYWFh50dUwxU+Ci4mJgaOjo7rDISIiohqOuUfplF4F4u+//66KOIiIiIiIVELpBLhz585VEQcRERERkUoonQCfOnXqmcc7depU4WCIiIiIiKqa0glwaRO5nhwLzDHARERERFSdKb0KREpKisIrISEBAQEB8PLywuHDh6siRiIiIiKiSqN0D7C5uXmJfa+++ir09PQwY8YMXL58uVICIyIiIiKqCkr3AJfFzs4Ot27dqqzqiIiIiIiqhNI9wNevX1fYFkIgPj4eixYtQvPmzSsrrhrF398f/v7+yMvLU3coRERERBqvQg/CkMlkePq0tm3bYt26dWjSpEmlBliTcDFqopdDoVzgQmQyEtJzYGtqAG9XK2hryZ5/IhFRNcPco3RK9wBHRkYqbGtpacHGxgYGBgaVFhQRkboEhMZjwd4wxKfmSPsczA0wr58bero7qDEyIiKqLEonwM7OzlURBxGR2gWExmPylit4+mux+6k5mLzlClaNaskkmIioBlBqEpxcLse6devQt29fuLu7w8PDA/3798emTZtKDIkgInqZFMoFFuwNK5H8ApD2LdgbhkI5f9cREb3syp0ACyHQv39/vPXWW4iLi4OHhweaNWuG6OhojBs3DoMGDarKOImIqtSFyGSFYQ9PEwDiU3NwITJZdUEREVGVKPcQiA0bNuDUqVM4duwYunTponDs+PHjGDhwIDZt2oQxY8ZUepBERFUtIb3s5Lci5YiIqPoqdw/wtm3bMHv27BLJLwB07doVn376KbZu3VqpwRERqYqtafkm8pa3HBERVV/lToCvX7+Onj17lnm8V69euHbtWqUERUSkat6uVnAwN0BZi53JULQahLerlSrDIiKiKlDuBDg5ORl2dnZlHrezs0NKSkqlBEVEpGraWjLM6+cGACWS4OLtef3cuB4wEVENUO4EuLCwEDo6ZQ8Z1tbWRkFBQaUEVdP4+/vDzc0Nvr6+6g6FiJ6hp7sDVo1qCXtzxWEO9uYGXAKNiKgGKfeT4LS0tNCrVy/o6+uXejw3NxcBAQEoLCys1ABrEj6NhejlwCfBEVFNwdyjdOVeBWLs2LHPLcMVIIioJtDWkqFd/VrqDoOIiKpIuRPg9evXV2UcREREREQqofSjkImIiEgRh80QvVyqRQK8KSgKa07eRWJGLpo6mGFB/2Zo7mRRatk7iRmYszsEEQkZSMspgJ2ZPgZ41sH73RpCV/vxnL791+Ox5MgtxKZkw7WWMT7t1QRdmthKx4UQWHYkHNsuxiAtOx+tXSzx1UAPuFobV1qsRERU8wWExmPB3jCFJwk6mBtgXj83TpwkqqbKvQpEVdl77V98te8G3u/WEPundoCbgynG/HIeDzNySy2vq6WF11o6YtOENjg+szM+79sMv128h2VHwqUyl6OTMe23qxja2gkHpnVA92Z2eGfzJdy6ny6VWX3yLtafjcLCge7YM8UHhro6GLPuPHLyy57Ep2ysRERUswWExmPylislHqN9PzUHk7dcQUBovJoiI6JnUXsC/HNgJIZ5O+GN1k5oaGeKhQM9YKinjR2XYkotX7eWEd5o7QS32mZwtDTCq252GNC8Di5GJUtl1p2JQudGNpjYuT4a2JpiZvfGaFbbHBuDogAU9f6uOxOJqV0boHszezR1MMPSoZ54kJaLw2EPKi1WIiKquQrlAgv2hqG0pZSK9y3YG4ZCebkWWyIiFVJrApxXIEdoXCp8GlhL+7S0ZPBpYI0r0Y8AADN3XMPQNUFl1hH1MBMnwxPRxvXxjO2r0SkKdQJAp0Y2uBJd9KCOmORsJKbnKpQxM9BFcycLqUxFYiUiIs1xITK5RM/vkwSA+NQcXIhMLrMMEamHWscAp2TloVAuYG2iuLawjYk+7iRmAgBszfRR2lLFr/14BqH/piGvQI7h3nUx49VG0rHEjFxYm+g9VaeeNFQhMSNHus7T100sYzhDeWJ9Wm5uLnJzH9eXnp5eajkiInr5JKSXnfxWpBwRqU61mAT3LJ/0bFLq/pUjWiIztwBh8WnwO3ATP52+i0md66s4umfz8/PDggUL1B0GERFVAVtTg+cXUqIcEamOWodAWBrpQVtLVmISWWJGbone2afVtjBEQztTDGheB5/0aozlR8OlcVY2Jvp4mJH3VJ15Uu+tjYmBdJ3yXrcisc6aNQupqanSKyws7Jn3RERELw9vVys4mBugrMXOZChaDcLb1UqVYRFROag1AdbT0YJ7HXOcjXgo7ZPLBc5GJKGls0W565HLgYJCAfl/QyVaOFsq1AkAgbcT0dLZEgDgZGUIG1N9nI1Iko6n5+QjOOaRVKYyYtXX14eZmZn0MjU1Lfc9ERFR9aatJcO8fm4AUCIJLt6e18+N6wETVUNqXwXirQ6u2HYxBjsvxyIiIR1z9oQiK68AQ1o5AQC+CbiJGduDpfJ7rsZh3/V/EZGQjntJWdh3/V98e+gm+r7iIK0DPMHHBSfDE7H21F1EJGRg2ZFwhMSlYmw7FwCATCbDBB9X/HD8No6EPcDN+2mYseMa7Mz00d3NTrrWiLXnsPFsVLljJSIizdLT3QGrRrWEvbniMAd7cwOsGtWS6wATVVNqHwPcz7M2kjPzsOxIOBLTc9G0thk2TvCGjWnRsIKEtFzEPcqWymtrybD65B1EJmZCAKhjYYgx7VzwZgdXqUwrZyusGNYCSw7fwuJDt+BibYSfRrdGY/vHPbCTOtdDdl4BZu0KQVpOPrxcLLFxvDcMdLWlMtFJWUjOfDyU4nmxEhGR5unp7oBX3ez5JDiqMfwv+GPx2cW4n3Efnvae+KHXD/Cu411q2fzCfPgF+mHjtY2IS4tDY+vG+KbbN+jZoKdUplBeiPkn5mNLyBbcz7iP2qa1Mc5zHOZ2mguZTD3vE5kobYkFqhKxsbFwcnJCTEwMHB0d1R0OERER1XDK5h7bQ7djzJ4xWN1nNdo4tsHyc8vxe9jvuPXeLdga25Yo/8mRT7AlZAvW9luLJtZNcCjiEGYcnoGzE86ihUMLAMDXp7/G0qCl2DhwI5rZNsOlfy9h/J/jsbDrQkxrM63S77k81D4EgoiIiIiqh6XnluLtlm9jfIvxcLNxw+q+q2Gka4R1V9eVWn7z9c2Y3WE2ejfsjXqW9TDZazJ6N+yNJUFLpDJnY85iQOMB6NOoD1wsXPC62+voXr87LsRdUNVtlcAEmIiIiIiQV5iHy/9eRrd63aR9WjItdKvXDUGxpT+ULLcwFwY6imPgDXUMEXgvUNpu79QexyKPITwpHABw7f41BN4LRK8GvargLspH7WOAiYiIiKhqpaenIy0tTdrW19eHvr7iHKaHWQ9RKAphZ2ynsN/O2A43H94std4e9Xtg6bml6OTcCfWt6uPY3WPYdWMXCkWhVObTDp8iLTcNTVY2gbaWNgrlhVjYdSFGvjKyEu9QOewBVgF/f3+4ubnB19dX3aEQERGRBnJzc4O5ubn08vPzq5R6V/RcgYZWDdHEvwn0vtTDewffw/jm46Ele5xi7vhnB7aGbMWvg3/FlXeuYOPAjfgu6DtsDN5YKTFUBHuAVWDKlCmYMmWKNBCdiIiISJXCwsJQp04dafvp3l8AsDayhrZMGw8yHyjsf5D5APYm9qXWa2Nsgz3D9iCnIAdJWUmobVobnx79FPUs60llPjryET71+RTD3IcBADzsPBCdGg2/QD+MbT62Mm5PaewBJiIiIqrhTE1NFR7OVVoCrKeth1a1W+HY3WPSPrmQ49jdY2jn2O6Z9RvoGKCOWR0UyAvwx40/MKDxAOlYVn6WQo8wAGjLtCEX8he8q4pjDzARERERAQBmtJ2BsXvGonXt1vCu443l55YjMz8T45uPBwCM2T0GdUzrwK9b0RCK87HnEZceh+b2zRGXFof5J+dDLuT42Odjqc5+jfph4emFqGteF81sm+Fq/FUsPbcUE5pPUMs9AkyAiYiIiOg/Q92HIjErEZ+f+Bz3M+6juX1zBIwMgJ1J0cS4e6n3FHpzcwpyMPf4XNxNuQsTPRP0btgbmwdthoWBhVTmh14/4LO/P8O7B95FQmYCapvWxsRWE/F5589VfXsSPghDhfggDCIiIlIl5h6l4xhgIiIiItIoTICJiIiISKNwDDCRBiuUC1yITEZCeg5sTQ3g7WoFbS2ZusMiIiKqUkyAiTRUQGg8FuwNQ3xqjrTPwdwA8/q5oae7gxojIyIiqlocAqECfBIcVTcBofGYvOWKQvILAPdTczB5yxUEhMarKTIiIqKqxwRYBaZMmYKwsDCcOHFC3aEQoVAusGBvGEpb/qV434K9YSiUc4EYIiKqmZgAE2mYC5HJJXp+nyQAxKfm4EJksuqCIiIiUiEmwEQaJiG97OS3IuWIiIheNkyAiTSMralBpZYjIiJ62TABJtIw3q5WcDA3QFmLnclQtBqEt6uVKsMiIiJSGSbARBpGW0uGef3cAKBEEly8Pa+fG9cDJiKiGosJMJEG6unugFWjWsLeXHGYg725AVaNasl1gImIqEbjgzCINFRPdwe86mbPJ8EREZHGYQJMpMG0tWRoV7+WusMgIiJSKQ6BUAE+CY6IiIio+mACrAJ8EhwRERFR9cEEmIiIiIg0ChNgIiIiItIoTICJiIiISKMwASYiIiIijcIEmIiIiIg0ChNgIiIiItIoTICJiIiISKMwAVYBPgiDiIiIqPpgAqwCfBAGERERUfXBBJiIiIiINAoTYCIiIiLSKEyAiYiIiEijMAEmIiIiIo2io+4AAGBTUBTWnLyLxIxcNHUww4L+zdDcyaLUskF3kvBLYCSuxT5CRk4BXKyNMbFTPQxsUUeh3P7r8Vhy5BZiU7LhWssYn/Zqgi5NbKXjQggsOxKObRdjkJadj9YulvhqoAdcrY0rLVYiIiIiqn7U3gO899q/+GrfDbzfrSH2T+0ANwdTjPnlPB5m5JZa/sq9FDR1MMXqUS0RML0jhrRyxIwdwTh244FU5nJ0Mqb9dhVDWzvhwLQO6N7MDu9svoRb99OlMqtP3sX6s1FYONAde6b4wFBXB2PWnUdOfmGlxUpERERE1Y/aE+CfAyMxzNsJb7R2QkM7Uywc6AFDPW3suBRTavkpXRpgZvfGaOVsBedaxpjQwRWdG9kgIPS+VGbdmSh0bmSDiZ3ro4GtKWZ2b4xmtc2xMSgKQFHv77ozkZjatQG6N7NHUwczLB3qiQdpuTgc9qDU61YkViKimqZQLhB0Jwl/Bsch6E4SCuVC3SERESlNrUMg8grkCI1Lxbu+9aV9Wloy+DSwxpXoRwCAmTuuITYlC9sntiuznvScAjSwNZG2r0an4M2O9RTKdGpkg8P/FCXJMcnZSEzPhU8Da+m4mYEumjtZ4Ep0Cvp71q5QrE/Lzc1Fbu7j3uH09PRSyxERvQwCQuOxYG8Y4lNzpH0O5gaY188NPd0d1BgZEZFy1NoDnJKVh0K5gLWJvsJ+GxN9JP43rMDWTB91LAzLrGPf9X9xPTYVQ1o7SfsSM3JhbaL3VJ160lCFxIwc6TplXbcisT7Nz88P5ubm0svNza3M+yAiqs4CQuMxecsVheQXAO6n5mDylisICI1XU2RERMpT+xCI5/mkZxMsHdq81GNn7zzER79fh99rHmhkZ6rawMph1qxZSE1NlV5hYWHqDomISGmFcoEFe8NQ2mCH4n0L9oZxOAQRvTTUmgBbGulBW0tWYhJZYkZuid7Zp527m4S3Nl7CZ33dMLiVo8IxGxN9PMzIe6rOPKn31sbEQLpOea9bkVj19fVhZmYmvUxNq1+STkT0PBcik0v0/D5JAIhPzcGFyGTVBUVE9ALUmgDr6WjBvY45zkY8lPbJ5QJnI5LQ0tmizPOC7iRhwoaL+LRXE4xoU7fE8RbOlgp1AkDg7US0dLYEADhZGcLGVB9nI5Kk4+k5+QiOeSSVqaxYiYhedgnpZSe/FSlHRKRuah8C8VYHV2y7GIOdl2MRkZCOOXtCkZVXgCGtisb0fhNwEzO2B0vlz955iAkbLmJcexf0dLdHQnoOEtJz8CjrcY/vBB8XnAxPxNpTdxGRkIFlR8IREpeKse1cAAAymQwTfFzxw/HbOBL2ADfvp2HGjmuwM9NHdzc7qZ4Ra89h49mocsdKRFQT2ZoaVGo5IiJ1U/uDMPp51kZyZh6WHQlHYnoumtY2w8YJ3rAxLRpWkJCWi7hH2VL5Py7HITu/ED+euIMfT9yR9rdxtZJWimjlbIUVw1pgyeFbWHzoFlysjfDT6NZobP94CMKkzvWQnVeAWbtCkJaTDy8XS2wc7w0DXW2pTHRSFpIzHyfWz4uViKgm8na1goO5Ae6n5pQ6DlgGwN7cAN6uVqoOjYioQmRCCM5aUJHY2Fg4OTkhJiYGjo6Ozz+BiKiaKF4FAoBCEiz777+rRrXkUmhE1RBzj9KpfQgEERFVfz3dHbBqVEvYmysOc7A3N2DyS0QvHbUPgSAiopdDT3cHvOpmjwuRyUhIz4GtadGwB20t2fNPJiKqRpgAExFRuWlrydCufi11h0FE9EI4BEIF/P394ebmBl9fX3WHQkRERKTxmACrwJQpUxAWFoYTJ06oOxQiIiIijccEmIiIiIg0ChNgIiIiItIoTICJiIiISKMwASYiIiIijcIEmIiIiIg0ChNgIiIiItIoTICJiIiISKMwASYiIiIijcIEWAX4JDgiIiKi6oMJsArwSXBERERE1QcTYCIiIiLSKEyAiYiIiEijMAEmIiIiIo3CBJiIiIiINAoTYCIiIiKS+F/wh8tyFxh8ZYA2P7fBhbgLZZbNL8zHFye/QP3v68PgKwN4rvZEQERAiXJxaXEYtWsUan1bC4YLDeGxygOX/r1UlbfxTDpquzIRERGRhiqUC1yITEZCeg5sTQ3g7WoFbS2ZusPC9tDtmHF4Blb3WY02jm2w/Nxy9NjSA7feuwVbY9sS5ecen4stIVuwtt9aNLFugkMRhzBo+yCcnXAWLRxaAABSslPgs84HXVy74ODIg7AxssHt5NuwNLBU9e1JZEIIobara5jY2Fg4OTkhJiYGjo6O6g6HiIiI1CAgNB4L9oYhPjVH2udgboB5/dzQ092hUq+lbO7R5uc28KrthZW9VwIA5EIOp2VOmOo9FZ92+LRE+dpLamNOxzmY4j1F2jd4x2AY6hhiy2tbAACfHv0UZ2LO4PT405V0Vy+OQyBUgA/CICIiIqAo+Z285YpC8gsA91NzMHnLFQSExqspMiCvMA+X/72MbvW6Sfu0ZFroVq8bgmKDSj0ntzAXBjoGCvsMdQwReC9Q2v7r1l9o7dAaQ34fAtvFtmixpgXWXl5bNTdRTkyAVYAPwiAiIqJCucCCvWEo7av34n0L9oahUF75X86np6cjLS1NeuXm5pYo8zDrIQpFIeyM7RT22xnb4X7G/VLr7VG/B5aeW4rbSbchF3IcuXMEu27sQnzG40T+bspdrLq0Cg2tGuLQqEOY3HoypgVMw8bgjZV7k0pgAkxERESkAhcik0v0/D5JAIhPzcGFyORKv7abmxvMzc2ll5+fX6XUu6LnCjS0aogm/k2g96Ue3jv4HsY3Hw8t2eMUUy7kaOnQEl//72u0cGiBd1q9g7dbvo3Vl1dXSgwVwUlwRERERCqQkF528luRcsoICwtDnTp1pG19ff0SZayNrKEt08aDzAcK+x9kPoC9iX2p9doY22DPsD3IKchBUlYSapvWxqdHP0U9y3pSGQdTB7jZuCmc19S6Kf648ceL3NILYQ8wERERkQrYmho8v5AS5ZRhamoKMzMz6VVaAqynrYdWtVvh2N1j0j65kOPY3WNo59jumfUb6BigjlkdFMgL8MeNPzCg8QDpmI+TD24l3VIoH54UDmdz5xe8q4pjAkxERESkAt6uVnAwN0BZi53JULQahLerlSrDUjCj7QysvbIWG4M34kbiDUzeNxmZ+ZkY33w8AGDM7jGYdXSWVP587HnsurELd1Pu4nT0afTc2hNyIcfHPh9LZT5o+wHOxZ7D16e/RkRyBH4N+RU/XfkJU7ymlLi+qnAIBBEREZEKaGvJMK+fGyZvuQIZoDAZrjgpntfPTa3rAQ91H4rErER8fuJz3M+4j+b2zREwMgB2JkUT4+6l3lMY35tTkIO5x+fibspdmOiZoHfD3tg8aDMsDCykMl51vLB76G7MOjYLX5z8Aq6WrljeYzlGvjJS1bcn4TrAKsR1gImIiKg6rwOsKdgDTERERKRCPd0d8KqbfbV8EpymYAJMREREpGLaWjK0q19L3WFoLE6CUwE+CY6IiIio+mACrAJ8EhwRERFR9cEEmIiIiIg0ChNgIiIiItIoTICJiIiISKOofRWITUFRWHPyLhIzctHUwQwL+jdDcyeLUsvm5Bdizu5QhMalIiIxA12b2GLtmNYlygXdScJX+8Nw+0EGHCwM8F6XBhjS2qnC1y22/3o8lhy5hdiUbLjWMsanvZqgSxPbit46EREREamBWnuA9177F1/tu4H3uzXE/qkd4OZgijG/nMfDjNxSy8uFgIGuFsb5uMCngXWpZWKSszBhw0W0q1cLB97vgAk+rvh0VwhOhidW+LoAcDk6GdN+u4qhrZ1wYFoHdG9mh3c2X8Kt++kv1ghEREREpFJqTYB/DozEMG8nvNHaCQ3tTLFwoAcM9bSx41JMqeWN9HSwcJAHhnvXhY2JfqlltpyPhpOVIeb2dUMDW1OMbe+CXu72+CUwssLXBYB1Z6LQuZENJnaujwa2ppjZvTGa1TbHxqCoF2oDIiIiIlIttSXAeQVyhMalKvTkamnJ4NPAGleiHwEAZu64hqFrgpSq92r0oxK9w50a2eBqdEq5r1t6vSml1nvlv3qJiIiI6OWgtjHAKVl5KJQLWD/Vk2tjoo87iZkAAFszfQghlKo3MSO31DrTcwuQk1+I1Oz851637Hr1njpH75nDJnJzc5Gb+/h4ejqHSxARERGpm9onwT3LJz2bqDuEF+Ln54cFCxaoOwwiIiIieoLahkBYGulBW0tWogc1MSO3zPG95WFjol9qnab6OjDQ1a7wdYvqzXvqnLwSPclPmjVrFlJTU6VXWFhYBe6IiIiIiCqT2hJgPR0tuNcxx9mIh9I+uVzgbEQSWjpbVLjeFs4WOBuRpLAv8PZDtHC2fKHrtnC2VDinqN5EtPyv3tLo6+vDzMxMepmamlbgjoiIiIioMql1FYi3Orhi28UY7Lwci4iEdMzZE4qsvAIMaVW0Zu83ATcxY3uwwjm3H6Tjn39TkZqdh/ScfPzzbyr++TdVOj6qjTPuJWfB78ANRCRkYHNQFPaHxOPNDq7lvi4AzNgejG8CbkrbE3xccDI8EWtP3UVEQgaWHQlHSFwqxrZzqZrGISIiIqIqodYxwP08ayM5Mw/LjoQjMT0XTWubYeMEb9iYFg0rSEjLRdyjbIVzxq2/qLCvz/eBAICoRX0AAE5WRlg3zgtf7gvD+jNRsDc3wKLXPNC5kU25rwsAcY+yIZPJpO1WzlZYMawFlhy+hcWHbsHF2gg/jW6Nxvbs1SUiIiJ6mciEssssUIXFxsbCyckJMTExcHR0VHc4REREVMMx9yidWodAEBERERGpGhNgIiIiItIoTICJiIiISKMwAVYBf39/uLm5wdfXV92hEBEREWk8JsAqMGXKFISFheHEiRPqDoWIiIhI4zEBJiIiIiKNotZ1gImIiKhmK5QLXIhMRkJ6DmxNDeDtagVtLdnzTySqQkyAiYiIqEoEhMZjwd4wxKfmSPsczA0wr58bero7qDEy0nQcAkFERESVLiA0HpO3XFFIfgHgfmoOJm+5goDQeDVFRsQEmIiIiCpZoVxgwd4wlPao2eJ9C/aGoVDOh9GSejABJiIiokp1ITK5RM/vkwSA+NQcXIhMVl1QRE9gAkxERESVKiG97OS3IuWIKhsTYCIiIqpUtqYGlVqOqLIxAVYBPgmOiIg0iberFRzMDVDWYmcyFK0G4e1qpcqwiCRMgFWAT4IjIiJNoq0lw7x+bgBQIgku3p7Xz43rAZPaMAEmIiKiStfT3QGrRrWEvbniMAd7cwOsGtWS6wCTWvFBGERERFQlero74FU3ez4JjqodJsBERERUZbS1ZGhXv5a6wyBSwCEQRERERKRRmAATERERkUZhAkxEREREGoUJMBERERFpFCbARERERKRRmACrAJ8ER0RERFR9MAFWAT4JjoiIiKj6YAJMRERERBqFCTARERERaRQ+CU6F5HI5ACA+Pl7NkRAREZEmKM45inMQKsIEWIUePHgAAPD29lZzJERERKRJHjx4gLp166o7jGpDJoQQ6g5CUxQUFODq1auws7ODllbVjD5JT0+Hm5sbwsLCYGpqWiXXeBmxXcrGtikd26VsbJvSsV3KxrYpnSraRS6X48GDB2jRogV0dNjvWYwJcA2TlpYGc3NzpKamwszMTN3hVBtsl7KxbUrHdikb26Z0bJeysW1Kx3ZRH06CIyIiIiKNwgSYiIiIiDQKE+AaRl9fH/PmzYO+vr66Q6lW2C5lY9uUju1SNrZN6dguZWPblI7toj4cA0xEREREGoU9wERERESkUZgAExEREZFGYQJMRERERBqFCTARERERaRQmwERERESkUZgAv2S4aEfp2C7PxzYqHdtFUXF7sF1IWXK5XN0hVBtPv3/YNtUPE+CXRPGbKSYmRs2RVC/F7RIXF6fmSKqf4ra5ceMGAEAmk6kznGqjuF3++ecfAGyXYsXtEhoaCoDt8qTitgkJCeEHgycUt8XZs2chhICWFlOKpwUGBgIA26Ya4v+Rl4RMJsOuXbvg6ekpJTRU1C47duxA3bp1cfv2bXWHU63IZDLs3bsX//vf/3Du3Dl1h1NtFLeLp6cnzp49q+5wqo0n26X4jzYVkclk+Ouvv+Dp6YmgoCD25v1HJpPhyJEj6NChA/bu3avucKoVmUyGo0ePolOnTvjzzz/VHQ6VQkfdAVD5xMXFYffu3Vi0aBGaNm2q7nCqjcTERJw+fRrff/89GjZsqO5wqgUhBGQyGWJiYvDbb79h3rx5aNu2rbrDqjZiYmJw+PBhrFy5Eu3bt1d3ONXGv//+i+vXr2PlypXo0KGDusOpVh4+fIjo6GgsX76cPzNPiIqKwqlTp/D999+jf//+6g6nWomMjMSNGzewYsUKDBgwQN3hUCnYA/wSuHz5MqZOnYqoqCh069aNvQ//uXz5Mvr164eLFy/C19eXX03+RyaT4fz585g9ezaio6PRuXNnABzTCQBXr17FO++8gzNnzsDLywsA2wUo+mq/e/fu2LRpE5o0aQKA7VIsJCQEDRo0wA8//ABXV1d1h1NthISEYMKECfjtt99Qv359ABznWuzWrVvo27cvFi1aBDs7OwBsm+qICfBL4PLlywgPD8f169eRm5sLLS0tvplQ9AlbW1sboaGh0NLSgkwmQ2FhobrDqhbi4uJw7tw5XLp0SRoaIpPJND6piYmJQXp6Om7cuIHY2FgAHOsKAJmZmWjcuDHu3buHBw8eqDucakVPTw/9+/fHvXv38OjRIwDg75n/WFpa4t9//8XFixcBgH+bntCpUydkZGQgJCQEANumWhJU7cjlciGEEJGRkSI3N1cIIcS2bduEm5ub6NGjh7h9+7ZCOU1RfL8xMTHSvn379glPT0/RsmVLER0dLYQQorCwUC3xVTeHDx8Wr7zyiujVq5c4e/astF+Tfm6K7zUiIkLad/z4cdGpUyfh7e0tTpw4oa7Q1Kq4XUJDQ8WtW7eEEEJcvXpVDBw4UDg5OYlDhw6pMzy1Km6bmzdvSr9rwsPDxYgRI4SBgYE4efKkEEJzfs886/fFrVu3xMiRI4Wbm5v45ZdfpP2a0jbFitvo2rVr4u7du0KIor/f7733nrC3txf+/v5SWU1rm+qMCXA1U/xG2r17t2jatKn46aefRHZ2thBCiHXr1olOnTqJoUOHijt37iiUr+mK7/PPP/8UHh4eYseOHdIvkj179ghfX1/RpUsXce/ePSGEEAUFBWqLVd3y8vKkfwcEBAgvLy8xfPhwce7cOTVGpXpP/szUr19f+Pv7S/sCAgJEz549Rffu3cWpU6fUGabKFbfBrl27RJ06dcS3334r/v33XyGEEOfPnxfDhw8XHh4e4vDhw+oMUy2e/P3r7Ows/P39RVJSkhCiKNkbNWqUqFWrlvj777+FEDU/mSm+v/z8fIX9T25HRUWJUaNGifbt24v169dL+zXtb9Pu3buFg4OD+Prrr0VycrIQQojbt2+L999/XzRu3FisWrWqxDmkXkyAq6EDBw4IQ0ND8cMPPyj0XAkhxM8//yw6deokRo4cKcLDw9UUoXrs2bNHGBsbi2+//VbqtSr2559/ik6dOolu3bqJyMhI9QSoBk/+Ii0sLJT+MMXExIidO3cKIYraxsvLS4waNUqcPn1aLXGqy549e4SRkZH44YcfxM2bNxWOBQQEiB49eojevXuLY8eOqSlC9Th27JgwNjYWq1evFgkJCQrHgoKCxPDhw0Xz5s3F/v371RSh+uzbt08YGxuLH374QcTHxysci4qKEiNGjBB2dnY1/gPCzz//LJo2bSp9C1n8u6W4cyE6OlrMmzdPFBQUiH/++UeMGjVKdOrUSSHR0xT79+8XRkZGYs2aNeL+/fsKx6KiosS0adOEm5ubWLZsmXoCpFIxAa5msrOzRd++fcWHH36osP/JXr0NGzYIDw8PMWHCBIX9NVlCQoJo3ry5+Pbbb4UQRb+Ms7KyxN69e6Xe8IMHD4rmzZuLfv36ifz8/Br5Kbu4RyYzM1Pad+rUKakNhCj6hWtpaSnmzp0r7fvrr79Ew4YNxVtvvSV9o1DTJScniw4dOgg/Pz8hhBC5ubkiJSVFbN68Wdy4cUMIUTQcol27dmLw4MEiKytLneGqRPF7YuLEiWLMmDEKx57s1bt06ZLo06ePaN++vcjMzKyR76XSZGRkiFdffVV8+umnQoii38dxcXFi5cqV4q+//hLZ2dkiPj5eDBgwQNSrV09kZWXVyLaRy+Vi//79olmzZqJjx45SElz838jISGFrayumT58u/U4KCwsTAwYMED169BCPHj1SW+yqlpubK15//XXpb3ZWVpa4c+eOWLhwodixY4d48OCBiI+PF2+++abw8vISKSkp6g2YJEyAq5n09HTRuHFjsXbtWiFEya/yixOfzZs3i6ioKJXHpy737t0TjRo1En///be4f/+++OKLL0Tnzp2Fjo6OaNOmjdi7d68QoijRq+ntEhcXJxo2bCjCwsLEjh07hIGBgThy5IgQQoiHDx8KCwsLMXHixBJfzx44cEAan6YJ4uPjRb169cQff/wh0tLSxNy5c0XHjh2Fvr6+qFevntizZ48QQohDhw5JQ2c0gVwuFx07dhTTp08XQpT8Gr/4/XP58mURGxur8vjUKSsrS3Ts2FEsWrRI3Lp1S8ycOVN07dpVWFhYiBYtWog5c+YIIYqGQ8TFxak52qpVUFAgjh49Kjw9PUW7du2k5DcpKUnUqlVLvPXWWyWS/5s3b9b4dnlaVlaWaNOmjZg+fbq4c+eOmDp1qujSpYtwcHAQTZo0EZ988okQomgc+dO9w6ReTICrofbt2yv0zhQnwaGhocLf37/EeKyaqPgXa1RUlEhPTxdCCNGuXTvh6uoqbGxsxKBBg8Ty5ctFdHS0cHd3F7NmzVJnuCqVm5srBg8eLKytrYWWlpbYuHGjdOzevXti48aNJYZGaKrx48cLExMTYW1tLQYOHChWrlwphCj6WRo3bpyao1OfCRMmCA8PD5GamiqEePw7JiYmRixYsEBjPigVv0/++ecf6VuBDz74QNja2goTExMxePBgsX79epGZmSlGjRolhg8frs5wVa6goEAcOXKkRBIcEBCg8DumJvaCP+1Z9/jTTz8JAwMDYW5uLgYPHiw2bdokhBBi6tSponv37qoKkZTEZdDUSPy3JFVubi5ycnIAFK0V2LdvX4SEhMDf3x8AoK2tDQDYtGkT1q9fj7S0NPUErCLivwc57NmzB7169cK2bdsgl8tx6tQpTJs2DYsWLcL69esxZcoU1K1bF82aNYOuri5E0Qc6dYdf5fT09DB27FgkJSXB1NQUr7zyinTMyckJY8aMUVjaSxMfwVlQUAAAWLlyJTZt2oRly5Zhy5YtmDhxIgCgcePGsLe3r/HLWRW/H5KSkhSWNxs2bBh0dHTwwQcfID09Xfods3r1amzZsgUGBgZqiVeVin/P7N69G927d8dff/2Fhw8fYunSpdiyZQt27tyJnTt3YvTo0TAyMoKRkRH09fWRn5+vEb9ngKK/PZ07d8bixYuRlZUFX19f5OXloUePHgpLetX0pQTlcjlkMpn0e6VYfn4+AODtt9/G1atXsXv3buzcuRMjRoyQytSqVUv6+07VjBqTbxJFX9n37dtXdOrUSWzevFkIIURKSooYO3asaNWqlRg8eLD4+uuvxfDhw4WZmZkIDg5Wc8Sq8ayJgMXS09PF7NmzhZWVVYlJcTVdYmKi2LFjhxg+fLiwtrYuc3KbpvXMPDkRMC4uTpoIWOzBgwdi7ty5wsLCQoSFhak0TnXZtWuXaNGihXB2dhbTpk2TllFcuXKlaNOmjWjUqJEYPXq06NWrl7CwsBBXr15Vb8Aq9KzJgMViY2PF7Nmzhbm5uQgNDVVxhKpV/F5KTEwUGRkZIjExUQhR9K3T4cOHhaenp2jbtm2JiXE1WXknAxZ/myJE0VCQ2bNnCzMzMxESEqL6oKlcmACr0dmzZ4WFhYWYNGmSGDVqlNDS0hIzZswQBQUFIjU1VaxatUp0795dtG3bVgwdOlRj3khlTQR8cjz0gQMHRK9evYSLi4u4cuWKqkNUueI/TElJSdKSVUIUJXyDBg0S1tbWCmv9bt26tcZ+ja3MRMDPPvtM2nfixAkxcOBAUa9ePY1J8kJDQ4WTk5P44osvxPLly4W9vb3o06ePdP/nz58XM2fOFK+//rqYOXOmNAygpnvWZMAnf8+cPn1adOrUSTRp0qTG/8wUt8m+fftEp06dxCuvvCJ8fHxEQECAEKJoInZxEtyxY0eRk5OjznBVoryTAT/44APpnCtXroh+/foJNze3Gv8z87JjAqxiT/ZWHTp0SHzxxRfS9o4dO4RMJhPTp09X+OOem5urEZ+0iz1vImBSUpKIi4sTK1askHqzNMGuXbtE27ZthbOzs5g5c6a4fPmyEKLoZ+q1114TtWrVEj///LN4//33hZmZWY1um/JOBHzy/RYVFSW2bNmikCjXNHK5XOGew8PDFf44h4aGiqZNm4o+ffqICxcuqCPEauN5kwGLl1P8888/NWZpxb/++ksYGxuLRYsWiT///FO8+eabQltbW+zatUsIUZQEHz16VNStW1djxrYqOxkwLy9PnD59WqMm1r6smACrUPGb5MKFC2Lr1q1iwoQJ0rJexYqT4I8++kihp0/TlDURMCQkRKxZs0ajlqwSQoiLFy8KGxsb8dlnn4mFCxcKZ2dnMWjQIIX1a8eMGSMaNWokPD09peS4plJ2IqCmKL7nv//+W8ydO1cMHTpUvPPOOwplrl+/Lpo0aSIGDhyocesfP42TAR+LjIwUHTt2FN9//70QouhDpouLi2jcuLHQ0tISO3bsEEIUvff+/vvvGv1B8mnlnQxILxcmwCr2559/Ci0tLdGyZUshk8lE586dS4wr27lzp5DJZGLu3Lk1fgZ/8S+PnJwcaX3awsJC8fXXX4sWLVpIs/aLffzxx6JVq1bS05lqot9++03hq+iIiAixePFi8eWXX0r7Ll68KFq1aiUGDBigkMTcuXNHY9aZ/Ouvv4RMJhPm5ub8qvEJAQEBQiaTie7duwt9fX3h6Ogofv/9d4UyISEhws7OTgwfPlyjPkw+fPhQYSmqw4cPixYtWogJEyaItLQ0af+cOXNEw4YNNaoT4u7du2LWrFkiOTlZxMXFicaNG4u3335b3L9/X/Ts2VMYGBiIX3/9Vd1hqs2TQ0CeTII1+amjLzsmwCpQ/Mv33r17YuTIkeKnn34SGRkZ4vfffxcODg5iypQpJcbe7dmzR/zzzz/qCFflOBHwsZiYGNGhQwfp67Pk5GRRp04dYWhoKKZOnapQ9vz586Jly5Zi8ODB4sCBA+oIV604EbCkyMhIMXfuXLF69WohRFGi26VLF9G7d29p3eNi//zzT5kTTGsiTgZUVPy+iI6Olh6oVPzh4MMPPxT9+vWTPhRMnTpVWFlZCSsrK5Gamlrj31OcDKgZmACryPnz58Xo0aNF165dFcaTbd++XdSpU0dMnjy5xKNaNQEnApZU3CN3/fp1kZycLIKCgkTdunVFhw4dSvxRvnjxonB1dRUjR45UGDdeE3Ei4LNdv35ddOnSRbi5uYmTJ09K+4ODg0XXrl1Fjx49xJ9//qnGCNWHkwEVFb+X9uzZI9q0aSO+++476dvGgoIC0bNnT4UP3FOnThXbtm0TycnJaolXlTgZUHMwAVaRP/74Q9SvX1+YmJiIgwcPKhzbsWOHcHFxEaNHjxbh4eFqilB1OBHw+VJTU4WHh4cYPny4SEpKEkFBQcLJyUmMGzdOXL9+XaHs5cuXNSbR40TAsoWEhIjXXntNmJqaikWLFikcu3btmujRo4do27at2L9/v5oiVB1OBny+vXv3Cn19feHv719iScDZs2cLY2Nj8f3334u3335b2NraatR7iZMBNQMTYBU6fPiwaN68uRg4cKAICgpSOLZlyxbRrFkzER8fr6boVIMTAcvv4sWLonXr1mLChAkiOTlZBAYGSkmwJvSEC8GJgKV51tfPt27dEiNHjhTNmzcX69evVzh2+fJlMWDAABEdHV3FEaofJwM+W2pqqujevbuYP3++wv7i8axRUVFi4sSJolGjRsLHx6fGDwd5EicDag4mwCpQPL5KCCEOHjwovLy8xPDhw8W5c+cUyj05CaMm40TA8rty5Ypo3ry5QhJcr149MXjw4Bo9RpwTAUtX/F54+tuQJ7cjIyPFqFGjRPv27UskwcVjFjUBJwOWLSEhQdStW1f89NNPpR4v/gARHx+vMX+XinEyoOZgAlzJynoqVUxMjPRUqj///FN4eXmJUaNGKUzcqckTCzgRsOKeTIJTUlLE33//Ldzd3UVcXJy6Q6sSnAhYuvI+kaqgoED8888/YtSoUaJTp05i1apVaotZXTgZUFHx79+rV6+Ke/fuidTUVNGqVSuxePHiEmUvXrwovv32W40ZcsbJgJqLCfALUuapVHPnzpX2/fXXX6Jhw4birbfekpb/quk4EbDirly5Ilq3bi3eeOMN8ejRoxrfW8WJgIrK+0Sq6dOnS7+TwsLCxIABA0SPHj3Eo0eP1Ba7qnEyoKLiJG337t2idu3a0t+hSZMmSRNHn0zkZs+eLbp166ZRE944GVAzMQGuBOV9KtXTX+UfOHBAYyYvCcGJgC/qwoULolOnThozLpoTARUp+0QqIYS4efNmjf2moCycDFjSvn37hKGhoVi7dq2IiYmR9r/++uvCxsZGzJs3TyxatEi8/fbbwtTUVFy7dk2N0aoWJwNqLibAlUDZp1Jp8phWTgR8MZrybUExTgRUVN4nUmnCV7OcDFg+2dnZYsiQIWL27NlCiKJvK8PDw8V3330nDh8+LF5//XXRr18/4e7uLgYNGlTiw2VNxsmAmo0JcCXhU6mejRMBqaI0dSJgWfhEKk4GVEZWVpZo3bq1mDp1qkhKShLvvfee6NSpk7C3txfOzs7iu+++E1lZWSItLa3GD616GicDajYtUKVo164dtm/fjt69e+PVV19FYGBgqeWEECqOTPWevEe5XI6CggLo6uoiNjYWf/zxB3r27Im5c+ciIiICK1euVGgrExMTdYRM1ViLFi2wbt06XLlyBR9++CGaNWuGX375Bbdu3YKFhYW6w6tSxe+lhw8fIjMzEw8fPoSuri46d+6MxYsXIysrC507d0ZeXh60tbVRUFCg5oir3i+//AJ3d3fk5eVBR0dHuufCwkLo6Ojg3r17mD9/PpycnDBr1izUq1cP69evx+rVq6U69PT01BW+yhkaGmLq1Kn4+eef4erqiri4OLz55puIj4/HgAEDsH//fujq6sLU1BSGhobqDrdKFb+fgoODERMTA319fdjY2CA1NbVE2UuXLuG7775DQUEB7O3tYWpqqupwqYoxAa6g4jdScnIy4uPjYW1tjSFDhmDLli3o2LEjBg0ahKCgIKn8r7/+isjISMhkMnWFXGXkcjkAICsrCwAgk8lw+vRp3L17F1paWtDR0UF0dDReeeUVBAcHAwD69++Pzz77DOfPn8fGjRuRk5MjnUv0tOIk+Pr165g4cSJatGiBCxcuoHbt2uoOrcoIISCTybB//34MHjwY7du3x8CBA3Ho0CHo6enB19cXixcvRnZ2Nrp164bc3Fzo6OioO+wqJYSAg4MDtLS00K1bNykJLv4AEBUVBS8vL6SmpkImk8HNzQ2zZ8+GpaUl9uzZU2qiownGjBmDS5cuYefOndi1axdGjRoFoOhDg5OTEwoLC9UcYdUrfj/t2bMHffr0wU8//QQzMzN4eXnhm2++QVBQkELnze7du3H48GGkp6erMWqqUmrre64B+FSqxzgRkFRB0yYC8olUJXEy4Iu7ceOGmD17tjA3N9eosfScDEhPYgKsBD6VqmycCEiqoikTAflEqrJxMmDFXbp0SQwfPlw0bdpUBAcHqzscleFkQHqaTAgNGJT6grZv3w5PT080adIEAHDnzh3s3r0bOTk5mDt3LoCi8UKTJk2Co6Mjpk2bhq5duwIA7t69Cysrqxo/VhEA9u7diwEDBsDMzAwnTpxA8+bN1R0S0UsrMjISa9euxUcffYTs7Gx07doVnTp1wpdffolx48bhxIkTWLduHYYPH67uUNUiPz8fJ06cwEcffQQjIyOcOHECenp6KCwshLa2trrDq7ays7Nx6dIluLi4wMnJSd3hqEx2djY6deqEdu3aYf78+Zg3bx6uX7+O8PBw6OvrY+rUqXj33XdRUFAAHR2dGj8emjgG+LliY2OxcuVKGBsbAwBSUlLQuXNnfP7550hISJDKtW7dGj/++CNiYmLw448/4uDBgwCAevXqaUTyC3AiINGLKH5f3Lt3D/n5+XB1dcX7778PS0tLLFu2DI0aNcKSJUtgZ2eHhg0bwsjICO+99x7S0tJq/HtKcDJgpTE0NETHjh01KvkFOBmQSmIC/ByOjo44fPgwnJycEBISAgDYuXMnbGxscPXqVWlSFwB4e3tjzZr/t3fvMVXX/x/Anwcw4hww9HA5pxJpHbwQBxTZ2pibECk4bLgGNGYcFWcFjmLJsg02uxGjgCVpmqJBxCAslk4mpoEk5OQWBgQ4CQoZqGWOEM4Bznn//vDrp85PcXLziOf52Nz83N6f1+c49Xk+e794f47GxkYUFhZKTWEPK8FGQKJpIf7XoHPkyBFER0cjJycHJpMJ7u7uMBqNaGlpgaenp1kn+p49e3Dx4kXMnTv3of47JdgMSNOEzYBkxmKTL2YZrkp1Z2wEJJoeXJFqfGwGpJlgrc2AdBMD8ARwVSo2AhLNBK5INT42A9JMsNZmQPoXm+Am6Oeff0ZcXBz8/f2RmZmJX3/9FTqdDsuXL8d7770Hb29vS5c4I9gISDRzrl69ioCAAKSmpmLr1q23HRf/mwbQ398PhUJhVT+Un82ANBOstRmQ/sU5wBNkjatSsRGQaHoJrkg1LsFmQLoPrLUZkP7FADwJ1rYqFRsBiaaP4IpU4xJsBiSi+4RTIKagrq4OycnJKC4uhlqttnQ5M25gYAArV66Ej48Pdu/ejQsXLiA6OhohISF48803odVqpXMbGxsxb948PPXUUxasmOjBVFZWhqioKOTk5CAsLAxPPvkkACAqKgpVVVVISEiAg4MDOjs7UVxcjOrqavj6+lq46vvj2LFjiIyMRHZ2NoKDg7F06VLpWEpKCnbt2oX09HQ0NzfjyJEjqKmpgUajsWDFRDQbMQBPkV6vx6OPPmrpMu6b+vp6xMfHw9fXV5oDHRMTg5CQEGzfvh0+Pj6WLpHogabX66HT6eDl5YW0tDQMDQ2ht7cXR48eha+vL/bv3w+DwYCuri54eXnh3XffNfty+TAbGBhAVFQUAgMDsXPnTmn/rcUtfv/9d6Snp6OyshKurq7YvXs3F9whoknhD0ucImsKv8DNeb779+9HXFwckpOTkZmZiaKiIuh0Ovzzzz8PdSMg0XQQQqCrqwsqlQrXrl3jilT/YTAY0N7ejsjISLP9t1Z28/DwwL59+6yyGZCIphfnANOEWWMjINF04YpU/2IzIBFZCgMwTYq1NQISTSeuSMVmQCKyLM4BpimxtkZAopnQ3t6OgoIC7NmzB9XV1VYzl57NgERkKQzANGXW1ghINJ0aGhqQlZWFpqYmFBUVwc/Pz9Il3RdsBiQiS2ITHE0Zwy/R5Hl7eyM+Pt7qVqRiMyARWRLfABMRkUV8+eWXeO211zBnzhyEhIRg/fr10Ol0eOONN9Dc3Izvv/8ednZ8T0NE04//shARkUXodDoEBASgt7cXq1evhslkAmDeDMgATEQzgW+AiYjogWCtzYBEdP/xqzUREVncf5sBq6qqGH6JaEbxDTAREVnc8PAw6uvrra4ZkIgsgwGYiIiIiKwKV4IjIiIiIqvCAExEREREVoUBmIiIiIisCgMwEREREVkVBmAiIiIisioMwERERERkVRiAiYim4PTp05DJZLh+/bqlS5Fs2rQJ69evt3QZREQPLAZgIpqVNm3aBJlMJv1SKpUICwvDL7/8YunSiIjoAccATESzVlhYGPr6+tDX14cffvgBdnZ2WLdunaXLshij0QiTyWTpMoiIHngMwEQ0a9nb20OlUkGlUmHZsmV4++230dPTg6tXr0rn9PT0IDo6Gs7Ozpg/fz4iIiLQ3d0tHb81XSAzMxNqtRpKpRLbtm3D6OiodI7BYMCOHTuwYMEC2NvbQ6PR4ODBg2a1NDQ0ICAgAHK5HIGBgejo6JCOvfPOO1i2bBkOHToEDw8PODo6IiEhAUajER999BFUKhXc3NyQlpZmNmZ2dja0Wi0UCgUWLFiAhIQEDA4OSsfz8vLg7OyMo0ePwtvbG/b29vjjjz9u+5zq6urg6uqKjIyMO36O3d3dkMlkKC0tRXBwMORyOfz8/HD27FnpnL/++gsxMTF44oknIJfLodVqUVRUZDZOUFAQEhMTkZSUhHnz5sHd3R0HDhzAjRs3sHnzZjg5OUGj0eD48eNm17W0tGDt2rVwdHSEu7s7YmNj8eeff96xViKi6cAATEQPhcHBQXz11VfQaDRQKpUAgNHRUYSGhsLJyQlnzpxBTU0NHB0dERYWhpGREenayspKdHZ2orKyEvn5+cjLy0NeXp50XKfToaioCDk5OWhra8Pnn38OR0dHs/unpKQgKysL9fX1sLOzQ1xcnNnxzs5OHD9+HOXl5SgqKsLBgwcRHh6OS5cuoaqqChkZGUhNTcW5c+eka2xsbJCTk4PW1lbk5+ejoqICb731ltm4Q0NDyMjIQG5uLlpbW+Hm5mZ2vKKiAqtXr0ZaWhp27Nhx188wJSUFycnJaGpqwqJFixATE4OxsTEAgF6vx4oVK1BWVoaWlha88soriI2NRW1trdkY+fn5cHFxQW1tLRITExEfH4+oqCgEBgaisbERa9asQWxsLIaGhgAA169fx3PPPYfly5ejvr4e5eXluHz5MqKjo+9aKxHRlAgiollo48aNwtbWVigUCqFQKAQAoVarRUNDg3ROQUGBWLx4sTCZTNI+g8EgHBwcxIkTJ6RxFi5cKMbGxqRzoqKixEsvvSSEEKKjo0MAECdPnrxjHZWVlQKAOHXqlLSvrKxMABDDw8NCCCF27twp5HK5GBgYkM4JDQ0Vnp6ewmg0SvsWL14s0tPTx33mw4cPC6VSKW1/8cUXAoBoamq67bOJiIgQpaWlwtHRURQXF487phBCdHV1CQAiNzdX2tfa2ioAiLa2tnGvCw8PF9u3b5e2V61aJVauXCltj42NCYVCIWJjY6V9fX19AoA4e/asEEKI999/X6xZs8Zs3J6eHgFAdHR03LVuIqLJsrNY8iYimqLg4GDs3bsXAPD333/js88+w9q1a1FbW4uFCxfi/PnzuHjxIpycnMyu0+v16OzslLafeeYZ2NraSttqtRrNzc0AgKamJtja2mLVqlV3rcXX19fsegC4cuUKPDw8AACenp5mdbi7u8PW1hY2NjZm+65cuSJtnzp1Cunp6Whvb8fAwADGxsag1+sxNDQEuVwOAHjkkUfM7n3LuXPncOzYMXzzzTf3/BMhxnuGJUuWwGg04sMPP0RJSQl6e3sxMjICg8Eg1XGnMWxtbaFUKqHVas2e8da4AHD+/HlUVlbe9kYduPnWfNGiRfdUOxHRRDAAE9GspVAooNFopO3c3Fw89thjOHDgAD744AMMDg5ixYoVKCwsvO1aV1dX6fdz5swxOyaTyaRmMgcHh3uq5b9jyGQyADBrSLvTPe523+7ubqxbtw7x8fFIS0vD/PnzUV1djS1btmBkZEQKng4ODtL9/uvpp5+GUqnEoUOHEB4eftu9JvoMH3/8MXbt2oVPPvlEmpeclJRkNpXkXp7z/487ODiIF1544Y7zk2+FcCKi6cYATEQPDZlMBhsbGwwPDwMA/P398fXXX8PNzQ1z586d1JharRYmkwlVVVV4/vnnp7Pcu2poaIDJZEJWVpb0lrikpOSer3dxcUFpaSmCgoIQHR2NkpKSewrB46mpqUFERARefvllADcD7IULF+Dt7T3pMYGbf0bffvstPD09YWfH/5KI6P5gExwRzVoGgwH9/f3o7+9HW1sbEhMTpTeKALBhwwa4uLggIiICZ86cQVdXF06fPo3XX38dly5duqd7eHp6YuPGjYiLi8N3330njTGRMDoZGo0Go6Oj+PTTT/Hbb7+hoKAA+/btm9AYbm5uqKioQHt7u1lD22R4eXnh5MmT+Omnn9DW1oZXX30Vly9fnvR4t2zbtg3Xrl1DTEwM6urq0NnZiRMnTmDz5s0wGo1THp+I6E4YgIlo1iovL4darYZarcazzz6Luro6HD58GEFBQQAAuVyOH3/8ER4eHnjxxRexdOlSbNmyBXq9fkJvhPfu3YvIyEgkJCRgyZIl2Lp1K27cuDFDT3WTn58fsrOzkZGRAR8fHxQWFiI9PX3C46hUKlRUVKC5uRkbNmyYdKhMTU2Fv78/QkNDERQUBJVKNS2rzT3++OOoqamB0WjEmjVroNVqkZSUBGdnZ7P50URE00kmhBCWLoKIiIiI6H7h12siIiIisioMwERERERkVRiAiYiIiMiqMAATERERkVVhACYiIiIiq8IATERERERWhQGYiIiIiKwKAzARERERWRUGYCIiIiKyKgzARERERGRVGICJiIiIyKowABMRERGRVfk/9gF1TkW5uSAAAAAASUVORK5CYII=", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "from math import floor\n", "import matplotlib.pyplot as plt\n", "from matplotlib.ticker import AutoMinorLocator\n", + "import numpy as np\n", "\n", "\n", "def format_ms(ms: float):\n", " return f\"{floor(ms / 1000)}:{ms % 1000}\"\n", "\n", "\n", - "fig, ax = plt.subplots(figsize=(7, 5))\n", + "fig, ax = plt.subplots(figsize=(10, 7))\n", "\n", - "ax_sc = ax.scatter(\n", - " range(len(results_list)),\n", + "ax_plt = ax.plot(\n", " [result[\"run\"][1] for (_, result) in results_list],\n", - " label=\"mean run duration\",\n", + " \"o--\",\n", + " color=\"black\",\n", + " label=\"run duration mean\",\n", ")\n", + "color_rounds = plt.get_cmap(\"magma\")(\n", + " np.linspace(\n", + " 0,\n", + " 1,\n", + " max([k for _, result in results_list for k, _ in result[\"run_steps\"].items()])\n", + " + 1,\n", + " )\n", + ")\n", + "step_names = {\n", + " step_name: i\n", + " for i, step_name in enumerate(\n", + " set(\n", + " [\n", + " step_name\n", + " for _, result in results_list\n", + " for _, run_steps_k in result[\"run_steps\"].items()\n", + " for step_name in run_steps_k\n", + " if re.match(r\"round \\d+\", step_name) is None\n", + " ]\n", + " )\n", + " )\n", + "}\n", + "color_steps = plt.get_cmap(\"viridis\")(\n", + " np.linspace(\n", + " 0,\n", + " 1,\n", + " len(step_names),\n", + " )\n", + ")\n", + "for i, (_, result) in enumerate(results_list):\n", + " for k, run_steps_k in result[\"run_steps\"].items():\n", + " for step_name, (begin, end) in run_steps_k.items():\n", + " is_round = re.match(r\"round \\d+\", step_name) is not None\n", + " _ = ax.vlines(\n", + " i + (-0.05 if is_round else 0.05),\n", + " begin,\n", + " end,\n", + " colors=(\n", + " color_rounds[k] if is_round else color_steps[step_names[step_name]]\n", + " ),\n", + " linewidths=2.5,\n", + " # label=step_name,\n", + " )\n", "_ = ax.set_xticks(\n", " range(len(results_list)),\n", " [result_name for (result_name, _) in results_list],\n", " rotation=45,\n", " ha=\"right\",\n", ")\n", - "ax.tick_params(axis=\"y\", labelcolor=ax_sc.get_facecolors())\n", + "_ = ax.tick_params(axis=\"y\", labelcolor=ax_plt[0].get_color())\n", "ax.yaxis.set_major_formatter(lambda x, _: format_ms(x))\n", "ax.yaxis.set_minor_locator(AutoMinorLocator())\n", - "ax.set_ylabel(\"Duration (s:ms)\")\n", - "ax.set_xlabel(\"Benchmark name\")\n", + "_ = ax.set_ylabel(\"Duration (s:ms)\")\n", + "_ = ax.set_xlabel(\"Benchmark name\")\n", "\n", "ax2 = ax.twinx()\n", - "ax2_sc = ax2.scatter(\n", - " range(len(results_list)),\n", + "ax2_plt = ax2.plot(\n", " [result[\"run\"][0] for (_, result) in results_list],\n", - " s=15,\n", + " \"x:\",\n", + " ms=5,\n", " color=\"green\",\n", " label=\"#run\",\n", ")\n", - "ax2.tick_params(axis=\"y\", labelcolor=ax2_sc.get_facecolors())\n", - "ax2.set_ylabel(\"#run\")\n", + "_ = ax2.tick_params(axis=\"y\", labelcolor=ax2_plt[0].get_color())\n", + "_ = ax2.set_ylabel(\"#run\")\n", "\n", "_ = fig.legend(\n", " loc=\"upper right\",\n", From 35143ff40294ea8f69ac9361da14610be5013669 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Thu, 24 Jul 2025 11:04:36 +0200 Subject: [PATCH 238/251] =?UTF-8?q?=F0=9F=9A=A7=20Bench=20analysis=20run?= =?UTF-8?q?=20step=20details?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bench/analyze.ipynb | 120 +++++++++++++++++++++++++++----------------- 1 file changed, 75 insertions(+), 45 deletions(-) diff --git a/bench/analyze.ipynb b/bench/analyze.ipynb index 290bd42e..77b01aaf 100644 --- a/bench/analyze.ipynb +++ b/bench/analyze.ipynb @@ -183,7 +183,22 @@ "metadata": {}, "outputs": [], "source": [ - "results_list = sorted(results.items(), key=lambda result: result[0])" + "results_list = sorted(results.items(), key=lambda result: result[0])\n", + "\n", + "# {k: [result_idx, begin, end][]}\n", + "run_steps_round: dict[int, list[tuple[int, float, float]]] = {}\n", + "# {step_name: [k, result_idx, begin, end][]}\n", + "run_steps: dict[str, list[tuple[int, int, float, float]]] = {}\n", + "\n", + "for i, (_, result) in enumerate(results_list):\n", + " for k, run_steps_k in result[\"run_steps\"].items():\n", + " for step_name, (begin, end) in run_steps_k.items():\n", + " is_round = re.match(r\"round \\d+\", step_name) is not None\n", + "\n", + " if is_round:\n", + " run_steps_round.setdefault(k, []).append((i, begin, end))\n", + " else:\n", + " run_steps.setdefault(step_name, []).append((k, i, begin, end))" ] }, { @@ -203,6 +218,7 @@ "source": [ "from math import floor\n", "import matplotlib.pyplot as plt\n", + "from matplotlib.patches import Patch\n", "from matplotlib.ticker import AutoMinorLocator\n", "import numpy as np\n", "\n", @@ -213,12 +229,6 @@ "\n", "fig, ax = plt.subplots(figsize=(10, 7))\n", "\n", - "ax_plt = ax.plot(\n", - " [result[\"run\"][1] for (_, result) in results_list],\n", - " \"o--\",\n", - " color=\"black\",\n", - " label=\"run duration mean\",\n", - ")\n", "color_rounds = plt.get_cmap(\"magma\")(\n", " np.linspace(\n", " 0,\n", @@ -227,71 +237,91 @@ " + 1,\n", " )\n", ")\n", - "step_names = {\n", - " step_name: i\n", - " for i, step_name in enumerate(\n", - " set(\n", - " [\n", - " step_name\n", - " for _, result in results_list\n", - " for _, run_steps_k in result[\"run_steps\"].items()\n", - " for step_name in run_steps_k\n", - " if re.match(r\"round \\d+\", step_name) is None\n", - " ]\n", - " )\n", - " )\n", - "}\n", + "step_names_to_idx = {step_name: i for i, step_name in enumerate(run_steps)}\n", "color_steps = plt.get_cmap(\"viridis\")(\n", " np.linspace(\n", " 0,\n", " 1,\n", - " len(step_names),\n", + " len(step_names_to_idx),\n", " )\n", ")\n", - "for i, (_, result) in enumerate(results_list):\n", - " for k, run_steps_k in result[\"run_steps\"].items():\n", - " for step_name, (begin, end) in run_steps_k.items():\n", - " is_round = re.match(r\"round \\d+\", step_name) is not None\n", - " _ = ax.vlines(\n", - " i + (-0.05 if is_round else 0.05),\n", - " begin,\n", - " end,\n", - " colors=(\n", - " color_rounds[k] if is_round else color_steps[step_names[step_name]]\n", - " ),\n", - " linewidths=2.5,\n", - " # label=step_name,\n", - " )\n", + "line_rounds = []\n", + "for k, steps in run_steps_round.items():\n", + " line_rounds.append(\n", + " ax.vlines(\n", + " [i - 0.03 for i, _, _ in steps],\n", + " [begin for _, begin, _ in steps],\n", + " [end for _, _, end in steps],\n", + " colors=(color_rounds[k]),\n", + " linewidths=4,\n", + " label=str(k),\n", + " )\n", + " )\n", + "line_steps = []\n", + "for step_name, steps in run_steps.items():\n", + " line_steps.append(\n", + " ax.vlines(\n", + " [i + 0.03 for _, i, _, _ in steps],\n", + " [begin for _, _, begin, _ in steps],\n", + " [end for _, _, _, end in steps],\n", + " colors=(color_steps[step_names_to_idx[step_name]]),\n", + " linewidths=4,\n", + " label=step_name,\n", + " )\n", + " )\n", + "plt_run_dura = ax.plot(\n", + " [result[\"run\"][1] for (_, result) in results_list],\n", + " \"o--\",\n", + " color=\"black\",\n", + " label=\"run duration mean\",\n", + ")\n", "_ = ax.set_xticks(\n", " range(len(results_list)),\n", " [result_name for (result_name, _) in results_list],\n", " rotation=45,\n", " ha=\"right\",\n", ")\n", - "_ = ax.tick_params(axis=\"y\", labelcolor=ax_plt[0].get_color())\n", + "_ = ax.tick_params(axis=\"y\", labelcolor=plt_run_dura[0].get_color())\n", "ax.yaxis.set_major_formatter(lambda x, _: format_ms(x))\n", "ax.yaxis.set_minor_locator(AutoMinorLocator())\n", "_ = ax.set_ylabel(\"Duration (s:ms)\")\n", "_ = ax.set_xlabel(\"Benchmark name\")\n", "\n", "ax2 = ax.twinx()\n", - "ax2_plt = ax2.plot(\n", + "plt_run_times = ax2.plot(\n", " [result[\"run\"][0] for (_, result) in results_list],\n", " \"x:\",\n", " ms=5,\n", " color=\"green\",\n", " label=\"#run\",\n", ")\n", - "_ = ax2.tick_params(axis=\"y\", labelcolor=ax2_plt[0].get_color())\n", + "_ = ax2.tick_params(axis=\"y\", labelcolor=plt_run_times[0].get_color())\n", "_ = ax2.set_ylabel(\"#run\")\n", "\n", - "_ = fig.legend(\n", - " loc=\"upper right\",\n", - " # https://stackoverflow.com/a/47370214\n", - " bbox_to_anchor=(1, 1),\n", - " bbox_transform=ax.transAxes,\n", + "leg = fig.legend(\n", + " handles=[\n", + " *plt_run_dura,\n", + " *plt_run_times,\n", + " Patch(visible=False, label=\"\\n$\\\\bf{Rounds}$\"),\n", + " *line_rounds,\n", + " Patch(visible=False, label=\"\\n$\\\\bf{Steps}$\"),\n", + " *line_steps,\n", + " ],\n", + " # loc=\"upper right\",\n", + " # # https://stackoverflow.com/a/47370214\n", + " # bbox_to_anchor=(1, 1),\n", + " # bbox_transform=ax.transAxes,\n", ")\n", - "_ = ax.set_title(\"Benchmarks of running RAPTOR\")" + "# Move titles to the left from https://stackoverflow.com/a/68261686\n", + "for handle, label in zip(leg.legend_handles, leg.texts):\n", + " if handle is not None and not handle.get_visible():\n", + " width = handle.get_window_extent().width\n", + " label.set_horizontalalignment(\"left\")\n", + " label.set_position((-2 * width, 0))\n", + "\n", + "_ = ax.set_title(\n", + " f\"Benchmarks of running RAPTOR (fp_len={results_list[0][1][\"fp_run_max_len\"]})\"\n", + ")" ] } ], From 12f7467d9f870f7e37a5b5ec9108eefb3c18bf6f Mon Sep 17 00:00:00 2001 From: Catatomik Date: Thu, 24 Jul 2025 15:59:23 +0200 Subject: [PATCH 239/251] =?UTF-8?q?=F0=9F=9A=A7=20More=20traces?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/McRAPTOR.ts | 2 +- src/base.ts | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/McRAPTOR.ts b/src/McRAPTOR.ts index 6ae15188..be62038d 100644 --- a/src/McRAPTOR.ts +++ b/src/McRAPTOR.ts @@ -159,7 +159,7 @@ export default class McRAPTOR): void { - if (stop.transfers.length) this.trace("fp b sz", this.bags[this.k].get(stopId)!.size); + this.trace("fp b sz", this.bags[this.k].get(stopId)!.size); for (const pJourneyStep of this.bags[this.k].get(stopId)!) { // Prevent chaining transfers diff --git a/src/base.ts b/src/base.ts index 8a6ec461..87b35b3b 100644 --- a/src/base.ts +++ b/src/base.ts @@ -139,6 +139,7 @@ export default class BaseRAPTOR acc + 1, 0); } this.trace(`end fp lookup`); + this.trace(`scanned fp cnt ${cnt}`); + this.trace(`marked size fp lookup ${this.marked.size}`); - this.trace(`end round ${this.k}`) + this.trace(`end round ${this.k}`); // Stopping criterion if (this.marked.size === 0) break; } From a9af058a98886f63030353275292100b8cdcbbe1 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Thu, 24 Jul 2025 16:01:35 +0200 Subject: [PATCH 240/251] =?UTF-8?q?=F0=9F=9A=A7=20Make=20bench=20executabl?= =?UTF-8?q?e?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bench/bench.sh | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 bench/bench.sh diff --git a/bench/bench.sh b/bench/bench.sh old mode 100644 new mode 100755 From be80a083043b771dd4a0600ccc8074ac3211c501 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Thu, 24 Jul 2025 16:59:28 +0200 Subject: [PATCH 241/251] =?UTF-8?q?=F0=9F=9A=A7=20Plot=20more=20data?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bench/analyze.ipynb | 276 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 267 insertions(+), 9 deletions(-) diff --git a/bench/analyze.ipynb b/bench/analyze.ipynb index 77b01aaf..9faded74 100644 --- a/bench/analyze.ipynb +++ b/bench/analyze.ipynb @@ -18,14 +18,23 @@ "from os import listdir\n", "from os.path import join, isdir, isfile\n", "import re\n", + "import traceback\n", "from typing import TypedDict\n", "import json\n", "\n", "DATA_PREFIX = \"Using data type \"\n", + "DELAY_PREFIX = \"Using delay of \"\n", + "SHARED_SECURE_PREFIX = \"Shared secure \"\n", "INSTANCE_PREFIX = \"Using instance type \"\n", "CRITERIA_PREFIX = \"Using criteria \"\n", + "FP_QUERY_MAX_LEN_PREFIX = \"Foot paths query max len \"\n", "FP_RUN_MAX_LEN_PREFIX = \"Foot paths run max len \"\n", "BENCHMARK_PREFIX = \"Benchmark of \"\n", + "SCANNED_FP_PREFIX = \"scanned fp cnt \"\n", + "MARKED_TR_PREFIX = \"marked size traverse route \"\n", + "MARKED_FP_PREFIX = \"marked size fp lookup \"\n", + "F_ROUTE_BAG_SZ_PREFIX = \"final route bag sz=\"\n", + "FP_BAG_SZ_PREFIX = \"fp b sz \"\n", "\n", "UNKNOWN_LITERAL = \"Unknown\"\n", "\n", @@ -44,8 +53,11 @@ "\n", "class Result(TypedDict):\n", " data: str\n", + " delay: tuple[int, int] | None\n", " instance: str\n", + " shared_secure: bool | None\n", " criteria: list[str]\n", + " fp_query_max_len: int\n", " fp_run_max_len: int\n", "\n", " # Benchmarks\n", @@ -57,6 +69,14 @@ " result: tuple[int, int]\n", " post_treatment: tuple[int, int]\n", "\n", + " # Run stats\n", + " scanned_fp: dict[int, list[int]]\n", + " marked_tr: dict[int, list[int]]\n", + " marked_fp: dict[int, list[int]]\n", + " # MC-specific\n", + " f_route_bag_sz: dict[int, list[int]] | None\n", + " fp_bag_sz: dict[int, list[int]] | None\n", + "\n", "\n", "results: dict[str, Result] = {}\n", "\n", @@ -73,8 +93,11 @@ " with open(file_path) as raw_output:\n", " result = Result(\n", " data=UNKNOWN_LITERAL,\n", + " delay=None,\n", " instance=UNKNOWN_LITERAL,\n", + " shared_secure=None,\n", " criteria=[UNKNOWN_LITERAL],\n", + " fp_query_max_len=-1,\n", " fp_run_max_len=-1,\n", " compute_data=(0, -1),\n", " create_instance=(0, -1),\n", @@ -82,6 +105,11 @@ " run_steps={},\n", " result=(0, -1),\n", " post_treatment=(0, -1),\n", + " scanned_fp={},\n", + " marked_tr={},\n", + " marked_fp={},\n", + " f_route_bag_sz=None,\n", + " fp_bag_sz=None,\n", " )\n", "\n", " k = 0\n", @@ -91,11 +119,22 @@ "\n", " if line.startswith(DATA_PREFIX):\n", " result[\"data\"] = line[len(DATA_PREFIX) :]\n", + " elif line.startswith(DELAY_PREFIX):\n", + " neg, pos = line[len(DELAY_PREFIX) : -1].split(\"s, \")\n", + " result[\"delay\"] = (int(neg), int(pos))\n", " elif line.startswith(INSTANCE_PREFIX):\n", " result[\"instance\"] = line[len(INSTANCE_PREFIX) :]\n", + " elif line.startswith(SHARED_SECURE_PREFIX):\n", + " result[\"shared_secure\"] = json.loads(\n", + " line[len(SHARED_SECURE_PREFIX) :]\n", + " )\n", " elif line.startswith(CRITERIA_PREFIX):\n", " result[\"criteria\"] = json.loads(\n", - " line[len(CRITERIA_PREFIX) :]\n", + " line[len(CRITERIA_PREFIX) :].replace(\"'\", '\"')\n", + " )\n", + " elif line.startswith(FP_QUERY_MAX_LEN_PREFIX):\n", + " result[\"fp_query_max_len\"] = json.loads(\n", + " line[len(FP_QUERY_MAX_LEN_PREFIX) :]\n", " )\n", " elif line.startswith(FP_RUN_MAX_LEN_PREFIX):\n", " result[\"fp_run_max_len\"] = json.loads(\n", @@ -153,17 +192,51 @@ " if step_name == \"end\":\n", " k = 0\n", "\n", + " elif (\n", + " matches := re.search(\n", + " r\"^\\[(?P\\d+.\\d+)\\] (?P.+)$\",\n", + " line,\n", + " )\n", + " ) is not None:\n", + " line = matches.group(\"msg\")\n", + "\n", + " if line.startswith(SCANNED_FP_PREFIX):\n", + " result[\"scanned_fp\"].setdefault(k, []).append(\n", + " int(line[len(SCANNED_FP_PREFIX) :])\n", + " )\n", + " elif line.startswith(MARKED_TR_PREFIX):\n", + " result[\"marked_tr\"].setdefault(k, []).append(\n", + " int(line[len(MARKED_TR_PREFIX) :])\n", + " )\n", + " elif line.startswith(MARKED_FP_PREFIX):\n", + " result[\"marked_fp\"].setdefault(k, []).append(\n", + " int(line[len(MARKED_FP_PREFIX) :])\n", + " )\n", + " elif line.startswith(F_ROUTE_BAG_SZ_PREFIX):\n", + " if result[\"f_route_bag_sz\"] is None:\n", + " result[\"f_route_bag_sz\"] = {}\n", + " result[\"f_route_bag_sz\"].setdefault(k, []).append(\n", + " int(line[len(F_ROUTE_BAG_SZ_PREFIX) :])\n", + " )\n", + " elif line.startswith(FP_BAG_SZ_PREFIX):\n", + " if result[\"fp_bag_sz\"] is None:\n", + " result[\"fp_bag_sz\"] = {}\n", + " result[\"fp_bag_sz\"].setdefault(k, []).append(\n", + " int(line[len(FP_BAG_SZ_PREFIX) :])\n", + " )\n", + "\n", + " run_times = result[\"run\"][0]\n", " for k, run_steps_k in result[\"run_steps\"].items():\n", " for step_name, (begin, end) in run_steps_k.items():\n", " run_steps_k[step_name] = (\n", - " begin / result[\"run\"][0],\n", - " end / result[\"run\"][0],\n", + " begin / run_times,\n", + " end / run_times,\n", " )\n", "\n", " results[node] = result\n", " print(\"Done.\")\n", " except Exception as exc:\n", - " print(f\"Error: {exc}\")\n", + " print(\"Error: \\n\", \"\\n\".join(traceback.format_exception(exc)))\n", "\n", "# results" ] @@ -183,6 +256,8 @@ "metadata": {}, "outputs": [], "source": [ + "from functools import reduce\n", + "\n", "results_list = sorted(results.items(), key=lambda result: result[0])\n", "\n", "# {k: [result_idx, begin, end][]}\n", @@ -198,12 +273,30 @@ " if is_round:\n", " run_steps_round.setdefault(k, []).append((i, begin, end))\n", " else:\n", - " run_steps.setdefault(step_name, []).append((k, i, begin, end))" + " run_steps.setdefault(step_name, []).append((k, i, begin, end))\n", + "\n", + "\n", + "def dict_append_by_key[K, T](d: dict[K, list[T]], k: K, el: T) -> dict[K, list[T]]:\n", + " d.setdefault(k, []).append(el)\n", + " return d\n", + "\n", + "\n", + "results_by_data: dict[str, list[tuple[str, Result]]] = reduce(\n", + " lambda acc, v: dict_append_by_key(acc, v[1][\"data\"], v), results_list, {}\n", + ")\n", + "results_by_instance: dict[str, list[tuple[str, Result]]] = reduce(\n", + " lambda acc, v: dict_append_by_key(acc, v[1][\"instance\"], v), results_list, {}\n", + ")\n", + "results_by_data_instance: dict[str, list[tuple[str, Result]]] = reduce(\n", + " lambda acc, v: dict_append_by_key(acc, f\"{v[1][\"data\"]}-{v[1][\"instance\"]}\", v),\n", + " results_list,\n", + " {},\n", + ")" ] }, { "cell_type": "markdown", - "id": "01d3903c", + "id": "64a48ea5", "metadata": {}, "source": [ "# Plot" @@ -212,7 +305,7 @@ { "cell_type": "code", "execution_count": null, - "id": "01778364", + "id": "2469a8f6", "metadata": {}, "outputs": [], "source": [ @@ -224,10 +317,95 @@ "\n", "\n", "def format_ms(ms: float):\n", - " return f\"{floor(ms / 1000)}:{ms % 1000}\"\n", + " return f\"{floor(ms / 1000)}:{ms % 1000}\"" + ] + }, + { + "cell_type": "markdown", + "id": "1cb781ac", + "metadata": {}, + "source": [ + "# Plot pre-running" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2e0bb862", + "metadata": {}, + "outputs": [], + "source": [ + "fig, ax = plt.subplots(figsize=(len(results_by_data_instance) + 2, 7))\n", "\n", + "results_by_data_instance_list = list(results_by_data_instance.items())\n", "\n", - "fig, ax = plt.subplots(figsize=(10, 7))\n", + "ax_plt = ax.plot(\n", + " [\n", + " sum(map(lambda result: result[1][\"compute_data\"][1], results)) / len(results)\n", + " for (_, results) in results_by_data_instance_list\n", + " ],\n", + " \"o--\",\n", + " color=\"black\",\n", + " label=\"Compute data\",\n", + ")\n", + "_ = ax.tick_params(axis=\"y\", labelcolor=ax_plt[0].get_color())\n", + "_ = ax.set_xticks(\n", + " range(len(results_by_data_instance_list)),\n", + " [data_instance for (data_instance, _) in results_by_data_instance_list],\n", + " rotation=45,\n", + " ha=\"right\",\n", + ")\n", + "ax.yaxis.set_major_formatter(lambda x, _: format_ms(x))\n", + "ax.yaxis.set_minor_locator(AutoMinorLocator())\n", + "_ = ax.set_ylabel(\"Duration (s:ms)\")\n", + "_ = ax.set_xlabel(\"Data-instance\")\n", + "\n", + "ax2 = ax.twinx()\n", + "ax2_plt = ax2.plot(\n", + " [\n", + " sum(map(lambda result: result[1][\"create_instance\"][1], results)) / len(results)\n", + " for (_, results) in results_by_data_instance_list\n", + " ],\n", + " \"x:\",\n", + " ms=5,\n", + " color=\"green\",\n", + " label=\"Create instance\",\n", + ")\n", + "_ = ax2.tick_params(axis=\"y\", labelcolor=ax2_plt[0].get_color())\n", + "ax2.yaxis.set_major_formatter(lambda x, _: format_ms(x))\n", + "_ = ax2.set_ylabel(\"Duration (s:ms)\")\n", + "\n", + "leg = fig.legend(\n", + " # loc=\"upper right\",\n", + " # # https://stackoverflow.com/a/47370214\n", + " # bbox_to_anchor=(1, 1),\n", + " # bbox_transform=ax.transAxes,\n", + ")\n", + "# Move titles to the left from https://stackoverflow.com/a/68261686\n", + "\n", + "_ = ax.set_title(\n", + " f\"Benchmarks of pre-running RAPTOR (fp_query_len={results_list[0][1][\"fp_query_max_len\"]},fp_run_len={results_list[0][1][\"fp_run_max_len\"]})\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "01d3903c", + "metadata": {}, + "source": [ + "# Plot running" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "01778364", + "metadata": {}, + "outputs": [], + "source": [ + "FIG_WIDTH=len(results) + 2\n", + "\n", + "fig, ax = plt.subplots(figsize=(FIG_WIDTH, 7))\n", "\n", "color_rounds = plt.get_cmap(\"magma\")(\n", " np.linspace(\n", @@ -323,6 +501,86 @@ " f\"Benchmarks of running RAPTOR (fp_len={results_list[0][1][\"fp_run_max_len\"]})\"\n", ")" ] + }, + { + "cell_type": "markdown", + "id": "66580a30", + "metadata": {}, + "source": [ + "# Plot metrics" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b42abf33", + "metadata": {}, + "outputs": [], + "source": [ + "from typing import Literal\n", + "from matplotlib.axes import Axes\n", + "\n", + "k_cnt = max(map(lambda result: len(result[\"run_steps\"]), results.values())) - 1\n", + "\n", + "metrics: list[\n", + " Literal[\"scanned_fp\"]\n", + " | Literal[\"marked_tr\"]\n", + " | Literal[\"marked_fp\"]\n", + " | Literal[\"f_route_bag_sz\"]\n", + " | Literal[\"fp_bag_sz\"]\n", + "] = [\n", + " \"scanned_fp\",\n", + " \"marked_tr\",\n", + " \"marked_fp\",\n", + " \"f_route_bag_sz\",\n", + " \"fp_bag_sz\",\n", + "]\n", + "\n", + "for metric in metrics:\n", + " fig = plt.figure(\n", + " layout=\"constrained\",\n", + " figsize=(\n", + " FIG_WIDTH,\n", + " 6 * k_cnt,\n", + " ),\n", + " )\n", + " _ = fig.suptitle(f\"{metric}\")\n", + "\n", + " axs: list[Axes] = fig.subplots(k_cnt, 1, sharex=True)\n", + "\n", + " for k, ax in enumerate(axs):\n", + " pos_data: list[tuple[int, list[int]]] = list(\n", + " filter(\n", + " lambda p_d: p_d[1] is not None,\n", + " [\n", + " (\n", + " i + 1,\n", + " (\n", + " result[metric][k + 1]\n", + " if k + 1 in (result[metric] or {})\n", + " else None\n", + " ),\n", + " )\n", + " for i, (_, result) in enumerate(results_list)\n", + " ],\n", + " )\n", + " )\n", + " _ = ax.violinplot(\n", + " [data for _, data in pos_data],\n", + " [pos for pos, _ in pos_data],\n", + " showmeans=True,\n", + " )\n", + " _ = ax.set_xticks(\n", + " range(1, len(results_list) + 1),\n", + " [result_name for (result_name, _) in results_list],\n", + " rotation=45,\n", + " ha=\"right\",\n", + " )\n", + " _ = ax.set_title(f\"Round {k+1}\")\n", + " # Thousand separator, from https://stackoverflow.com/questions/16670125/python-format-string-thousand-separator-with-spaces\n", + " ax.yaxis.set_major_formatter(lambda x, _: \"{:,}\".format(x))\n", + " _ = ax.yaxis.set_minor_locator(AutoMinorLocator())" + ] } ], "metadata": { From 23648be2ee02a061bc84833f971cbfd0a23b84b8 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Mon, 18 Aug 2025 09:21:43 +0000 Subject: [PATCH 242/251] Updating coverage badges --- badges/coverage-functions.svg | 2 +- badges/coverage-lines.svg | 2 +- badges/coverage-statements.svg | 2 +- badges/coverage-total.svg | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/badges/coverage-functions.svg b/badges/coverage-functions.svg index fd6da43f..8830f012 100644 --- a/badges/coverage-functions.svg +++ b/badges/coverage-functions.svg @@ -1 +1 @@ -Coverage: functions: 93.87%Coverage: functions93.87% \ No newline at end of file +Coverage: functions: 93.93%Coverage: functions93.93% \ No newline at end of file diff --git a/badges/coverage-lines.svg b/badges/coverage-lines.svg index 9b447b68..8232c4ef 100644 --- a/badges/coverage-lines.svg +++ b/badges/coverage-lines.svg @@ -1 +1 @@ -Coverage: lines: 95.72%Coverage: lines95.72% \ No newline at end of file +Coverage: lines: 95.9%Coverage: lines95.9% \ No newline at end of file diff --git a/badges/coverage-statements.svg b/badges/coverage-statements.svg index 990778a4..471c28e3 100644 --- a/badges/coverage-statements.svg +++ b/badges/coverage-statements.svg @@ -1 +1 @@ -Coverage: statements: 94.49%Coverage: statements94.49% \ No newline at end of file +Coverage: statements: 94.69%Coverage: statements94.69% \ No newline at end of file diff --git a/badges/coverage-total.svg b/badges/coverage-total.svg index 660ef3b9..f143f5d5 100644 --- a/badges/coverage-total.svg +++ b/badges/coverage-total.svg @@ -1 +1 @@ -Coverage: total: 92.26%Coverage: total92.26% \ No newline at end of file +Coverage: total: 92.37%Coverage: total92.37% \ No newline at end of file From fc60b9bc49c1a2c14980e5632c48f433c3cb9348 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Fri, 22 Aug 2025 17:18:14 +0200 Subject: [PATCH 243/251] =?UTF-8?q?=F0=9F=9A=A8=20Compatibility=20with=20i?= =?UTF-8?q?solatedModules?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/models/result.model.ts | 2 +- tsconfig.jest.json | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/test/models/result.model.ts b/src/test/models/result.model.ts index e2e2cbe8..141fd6ba 100644 --- a/src/test/models/result.model.ts +++ b/src/test/models/result.model.ts @@ -17,7 +17,7 @@ import { deleteModelWithClass, getModelForClass, prop, type Ref } from "@typegoo import { TimeStamps } from "@typegoose/typegoose/lib/defaultClasses"; import { modelOptions } from "@typegoose/typegoose/lib/modelOptions"; import { Connection } from "mongoose"; -import { InternalTimeInt, RAPTORRunSettings } from "../../"; +import type { InternalTimeInt, RAPTORRunSettings } from "../../"; import { dbAddresses } from "./addresses.model"; import { dbTBM_Stops } from "./TBM_stops.model"; import { dbTBM_ScheduledRoutes } from "./TBMScheduledRoutes.model"; diff --git a/tsconfig.jest.json b/tsconfig.jest.json index 23f06db2..d8b648ef 100644 --- a/tsconfig.jest.json +++ b/tsconfig.jest.json @@ -6,6 +6,8 @@ "sourceMap": true, "declaration": true, "isolatedModules": true, + "experimentalDecorators": true, + "emitDecoratorMetadata": true, "types": [ "node", "jest" From b3b5ca4eb05dc54898812d004c3493c9fcf6f324 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Fri, 22 Aug 2025 15:19:29 +0000 Subject: [PATCH 244/251] Updating coverage badges --- badges/coverage-lines.svg | 2 +- badges/coverage-statements.svg | 2 +- badges/coverage-total.svg | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/badges/coverage-lines.svg b/badges/coverage-lines.svg index 4ffb8975..51a3bc5c 100644 --- a/badges/coverage-lines.svg +++ b/badges/coverage-lines.svg @@ -1 +1 @@ -Coverage: lines: 95.9%Coverage: lines95.9% +Coverage: lines: 95.86%Coverage: lines95.86% \ No newline at end of file diff --git a/badges/coverage-statements.svg b/badges/coverage-statements.svg index 9c5fc6e3..471c28e3 100644 --- a/badges/coverage-statements.svg +++ b/badges/coverage-statements.svg @@ -1 +1 @@ -Coverage: statements: 94.69%Coverage: statements94.69% +Coverage: statements: 94.69%Coverage: statements94.69% \ No newline at end of file diff --git a/badges/coverage-total.svg b/badges/coverage-total.svg index 3014f53b..dde55e0f 100644 --- a/badges/coverage-total.svg +++ b/badges/coverage-total.svg @@ -1 +1 @@ -Coverage: total: 92.37%Coverage: total92.37% +Coverage: total: 92.44%Coverage: total92.44% \ No newline at end of file From 9c4ec35c2f7e7c7e3bb8061904857227ef250f7c Mon Sep 17 00:00:00 2001 From: Catatomik Date: Fri, 29 Aug 2025 11:02:13 +0200 Subject: [PATCH 245/251] =?UTF-8?q?=F0=9F=9A=A7=20Trip=20structure=20chang?= =?UTF-8?q?es?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/index.ts | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/test/index.ts b/src/test/index.ts index 89c4a09f..af7a5275 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -160,9 +160,8 @@ async function computeRAPTORData( [ _id, stops, - trips.map(({ tripId, schedules }) => ({ - id: tripId, - times: schedules + trips.map(({ schedules }) => + schedules .map<[(typeof schedules)[number], [number, number]]>((schedule) => [ schedule, typeof schedule === "object" && "hor_estime" in schedule @@ -193,7 +192,7 @@ async function computeRAPTORData( } } else return [arr, dep] satisfies [unknown, unknown]; }), - })), + ), ] satisfies [unknown, unknown, unknown], ), ] as ConstructorParameters>; @@ -235,9 +234,9 @@ type InstanceType = "RAPTOR" | "SharedRAPTOR" | "McRAPTOR" | "McSharedRAPTOR"; function postTreatment( postCriteria: Criterion[], - data: IRAPTORData, + data: IRAPTORData, instanceType: InstanceType, - results: ReturnType["getBestJourneys"]>, + results: ReturnType["getBestJourneys"]>, pt: SharedID, ) { const timeType = data.timeType; @@ -269,7 +268,7 @@ type DBJourneyReal = Omit & { steps: (JourneyStepBase | JourneyStepFoot | JourneyStepVehicle)[]; }; function journeyDBFormatter( - journey: NonNullable["getBestJourneys"]>[number][number]>, + journey: NonNullable["getBestJourneys"]>[number][number]>, ): DBJourneyReal { return { steps: journey.map((js) => ({ @@ -298,7 +297,7 @@ async function insertResults["getBestJourneys"]>, + results: ReturnType["getBestJourneys"]>, ) { if (!results.length) throw new Error("No journey found"); @@ -535,10 +534,10 @@ Command-line interface: )); if (!b4.lastReturn) throw new Error("No RAPTOR instance"); const [RAPTORDataInst, RAPTORInstance] = b4.lastReturn as readonly [ - Omit, "attachStops"> & { + Omit, "attachStops"> & { attachStops: SharedRAPTORData["attachStops"]; }, - BaseRAPTOR, + BaseRAPTOR, ]; if (sharedSecure) (RAPTORDataInst as SharedRAPTORData).secure = true; From a06348c655f6a2447c832622d2fc4b34cbb559ef Mon Sep 17 00:00:00 2001 From: Catatomik Date: Tue, 2 Sep 2025 18:00:33 +0200 Subject: [PATCH 246/251] =?UTF-8?q?=F0=9F=90=9B=E2=9C=85=20Error=20when=20?= =?UTF-8?q?iterating=20over=20shared=20empty=20stops=20or=20routes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/structures/shared.ts | 4 ++++ test/structures/shared.test.ts | 12 ++++++++++++ 2 files changed, 16 insertions(+) diff --git a/src/structures/shared.ts b/src/structures/shared.ts index 232e169e..f61b3e44 100644 --- a/src/structures/shared.ts +++ b/src/structures/shared.ts @@ -560,6 +560,8 @@ class SharedRAPTORData implements IRAPTORData) { + if (this.sDataView.length === 0) return undefined; + const seen = new Set(); const stopRetriever = new StopRetriever(this.sDataView, this.rDataView, 0, PtrType.Stop, null); @@ -611,6 +613,8 @@ class SharedRAPTORData implements IRAPTORData) { + if (this.rDataView.length === 0) return undefined; + const routeRetriever = new RouteRetriever(this.timeType, this.sDataView, this.rDataView, 0, PtrType.Route, null); for (let ptr = 0; ptr < this.rDataView.length; ptr += routeRetriever.point(ptr).chunkSize) { /** diff --git a/test/structures/shared.test.ts b/test/structures/shared.test.ts index 65d6fb16..1143f4a3 100644 --- a/test/structures/shared.test.ts +++ b/test/structures/shared.test.ts @@ -87,6 +87,18 @@ describe("SharedRAPTORData class", () => { test("All routes are present", () => { testRoutes(timeType, routes, SharedRAPTORDataInst); }); + + test("With empty stops or routes", () => { + const emptySharedRAPTORDataInst = SharedRAPTORData.makeFromRawData(sharedTimeScal, [], []); + + expect(() => { + for (const [_, stop] of emptySharedRAPTORDataInst.stops) void stop.id; + }).not.toThrow(); + + expect(() => { + for (const [_, route] of emptySharedRAPTORDataInst.routes) void route.id; + }).not.toThrow(); + }); }); describe("From internal data instantiation", () => { From fba682d608b09f7df7060cd50d8a8e74fb9dc638 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Tue, 2 Sep 2025 16:03:48 +0000 Subject: [PATCH 247/251] Updating coverage badges --- badges/coverage-branches.svg | 2 +- badges/coverage-functions.svg | 2 +- badges/coverage-lines.svg | 2 +- badges/coverage-statements.svg | 2 +- badges/coverage-total.svg | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/badges/coverage-branches.svg b/badges/coverage-branches.svg index c3bc74d8..b3e85f55 100644 --- a/badges/coverage-branches.svg +++ b/badges/coverage-branches.svg @@ -1 +1 @@ -Coverage: branches: 85.39%Coverage: branches85.39% \ No newline at end of file +Coverage: branches: 85.53%Coverage: branches85.53% \ No newline at end of file diff --git a/badges/coverage-functions.svg b/badges/coverage-functions.svg index 5f274d07..66c721c9 100644 --- a/badges/coverage-functions.svg +++ b/badges/coverage-functions.svg @@ -1 +1 @@ -Coverage: functions: 93.78%Coverage: functions93.78% \ No newline at end of file +Coverage: functions: 93.84%Coverage: functions93.84% \ No newline at end of file diff --git a/badges/coverage-lines.svg b/badges/coverage-lines.svg index 2f16e6bb..4c9a2bc4 100644 --- a/badges/coverage-lines.svg +++ b/badges/coverage-lines.svg @@ -1 +1 @@ -Coverage: lines: 95.71%Coverage: lines95.71% +Coverage: lines: 95.85%Coverage: lines95.85% \ No newline at end of file diff --git a/badges/coverage-statements.svg b/badges/coverage-statements.svg index 5f93094f..c9075dad 100644 --- a/badges/coverage-statements.svg +++ b/badges/coverage-statements.svg @@ -1 +1 @@ -Coverage: statements: 94.55%Coverage: statements94.55% +Coverage: statements: 94.72%Coverage: statements94.72% \ No newline at end of file diff --git a/badges/coverage-total.svg b/badges/coverage-total.svg index 72e35a87..93f923e3 100644 --- a/badges/coverage-total.svg +++ b/badges/coverage-total.svg @@ -1 +1 @@ -Coverage: total: 92.35%Coverage: total92.35% +Coverage: total: 92.48%Coverage: total92.48% \ No newline at end of file From 5dd2d6073fc03d09f5c17343b097aff7520deead Mon Sep 17 00:00:00 2001 From: Catatomik Date: Fri, 5 Sep 2025 15:09:39 +0200 Subject: [PATCH 248/251] =?UTF-8?q?=E2=AC=86=EF=B8=8F=E2=9E=95=20BIBM?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitmodules | 4 + bibm | 1 + package.json | 9 +- pnpm-lock.yaml | 472 ++++++++++++++++++++++++++----------------------- 4 files changed, 265 insertions(+), 221 deletions(-) create mode 100644 .gitmodules create mode 160000 bibm diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..a38010e5 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,4 @@ +[submodule "bibm"] + path = bibm + url = https://github.com/Cata-Dev/Best-itinerary-Bordeaux-Metropole.git + branch = dev diff --git a/bibm b/bibm new file mode 160000 index 00000000..6f8247e1 --- /dev/null +++ b/bibm @@ -0,0 +1 @@ +Subproject commit 6f8247e17aaac6ca6cfc5826ee182933afeccbdf diff --git a/package.json b/package.json index 4c35000c..0f58b421 100644 --- a/package.json +++ b/package.json @@ -26,12 +26,15 @@ "author": "Catatomik", "license": "MIT", "dependencies": { + "@bibm/common": "link:bibm/Common", + "@bibm/compute": "link:bibm/Compute", + "@bibm/data": "link:bibm/Data", "@catatomik/dijkstra": "github:catatomik/dijkstra", - "@typegoose/typegoose": "^12.17.0", + "@typegoose/typegoose": "^12.19.0", "core-js": "^3.44.0", "minimist": "^1.2.8", - "mongodb": "^6.17.0", - "mongoose": "^8.16.2" + "mongodb": "^6.19.0", + "mongoose": "^8.18.0" }, "devDependencies": { "0x": "^6.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3c35d13d..32aecb94 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,24 +8,33 @@ importers: .: dependencies: + '@bibm/common': + specifier: link:bibm/Common + version: link:bibm/Common + '@bibm/compute': + specifier: link:bibm/Compute + version: link:bibm/Compute + '@bibm/data': + specifier: link:bibm/Data + version: link:bibm/Data '@catatomik/dijkstra': specifier: github:catatomik/dijkstra version: https://codeload.github.com/catatomik/dijkstra/tar.gz/e3304b71e4bda9aefb04d2d18b32e7aa369a4aed '@typegoose/typegoose': - specifier: ^12.17.0 - version: 12.17.0(mongoose@8.16.2) + specifier: ^12.19.0 + version: 12.19.0(mongoose@8.18.0) core-js: specifier: ^3.44.0 - version: 3.44.0 + version: 3.45.1 minimist: specifier: ^1.2.8 version: 1.2.8 mongodb: - specifier: ^6.17.0 - version: 6.17.0 + specifier: ^6.19.0 + version: 6.19.0 mongoose: - specifier: ^8.16.2 - version: 8.16.2 + specifier: ^8.18.0 + version: 8.18.0 devDependencies: 0x: specifier: ^6.0.0 @@ -44,7 +53,7 @@ importers: version: 1.2.5 '@types/node': specifier: ^22 - version: 22.15.32 + version: 22.18.1 eslint: specifier: ^9.34.0 version: 9.34.0 @@ -53,13 +62,13 @@ importers: version: 16.3.0 jest: specifier: ^30.1.2 - version: 30.1.3(@types/node@22.15.32) + version: 30.1.3(@types/node@22.18.1) prettier: specifier: ^3.6.2 version: 3.6.2 ts-jest: specifier: ^29.4.1 - version: 29.4.1(@babel/core@7.28.3)(@jest/transform@30.1.2)(@jest/types@30.0.5)(babel-jest@30.1.2(@babel/core@7.28.3))(jest-util@30.0.5)(jest@30.1.3(@types/node@22.15.32))(typescript@5.9.2) + version: 29.4.1(@babel/core@7.28.3)(@jest/transform@30.1.2)(@jest/types@30.0.5)(babel-jest@30.1.2(@babel/core@7.28.3))(jest-util@30.0.5)(jest@30.1.3(@types/node@22.18.1))(typescript@5.9.2) typedoc: specifier: ^0.28.12 version: 0.28.12(typescript@5.9.2) @@ -68,7 +77,7 @@ importers: version: 5.9.2 typescript-eslint: specifier: ^8.41.0 - version: 8.41.0(eslint@9.34.0)(typescript@5.9.2) + version: 8.42.0(eslint@9.34.0)(typescript@5.9.2) packages: @@ -250,17 +259,17 @@ packages: resolution: {tarball: https://codeload.github.com/catatomik/dijkstra/tar.gz/e3304b71e4bda9aefb04d2d18b32e7aa369a4aed} version: 1.0.0 - '@emnapi/core@1.4.5': - resolution: {integrity: sha512-XsLw1dEOpkSX/WucdqUhPWP7hDxSvZiY+fsUC14h+FtQ2Ifni4znbBt8punRX+Uj2JG/uDb8nEHVKvrVlvdZ5Q==} + '@emnapi/core@1.5.0': + resolution: {integrity: sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg==} - '@emnapi/runtime@1.4.5': - resolution: {integrity: sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==} + '@emnapi/runtime@1.5.0': + resolution: {integrity: sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==} - '@emnapi/wasi-threads@1.0.4': - resolution: {integrity: sha512-PJR+bOmMOPH8AtcTGAyYNiuJ3/Fcoj2XN/gBEWzDIKh254XO+mM9XoXHk5GNEhodxeMznbg7BlRojVbKN+gC6g==} + '@emnapi/wasi-threads@1.1.0': + resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} - '@eslint-community/eslint-utils@4.7.0': - resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} + '@eslint-community/eslint-utils@4.8.0': + resolution: {integrity: sha512-MJQFqrZgcW0UNYLGOuQpey/oTN59vyWwplvCGZztn1cKz9agZPPYpJB7h2OMmuu7VLqkvEjN8feFZJmxNF9D+Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 @@ -297,25 +306,21 @@ packages: resolution: {integrity: sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@gerrit0/mini-shiki@3.12.1': - resolution: {integrity: sha512-qA9/VGm7No0kxb7k0oKFT0DSJ6BtuMMtC7JQdZn9ElMALE9hjbyoaS13Y8OWr0qHwzh07KHt3Wbw34az/FLsrg==} + '@gerrit0/mini-shiki@3.12.2': + resolution: {integrity: sha512-HKZPmO8OSSAAo20H2B3xgJdxZaLTwtlMwxg0967scnrDlPwe6j5+ULGHyIqwgTbFCn9yv/ff8CmfWZLE9YKBzA==} '@humanfs/core@0.19.1': resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} engines: {node: '>=18.18.0'} - '@humanfs/node@0.16.6': - resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} + '@humanfs/node@0.16.7': + resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} engines: {node: '>=18.18.0'} '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - '@humanwhocodes/retry@0.3.1': - resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} - engines: {node: '>=18.18'} - '@humanwhocodes/retry@0.4.3': resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} @@ -453,23 +458,23 @@ packages: resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - '@shikijs/engine-oniguruma@3.12.1': - resolution: {integrity: sha512-hbYq+XOc55CU7Irkhsgwh8WgQbx2W5IVzHV4l+wZ874olMLSNg5o3F73vo9m4SAhimFyqq/86xnx9h+T30HhhQ==} + '@shikijs/engine-oniguruma@3.12.2': + resolution: {integrity: sha512-hozwnFHsLvujK4/CPVHNo3Bcg2EsnG8krI/ZQ2FlBlCRpPZW4XAEQmEwqegJsypsTAN9ehu2tEYe30lYKSZW/w==} - '@shikijs/langs@3.12.1': - resolution: {integrity: sha512-Y1MbMfVO5baRz7Boo7EoD36TmzfUx/I5n8e+wZumx6SlUA81Zj1ZwNJL871iIuSHrdsheV4AxJtHQ9mlooklmg==} + '@shikijs/langs@3.12.2': + resolution: {integrity: sha512-bVx5PfuZHDSHoBal+KzJZGheFuyH4qwwcwG/n+MsWno5cTlKmaNtTsGzJpHYQ8YPbB5BdEdKU1rga5/6JGY8ww==} - '@shikijs/themes@3.12.1': - resolution: {integrity: sha512-9JrAm9cA5hqM/YXymA3oAAZdnCgQf1zyrNDtsnM105nNEoEpux4dyzdoOjc2KawEKj1iUs/WH2ota6Atp7GYkQ==} + '@shikijs/themes@3.12.2': + resolution: {integrity: sha512-fTR3QAgnwYpfGczpIbzPjlRnxyONJOerguQv1iwpyQZ9QXX4qy/XFQqXlf17XTsorxnHoJGbH/LXBvwtqDsF5A==} - '@shikijs/types@3.12.1': - resolution: {integrity: sha512-Is/p+1vTss22LIsGCJTmGrxu7ZC1iBL9doJFYLaZ4aI8d0VDXb7Mn0kBzhkc7pdsRpmUbQLQ5HXwNpa3H6F8og==} + '@shikijs/types@3.12.2': + resolution: {integrity: sha512-K5UIBzxCyv0YoxN3LMrKB9zuhp1bV+LgewxuVwHdl4Gz5oePoUFrr9EfgJlGlDeXCU1b/yhdnXeuRvAnz8HN8Q==} '@shikijs/vscode-textmate@10.0.2': resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} - '@sinclair/typebox@0.34.40': - resolution: {integrity: sha512-gwBNIP8ZAYev/ORDWW0QvxdwPXwxBtLsdsJgSc7eDIRt8ubP+rxUBzPsrwnu16fgEF8Bx4lh/+mvQvJzcTM6Kw==} + '@sinclair/typebox@0.34.41': + resolution: {integrity: sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==} '@sinonjs/commons@3.0.1': resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} @@ -483,11 +488,11 @@ packages: '@tybys/wasm-util@0.10.0': resolution: {integrity: sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ==} - '@typegoose/typegoose@12.17.0': - resolution: {integrity: sha512-oty0KpmURqJBZiBD0DuEhpKaMwB5KDAoosvVB3V2JI630b1WMGSN2IeiiCqEhKAhTCxRwmMM48YrX1Ih6BMg/A==} + '@typegoose/typegoose@12.19.0': + resolution: {integrity: sha512-rsHMd3M6Rj6YYw6ecZU6YtXjiBzCqO3zJtgrrVCau1bEp6na8sbMcqRy8kNbTRyA2QCBAGEvM7nXTM8hdxeEiQ==} engines: {node: '>=16.20.1'} peerDependencies: - mongoose: ~8.16.0 + mongoose: ~8.18.0 '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} @@ -498,8 +503,8 @@ packages: '@types/babel__template@7.4.4': resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} - '@types/babel__traverse@7.20.7': - resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==} + '@types/babel__traverse@7.28.0': + resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} @@ -522,8 +527,8 @@ packages: '@types/minimist@1.2.5': resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} - '@types/node@22.15.32': - resolution: {integrity: sha512-3jigKqgSjsH6gYZv2nEsqdXfZqIFGAV36XYYjf9KGZ3PSG+IhLecqPnI310RvjutyMwifE2hhhNEklOUrvx/wA==} + '@types/node@22.18.1': + resolution: {integrity: sha512-rzSDyhn4cYznVG+PCzGe1lwuMYJrcBS1fc3JqSa2PvtABwWo+dZ1ij5OVok3tqfpEBCBoaR4d7upFJk73HRJDw==} '@types/stack-utils@2.0.3': resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} @@ -543,63 +548,63 @@ packages: '@types/yargs@17.0.33': resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} - '@typescript-eslint/eslint-plugin@8.41.0': - resolution: {integrity: sha512-8fz6oa6wEKZrhXWro/S3n2eRJqlRcIa6SlDh59FXJ5Wp5XRZ8B9ixpJDcjadHq47hMx0u+HW6SNa6LjJQ6NLtw==} + '@typescript-eslint/eslint-plugin@8.42.0': + resolution: {integrity: sha512-Aq2dPqsQkxHOLfb2OPv43RnIvfj05nw8v/6n3B2NABIPpHnjQnaLo9QGMTvml+tv4korl/Cjfrb/BYhoL8UUTQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.41.0 + '@typescript-eslint/parser': ^8.42.0 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/parser@8.41.0': - resolution: {integrity: sha512-gTtSdWX9xiMPA/7MV9STjJOOYtWwIJIYxkQxnSV1U3xcE+mnJSH3f6zI0RYP+ew66WSlZ5ed+h0VCxsvdC1jJg==} + '@typescript-eslint/parser@8.42.0': + resolution: {integrity: sha512-r1XG74QgShUgXph1BYseJ+KZd17bKQib/yF3SR+demvytiRXrwd12Blnz5eYGm8tXaeRdd4x88MlfwldHoudGg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/project-service@8.41.0': - resolution: {integrity: sha512-b8V9SdGBQzQdjJ/IO3eDifGpDBJfvrNTp2QD9P2BeqWTGrRibgfgIlBSw6z3b6R7dPzg752tOs4u/7yCLxksSQ==} + '@typescript-eslint/project-service@8.42.0': + resolution: {integrity: sha512-vfVpLHAhbPjilrabtOSNcUDmBboQNrJUiNAGoImkZKnMjs2TIcWG33s4Ds0wY3/50aZmTMqJa6PiwkwezaAklg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/scope-manager@8.41.0': - resolution: {integrity: sha512-n6m05bXn/Cd6DZDGyrpXrELCPVaTnLdPToyhBoFkLIMznRUQUEQdSp96s/pcWSQdqOhrgR1mzJ+yItK7T+WPMQ==} + '@typescript-eslint/scope-manager@8.42.0': + resolution: {integrity: sha512-51+x9o78NBAVgQzOPd17DkNTnIzJ8T/O2dmMBLoK9qbY0Gm52XJcdJcCl18ExBMiHo6jPMErUQWUv5RLE51zJw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.41.0': - resolution: {integrity: sha512-TDhxYFPUYRFxFhuU5hTIJk+auzM/wKvWgoNYOPcOf6i4ReYlOoYN8q1dV5kOTjNQNJgzWN3TUUQMtlLOcUgdUw==} + '@typescript-eslint/tsconfig-utils@8.42.0': + resolution: {integrity: sha512-kHeFUOdwAJfUmYKjR3CLgZSglGHjbNTi1H8sTYRYV2xX6eNz4RyJ2LIgsDLKf8Yi0/GL1WZAC/DgZBeBft8QAQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/type-utils@8.41.0': - resolution: {integrity: sha512-63qt1h91vg3KsjVVonFJWjgSK7pZHSQFKH6uwqxAH9bBrsyRhO6ONoKyXxyVBzG1lJnFAJcKAcxLS54N1ee1OQ==} + '@typescript-eslint/type-utils@8.42.0': + resolution: {integrity: sha512-9KChw92sbPTYVFw3JLRH1ockhyR3zqqn9lQXol3/YbI6jVxzWoGcT3AsAW0mu1MY0gYtsXnUGV/AKpkAj5tVlQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/types@8.41.0': - resolution: {integrity: sha512-9EwxsWdVqh42afLbHP90n2VdHaWU/oWgbH2P0CfcNfdKL7CuKpwMQGjwev56vWu9cSKU7FWSu6r9zck6CVfnag==} + '@typescript-eslint/types@8.42.0': + resolution: {integrity: sha512-LdtAWMiFmbRLNP7JNeY0SqEtJvGMYSzfiWBSmx+VSZ1CH+1zyl8Mmw1TT39OrtsRvIYShjJWzTDMPWZJCpwBlw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.41.0': - resolution: {integrity: sha512-D43UwUYJmGhuwHfY7MtNKRZMmfd8+p/eNSfFe6tH5mbVDto+VQCayeAt35rOx3Cs6wxD16DQtIKw/YXxt5E0UQ==} + '@typescript-eslint/typescript-estree@8.42.0': + resolution: {integrity: sha512-ku/uYtT4QXY8sl9EDJETD27o3Ewdi72hcXg1ah/kkUgBvAYHLwj2ofswFFNXS+FL5G+AGkxBtvGt8pFBHKlHsQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/utils@8.41.0': - resolution: {integrity: sha512-udbCVstxZ5jiPIXrdH+BZWnPatjlYwJuJkDA4Tbo3WyYLh8NvB+h/bKeSZHDOFKfphsZYJQqaFtLeXEqurQn1A==} + '@typescript-eslint/utils@8.42.0': + resolution: {integrity: sha512-JnIzu7H3RH5BrKC4NoZqRfmjqCIS1u3hGZltDYJgkVdqAezl4L9d1ZLw+36huCujtSBSAirGINF/S4UxOcR+/g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/visitor-keys@8.41.0': - resolution: {integrity: sha512-+GeGMebMCy0elMNg67LRNoVnUFPIm37iu5CmHESVx56/9Jsfdpsvbv605DQ81Pi/x11IdKUsS5nzgTYbCQU9fg==} + '@typescript-eslint/visitor-keys@8.42.0': + resolution: {integrity: sha512-3WbiuzoEowaEn8RSnhJBrxSwX8ULYE9CXaPepS2C2W3NSA5NNIvBaslpBSBElPq0UGr0xVJlXFWOAKIkyylydQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@tyriar/fibonacci-heap@2.0.9': @@ -747,8 +752,8 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - ansi-regex@6.1.0: - resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + ansi-regex@6.2.0: + resolution: {integrity: sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg==} engines: {node: '>=12'} ansi-styles@2.2.1: @@ -872,8 +877,8 @@ packages: engines: {node: '>= 0.8'} hasBin: true - browserslist@4.25.2: - resolution: {integrity: sha512-0si2SJK3ooGzIawRu61ZdPCO1IncZwS8IzuX73sPZsXW6EQ/w/DAfPyKI8l1ETTCr2MnvqWitmlCUxgdul45jA==} + browserslist@4.25.4: + resolution: {integrity: sha512-4jYpcjabC606xJ3kw2QwGEZKX0Aw7sgQdZCvIK9dhVSPh76BKo+C+btT1RRofH7B+8iNpEbgGNVWiLki5q93yg==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -930,8 +935,8 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - caniuse-lite@1.0.30001735: - resolution: {integrity: sha512-EV/laoX7Wq2J9TQlyIXRxTJqIw4sxfXS4OYgudGxBYRuTv0q7AM6yMEpU/Vo1I94thg9U6EZ2NfZx9GJq83u7w==} + caniuse-lite@1.0.30001741: + resolution: {integrity: sha512-QGUGitqsc8ARjLdgAfxETDhRbJ0REsP6O3I96TAth/mVjh2cYzN2u+3AzPP3aVSm2FehEItaJw1xd+IGBXWeSw==} chalk@1.1.3: resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} @@ -1007,8 +1012,8 @@ packages: convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - core-js@3.44.0: - resolution: {integrity: sha512-aFCtd4l6GvAXwVEh3XbbVqJGHDJt0OZRa+5ePGx3LLwi12WfexqQxcsohb2wgsa/92xtl19Hd66G/L+TaAxDMw==} + core-js@3.45.1: + resolution: {integrity: sha512-L4NPsJlCfZsPeXukyzHFlg/i7IIVwHSItR0wg0FLNqYClJ4MQYTYLbC7EkjKYRLZF2iof2MUgN0EGy7MdQFChg==} core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} @@ -1102,8 +1107,8 @@ packages: supports-color: optional: true - dedent@1.6.0: - resolution: {integrity: sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA==} + dedent@1.7.0: + resolution: {integrity: sha512-HGFtf8yhuhGhqO07SV79tRp+br4MnbdjeVxotpn1QBl30pcLLCQjX5b2295ll0fv8RKDKsmWYrl05usHM9CewQ==} peerDependencies: babel-plugin-macros: ^3.1.0 peerDependenciesMeta: @@ -1164,8 +1169,8 @@ packages: eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - electron-to-chromium@1.5.203: - resolution: {integrity: sha512-uz4i0vLhfm6dLZWbz/iH88KNDV+ivj5+2SA+utpgjKaj9Q0iDLuwk6Idhe9BTxciHudyx6IvTvijhkPvFGUQ0g==} + electron-to-chromium@1.5.214: + resolution: {integrity: sha512-TpvUNdha+X3ybfU78NoQatKvQEm1oq3lf2QbnmCEdw+Bd9RuIAY+hJTvq1avzHM0f7EJfnH3vbCnbzKzisc/9Q==} elliptic@6.6.1: resolution: {integrity: sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==} @@ -1309,8 +1314,8 @@ packages: fast-safe-stringify@2.1.1: resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} - fast-uri@3.0.6: - resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} + fast-uri@3.1.0: + resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} fastq@1.19.1: resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} @@ -1630,8 +1635,8 @@ packages: resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} engines: {node: '>=10'} - istanbul-reports@3.1.7: - resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + istanbul-reports@3.2.0: + resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} engines: {node: '>=8'} jackspeak@3.4.3: @@ -1801,8 +1806,8 @@ packages: engines: {node: '>=6'} hasBin: true - jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + jsonfile@6.2.0: + resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} jsonparse@1.3.1: resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} @@ -1960,8 +1965,8 @@ packages: mongodb-connection-string-url@3.0.2: resolution: {integrity: sha512-rMO7CGo/9BFwyZABcKAWL8UJwH/Kc2x0g72uhDWzG48URRax5TCIcJ7Rc3RZqffZzO/Gwff/jyKwCU9TN8gehA==} - mongodb@6.17.0: - resolution: {integrity: sha512-neerUzg/8U26cgruLysKEjJvoNSXhyID3RvzvdcpsIi2COYM3FS3o9nlH7fxFtefTb942dX3W9i37oPfCVj4wA==} + mongodb@6.18.0: + resolution: {integrity: sha512-fO5ttN9VC8P0F5fqtQmclAkgXZxbIkYRTUi1j8JO6IYwvamkhtYDilJr35jOPELR49zqCJgXZWwCtW7B+TM8vQ==} engines: {node: '>=16.20.1'} peerDependencies: '@aws-sdk/credential-providers': ^3.188.0 @@ -1987,12 +1992,39 @@ packages: socks: optional: true - mongoose@8.16.2: - resolution: {integrity: sha512-52T4XPhDgJL4cqooBsOORzYBH3ddMwABMEF/LV7TgvD2DEKZlnYTc2HF9ch1U2lcKjhE4pQ+WuInfLFJbguGcQ==} + mongodb@6.19.0: + resolution: {integrity: sha512-H3GtYujOJdeKIMLKBT9PwlDhGrQfplABNF1G904w6r5ZXKWyv77aB0X9B+rhmaAwjtllHzaEkvi9mkGVZxs2Bw==} + engines: {node: '>=16.20.1'} + peerDependencies: + '@aws-sdk/credential-providers': ^3.188.0 + '@mongodb-js/zstd': ^1.1.0 || ^2.0.0 + gcp-metadata: ^5.2.0 + kerberos: ^2.0.1 + mongodb-client-encryption: '>=6.0.0 <7' + snappy: ^7.3.2 + socks: ^2.7.1 + peerDependenciesMeta: + '@aws-sdk/credential-providers': + optional: true + '@mongodb-js/zstd': + optional: true + gcp-metadata: + optional: true + kerberos: + optional: true + mongodb-client-encryption: + optional: true + snappy: + optional: true + socks: + optional: true + + mongoose@8.18.0: + resolution: {integrity: sha512-3TixPihQKBdyaYDeJqRjzgb86KbilEH07JmzV8SoSjgoskNTpa6oTBmDxeoF9p8YnWQoz7shnCyPkSV/48y3yw==} engines: {node: '>=16.20.1'} - morphdom@2.7.5: - resolution: {integrity: sha512-z6bfWFMra7kBqDjQGHud1LSXtq5JJC060viEkQFMBX6baIecpkNr2Ywrn2OQfWP3rXiNFQRPoFjD8/TvJcWcDg==} + morphdom@2.7.7: + resolution: {integrity: sha512-04GmsiBcalrSCNmzfo+UjU8tt3PhZJKzcOy+r1FlGA7/zri8wre3I1WkYN9PT3sIeIKfW9bpyElA+VzOg2E24g==} mpath@0.9.0: resolution: {integrity: sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==} @@ -2018,8 +2050,8 @@ packages: nanohtml@1.10.0: resolution: {integrity: sha512-r/3AQl+jxAxUIJRiKExUjBtFcE1cm4yTOsTIdVqqlxPNtBxJh522ANrcQYzdNHhPzbPgb7j6qujq6eGehBX0kg==} - napi-postinstall@0.3.2: - resolution: {integrity: sha512-tWVJxJHmBWLy69PvO96TZMZDrzmw5KeiZBz3RHmiM2XZ9grBJ2WgMAFVVg25nqp3ZjTFUs2Ftw1JhscL3Teliw==} + napi-postinstall@0.3.3: + resolution: {integrity: sha512-uTp172LLXSxuSYHv/kou+f6KW3SMppU9ivthaVTXian9sOt3XM/zHYHpRZiLgQoxeWfYUnslNWQHF1+G71xcow==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} hasBin: true @@ -2611,8 +2643,8 @@ packages: peerDependencies: typescript: 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x || 5.9.x - typescript-eslint@8.41.0: - resolution: {integrity: sha512-n66rzs5OBXW3SFSnZHr2T685q1i4ODm2nulFJhMZBotaTavsS8TrI3d7bDlRSs9yWo7HmyWrN9qDu14Qv7Y0Dw==} + typescript-eslint@8.42.0: + resolution: {integrity: sha512-ozR/rQn+aQXQxh1YgbCzQWDFrsi9mcg+1PM3l/z5o1+20P7suOIaNg515bpr/OYt6FObz/NHcBstydDLHWeEKg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -2774,7 +2806,7 @@ snapshots: jsonstream2: 3.0.0 make-dir: 3.1.0 minimist: 1.2.8 - morphdom: 2.7.5 + morphdom: 2.7.7 nanohtml: 1.10.0 on-net-listen: 1.1.2 opn: 5.5.0 @@ -2834,7 +2866,7 @@ snapshots: dependencies: '@babel/compat-data': 7.28.0 '@babel/helper-validator-option': 7.27.1 - browserslist: 4.25.2 + browserslist: 4.25.4 lru-cache: 5.1.1 semver: 6.3.1 @@ -2987,23 +3019,23 @@ snapshots: dependencies: '@tyriar/fibonacci-heap': 2.0.9 - '@emnapi/core@1.4.5': + '@emnapi/core@1.5.0': dependencies: - '@emnapi/wasi-threads': 1.0.4 + '@emnapi/wasi-threads': 1.1.0 tslib: 2.8.1 optional: true - '@emnapi/runtime@1.4.5': + '@emnapi/runtime@1.5.0': dependencies: tslib: 2.8.1 optional: true - '@emnapi/wasi-threads@1.0.4': + '@emnapi/wasi-threads@1.1.0': dependencies: tslib: 2.8.1 optional: true - '@eslint-community/eslint-utils@4.7.0(eslint@9.34.0)': + '@eslint-community/eslint-utils@4.8.0(eslint@9.34.0)': dependencies: eslint: 9.34.0 eslint-visitor-keys: 3.4.3 @@ -3047,25 +3079,23 @@ snapshots: '@eslint/core': 0.15.2 levn: 0.4.1 - '@gerrit0/mini-shiki@3.12.1': + '@gerrit0/mini-shiki@3.12.2': dependencies: - '@shikijs/engine-oniguruma': 3.12.1 - '@shikijs/langs': 3.12.1 - '@shikijs/themes': 3.12.1 - '@shikijs/types': 3.12.1 + '@shikijs/engine-oniguruma': 3.12.2 + '@shikijs/langs': 3.12.2 + '@shikijs/themes': 3.12.2 + '@shikijs/types': 3.12.2 '@shikijs/vscode-textmate': 10.0.2 '@humanfs/core@0.19.1': {} - '@humanfs/node@0.16.6': + '@humanfs/node@0.16.7': dependencies: '@humanfs/core': 0.19.1 - '@humanwhocodes/retry': 0.3.1 + '@humanwhocodes/retry': 0.4.3 '@humanwhocodes/module-importer@1.0.1': {} - '@humanwhocodes/retry@0.3.1': {} - '@humanwhocodes/retry@0.4.3': {} '@isaacs/cliui@8.0.2': @@ -3090,7 +3120,7 @@ snapshots: '@jest/console@30.1.2': dependencies: '@jest/types': 30.0.5 - '@types/node': 22.15.32 + '@types/node': 22.18.1 chalk: 4.1.2 jest-message-util: 30.1.0 jest-util: 30.0.5 @@ -3104,14 +3134,14 @@ snapshots: '@jest/test-result': 30.1.3 '@jest/transform': 30.1.2 '@jest/types': 30.0.5 - '@types/node': 22.15.32 + '@types/node': 22.18.1 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 4.3.0 exit-x: 0.2.2 graceful-fs: 4.2.11 jest-changed-files: 30.0.5 - jest-config: 30.1.3(@types/node@22.15.32) + jest-config: 30.1.3(@types/node@22.18.1) jest-haste-map: 30.1.0 jest-message-util: 30.1.0 jest-regex-util: 30.0.1 @@ -3138,7 +3168,7 @@ snapshots: dependencies: '@jest/fake-timers': 30.1.2 '@jest/types': 30.0.5 - '@types/node': 22.15.32 + '@types/node': 22.18.1 jest-mock: 30.0.5 '@jest/expect-utils@30.1.2': @@ -3156,7 +3186,7 @@ snapshots: dependencies: '@jest/types': 30.0.5 '@sinonjs/fake-timers': 13.0.5 - '@types/node': 22.15.32 + '@types/node': 22.18.1 jest-message-util: 30.1.0 jest-mock: 30.0.5 jest-util: 30.0.5 @@ -3174,7 +3204,7 @@ snapshots: '@jest/pattern@30.0.1': dependencies: - '@types/node': 22.15.32 + '@types/node': 22.18.1 jest-regex-util: 30.0.1 '@jest/reporters@30.1.3': @@ -3185,7 +3215,7 @@ snapshots: '@jest/transform': 30.1.2 '@jest/types': 30.0.5 '@jridgewell/trace-mapping': 0.3.30 - '@types/node': 22.15.32 + '@types/node': 22.18.1 chalk: 4.1.2 collect-v8-coverage: 1.0.2 exit-x: 0.2.2 @@ -3195,7 +3225,7 @@ snapshots: istanbul-lib-instrument: 6.0.3 istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 5.0.6 - istanbul-reports: 3.1.7 + istanbul-reports: 3.2.0 jest-message-util: 30.1.0 jest-util: 30.0.5 jest-worker: 30.1.0 @@ -3207,7 +3237,7 @@ snapshots: '@jest/schemas@30.0.5': dependencies: - '@sinclair/typebox': 0.34.40 + '@sinclair/typebox': 0.34.41 '@jest/snapshot-utils@30.1.2': dependencies: @@ -3262,7 +3292,7 @@ snapshots: '@jest/schemas': 30.0.5 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 22.15.32 + '@types/node': 22.18.1 '@types/yargs': 17.0.33 chalk: 4.1.2 @@ -3286,8 +3316,8 @@ snapshots: '@napi-rs/wasm-runtime@0.2.12': dependencies: - '@emnapi/core': 1.4.5 - '@emnapi/runtime': 1.4.5 + '@emnapi/core': 1.5.0 + '@emnapi/runtime': 1.5.0 '@tybys/wasm-util': 0.10.0 optional: true @@ -3308,27 +3338,27 @@ snapshots: '@pkgr/core@0.2.9': {} - '@shikijs/engine-oniguruma@3.12.1': + '@shikijs/engine-oniguruma@3.12.2': dependencies: - '@shikijs/types': 3.12.1 + '@shikijs/types': 3.12.2 '@shikijs/vscode-textmate': 10.0.2 - '@shikijs/langs@3.12.1': + '@shikijs/langs@3.12.2': dependencies: - '@shikijs/types': 3.12.1 + '@shikijs/types': 3.12.2 - '@shikijs/themes@3.12.1': + '@shikijs/themes@3.12.2': dependencies: - '@shikijs/types': 3.12.1 + '@shikijs/types': 3.12.2 - '@shikijs/types@3.12.1': + '@shikijs/types@3.12.2': dependencies: '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 '@shikijs/vscode-textmate@10.0.2': {} - '@sinclair/typebox@0.34.40': {} + '@sinclair/typebox@0.34.41': {} '@sinonjs/commons@3.0.1': dependencies: @@ -3345,11 +3375,11 @@ snapshots: tslib: 2.8.1 optional: true - '@typegoose/typegoose@12.17.0(mongoose@8.16.2)': + '@typegoose/typegoose@12.19.0(mongoose@8.18.0)': dependencies: lodash: 4.17.21 loglevel: 1.9.2 - mongoose: 8.16.2 + mongoose: 8.18.0 reflect-metadata: 0.2.2 semver: 7.7.2 tslib: 2.8.1 @@ -3360,7 +3390,7 @@ snapshots: '@babel/types': 7.28.2 '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 - '@types/babel__traverse': 7.20.7 + '@types/babel__traverse': 7.28.0 '@types/babel__generator@7.27.0': dependencies: @@ -3371,7 +3401,7 @@ snapshots: '@babel/parser': 7.28.3 '@babel/types': 7.28.2 - '@types/babel__traverse@7.20.7': + '@types/babel__traverse@7.28.0': dependencies: '@babel/types': 7.28.2 @@ -3395,7 +3425,7 @@ snapshots: '@types/minimist@1.2.5': {} - '@types/node@22.15.32': + '@types/node@22.18.1': dependencies: undici-types: 6.21.0 @@ -3415,14 +3445,14 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@8.41.0(@typescript-eslint/parser@8.41.0(eslint@9.34.0)(typescript@5.9.2))(eslint@9.34.0)(typescript@5.9.2)': + '@typescript-eslint/eslint-plugin@8.42.0(@typescript-eslint/parser@8.42.0(eslint@9.34.0)(typescript@5.9.2))(eslint@9.34.0)(typescript@5.9.2)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.41.0(eslint@9.34.0)(typescript@5.9.2) - '@typescript-eslint/scope-manager': 8.41.0 - '@typescript-eslint/type-utils': 8.41.0(eslint@9.34.0)(typescript@5.9.2) - '@typescript-eslint/utils': 8.41.0(eslint@9.34.0)(typescript@5.9.2) - '@typescript-eslint/visitor-keys': 8.41.0 + '@typescript-eslint/parser': 8.42.0(eslint@9.34.0)(typescript@5.9.2) + '@typescript-eslint/scope-manager': 8.42.0 + '@typescript-eslint/type-utils': 8.42.0(eslint@9.34.0)(typescript@5.9.2) + '@typescript-eslint/utils': 8.42.0(eslint@9.34.0)(typescript@5.9.2) + '@typescript-eslint/visitor-keys': 8.42.0 eslint: 9.34.0 graphemer: 1.4.0 ignore: 7.0.5 @@ -3432,41 +3462,41 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.41.0(eslint@9.34.0)(typescript@5.9.2)': + '@typescript-eslint/parser@8.42.0(eslint@9.34.0)(typescript@5.9.2)': dependencies: - '@typescript-eslint/scope-manager': 8.41.0 - '@typescript-eslint/types': 8.41.0 - '@typescript-eslint/typescript-estree': 8.41.0(typescript@5.9.2) - '@typescript-eslint/visitor-keys': 8.41.0 + '@typescript-eslint/scope-manager': 8.42.0 + '@typescript-eslint/types': 8.42.0 + '@typescript-eslint/typescript-estree': 8.42.0(typescript@5.9.2) + '@typescript-eslint/visitor-keys': 8.42.0 debug: 4.4.1 eslint: 9.34.0 typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.41.0(typescript@5.9.2)': + '@typescript-eslint/project-service@8.42.0(typescript@5.9.2)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.41.0(typescript@5.9.2) - '@typescript-eslint/types': 8.41.0 + '@typescript-eslint/tsconfig-utils': 8.42.0(typescript@5.9.2) + '@typescript-eslint/types': 8.42.0 debug: 4.4.1 typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.41.0': + '@typescript-eslint/scope-manager@8.42.0': dependencies: - '@typescript-eslint/types': 8.41.0 - '@typescript-eslint/visitor-keys': 8.41.0 + '@typescript-eslint/types': 8.42.0 + '@typescript-eslint/visitor-keys': 8.42.0 - '@typescript-eslint/tsconfig-utils@8.41.0(typescript@5.9.2)': + '@typescript-eslint/tsconfig-utils@8.42.0(typescript@5.9.2)': dependencies: typescript: 5.9.2 - '@typescript-eslint/type-utils@8.41.0(eslint@9.34.0)(typescript@5.9.2)': + '@typescript-eslint/type-utils@8.42.0(eslint@9.34.0)(typescript@5.9.2)': dependencies: - '@typescript-eslint/types': 8.41.0 - '@typescript-eslint/typescript-estree': 8.41.0(typescript@5.9.2) - '@typescript-eslint/utils': 8.41.0(eslint@9.34.0)(typescript@5.9.2) + '@typescript-eslint/types': 8.42.0 + '@typescript-eslint/typescript-estree': 8.42.0(typescript@5.9.2) + '@typescript-eslint/utils': 8.42.0(eslint@9.34.0)(typescript@5.9.2) debug: 4.4.1 eslint: 9.34.0 ts-api-utils: 2.1.0(typescript@5.9.2) @@ -3474,14 +3504,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.41.0': {} + '@typescript-eslint/types@8.42.0': {} - '@typescript-eslint/typescript-estree@8.41.0(typescript@5.9.2)': + '@typescript-eslint/typescript-estree@8.42.0(typescript@5.9.2)': dependencies: - '@typescript-eslint/project-service': 8.41.0(typescript@5.9.2) - '@typescript-eslint/tsconfig-utils': 8.41.0(typescript@5.9.2) - '@typescript-eslint/types': 8.41.0 - '@typescript-eslint/visitor-keys': 8.41.0 + '@typescript-eslint/project-service': 8.42.0(typescript@5.9.2) + '@typescript-eslint/tsconfig-utils': 8.42.0(typescript@5.9.2) + '@typescript-eslint/types': 8.42.0 + '@typescript-eslint/visitor-keys': 8.42.0 debug: 4.4.1 fast-glob: 3.3.3 is-glob: 4.0.3 @@ -3492,20 +3522,20 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.41.0(eslint@9.34.0)(typescript@5.9.2)': + '@typescript-eslint/utils@8.42.0(eslint@9.34.0)(typescript@5.9.2)': dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.34.0) - '@typescript-eslint/scope-manager': 8.41.0 - '@typescript-eslint/types': 8.41.0 - '@typescript-eslint/typescript-estree': 8.41.0(typescript@5.9.2) + '@eslint-community/eslint-utils': 4.8.0(eslint@9.34.0) + '@typescript-eslint/scope-manager': 8.42.0 + '@typescript-eslint/types': 8.42.0 + '@typescript-eslint/typescript-estree': 8.42.0(typescript@5.9.2) eslint: 9.34.0 typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.41.0': + '@typescript-eslint/visitor-keys@8.42.0': dependencies: - '@typescript-eslint/types': 8.41.0 + '@typescript-eslint/types': 8.42.0 eslint-visitor-keys: 4.2.1 '@tyriar/fibonacci-heap@2.0.9': {} @@ -3602,7 +3632,7 @@ snapshots: ajv@8.17.1: dependencies: fast-deep-equal: 3.1.3 - fast-uri: 3.0.6 + fast-uri: 3.1.0 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 @@ -3614,7 +3644,7 @@ snapshots: ansi-regex@5.0.1: {} - ansi-regex@6.1.0: {} + ansi-regex@6.2.0: {} ansi-styles@2.2.1: {} @@ -3840,12 +3870,12 @@ snapshots: vm-browserify: 1.1.2 xtend: 4.0.2 - browserslist@4.25.2: + browserslist@4.25.4: dependencies: - caniuse-lite: 1.0.30001735 - electron-to-chromium: 1.5.203 + caniuse-lite: 1.0.30001741 + electron-to-chromium: 1.5.214 node-releases: 2.0.19 - update-browserslist-db: 1.1.3(browserslist@4.25.2) + update-browserslist-db: 1.1.3(browserslist@4.25.4) bs-logger@0.2.6: dependencies: @@ -3898,7 +3928,7 @@ snapshots: camelcase@6.3.0: {} - caniuse-lite@1.0.30001735: {} + caniuse-lite@1.0.30001741: {} chalk@1.1.3: dependencies: @@ -3975,7 +4005,7 @@ snapshots: convert-source-map@2.0.0: {} - core-js@3.44.0: {} + core-js@3.45.1: {} core-util-is@1.0.3: {} @@ -4115,7 +4145,7 @@ snapshots: dependencies: ms: 2.1.3 - dedent@1.6.0: {} + dedent@1.7.0: {} deep-is@0.1.4: {} @@ -4182,7 +4212,7 @@ snapshots: eastasianwidth@0.2.0: {} - electron-to-chromium@1.5.203: {} + electron-to-chromium@1.5.214: {} elliptic@6.6.1: dependencies: @@ -4239,7 +4269,7 @@ snapshots: eslint@9.34.0: dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.34.0) + '@eslint-community/eslint-utils': 4.8.0(eslint@9.34.0) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.21.0 '@eslint/config-helpers': 0.3.1 @@ -4247,7 +4277,7 @@ snapshots: '@eslint/eslintrc': 3.3.1 '@eslint/js': 9.34.0 '@eslint/plugin-kit': 0.3.5 - '@humanfs/node': 0.16.6 + '@humanfs/node': 0.16.7 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 '@types/estree': 1.0.8 @@ -4349,7 +4379,7 @@ snapshots: fast-safe-stringify@2.1.1: {} - fast-uri@3.0.6: {} + fast-uri@3.1.0: {} fastq@1.19.1: dependencies: @@ -4396,7 +4426,7 @@ snapshots: fs-extra@10.1.0: dependencies: graceful-fs: 4.2.11 - jsonfile: 6.1.0 + jsonfile: 6.2.0 universalify: 2.0.1 fs.realpath@1.0.0: {} @@ -4672,7 +4702,7 @@ snapshots: transitivePeerDependencies: - supports-color - istanbul-reports@3.1.7: + istanbul-reports@3.2.0: dependencies: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 @@ -4695,10 +4725,10 @@ snapshots: '@jest/expect': 30.1.2 '@jest/test-result': 30.1.3 '@jest/types': 30.0.5 - '@types/node': 22.15.32 + '@types/node': 22.18.1 chalk: 4.1.2 co: 4.6.0 - dedent: 1.6.0 + dedent: 1.7.0 is-generator-fn: 2.1.0 jest-each: 30.1.0 jest-matcher-utils: 30.1.2 @@ -4715,7 +4745,7 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@30.1.3(@types/node@22.15.32): + jest-cli@30.1.3(@types/node@22.18.1): dependencies: '@jest/core': 30.1.3 '@jest/test-result': 30.1.3 @@ -4723,7 +4753,7 @@ snapshots: chalk: 4.1.2 exit-x: 0.2.2 import-local: 3.2.0 - jest-config: 30.1.3(@types/node@22.15.32) + jest-config: 30.1.3(@types/node@22.18.1) jest-util: 30.0.5 jest-validate: 30.1.0 yargs: 17.7.2 @@ -4734,7 +4764,7 @@ snapshots: - supports-color - ts-node - jest-config@30.1.3(@types/node@22.15.32): + jest-config@30.1.3(@types/node@22.18.1): dependencies: '@babel/core': 7.28.3 '@jest/get-type': 30.1.0 @@ -4761,7 +4791,7 @@ snapshots: slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: - '@types/node': 22.15.32 + '@types/node': 22.18.1 transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -4790,7 +4820,7 @@ snapshots: '@jest/environment': 30.1.2 '@jest/fake-timers': 30.1.2 '@jest/types': 30.0.5 - '@types/node': 22.15.32 + '@types/node': 22.18.1 jest-mock: 30.0.5 jest-util: 30.0.5 jest-validate: 30.1.0 @@ -4798,7 +4828,7 @@ snapshots: jest-haste-map@30.1.0: dependencies: '@jest/types': 30.0.5 - '@types/node': 22.15.32 + '@types/node': 22.18.1 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -4837,7 +4867,7 @@ snapshots: jest-mock@30.0.5: dependencies: '@jest/types': 30.0.5 - '@types/node': 22.15.32 + '@types/node': 22.18.1 jest-util: 30.0.5 jest-pnp-resolver@1.2.3(jest-resolve@30.1.3): @@ -4871,7 +4901,7 @@ snapshots: '@jest/test-result': 30.1.3 '@jest/transform': 30.1.2 '@jest/types': 30.0.5 - '@types/node': 22.15.32 + '@types/node': 22.18.1 chalk: 4.1.2 emittery: 0.13.1 exit-x: 0.2.2 @@ -4900,7 +4930,7 @@ snapshots: '@jest/test-result': 30.1.3 '@jest/transform': 30.1.2 '@jest/types': 30.0.5 - '@types/node': 22.15.32 + '@types/node': 22.18.1 chalk: 4.1.2 cjs-module-lexer: 2.1.0 collect-v8-coverage: 1.0.2 @@ -4947,7 +4977,7 @@ snapshots: jest-util@30.0.5: dependencies: '@jest/types': 30.0.5 - '@types/node': 22.15.32 + '@types/node': 22.18.1 chalk: 4.1.2 ci-info: 4.3.0 graceful-fs: 4.2.11 @@ -4966,7 +4996,7 @@ snapshots: dependencies: '@jest/test-result': 30.1.3 '@jest/types': 30.0.5 - '@types/node': 22.15.32 + '@types/node': 22.18.1 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -4975,18 +5005,18 @@ snapshots: jest-worker@30.1.0: dependencies: - '@types/node': 22.15.32 + '@types/node': 22.18.1 '@ungap/structured-clone': 1.3.0 jest-util: 30.0.5 merge-stream: 2.0.0 supports-color: 8.1.1 - jest@30.1.3(@types/node@22.15.32): + jest@30.1.3(@types/node@22.18.1): dependencies: '@jest/core': 30.1.3 '@jest/types': 30.0.5 import-local: 3.2.0 - jest-cli: 30.1.3(@types/node@22.15.32) + jest-cli: 30.1.3(@types/node@22.18.1) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -5019,7 +5049,7 @@ snapshots: json5@2.2.3: {} - jsonfile@6.1.0: + jsonfile@6.2.0: dependencies: universalify: 2.0.1 optionalDependencies: @@ -5185,17 +5215,23 @@ snapshots: '@types/whatwg-url': 11.0.5 whatwg-url: 14.2.0 - mongodb@6.17.0: + mongodb@6.18.0: + dependencies: + '@mongodb-js/saslprep': 1.3.0 + bson: 6.10.4 + mongodb-connection-string-url: 3.0.2 + + mongodb@6.19.0: dependencies: '@mongodb-js/saslprep': 1.3.0 bson: 6.10.4 mongodb-connection-string-url: 3.0.2 - mongoose@8.16.2: + mongoose@8.18.0: dependencies: bson: 6.10.4 kareem: 2.6.3 - mongodb: 6.17.0 + mongodb: 6.18.0 mpath: 0.9.0 mquery: 5.0.0 ms: 2.1.3 @@ -5210,7 +5246,7 @@ snapshots: - socks - supports-color - morphdom@2.7.5: {} + morphdom@2.7.7: {} mpath@0.9.0: {} @@ -5249,7 +5285,7 @@ snapshots: through2: 2.0.5 transform-ast: 2.4.4 - napi-postinstall@0.3.2: {} + napi-postinstall@0.3.3: {} natural-compare@1.4.0: {} @@ -5689,7 +5725,7 @@ snapshots: strip-ansi@7.1.0: dependencies: - ansi-regex: 6.1.0 + ansi-regex: 6.2.0 strip-bom@4.0.0: {} @@ -5779,12 +5815,12 @@ snapshots: dependencies: typescript: 5.9.2 - ts-jest@29.4.1(@babel/core@7.28.3)(@jest/transform@30.1.2)(@jest/types@30.0.5)(babel-jest@30.1.2(@babel/core@7.28.3))(jest-util@30.0.5)(jest@30.1.3(@types/node@22.15.32))(typescript@5.9.2): + ts-jest@29.4.1(@babel/core@7.28.3)(@jest/transform@30.1.2)(@jest/types@30.0.5)(babel-jest@30.1.2(@babel/core@7.28.3))(jest-util@30.0.5)(jest@30.1.3(@types/node@22.18.1))(typescript@5.9.2): dependencies: bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 handlebars: 4.7.8 - jest: 30.1.3(@types/node@22.15.32) + jest: 30.1.3(@types/node@22.18.1) json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 @@ -5825,19 +5861,19 @@ snapshots: typedoc@0.28.12(typescript@5.9.2): dependencies: - '@gerrit0/mini-shiki': 3.12.1 + '@gerrit0/mini-shiki': 3.12.2 lunr: 2.3.9 markdown-it: 14.1.0 minimatch: 9.0.5 typescript: 5.9.2 yaml: 2.8.1 - typescript-eslint@8.41.0(eslint@9.34.0)(typescript@5.9.2): + typescript-eslint@8.42.0(eslint@9.34.0)(typescript@5.9.2): dependencies: - '@typescript-eslint/eslint-plugin': 8.41.0(@typescript-eslint/parser@8.41.0(eslint@9.34.0)(typescript@5.9.2))(eslint@9.34.0)(typescript@5.9.2) - '@typescript-eslint/parser': 8.41.0(eslint@9.34.0)(typescript@5.9.2) - '@typescript-eslint/typescript-estree': 8.41.0(typescript@5.9.2) - '@typescript-eslint/utils': 8.41.0(eslint@9.34.0)(typescript@5.9.2) + '@typescript-eslint/eslint-plugin': 8.42.0(@typescript-eslint/parser@8.42.0(eslint@9.34.0)(typescript@5.9.2))(eslint@9.34.0)(typescript@5.9.2) + '@typescript-eslint/parser': 8.42.0(eslint@9.34.0)(typescript@5.9.2) + '@typescript-eslint/typescript-estree': 8.42.0(typescript@5.9.2) + '@typescript-eslint/utils': 8.42.0(eslint@9.34.0)(typescript@5.9.2) eslint: 9.34.0 typescript: 5.9.2 transitivePeerDependencies: @@ -5866,7 +5902,7 @@ snapshots: unrs-resolver@1.11.1: dependencies: - napi-postinstall: 0.3.2 + napi-postinstall: 0.3.3 optionalDependencies: '@unrs/resolver-binding-android-arm-eabi': 1.11.1 '@unrs/resolver-binding-android-arm64': 1.11.1 @@ -5888,9 +5924,9 @@ snapshots: '@unrs/resolver-binding-win32-ia32-msvc': 1.11.1 '@unrs/resolver-binding-win32-x64-msvc': 1.11.1 - update-browserslist-db@1.1.3(browserslist@4.25.2): + update-browserslist-db@1.1.3(browserslist@4.25.4): dependencies: - browserslist: 4.25.2 + browserslist: 4.25.4 escalade: 3.2.0 picocolors: 1.1.1 From 02be786c292f135d541eccd3ac69b7391fd59f71 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Fri, 5 Sep 2025 15:09:58 +0200 Subject: [PATCH 249/251] =?UTF-8?q?=F0=9F=9A=A7=20Rebase=20using=20BIBM,?= =?UTF-8?q?=20add=20SNCF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/index.ts | 498 +++++++++++++------- src/test/lintScheduledRoutes.ts | 6 +- src/test/models/NonScheduledRoutes.model.ts | 36 -- src/test/models/TBMScheduledRoutes.model.ts | 14 +- src/test/models/TBM_lines.model.ts | 33 -- src/test/models/TBM_lines_routes.model.ts | 46 -- src/test/models/TBM_schedules.model.ts | 19 +- src/test/models/TBM_stops.model.ts | 60 --- src/test/models/TBM_trips.model.ts | 41 -- src/test/models/addresses.model.ts | 50 -- src/test/models/index.ts | 53 --- src/test/models/intersections.model.ts | 37 -- src/test/models/result.model.ts | 183 ------- src/test/models/sections.model.ts | 61 --- 14 files changed, 346 insertions(+), 791 deletions(-) delete mode 100644 src/test/models/NonScheduledRoutes.model.ts delete mode 100644 src/test/models/TBM_lines.model.ts delete mode 100644 src/test/models/TBM_lines_routes.model.ts delete mode 100644 src/test/models/TBM_stops.model.ts delete mode 100644 src/test/models/TBM_trips.model.ts delete mode 100644 src/test/models/addresses.model.ts delete mode 100644 src/test/models/index.ts delete mode 100644 src/test/models/intersections.model.ts delete mode 100644 src/test/models/result.model.ts delete mode 100644 src/test/models/sections.model.ts diff --git a/src/test/index.ts b/src/test/index.ts index af7a5275..a6ff0871 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -3,9 +3,22 @@ import initDB from "./utils/mongoose"; // Needed to solve "Reflect.getMetadata is not a function" error of typegoose import "core-js/features/reflect"; +import { Override, UnpackRefType } from "@bibm/common/types"; +import { journeyDBFormatter } from "@bibm/compute/jobs/compute"; +import { makeMapId, Providers } from "@bibm/compute/jobs/preCompute/utils"; +import NonScheduledRoutesModelInit, { dbFootPaths } from "@bibm/data/models/Compute/NonScheduledRoutes.model"; +import ResultModelInit, { LocationAddress, LocationTBM, PointType } from "@bibm/data/models/Compute/result.model"; +import { Schedule } from "@bibm/data/models/Compute/types"; +import SNCFScheduledRoutesModelInit, { dbSNCF_ScheduledRoutes } from "@bibm/data/models/SNCF/SNCFScheduledRoutes.model"; +import { dbSNCF_Schedules } from "@bibm/data/models/SNCF/SNCF_schedules.model"; +import SNCFStopsModelInit, { dbSNCF_Stops } from "@bibm/data/models/SNCF/SNCF_stops.model"; +// Those 2 are local because of conflicting Mongoose instances between BIBM and here +// Otherwise, we get NotValidModelError [TypeError]: Expected "getDiscriminatorModelForClass.from" to be a valid mongoose.Model! (got: "function model(doc, fields, skipId) ...") [E205] +import TBMScheduledRoutesModelInit, { dbTBM_ScheduledRoutes } from "./models/TBMScheduledRoutes.model"; +import TBMSchedulesModelInit, { dbTBM_Schedules_rt } from "./models/TBM_schedules.model"; +import TBMStopsModelInit, { dbTBM_Stops } from "@bibm/data/models/TBM/TBM_stops.model"; import { DocumentType } from "@typegoose/typegoose"; import minimist from "minimist"; -import { FilterQuery } from "mongoose"; import { exit } from "process"; import { inspect } from "util"; import { @@ -34,93 +47,221 @@ import { TimeInt, TimeScal, Timestamp, + Trip, } from "../"; import BaseRAPTOR from "../base"; -import NonScheduledRoutesModelInit, { dbFootPaths } from "./models/NonScheduledRoutes.model"; -import ResultModelInit, { - Journey as DBJourney, - JourneyStepBase, - JourneyStepFoot, - JourneyStepType, - JourneyStepVehicle, - LocationAddress, - LocationTBM, - LocationType, -} from "./models/result.model"; -import TBMSchedulesModelInit from "./models/TBM_schedules.model"; -import stopsModelInit, { dbTBM_Stops } from "./models/TBM_stops.model"; -import TBMScheduledRoutesModelInit, { dbTBM_ScheduledRoutes } from "./models/TBMScheduledRoutes.model"; -import { binarySearch, Combinations, mapAsync, UnpackRefs } from "./utils"; +import { Combinations } from "./utils"; import { benchmark } from "./utils/benchmark"; -async function queryData() { +async function queryData(fpReqLen: number) { console.debug("Querying data..."); const sourceDB = await initDB("bibm"); const computeDB = await initDB("bibm-compute"); - const stopsModel = stopsModelInit(sourceDB); + const TBMStopsModel = TBMStopsModelInit(sourceDB); + const SNCFStopsModel = SNCFStopsModelInit(sourceDB); const TBMSchedulesModel = TBMSchedulesModelInit(sourceDB)[1]; const TBMScheduledRoutesModel = TBMScheduledRoutesModelInit(sourceDB); + const SNCFScheduledRoutesModel = SNCFScheduledRoutesModelInit(sourceDB); const NonScheduledRoutesModel = NonScheduledRoutesModelInit(sourceDB); const resultModel = ResultModelInit(computeDB); - const dbScheduledRoutesProjection = { _id: 1, stops: 1, trips: 1 } satisfies Partial>; - type dbScheduledRoute = Pick; - type ScheduledRoutesOverwritten = UnpackRefs; - type ScheduledRoute = Omit & ScheduledRoutesOverwritten; - - const dbScheduledRoutes = (await TBMScheduledRoutesModel.find>>({}, dbScheduledRoutesProjection) - .populate("trips.schedules") - .lean() - .exec()) as ScheduledRoute[]; - - const dbStopProjection = { _id: 1 } satisfies Partial>; - type Stop = Pick; - - const stops = dbScheduledRoutes.reduce<{ id: ScheduledRoute["stops"][number]; connectedRoutes: ScheduledRoute["_id"][] }[]>( - (acc, { _id, stops }) => { - for (const stop of stops) { - let pos = binarySearch(acc, stop, (a, b) => a - b.id); - if (pos < 0) { - pos = -pos - 1; - acc.splice(pos, 0, { id: stop, connectedRoutes: [] }); + /** DB Types */ + + // Stops + // TBM + const dbTBMStopProjection = { _id: 1 } satisfies Partial>; + type TBMStop = Pick; + + // SNCF + const dbSNCFStopProjection = { _id: 1 } satisfies Partial>; + type SNCFStop = Pick; + + // Schedules + const schedulesProjection = { arr_int_hor: 1, dep_int_hor: 1 } satisfies Partial>; + type dbSchedule = Pick; + + // Scheduled Routes + // TBM + const dbTBMSchedulesProjection = { hor_theo: 1 } satisfies Partial>; + const dbTBMScheduledRoutesProjection = { _id: 1, stops: 1, trips: 1 } satisfies Partial>; + type dbTBMScheduledRoute = Pick; + interface TBMScheduledRoutesOverwritten /* extends dbTBM_ScheduledRoutes */ { + _id: UnpackRefType; + stops: UnpackRefType; + trips: { + // Not a Document because of lean + schedules: (Pick & dbSchedule)[]; + }[]; + } + type TBMScheduledRoute = Override; + + // SNCF + const dbSNCFSchedulesProjection = { baseArrival: 1, baseDeparture: 1 } satisfies Partial>; + const dbSNCFScheduledRoutesProjection = { _id: 1, stops: 1, trips: 1 } satisfies Partial>; + type dbSNCFScheduledRoute = Pick; + interface SNCFScheduledRoutesOverwritten /* extends dbSNCF_ScheduledRoutes */ { + stops: UnpackRefType; + trips: { + // Not a Document because of lean + schedules: (Pick & dbSchedule)[]; + }[]; + } + type SNCFScheduledRoute = Omit & SNCFScheduledRoutesOverwritten; + + type ProviderRouteId = TBMScheduledRoute["_id"] | SNCFScheduledRoute["_id"]; + // eslint-disable-next-line @typescript-eslint/no-duplicate-type-constituents + type ProviderStopId = TBMStop["_id"] | SNCFStop["_id"]; + + // Non Schedules Routes + const dbNonScheduledRoutesProjection = { from: 1, to: 1, distance: 1 } satisfies Partial>; + type dbNonScheduledRoute = Pick; + + // Virtual IDs (stops routes) management + + const stopIdsMappingF = new Map<`${Providers}-${ProviderStopId}`, number>(); + const stopIdsMappingB = new Map(); + const TBMStopsCount = (await TBMStopsModel.estimatedDocumentCount()) * 1.5; + const SNCFStopsCount = (await SNCFStopsModel.estimatedDocumentCount()) * 1.5; + const stopIdsRanges = { + [Providers.TBM]: [0, TBMStopsCount, -1], + [Providers.SNCF]: [TBMStopsCount + 1, TBMStopsCount + 1 + SNCFStopsCount, -1], + } satisfies Record; + const [mapStopId, unmapStopId] = makeMapId(stopIdsRanges, stopIdsMappingF, stopIdsMappingB); + + const routeIdsMappingF = new Map<`${Providers}-${ProviderRouteId}`, number>(); + const routeIdsMappingB = new Map(); + // Memoizing allows us to only remember backward mapping, forward mapping is stored inside memoize + const TBMSRCount = (await TBMScheduledRoutesModel.estimatedDocumentCount()) * 1.5; + const SNCFSRCount = (await SNCFScheduledRoutesModel.estimatedDocumentCount()) * 1.5; + const routeIdsRanges = { + [Providers.TBM]: [0, TBMSRCount, -1], + [Providers.SNCF]: [TBMSRCount + 1, TBMSRCount + 1 + SNCFSRCount, -1], + } satisfies Record; + const [mapRouteId, unmapRouteId] = makeMapId(routeIdsRanges, routeIdsMappingF, routeIdsMappingB); + + // Non scheduled routes + + // Query must associate (s, from) AND (from, s) forall s in stops ! + const dbNonScheduledRoutes = ( + (await NonScheduledRoutesModel.find>( + { distance: { $lte: fpReqLen } }, + { ...dbNonScheduledRoutesProjection, _id: 0 }, + ) + .lean() + .exec()) as dbNonScheduledRoute[] + ).reduce>[1][number][2]>>((acc, { from, to, distance }) => { + const mappedFrom = mapStopId(parseInt(from.substring(3).split("-")[0]), parseInt(from.split("-")[1])); + const mappedTo = mapStopId(parseInt(to.substring(3).split("-")[0]), parseInt(to.split("-")[1])); + + for (const [from, to] of [ + [mappedFrom, mappedTo], + [mappedTo, mappedFrom], + ]) { + let stopNonScheduledRoutes = acc.get(from); + if (!stopNonScheduledRoutes) { + stopNonScheduledRoutes = []; + acc.set(from, stopNonScheduledRoutes); + } + + stopNonScheduledRoutes.push({ length: distance, to }); + } + + return acc; + }, new Map()); + + // TBM stops & routes + + const dbTBMScheduledRoutes = ( + (await TBMScheduledRoutesModel.find>({}, dbTBMScheduledRoutesProjection) + .populate("trips.schedules", { ...schedulesProjection, ...dbTBMSchedulesProjection, _id: 0, __t: 0 }) + .lean() + .exec()) as TBMScheduledRoute[] + ).map(({ _id, stops, trips }) => ({ + _id, + stops: stops.map((stop) => mapStopId(Providers.TBM, stop)), + trips, + })); + + const TBMStops = dbTBMScheduledRoutes.reduce, undefined>]>>( + (acc, { _id: routeId, stops }) => { + for (const stopId of stops) { + let stop = acc.get(stopId); + if (!stop) { + stop = [[], dbNonScheduledRoutes.get(stopId) ?? []]; + acc.set(stopId, stop); } - acc[pos].connectedRoutes.push(_id); + + stop[0].push(mapRouteId(Providers.TBM, routeId)); } return acc; }, - ( - (await stopsModel - .find>>( - { - $and: [{ coords: { $not: { $elemMatch: { $eq: Infinity } } } }], - }, - dbStopProjection, - ) - .sort({ _id: 1 }) - .lean() - .exec()) as Stop[] - ).map(({ _id: id }) => ({ id, connectedRoutes: [] })), + new Map( + ( + (await TBMStopsModel.find>({ coords: { $not: { $elemMatch: { $eq: Infinity } } } }, dbTBMStopProjection) + .lean() + .exec()) as TBMStop[] + ).map(({ _id }) => { + const mappedId = mapStopId(Providers.TBM, _id); + + return [mappedId, [[], dbNonScheduledRoutes.get(mappedId) ?? []]]; + }), + ), ); - const dbNonScheduledRoutesProjection = { from: 1, to: 1, distance: 1 } satisfies Partial>; - type dbNonScheduledRoute = Pick; - type NonScheduledRoutesOverwritten = UnpackRefs; - type NonScheduledRoute = Omit & NonScheduledRoutesOverwritten; - - //Query must associate (s, from) AND (from, s) forall s in stops ! - const dbNonScheduledRoutes = async (stopId: NonScheduledRoutesOverwritten["from"], additionalQuery: FilterQuery = {}) => - ( - (await NonScheduledRoutesModel.find>>( - { $and: [{ $or: [{ from: stopId }, { to: stopId }] }, additionalQuery] }, - dbNonScheduledRoutesProjection, - ) - .lean() - .exec()) as NonScheduledRoute[] - ).map(({ from, to, distance }) => ({ distance, ...(to === stopId ? { to: from } : { to }) })); - - return { dbScheduledRoutes, stops, dbNonScheduledRoutes, TBMSchedulesModel, resultModel }; + // SNCF stops & routes + + const dbSNCFScheduledRoutes = ( + (await SNCFScheduledRoutesModel.find>({}, dbSNCFScheduledRoutesProjection) + .populate("trips.schedules", { ...schedulesProjection, ...dbSNCFSchedulesProjection, _id: 0 }) + .lean() + .exec()) as SNCFScheduledRoute[] + ).map(({ _id, stops, trips }) => ({ + _id, + stops: stops.map((stop) => mapStopId(Providers.SNCF, stop)), + trips, + })); + + const SNCFStops = dbSNCFScheduledRoutes.reduce, undefined>]>>( + (acc, { _id: routeId, stops }) => { + for (const stopId of stops) { + let stop = acc.get(stopId); + if (!stop) { + stop = [[], dbNonScheduledRoutes.get(stopId) ?? []]; + acc.set(stopId, stop); + } + + stop[0].push(mapRouteId(Providers.SNCF, routeId)); + } + + return acc; + }, + new Map( + ( + (await SNCFStopsModel.find>({ coords: { $not: { $elemMatch: { $eq: Infinity } } } }, dbSNCFStopProjection) + .lean() + .exec()) as SNCFStop[] + ).map(({ _id }) => { + const mappedId = mapStopId(Providers.SNCF, _id); + + return [mappedId, [[], dbNonScheduledRoutes.get(mappedId) ?? []]]; + }), + ), + ); + return { + TBMStops, + SNCFStops, + dbTBMScheduledRoutes, + dbSNCFScheduledRoutes, + dbNonScheduledRoutes, + TBMSchedulesModel, + resultModel, + mapStopId, + unmapStopId, + mapRouteId, + unmapRouteId, + }; } function getArgsOptNumber(args: ReturnType, opt: string): number | null { @@ -135,66 +276,77 @@ function getArgsOptNumber(args: ReturnType, opt: string): numbe type DataType = "scalar" | "interval"; -async function computeRAPTORData( - { stops, dbNonScheduledRoutes, dbScheduledRoutes }: Awaited>, - fpReqLen: number, +function computeRAPTORData( + { TBMStops, SNCFStops, dbTBMScheduledRoutes, dbSNCFScheduledRoutes, mapRouteId }: Awaited>, dataType: DataType, /** In ms, [neg, pos] */ delay: [number, number] | null, ) { + const scheduleMapperInt = + (getBaseArr: (schedule: T) => Timestamp, getBaseDep: (schedule: T) => Timestamp) => + (schedule: T): NonNullable["at"]>> => { + if (delay) + return [ + [getBaseArr(schedule) - delay[0], getBaseArr(schedule) + delay[1]] satisfies InternalTimeInt, + [getBaseDep(schedule) - delay[0], getBaseDep(schedule) + delay[1]] satisfies InternalTimeInt, + ]; + else { + return [ + schedule.arr_int_hor.map((date) => date.getTime()) as [number, number], + schedule.dep_int_hor.map((date) => date.getTime()) as [number, number], + ]; + } + }; + return [ dataType === "scalar" ? TimeScal : TimeInt, - await mapAsync<(typeof stops)[number], ConstructorParameters>[1][number]>( - stops, - async ({ id, connectedRoutes }) => [ - id, - connectedRoutes, - (await dbNonScheduledRoutes(id, { distance: { $lte: fpReqLen } })).map(({ to, distance }) => ({ - to, - length: distance, - })), - ], - ), - dbScheduledRoutes.map( - ({ _id, stops, trips }) => - [ - _id, - stops, - trips.map(({ schedules }) => - schedules - .map<[(typeof schedules)[number], [number, number]]>((schedule) => [ - schedule, - typeof schedule === "object" && "hor_estime" in schedule - ? [schedule.hor_estime.getTime() || TimeScal.MAX_SAFE, schedule.hor_estime.getTime() || TimeScal.MAX_SAFE] - : [TimeScal.MAX, TimeScal.MAX], - ]) - // Transform to interval - .map(([schedule, [arr, dep]]) => { - if (dataType === "interval") { - if (delay) - return [[arr - delay[0], arr + delay[1]] satisfies InternalTimeInt, [dep - delay[0], dep + delay[1]] satisfies InternalTimeInt]; - else { - if (typeof schedule !== "object") - return [ - [arr, arr], - [dep, dep], - ] satisfies [InternalTimeInt, InternalTimeInt]; - - let theo = schedule.hor_theo.getTime() || TimeScal.MAX_SAFE; - let estime = schedule.hor_estime.getTime() || schedule.hor_app.getTime() || TimeScal.MAX_SAFE; - - // Prevent upper bound to be MAX_SAFE - if (theo < TimeScal.MAX_SAFE && estime === TimeScal.MAX_SAFE) estime = theo; - if (estime < TimeScal.MAX_SAFE && theo === TimeScal.MAX_SAFE) theo = estime; - - const int = theo < estime ? [theo, estime] : [estime, theo]; - return [[int[0], int[1]] as const, [int[0], int[1]] as const] satisfies [unknown, unknown]; - } - } else return [arr, dep] satisfies [unknown, unknown]; - }), - ), - ] satisfies [unknown, unknown, unknown], - ), + [ + ...TBMStops.entries().map( + ([id, [connectedRoutes, nonScheduledRoutes]]) => [id, connectedRoutes, nonScheduledRoutes] satisfies [unknown, unknown, unknown], + ), + ...SNCFStops.entries().map( + ([id, [connectedRoutes, nonScheduledRoutes]]) => [id, connectedRoutes, nonScheduledRoutes] satisfies [unknown, unknown, unknown], + ), + ], + [ + ...dbTBMScheduledRoutes.map( + ({ _id, stops, trips }) => + [ + // Don't forget to finally map route ID! + mapRouteId(Providers.TBM, _id), + stops, + trips.map(({ schedules }) => + // Make schedules intervals + schedules.map["at"]>>>( + dataType === "interval" + ? scheduleMapperInt( + (schedule) => schedule.hor_theo.getTime(), + (schedule) => schedule.hor_theo.getTime(), + ) + : (schedule) => [schedule.hor_theo.getTime(), schedule.hor_theo.getTime()] as [number, number], + ), + ), + ] satisfies [unknown, unknown, unknown], + ), + ...dbSNCFScheduledRoutes.map( + ({ _id, stops, trips }) => + [ + // Don't forget to finally map route ID! + mapRouteId(Providers.SNCF, _id), + stops, + trips.map(({ schedules }) => + schedules.map["at"]>>>( + dataType === "interval" + ? scheduleMapperInt( + (schedule) => schedule.baseArrival.getTime(), + (schedule) => schedule.baseDeparture.getTime(), + ) + : (schedule) => [schedule.baseArrival.getTime(), schedule.baseDeparture.getTime()] as [number, number], + ), + ), + ] satisfies [unknown, unknown, unknown], + ), + ], ] as ConstructorParameters>; } @@ -264,37 +416,13 @@ function postTreatment & { - steps: (JourneyStepBase | JourneyStepFoot | JourneyStepVehicle)[]; -}; -function journeyDBFormatter( - journey: NonNullable["getBestJourneys"]>[number][number]>, -): DBJourneyReal { - return { - steps: journey.map((js) => ({ - ...js, - time: typeof js.label.time === "number" ? [js.label.time, js.label.time] : js.label.time, - ...("transfer" in js - ? { type: JourneyStepType.Foot } - : "route" in js - ? { route: js.route.id, type: JourneyStepType.Vehicle } - : { - type: JourneyStepType.Base, - }), - })), - criteria: journey[0].label.criteria.map(({ name }) => ({ - name, - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - value: journey.at(-1)!.label.value(name), - })), - }; -} - async function insertResults( resultModel: Awaited>["resultModel"], + unmapStopId: Awaited>["unmapStopId"], + unmapRouteId: Awaited>["unmapRouteId"], timeType: Time, - from: LocationAddress | LocationTBM, - to: LocationAddress | LocationTBM, + from: [mappedId: number, LocationAddress | LocationTBM], + to: [mappedId: number, LocationAddress | LocationTBM], departureTime: TimeVal, settings: RAPTORRunSettings, results: ReturnType["getBestJourneys"]>, @@ -310,7 +438,17 @@ async function insertResults timeType.strict.order(a.at(-1)!.label.time, b.at(-1)!.label.time)) - .map((journey) => journeyDBFormatter(journey)), + .map((journey) => + journeyDBFormatter( + [from[0], from[1].id as UnpackRefType<(typeof from)[1]["id"]>], + [to[0], to[1].id as UnpackRefType<(typeof from)[1]["id"]>], + unmapStopId, + unmapRouteId, + // @ts-expect-error Giving Timestamp | InternalTimeInt as TimeVal instead of InternalTimeInt but it's safe, just copying time field + // It will try to write a Timestamp instead of a InternalTimeInt, so model validation should fail + journey, + ), + ), settings, }); @@ -458,28 +596,32 @@ Command-line interface: const saveResults = "save" in args && args.save === true ? true : false; console.debug(`Saving results`, saveResults); - const b1 = await benchmark(queryData, []); + const b1 = await benchmark(queryData, [fpReqLen]); const queriedData = b1.lastReturn; if (!queriedData) throw new Error("No queried data"); // Setup source & destination - let ps: number | SharedID; + let ps: number; let from: LocationAddress | LocationTBM; const psOpt = getArgsOptNumber(args, "ps"); if (psOpt === null) { - ps = 974; // Barrière d'Ornano - from = { type: LocationType.Address, id: 174287 }; + ps = queriedData.mapStopId(Providers.TBM, 974); // Barrière d'Ornano + from = { type: PointType.Address, id: 174287 }; } else { - ps = psOpt; - from = { type: LocationType.TBM, id: ps }; + ps = queriedData.mapStopId(Providers.TBM, psOpt); + from = { type: PointType.TBMStop, id: ps }; } - let psInternalId = ps; + // Fake stop ID, foot proxy to ps + const psRawId = 1_000_000; + let psId: number | SharedID = psRawId; - const pt = + const pt = queriedData.mapStopId( + Providers.TBM, getArgsOptNumber(args, "pt") ?? - // Béthanie - 3846; + // Béthanie + 3846, + ); // Compute RAPTOR data @@ -488,7 +630,7 @@ Command-line interface: [ps]: 100, }; - const b2 = await benchmark(computeRAPTORData, [queriedData, fpReqLen, dataType, delay]); + const b2 = await benchmark(computeRAPTORData, [queriedData, dataType, delay]); const rawRAPTORData = b2.lastReturn; if (!rawRAPTORData) throw new Error("No raw RAPTOR data"); @@ -501,9 +643,7 @@ Command-line interface: if (!b3.lastReturn) throw new Error("No raw Shared RAPTOR data"); rawSharedRAPTORData = b3.lastReturn; - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - psInternalId = queriedData.stops.at(-1)!.id + 1; - ps = SharedRAPTORData.serializeId(psInternalId); + psId = SharedRAPTORData.serializeId(psRawId); } // Create RAPTOR @@ -546,8 +686,8 @@ Command-line interface: const attachStops = new Map>>(); - attachStops.set(psInternalId, [ - psInternalId, + attachStops.set(psRawId, [ + psRawId, [], Object.keys(distances).map((k) => { const sId = parseInt(k); @@ -559,7 +699,7 @@ Command-line interface: Object.keys(distances).forEach((k) => { const sId = parseInt(k); - attachStops.set(sId, [sId, [], [{ to: psInternalId, length: distances[sId] }]]); + attachStops.set(sId, [sId, [], [{ to: psRawId, length: distances[sId] }]]); }); RAPTORDataInst.attachStops(Array.from(attachStops.values())); @@ -567,19 +707,26 @@ Command-line interface: // Run params // https://www.mongodb.com/docs/manual/core/aggregation-pipeline-optimization/#-sort----limit-coalescence - const maxUpdatedAt = (await queriedData.TBMSchedulesModel.find().sort({ updatedAt: -1 }).limit(1))[0]?.updatedAt?.getTime() ?? Infinity; + const minSchedule = ( + await queriedData.TBMSchedulesModel.find({ hor_theo: { $gt: new Date(0) } }) + .sort({ hor_theo: 1 }) + .limit(1) + ).at(0)?.hor_theo; + const maxSchedule = (await queriedData.TBMSchedulesModel.find().sort({ hor_theo: -1 }).limit(1)).at(0)?.hor_theo; + if (!minSchedule || !maxSchedule) throw new Error("Could not find latest & oldest TBM schedules"); - const departureTime = dataType === "interval" ? ([maxUpdatedAt, maxUpdatedAt] satisfies [unknown, unknown]) : maxUpdatedAt; + const meanSchedule = new Date(Math.round((minSchedule.getTime() + maxSchedule.getTime()) / 2)).getTime(); + const departureTime = dataType === "interval" ? ([meanSchedule, meanSchedule] satisfies [unknown, unknown]) : meanSchedule; const settings: RAPTORRunSettings = { walkSpeed: 1.5, maxTransferLength: fpRunLen }; // Run function runRAPTOR() { - RAPTORInstance.run(ps, pt, departureTime, settings); + RAPTORInstance.run(psId, pt, departureTime, settings); } console.log( - `Running with: ps=${ps}, pt=${pt}, departure time=${new Date(typeof departureTime === "number" ? departureTime : departureTime[0]).toLocaleString()}, settings=${JSON.stringify(settings)}`, + `Running with: ps=${psId}, pt=${pt}, departure time=${new Date(typeof departureTime === "number" ? departureTime : departureTime[0]).toLocaleString()}, settings=${JSON.stringify(settings)}`, ); await benchmark(runRAPTOR, [], undefined, runTimes); @@ -607,9 +754,12 @@ Command-line interface: const b8 = await benchmark(insertResults, [ queriedData.resultModel, + queriedData.unmapStopId, + queriedData.unmapRouteId, RAPTORDataInst.timeType, - from, - { type: LocationType.TBM, id: pt }, + [psRawId, from], + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + [pt, { type: PointType.TBMStop, id: queriedData.unmapStopId(pt)![0] }], departureTime, settings, b7.lastReturn, diff --git a/src/test/lintScheduledRoutes.ts b/src/test/lintScheduledRoutes.ts index 2e533861..d48c2700 100644 --- a/src/test/lintScheduledRoutes.ts +++ b/src/test/lintScheduledRoutes.ts @@ -3,9 +3,9 @@ import initDB from "./utils/mongoose"; // Needed to solve "Reflect.getMetadata is not a function" error of typegoose import "core-js/features/reflect"; -import TBMScheduledRoutesModelInit, { dbTBM_ScheduledRoutes } from "./models/TBMScheduledRoutes.model"; -import TBMLinesRoutesModelInit from "./models/TBM_lines.model"; -import TBMLinesModelInit from "./models/TBM_lines_routes.model"; +import TBMScheduledRoutesModelInit, { dbTBM_ScheduledRoutes } from "@bibm/data/models/TBM/TBMScheduledRoutes.model"; +import TBMLinesRoutesModelInit from "@bibm/data/models/TBM/TBM_lines.model"; +import TBMLinesModelInit from "@bibm/data/models/TBM/TBM_lines_routes.model"; import { UnpackRefs } from "./utils"; import { benchmark } from "./utils/benchmark"; diff --git a/src/test/models/NonScheduledRoutes.model.ts b/src/test/models/NonScheduledRoutes.model.ts deleted file mode 100644 index 8727b3d4..00000000 --- a/src/test/models/NonScheduledRoutes.model.ts +++ /dev/null @@ -1,36 +0,0 @@ -// addresses-model.js - A mongoose model -// -// See http://mongoosejs.com/docs/models.html - -export function approachedStopName(_id: number) { - return `as=${_id}` as const; -} - -import { deleteModelWithClass, getModelForClass, prop, type Ref, type ReturnModelType } from "@typegoose/typegoose"; -import { modelOptions } from "@typegoose/typegoose/lib/modelOptions"; -import { Connection } from "mongoose"; -import { dbTBM_Stops } from "./TBM_stops.model"; -import { dbSections } from "./sections.model"; - -@modelOptions({ options: { customName: "NonScheduledRoutes" } }) -export class dbFootPaths { - @prop({ required: true, index: true, ref: () => dbTBM_Stops, type: () => Number }) - public from!: Ref; - - @prop({ required: true, index: true, ref: () => dbTBM_Stops, type: () => Number }) - public to!: Ref; - - @prop({ required: true }) - public distance!: number; - - @prop() - public path?: (dbSections["_id"] | ReturnType)[]; // Ref[] to intersections | stops -} - -export default function init(db: Connection): ReturnModelType { - deleteModelWithClass(dbFootPaths); - - return getModelForClass(dbFootPaths, { existingConnection: db }); -} - -export type dbFootPathsModel = ReturnType; diff --git a/src/test/models/TBMScheduledRoutes.model.ts b/src/test/models/TBMScheduledRoutes.model.ts index 20522e9d..58856250 100644 --- a/src/test/models/TBMScheduledRoutes.model.ts +++ b/src/test/models/TBMScheduledRoutes.model.ts @@ -2,14 +2,14 @@ // // See http://mongoosejs.com/docs/models.html +import { TBMEndpoints } from "@bibm/data/models/TBM/index"; +import { dbTBM_Lines_routes } from "@bibm/data/models/TBM/TBM_lines_routes.model"; +import { dbTBM_Stops } from "@bibm/data/models/TBM/TBM_stops.model"; import { deleteModelWithClass, getModelForClass, prop, type Ref, type ReturnModelType } from "@typegoose/typegoose"; import { TimeStamps } from "@typegoose/typegoose/lib/defaultClasses"; import { modelOptions } from "@typegoose/typegoose/lib/modelOptions"; import { Connection } from "mongoose"; -import { TBMEndpoints } from "."; -import { dbTBM_Lines_routes } from "./TBM_lines_routes.model"; import { dbTBM_Schedules_rt, default as TBMSchedulesRtInit } from "./TBM_schedules.model"; -import { dbTBM_Stops, default as TBMStopsInit } from "./TBM_stops.model"; @modelOptions({ schemaOptions: { _id: false } }) export class TripOfScheduledRoute { @@ -17,25 +17,23 @@ export class TripOfScheduledRoute { public tripId!: number; @prop({ required: true, ref: () => dbTBM_Schedules_rt, type: () => Number }) - public schedules!: Ref[]; + public schedules!: Ref[]; } @modelOptions({ options: { customName: TBMEndpoints.ScheduledRoutes } }) export class dbTBM_ScheduledRoutes extends TimeStamps { @prop({ required: true, ref: () => dbTBM_Lines_routes, type: () => Number }) - // routeId - public _id!: Ref; + public _id!: Ref; @prop({ required: true, type: () => TripOfScheduledRoute }) public trips!: TripOfScheduledRoute[]; @prop({ required: true, ref: () => dbTBM_Stops, type: () => Number }) - public stops!: Ref[]; + public stops!: Ref[]; } export default function init(db: Connection): ReturnModelType { TBMSchedulesRtInit(db); - TBMStopsInit(db); deleteModelWithClass(dbTBM_ScheduledRoutes); diff --git a/src/test/models/TBM_lines.model.ts b/src/test/models/TBM_lines.model.ts deleted file mode 100644 index 98b3106d..00000000 --- a/src/test/models/TBM_lines.model.ts +++ /dev/null @@ -1,33 +0,0 @@ -// tbm_lines-model.js - A mongoose model -// -// See http://mongoosejs.com/docs/models.html - -import { type ReturnModelType, deleteModelWithClass, getModelForClass, prop } from "@typegoose/typegoose"; -import { TimeStamps } from "@typegoose/typegoose/lib/defaultClasses"; -import { modelOptions } from "@typegoose/typegoose/lib/modelOptions"; -import { Connection } from "mongoose"; -import { TBMEndpoints } from "."; -import { type Active, VehicleType } from "./TBM_stops.model"; - -@modelOptions({ options: { customName: TBMEndpoints.Lines } }) -export class dbTBM_Lines extends TimeStamps { - @prop({ required: true }) - public _id!: number; - - @prop({ required: true }) - public libelle!: string; - - @prop({ required: true, enum: VehicleType }) - public vehicule!: VehicleType; - - @prop({ required: true, enum: [0, 1] as const }) - public active!: Active; -} - -export default function init(db: Connection): ReturnModelType { - deleteModelWithClass(dbTBM_Lines); - - return getModelForClass(dbTBM_Lines, { existingConnection: db }); -} - -export type dbTBM_LinesModel = ReturnType; diff --git a/src/test/models/TBM_lines_routes.model.ts b/src/test/models/TBM_lines_routes.model.ts deleted file mode 100644 index 74e6c7eb..00000000 --- a/src/test/models/TBM_lines_routes.model.ts +++ /dev/null @@ -1,46 +0,0 @@ -// tbm_lines_routes-model.js - A mongoose model -// -// See http://mongoosejs.com/docs/models.html - -import { deleteModelWithClass, getModelForClass, prop, type Ref, type ReturnModelType } from "@typegoose/typegoose"; -import { TimeStamps } from "@typegoose/typegoose/lib/defaultClasses"; -import { modelOptions } from "@typegoose/typegoose/lib/modelOptions"; -import { Connection } from "mongoose"; -import { TBMEndpoints } from "."; -import { dbTBM_Lines } from "./TBM_lines.model"; -import { dbTBM_Stops, VehicleType } from "./TBM_stops.model"; - -@modelOptions({ options: { customName: TBMEndpoints.Lines_routes } }) -export class dbTBM_Lines_routes extends TimeStamps { - @prop({ required: true }) - public _id!: number; - - @prop({ required: true }) - public libelle!: string; - - @prop({ required: true }) - public sens!: string; - - @prop({ required: true }) - public vehicule!: VehicleType; - - @prop({ required: true, ref: () => dbTBM_Lines, type: () => Number }) - public rs_sv_ligne_a!: Ref; - - @prop({ required: true, ref: () => dbTBM_Stops, type: () => Number }) - public rg_sv_arret_p_nd!: Ref; - - @prop({ required: true, ref: () => dbTBM_Stops, type: () => Number }) - public rg_sv_arret_p_na!: Ref; -} - -// for more of what you can do here. -export default function init(db: Connection): ReturnModelType { - deleteModelWithClass(dbTBM_Lines_routes); - - return getModelForClass(dbTBM_Lines_routes, { - existingConnection: db, - }); -} - -export type dbTBM_Lines_routesModel = ReturnType; diff --git a/src/test/models/TBM_schedules.model.ts b/src/test/models/TBM_schedules.model.ts index 9170d37a..06fb15ff 100644 --- a/src/test/models/TBM_schedules.model.ts +++ b/src/test/models/TBM_schedules.model.ts @@ -14,6 +14,10 @@ export enum RtScheduleType { Deviation = "DEVIATION", } +import { Schedule } from "@bibm/data/models/Compute/types"; +import { TBMEndpoints } from "@bibm/data/models/TBM/index"; +import { dbTBM_Stops } from "@bibm/data/models/TBM/TBM_stops.model"; +import { dbTBM_Trips } from "@bibm/data/models/TBM/TBM_trips.model"; import { deleteModelWithClass, getDiscriminatorModelForClass, @@ -26,9 +30,6 @@ import { import { TimeStamps } from "@typegoose/typegoose/lib/defaultClasses"; import { modelOptions } from "@typegoose/typegoose/lib/modelOptions"; import { Connection } from "mongoose"; -import { TBMEndpoints } from "."; -import { dbTBM_Stops } from "./TBM_stops.model"; -import { dbTBM_Trips } from "./TBM_trips.model"; @index({ _id: 1, realtime: 1 }, { unique: true }) @modelOptions({ options: { customName: TBMEndpoints.Schedules } }) @@ -43,20 +44,26 @@ export class dbTBM_Schedules extends TimeStamps { public realtime!: boolean; @prop({ required: true, ref: () => dbTBM_Stops, type: () => Number }) - public rs_sv_arret_p!: Ref; + public rs_sv_arret_p!: Ref; @prop({ required: true, ref: () => dbTBM_Trips, type: () => Number, index: true }) - public rs_sv_cours_a!: Ref; + public rs_sv_cours_a!: Ref; } @modelOptions({ options: { customName: TBMEndpoints.Schedules_rt } }) -export class dbTBM_Schedules_rt extends dbTBM_Schedules { +export class dbTBM_Schedules_rt extends dbTBM_Schedules implements Schedule { @prop({ required: true }) public hor_app!: Date; @prop({ required: true }) public hor_estime!: Date; + @prop({ required: true }) + public arr_int_hor!: [Date, Date]; + + @prop({ required: true }) + public dep_int_hor!: [Date, Date]; + @prop({ required: true, enum: RtScheduleState }) public etat!: RtScheduleState; diff --git a/src/test/models/TBM_stops.model.ts b/src/test/models/TBM_stops.model.ts deleted file mode 100644 index 08fa4374..00000000 --- a/src/test/models/TBM_stops.model.ts +++ /dev/null @@ -1,60 +0,0 @@ -// tbm_stops-model.js - A mongoose model -// -// See http://mongoosejs.com/docs/models.html - -import { type ReturnModelType, deleteModelWithClass, getModelForClass, prop } from "@typegoose/typegoose"; -import { TimeStamps } from "@typegoose/typegoose/lib/defaultClasses"; -import { modelOptions } from "@typegoose/typegoose/lib/modelOptions"; -import { Connection } from "mongoose"; -import { TBMEndpoints } from "."; - -export enum VehicleType { - Bus = "BUS", - Tram = "TRAM", - Bateau = "BATEAU", -} - -export enum StopType { - Classique = "CLASSIQUE", - Delestage = "DELESTAGE", - Autre = "AUTRE", - Fictif = "FICTIF", -} - -export type Active = 0 | 1; - -@modelOptions({ options: { customName: TBMEndpoints.Stops } }) -export class dbTBM_Stops extends TimeStamps { - @prop({ required: true }) - public _id!: number; - - @prop({ type: () => [Number], required: true }) - public coords!: [number, number]; - - @prop({ required: true }) - public libelle!: string; - - @prop({ required: true }) - public libelle_norm!: string; - - @prop({ required: true, enum: VehicleType }) - public vehicule!: VehicleType; - - @prop({ required: true, enum: StopType }) - public type!: StopType; - - @prop({ required: true, enum: [0, 1] as const }) - public actif!: Active; -} - -// export type dbTBM_Stops = Omit, "coords"> & { -// coords: Coords; -// }; - -export default function init(db: Connection): ReturnModelType { - deleteModelWithClass(dbTBM_Stops); - - return getModelForClass(dbTBM_Stops, { existingConnection: db }); -} - -export type dbTBM_StopsModel = ReturnType; diff --git a/src/test/models/TBM_trips.model.ts b/src/test/models/TBM_trips.model.ts deleted file mode 100644 index 583a2c98..00000000 --- a/src/test/models/TBM_trips.model.ts +++ /dev/null @@ -1,41 +0,0 @@ -// tbm_vehicles-model.js - A mongoose model -// -// See http://mongoosejs.com/docs/models.html - -import { deleteModelWithClass, getModelForClass, prop, type Ref, type ReturnModelType } from "@typegoose/typegoose"; -import { TimeStamps } from "@typegoose/typegoose/lib/defaultClasses"; -import { modelOptions } from "@typegoose/typegoose/lib/modelOptions"; -import { Connection } from "mongoose"; -import { TBMEndpoints } from "."; -import { dbTBM_Lines } from "./TBM_lines.model"; -import { dbTBM_Lines_routes } from "./TBM_lines_routes.model"; -import { dbTBM_Stops } from "./TBM_stops.model"; - -@modelOptions({ options: { customName: TBMEndpoints.Trips } }) -export class dbTBM_Trips extends TimeStamps { - @prop({ required: true }) - public _id!: number; - - @prop({ required: true }) - public etat!: string; - - @prop({ required: true, ref: () => dbTBM_Lines, type: () => Number }) - public rs_sv_ligne_a!: Ref; - - @prop({ required: true, ref: () => dbTBM_Stops, type: () => Number }) - public rg_sv_arret_p_nd!: Ref; - - @prop({ required: true, ref: () => dbTBM_Stops, type: () => Number }) - public rg_sv_arret_p_na!: Ref; - - @prop({ required: true, ref: () => dbTBM_Lines_routes, type: () => Number, index: true }) - public rs_sv_chem_l!: Ref; -} - -export default function init(db: Connection): ReturnModelType { - deleteModelWithClass(dbTBM_Trips); - - return getModelForClass(dbTBM_Trips, { existingConnection: db }); -} - -export type dbTBM_TripsModel = ReturnType; diff --git a/src/test/models/addresses.model.ts b/src/test/models/addresses.model.ts deleted file mode 100644 index 4238797a..00000000 --- a/src/test/models/addresses.model.ts +++ /dev/null @@ -1,50 +0,0 @@ -// addresses-model.js - A mongoose model -// -// See http://mongoosejs.com/docs/models.html - -import { type ReturnModelType, deleteModelWithClass, getModelForClass, prop } from "@typegoose/typegoose"; -import { TimeStamps } from "@typegoose/typegoose/lib/defaultClasses"; -import { modelOptions } from "@typegoose/typegoose/lib/modelOptions"; -import { Connection } from "mongoose"; -import { TBMEndpoints } from "."; - -@modelOptions({ options: { customName: TBMEndpoints.Addresses } }) -export class dbAddresses extends TimeStamps { - @prop({ required: true }) - public _id!: number; - - @prop({ type: () => [Number, Number], required: true }) - public coords!: [number, number]; - - @prop({ required: true }) - public numero!: number; - - @prop() - public rep?: string; - - @prop({ required: true }) - public type_voie!: string; - - @prop({ required: true }) - public nom_voie!: string; - - @prop({ required: true }) - public nom_voie_norm!: string; - - @prop({ required: true }) - public code_postal!: number; - - @prop({ required: true }) - public fantoir!: string; - - @prop({ required: true }) - public commune!: string; -} - -export default function init(db: Connection): ReturnModelType { - deleteModelWithClass(dbAddresses); - - return getModelForClass(dbAddresses, { existingConnection: db }); -} - -export type dbAddressesModel = ReturnType; diff --git a/src/test/models/index.ts b/src/test/models/index.ts deleted file mode 100644 index f034400e..00000000 --- a/src/test/models/index.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { ReturnModelType } from "@typegoose/typegoose"; -import { dbAddresses } from "./addresses.model"; -import { dbIntersections } from "./intersections.model"; -import { dbSections } from "./sections.model"; -import { dbTBM_Lines } from "./TBM_lines.model"; -import { dbTBM_Lines_routes } from "./TBM_lines_routes.model"; -import { dbTBM_Schedules, dbTBM_Schedules_rt } from "./TBM_schedules.model"; -import { dbTBM_Stops } from "./TBM_stops.model"; -import { dbTBM_Trips } from "./TBM_trips.model"; -import { dbTBM_ScheduledRoutes } from "./TBMScheduledRoutes.model"; - -enum TBMEndpoints { - Addresses = "Addresses", - Intersections = "Intersections", - Sections = "Sections", - Stops = "TBM_Stops", - Lines = "TBM_Lines", - // 2 different endpoints in 1 collection - Schedules = "TBM_Schedules", - Schedules_rt = "TBM_Schedules_rt", - Trips = "TBM_Trips", - Lines_routes = "TBM_Lines_routes", - ScheduledRoutes = "TBM_Scheduled_routes", - RouteSections = "TBM_Route_sections", - LinkLineRoutesSections = "TBM_Link_line_routes_sections", -} - -type TBMClass = E extends TBMEndpoints.Addresses - ? typeof dbAddresses - : E extends TBMEndpoints.Intersections - ? typeof dbIntersections - : E extends TBMEndpoints.Sections - ? typeof dbSections - : E extends TBMEndpoints.Lines - ? typeof dbTBM_Lines - : E extends TBMEndpoints.Lines_routes - ? typeof dbTBM_Lines_routes - : E extends TBMEndpoints.Schedules - ? typeof dbTBM_Schedules - : E extends TBMEndpoints.Schedules_rt - ? typeof dbTBM_Schedules_rt - : E extends TBMEndpoints.Stops - ? typeof dbTBM_Stops - : E extends TBMEndpoints.Trips - ? typeof dbTBM_Trips - : E extends TBMEndpoints.ScheduledRoutes - ? typeof dbTBM_ScheduledRoutes - : never; - -type TBMModel = ReturnModelType>; - -export { TBMEndpoints }; -export type { TBMClass, TBMModel }; diff --git a/src/test/models/intersections.model.ts b/src/test/models/intersections.model.ts deleted file mode 100644 index 13adc1f2..00000000 --- a/src/test/models/intersections.model.ts +++ /dev/null @@ -1,37 +0,0 @@ -// intersections-model.js - A mongoose model -// -// See http://mongoosejs.com/docs/models.html - -import { deleteModelWithClass, getModelForClass, prop, type ReturnModelType } from "@typegoose/typegoose"; -import { TimeStamps } from "@typegoose/typegoose/lib/defaultClasses"; -import { modelOptions } from "@typegoose/typegoose/lib/modelOptions"; -import { Connection } from "mongoose"; -import { TBMEndpoints } from "."; - -@modelOptions({ options: { customName: TBMEndpoints.Intersections } }) -export class dbIntersections extends TimeStamps { - @prop({ required: true }) - public _id!: number; - - @prop({ type: () => [Number, Number], required: true }) - public coords!: [number, number]; - - @prop({ required: true }) - public nature!: string; - - /** Not used for now - @prop({ required: true }) - public commune!: string; - - @prop({ required: true }) - public code_commune!: string; - */ -} - -export default function init(db: Connection): ReturnModelType { - deleteModelWithClass(dbIntersections); - - return getModelForClass(dbIntersections, { existingConnection: db }); -} - -export type dbIntersectionsModel = ReturnType; diff --git a/src/test/models/result.model.ts b/src/test/models/result.model.ts deleted file mode 100644 index 141fd6ba..00000000 --- a/src/test/models/result.model.ts +++ /dev/null @@ -1,183 +0,0 @@ -// ComputeResult-model.js - A mongoose model -// -// See http://mongoosejs.com/docs/models.html -export enum JourneyStepType { - Base = "B", - Foot = "F", - Vehicle = "V", -} - -export enum LocationType { - SNCF = "S", - TBM = "T", - Address = "A", -} - -import { deleteModelWithClass, getModelForClass, prop, type Ref } from "@typegoose/typegoose"; -import { TimeStamps } from "@typegoose/typegoose/lib/defaultClasses"; -import { modelOptions } from "@typegoose/typegoose/lib/modelOptions"; -import { Connection } from "mongoose"; -import type { InternalTimeInt, RAPTORRunSettings } from "../../"; -import { dbAddresses } from "./addresses.model"; -import { dbTBM_Stops } from "./TBM_stops.model"; -import { dbTBM_ScheduledRoutes } from "./TBMScheduledRoutes.model"; - -export type stopId = dbTBM_Stops["_id"]; -export type routeId = dbTBM_ScheduledRoutes["_id"]; - -@modelOptions({ - schemaOptions: { - _id: false, - }, -}) -class RunSettings implements RAPTORRunSettings { - @prop({ required: true }) - public maxTransferLength!: number; - - @prop({ required: true }) - public walkSpeed!: number; -} - -@modelOptions({ - schemaOptions: { - discriminatorKey: "type", - _id: false, - }, -}) -export class JourneyStepBase { - @prop({ required: true }) - /** @description JourneyStep type */ - public type!: JourneyStepType; - - @prop({ required: true }) - public time!: InternalTimeInt; -} - -class Transfer { - @prop({ required: true }) - public to!: stopId | string; - - @prop({ required: true }) - public length!: number; -} - -export class JourneyStepFoot extends JourneyStepBase { - @prop({ required: true }) - public boardedAt!: stopId | string; - - @prop({ required: true }) - public transfer!: Transfer; -} - -export function isJourneyStepFoot(label: JourneyStepBase): label is JourneyStepFoot { - return label.type === JourneyStepType.Foot; -} - -export class JourneyStepVehicle extends JourneyStepBase { - @prop({ required: true }) - public boardedAt!: stopId | string; - - @prop({ required: true, ref: () => dbTBM_ScheduledRoutes, type: () => Number }) - public route!: Ref; - - @prop({ required: true }) - public tripIndex!: number; -} - -export function isJourneyStepVehicle(js: JourneyStepBase): js is JourneyStepVehicle { - return js.type === JourneyStepType.Vehicle; -} - -export class Criterion { - @prop({ required: true }) - public name!: string; - - @prop({ required: true }) - public value!: unknown; -} - -export class Journey { - @prop({ - required: true, - type: [JourneyStepBase], - discriminators: () => [ - { type: JourneyStepBase, value: JourneyStepType.Base }, - { type: JourneyStepFoot, value: JourneyStepType.Foot }, - { type: JourneyStepVehicle, value: JourneyStepType.Vehicle }, - ], - }) - public steps!: JourneyStepBase[]; - - @prop({ required: true }) - public criteria!: Criterion[]; -} - -@modelOptions({ - schemaOptions: { - discriminatorKey: "type", - _id: false, - }, -}) -class LocationBase { - @prop({ required: true }) - public type!: LocationType; -} - -export class LocationTBM extends LocationBase { - @prop({ required: true, ref: () => dbTBM_Stops, type: () => Number }) - public id!: Ref; -} -export function isLocationTBM(loc: LocationBase): loc is LocationTBM { - return loc.type === LocationType.TBM; -} - -export class LocationAddress extends LocationBase { - @prop({ required: true, ref: () => dbAddresses, type: () => Number }) - public id!: Ref; -} - -export function isLocationAddress(loc: LocationBase): loc is LocationAddress { - return loc.type === LocationType.Address; -} - -@modelOptions({ options: { customName: "results" } }) -export class dbComputeResult extends TimeStamps { - @prop({ - required: true, - type: LocationBase, - discriminators: () => [ - { type: LocationTBM, value: LocationType.TBM }, - { type: LocationAddress, value: LocationType.Address }, - ], - }) - public from!: LocationBase; - - @prop({ - required: true, - type: LocationBase, - discriminators: () => [ - { type: LocationTBM, value: LocationType.TBM }, - { type: LocationAddress, value: LocationType.Address }, - ], - }) - public to!: LocationBase; - - @prop({ required: true }) - departureTime!: Date; - - @prop({ required: true, type: () => RunSettings }) - settings!: RunSettings; - - @prop({ required: true }) - journeys!: Journey[]; -} - -export default function init(db: Connection) { - deleteModelWithClass(dbComputeResult); - - return getModelForClass(dbComputeResult, { - existingConnection: db, - }); -} - -export type dbComputeResultModel = ReturnType; diff --git a/src/test/models/sections.model.ts b/src/test/models/sections.model.ts deleted file mode 100644 index 35ba9206..00000000 --- a/src/test/models/sections.model.ts +++ /dev/null @@ -1,61 +0,0 @@ -// sections-model.js - A mongoose model -// -// See http://mongoosejs.com/docs/models.html - -export enum SectionDomanial { - NonRenseigne = 0, - Autoroute = 1, - RouteNationale = 2, - RouteDepartementale = 3, - VoieMetropolitaine = 4, - VoiePrivee = 5, - CheminRural = 6, - Autre = 7, -} - -import { deleteModelWithClass, getModelForClass, prop, type ReturnModelType } from "@typegoose/typegoose"; -import { TimeStamps } from "@typegoose/typegoose/lib/defaultClasses"; -import { modelOptions } from "@typegoose/typegoose/lib/modelOptions"; -import { Connection } from "mongoose"; -import { TBMEndpoints } from "."; - -@modelOptions({ options: { customName: TBMEndpoints.Sections } }) -export class dbSections extends TimeStamps { - @prop({ required: true }) - public _id!: number; - - @prop({ type: () => [[Number, Number]], required: true }) - public coords!: [number, number][]; - - @prop({ required: true }) - public distance!: number; - - @prop({ required: true, enum: SectionDomanial }) - public domanial!: SectionDomanial; - - @prop({ required: true }) - public groupe!: number; - - @prop({ required: true }) - public cat_dig!: number; - - @prop({ required: true }) - public nom_voie!: string; - - @prop({ required: true }) - public rg_fv_graph_dbl!: boolean; - - @prop({ required: true }) - public rg_fv_graph_nd!: number; - - @prop({ required: true }) - public rg_fv_graph_na!: number; -} - -export default function init(db: Connection): ReturnModelType { - deleteModelWithClass(dbSections); - - return getModelForClass(dbSections, { existingConnection: db }); -} - -export type dbSectionsModel = ReturnType; From d1498f1b4ee50ea26758b43822e1e231299ff95a Mon Sep 17 00:00:00 2001 From: Catatomik Date: Fri, 5 Sep 2025 15:15:09 +0200 Subject: [PATCH 250/251] =?UTF-8?q?=F0=9F=9A=A7=20Max=20RAPTOR=20rounds=20?= =?UTF-8?q?CLI=20argument?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/index.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/test/index.ts b/src/test/index.ts index a6ff0871..d2a249e2 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -461,6 +461,7 @@ Command-line interface: h, help, -h, --h, --help: see this message --fp-req-len=: maximum foot paths' length to retrieve and store un RAPTOR data --fp-run-len=: maximum foot paths' length to consider during itineraries search + --rounds=: (max) number of RAPTOR rounds to perform (-d[ ] | --d=): time data type, scalar or interval --delay-pos=: positive delay (in sec), interval time only --delay-neg=: negative delay (in sec), interval time only @@ -494,6 +495,9 @@ Command-line interface: const fpRunLen = getArgsOptNumber(args, "fp-run-len") ?? 2_000; console.debug(`Foot paths run max len`, fpRunLen); + const maxRounds = getArgsOptNumber(args, "rounds") ?? undefined; + console.debug(`Performing maximal rounds of`, maxRounds); + let dataType: DataType; if ("d" in args) { switch ((args.d as string).toLowerCase()) { @@ -723,7 +727,7 @@ Command-line interface: // Run function runRAPTOR() { - RAPTORInstance.run(psId, pt, departureTime, settings); + RAPTORInstance.run(psId, pt, departureTime, settings, maxRounds); } console.log( `Running with: ps=${psId}, pt=${pt}, departure time=${new Date(typeof departureTime === "number" ? departureTime : departureTime[0]).toLocaleString()}, settings=${JSON.stringify(settings)}`, From d9141357a7a6e186598fd7d4ec5de610f0485f23 Mon Sep 17 00:00:00 2001 From: Catatomik Date: Fri, 12 Sep 2025 17:05:40 +0200 Subject: [PATCH 251/251] =?UTF-8?q?=E2=9C=A8=20Support=20OTA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/index.ts | 75 +++++++++++++++++++++++++++++++++++++---------- 1 file changed, 59 insertions(+), 16 deletions(-) diff --git a/src/test/index.ts b/src/test/index.ts index d2a249e2..e5cbf6ad 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -475,6 +475,7 @@ Command-line interface: --save: save results in database --ps=: source stop in source database for the itinerary query --pt=: target stop in source database for the itinerary query + --ota: make OTA (One-To-All) runs, ignores pt `); } @@ -620,12 +621,17 @@ Command-line interface: const psRawId = 1_000_000; let psId: number | SharedID = psRawId; - const pt = queriedData.mapStopId( - Providers.TBM, - getArgsOptNumber(args, "pt") ?? - // Béthanie - 3846, - ); + const OTA = args.ota === true ? true : false; + console.debug("OTA mode set to", OTA); + + const pt = OTA + ? null + : queriedData.mapStopId( + Providers.TBM, + getArgsOptNumber(args, "pt") ?? + // Béthanie + 3846, + ); // Compute RAPTOR data @@ -737,36 +743,73 @@ Command-line interface: // Get results function resultRAPTOR() { - return RAPTORInstance.getBestJourneys(pt); + return OTA + ? new Map(Array.from(RAPTORDataInst.stops).map(([_, { id }]) => [id, RAPTORInstance.getBestJourneys(id)])) + : // OTA is false <=> pt is number + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + RAPTORInstance.getBestJourneys(pt!); } const b6 = await benchmark(resultRAPTOR, [], undefined, getResTimes); if (!b6.lastReturn) throw new Error(`No best journeys`); console.debug("Best journeys", inspect(b6.lastReturn, false, 6)); - const b7 = await benchmark(postTreatment, [ - postCriteria as Criterion[], - RAPTORDataInst, - instanceType, - b6.lastReturn, - pt, - ]); + // Allow post-treating in OTA mode too + function postTreatmentAdapter() { + if (b6.lastReturn instanceof Array) + return postTreatment( + postCriteria as Criterion[], + RAPTORDataInst, + instanceType, + b6.lastReturn, + // If best journeys is an array, there was a target + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + pt!, + ); + + if (b6.lastReturn instanceof Map) { + return new Map( + b6.lastReturn + .entries() + .map(([stopId, bestJourneys]) => [ + stopId, + postTreatment( + postCriteria as Criterion[], + RAPTORDataInst, + instanceType, + bestJourneys, + stopId, + ), + ]), + ); + } + + // Should never happen + return []; + } + const b7 = await benchmark(postTreatmentAdapter, []); if (!b7.lastReturn) throw new Error(`No post treatment`); console.debug("Post treatment", inspect(b7.lastReturn, false, 6)); if (saveResults) { // Save results + if (OTA) { + console.warn("Saving results is not supported in OTA mode"); + return; + } + const b8 = await benchmark(insertResults, [ queriedData.resultModel, queriedData.unmapStopId, queriedData.unmapRouteId, RAPTORDataInst.timeType, [psRawId, from], + // OTA === false <=> pt is number // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - [pt, { type: PointType.TBMStop, id: queriedData.unmapStopId(pt)![0] }], + [pt!, { type: PointType.TBMStop, id: queriedData.unmapStopId(pt!)![0] }], departureTime, settings, - b7.lastReturn, + b7.lastReturn as ReturnType>, ]); console.log("Saved result id", b8.lastReturn); }