C#:
using Facepunch;
using Newtonsoft.Json;
using Oxide.Core.Plugins;
using Oxide.Ext.AStar;
using ProtoBuf;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using UnityEngine;
namespace Oxide.Plugins {
[Info("NPCTaxi", "k1lly0u", "0.1.15")]
[Description("Allow players to call NPC driven taxi's to drive them around")]
class NPCTaxi : RustPlugin, IPathFinder {
#region Fields
[PluginReference]
Plugin ServerRewards, Economics, Friends, Clans;
private Telephone _telephone;
private List<GridNode> _roadNodes = ListPool.Get<GridNode>();
private static Hash<ulong, float> _cooldowns = new Hash<ulong, float>();
private static int _scrapItemID;
private static NPCTaxi Instance;
private static Oxide.Ext.AStar.PathFinder PathFinder;
private static List<BasePlayer> PathRequests;
private static List<VehicleAI> ActiveVehicles;
private const string SCIENTIST_PREFAB = "assets/rust.ai/agents/npcplayer/humannpc/scientist/scientistnpc_heavy.prefab";
private const string PHONE_PREFAB = "assets/prefabs/voiceaudio/telephone/telephone.deployed.prefab";
private const string PERMISSION_USE = "npctaxi.use";
private const string PERMISSION_NOCOST = "npctaxi.nocost";
private const string PERMISSION_NOCOOLDOWN = "npctaxi.nocooldown";
private const float MAXIMUM_CALL_DISTANCE_FROM_ROAD = 20;
private const float WORLD_GRID_SIZE = 2f;
public bool DebugMode => Configuration.PathfinderDebug;
private bool DrawSensors => false;
private PurchaseType _purchaseType;
private enum PurchaseType {
Scrap, ServerRewards, Economics
}
#endregion
#region Oxide Hooks
private void Loaded() {
Instance = this;
PathRequests = ListPool.Get<BasePlayer>();
ActiveVehicles = ListPool.Get<VehicleAI>();
permission.RegisterPermission(PERMISSION_USE, this);
permission.RegisterPermission(PERMISSION_NOCOST, this);
permission.RegisterPermission(PERMISSION_NOCOOLDOWN, this);
for (int i = 0; i < Configuration.Costs.Count; i++) {
if (!permission.PermissionExists(Configuration.Costs[i].Permission)) permission.RegisterPermission(Configuration.Costs[i].Permission, this);
}
}
protected override void LoadDefaultMessages() => lang.RegisterMessages(Messages, this);
private void OnServerInitialized() {
_purchaseType = ParseType<PurchaseType>(Configuration.CostType);
_scrapItemID = ItemManager.FindItemDefinition("scrap").itemid;
if (!Configuration.Invincible) Unsubscribe(nameof(OnEntityTakeDamage));
if (!Configuration.UseTelephone) Unsubscribe(nameof(OnPhoneDial));
else SpawnTelephone();
PathFinder = PathManager.RegisterPathFinder(this, new PathFinderConfig {
NodeEvaluator = EvaluateNode, WorldSize = World.Size, CellSize = WORLD_GRID_SIZE, PathInterval = 10f, BlurRate = 2
}
);
}
private void OnEntityTakeDamage(BaseVehicleModule baseVehicleModule, HitInfo hitInfo) {
if (baseVehicleModule.GetParentEntity()?.GetComponent<VehicleAI>() != null) {
hitInfo.damageTypes.Clear();
hitInfo.HitEntity = null;
hitInfo.HitMaterial = 0;
hitInfo.PointStart = Vector3.zero;
}
}
private void OnEntityTakeDamage(ScientistNPC scientistNPC, HitInfo hitInfo) {
if (scientistNPC.GetMountedVehicle()?.GetComponent<VehicleAI>() != null) {
hitInfo.damageTypes.Clear();
hitInfo.HitEntity = null;
hitInfo.HitMaterial = 0;
hitInfo.PointStart = Vector3.zero;
}
}
private object OnTurretTarget(AutoTurret autoTurret, ScientistNPC scientistNPC) {
if (ActiveVehicles.Count == 0) return null;
if (scientistNPC?.GetMountedVehicle()?.GetComponent<VehicleAI>() != null) return true;
return null;
}
private void OnLootEntity(BasePlayer player, Rust.Modular.EngineStorage engineStorage) {
if (engineStorage.GetComponentInParent<VehicleAI>() != null) NextTick(player.EndLooting);
}
private void OnEntityKill(ModularCar modularCar) => UnityEngine.Object.Destroy(modularCar.GetComponent<VehicleAI>());
private void OnMapMarkerAdd(BasePlayer player, MapNote mapNote) {
VehicleAI vehicleAI = player.GetMountedVehicle()?.GetComponent<VehicleAI>();
if (vehicleAI != null && vehicleAI.Caller == player && vehicleAI.State == VehicleAI.TaxiState.WaitingForInput) {
int topology = TerrainMeta.TopologyMap.GetTopology(mapNote.worldPosition, MAXIMUM_CALL_DISTANCE_FROM_ROAD);
if (!ContainsTopology(topology, TerrainTopology.Enum.Road)) {
player.ChatMessage(Message("Error.TooFarAway", player.userID, true));
return;
}
Vector3 closestNode = FindClosestNodeTo(mapNote.worldPosition);
vehicleAI.OnMarkerPlaced(closestNode);
}
}
private object CanMountEntity(BasePlayer player, BaseMountable mountable) {
if (player.IsNpc) return null;
VehicleAI vehicleAI = mountable.VehicleParent()?.GetComponent<VehicleAI>();
if (vehicleAI != null) {
if (vehicleAI.State == VehicleAI.TaxiState.WaitingForInput) {
if (player == vehicleAI.Caller) {
vehicleAI.OnCallerEnteredVehicle();
return null;
}
if (player.currentTeam != 0UL && player.currentTeam.Equals(vehicleAI.Caller.currentTeam)) return null;
if (IsFriend(vehicleAI.Caller.userID, player.userID)) return null;
if (IsClanmate(vehicleAI.Caller.userID, player.userID)) return null;
}
return false;
}
return null;
}
private void OnEntityDismounted(BaseMountable mountable, BasePlayer player) {
VehicleAI vehicleAI = mountable.VehicleParent()?.GetComponent<VehicleAI>();
if (vehicleAI != null) {
if (player == vehicleAI.Caller) {
player.SendConsoleCommand("gametip.hidegametip");
player.ChatMessage(Message("Notification.Goodbye", player.userID, true));
vehicleAI.CancelService();
_cooldowns[player.userID] = Time.time + Configuration.CooldownTime;
}
}
}
private object OnPhoneDial(PhoneController callerPhone, PhoneController receiverPhone, BasePlayer player) {
if ((receiverPhone.ParentEntity as Telephone) == _telephone) {
receiverPhone.OnDialFailed(Telephone.DialFailReason.RemoteHangUp);
callerPhone.ServerHangUp();
callerPhone.ClearCurrentUser();
RequestTaxi(player, true);
return true;
}
return null;
}
private object OnServerCommand(ConsoleSystem.Arg arg) {
const string VEHICLE_SWAP_SEAT = "vehicle.swapseats";
const string PLAYER_SWAP_SEAT = "player.swapseat";
BasePlayer player = arg.Player();
if (player != null && (arg.cmd.FullName.Equals(PLAYER_SWAP_SEAT, StringComparison.OrdinalIgnoreCase) || arg.cmd.FullName.Equals(VEHICLE_SWAP_SEAT, StringComparison.OrdinalIgnoreCase))) {
if (player.GetMountedVehicle()?.GetComponent<VehicleAI>() != null) {
player.ChatMessage(Message("Notification.NoSwappingSeats", player.userID, true));
return false;
}
}
return null;
}
private void Unload() {
if (_telephone != null && !_telephone.IsDestroyed) {
TelephoneManager.DeregisterTelephone(_telephone.Controller);
_telephone.Kill(BaseNetworkable.DestroyMode.None);
}
for (int i = ActiveVehicles.Count - 1; i >= 0; i--) {
UnityEngine.Object.Destroy(ActiveVehicles[i]);
}
ListPool.Free(ref ActiveVehicles);
ListPool.Free(ref PathRequests);
ListPool.Free(ref _roadNodes);
PathManager.Unload(this);
Instance = null;
Configuration = null;
PathFinder = null;
}
#endregion
#region Path Generator Callbacks
private void OnPathGenerated(PathCompletedResult pathResult) {
if (DebugMode) Debug.Log("Path Generated");
List<Vector3> results = pathResult.Results;
PathRequests.Remove(pathResult.Requester);
pathResult.Requester.ChatMessage(Message("Notification.Inbound", pathResult.Requester.userID, true));
SendMapMarker(pathResult.Requester, results[results.Count - 1]);
VehicleAI vehicleAI = CreateTaxiVehicle(results[0] + Vector3.up, Quaternion.LookRotation((results[1] - results[0]).normalized));
vehicleAI.InitializeVehicle(pathResult.Requester, results);
ActiveVehicles.Add(vehicleAI);
_cooldowns[pathResult.Requester.userID] = Time.time + Configuration.CooldownTime;
if (DebugMode) Debug.Log($"Taxi spawned at {results[0]}");
}
private void OnPathFailed(PathFailedResult pathResult) {
if (DebugMode) Debug.Log("Path Generation Failed");
pathResult.Requester.ChatMessage(string.Format(Message("Error.PathFail", pathResult.Requester.userID), pathResult.Reason));
PathRequests.Remove(pathResult.Requester);
}
#endregion
#region Node Helpers
private Vector3 FindClosestNodeTo(Vector3 position) {
Vector3 closestNode = position;
float closestDistance = float.MaxValue;
for (int i = 0; i < _roadNodes.Count; i++) {
GridNode node = _roadNodes[i];
float distance = Vector3.Distance(position, node.Position);
if (distance < closestDistance) {
closestNode = node.Position;
closestDistance = distance;
}
}
return closestNode;
}
private Vector3 FindNodeAtDistance(Vector3 position, float range, float threshold) {
Vector3 closestNode = position;
float closestDistance = float.MaxValue;
for (int i = 0; i < _roadNodes.Count; i++) {
GridNode node = _roadNodes[i];
float distance = Vector3.Distance(position, node.Position);
if (distance.Approximately(range, threshold)) return node.Position;
if (distance < closestDistance) {
closestNode = node.Position;
closestDistance = distance;
}
}
return closestNode;
}
#endregion
#region Map Markers
private static void SendMapMarker(BasePlayer player, Vector3 position) {
if (player.ServerCurrentMapNote != null) player.ServerCurrentMapNote.Dispose();
MapNote mapNote = Pool.Get<MapNote>();
mapNote.noteType = 1;
mapNote.worldPosition = position;
player.ServerCurrentMapNote = mapNote;
using (MapNoteList list = Pool.Get<MapNoteList>()) {
list.notes = Pool.GetList<MapNote>();
if (player.ServerCurrentDeathNote != null) list.notes.Add(player.ServerCurrentDeathNote);
list.notes.Add(mapNote);
player.ClientRPCPlayer<MapNoteList>(null, player, "Client_ReceiveMarkers", list);
list.notes.Clear();
}
}
#endregion
#region Telephone
private void SpawnTelephone() {
_telephone = GameManager.server.CreateEntity(PHONE_PREFAB) as Telephone;
_telephone.enableSaving = false;
_telephone.limitNetworking = true;
UnityEngine.Object.Destroy(_telephone.GetComponent<Collider>());
UnityEngine.Object.Destroy(_telephone.GetComponent<GroundWatch>());
UnityEngine.Object.Destroy(_telephone.GetComponent<DestroyOnGroundMissing>());
_telephone.Spawn();
NextTick(() => {
_telephone.Controller.PhoneName = "Taxi Service";
_telephone.Controller.RequirePower = false;
_telephone.SendNetworkUpdate(BasePlayer.NetworkQueue.Update);
}
);
}
#endregion
#region Helpers
private T ParseType<T>(string type) {
try {
return (T)Enum.Parse(typeof(T), type, true);
}
catch {
return default(T);
}
}
private int GetFareCost(string playerId) {
int cost = int.MaxValue;
for (int i = 0; i < Configuration.Costs.Count; i++) {
ConfigData.CostEntry costEntry = Configuration.Costs[i];
if (permission.UserHasPermission(playerId, costEntry.Permission)) cost = Mathf.Min(cost, costEntry.Cost);
}
return cost;
}
private int GetAmount(BasePlayer player) {
switch (_purchaseType) {
case PurchaseType.Scrap : return player.inventory.GetAmount(_scrapItemID);
case PurchaseType.ServerRewards : return (int)ServerRewards?.Call("CheckPoints", player.userID);
case PurchaseType.Economics : return (int)((double)Economics?.Call("Balance", player.UserIDString));
}
return 0;
}
private void SubtractFareCost(BasePlayer player, int fareCost) {
switch (_purchaseType) {
case PurchaseType.Scrap : player.inventory.Take(null, _scrapItemID, fareCost);
return;
case PurchaseType.ServerRewards : ServerRewards?.Call("TakePoints", player.userID, fareCost);
return;
case PurchaseType.Economics : Economics?.Call("Withdraw", player.UserIDString, (double)fareCost);
return;
}
}
private void RefundFareCost(BasePlayer player, int refundFare) {
switch (_purchaseType) {
case PurchaseType.Scrap : player.GiveItem(ItemManager.CreateByItemID(_scrapItemID, refundFare), BaseEntity.GiveItemReason.PickedUp);
return;
case PurchaseType.ServerRewards : ServerRewards?.Call("AddPoints", player.userID, refundFare);
return;
case PurchaseType.Economics : Economics?.Call("Deposit", player.UserIDString, (double)refundFare);
return;
}
}
private bool IsClanmate(ulong playerId, ulong friendId) {
if (!Clans) return false;
string playerTag = Clans?.Call<string>("GetClanOf", playerId);
string friendTag = Clans?.Call<string>("GetClanOf", friendId);
if (!string.IsNullOrEmpty(playerTag) && playerTag == friendTag) return true;
return false;
}
private bool IsFriend(ulong playerID, ulong friendID) {
if (!Friends) return false;
return (bool)Friends?.Call("AreFriends", playerID, friendID);
}
private static bool ContainsTopologyAtPoint(TerrainTopology.Enum mask, Vector3 position) => (TerrainMeta.TopologyMap.GetTopology(position) & (int)mask) != 0;
private static bool ContainsTopology(int topology, TerrainTopology.Enum mask) => (topology & (int)mask) != 0;
#endregion
#region Node Evaluator
public void EvaluateNode(GridNode gridNode, Vector3 position) {
position.y = TerrainMeta.HeightMap.GetHeight(position);
gridNode.Position = position;
if (position.y < 0) {
gridNode.C_Cost = 1000;
gridNode.IsBlocked = true;
return;
}
int topologyInRadius = TerrainMeta.TopologyMap.GetTopology(position, gridNode.CellSize * 0.5f);
if (topologyInRadius.ContainsTopology(TerrainTopology.Enum.Road)) {
_roadNodes.Add(gridNode);
gridNode.C_Cost = 0;
return;
}
if (topologyInRadius.ContainsTopology(TerrainTopology.Enum.Ocean | TerrainTopology.Enum.River | TerrainTopology.Enum.Lake | TerrainTopology.Enum.Cliff | TerrainTopology.Enum.Swamp | TerrainTopology.Enum.Decor | TerrainTopology.Enum.Building)) {
gridNode.C_Cost = 1000;
gridNode.IsBlocked = true;
return;
}
gridNode.C_Cost = 50;
if (topologyInRadius.ContainsTopology(TerrainTopology.Enum.Roadside)) return;
if (topologyInRadius.ContainsTopology(TerrainTopology.Enum.Monument | TerrainTopology.Enum.Forest | TerrainTopology.Enum.Forestside | TerrainTopology.Enum.Cliffside)) gridNode.C_Cost = 750;
float slope = TerrainMeta.HeightMap.GetSlope(position);
float maxSlope = Configuration.Taxi.Tier == 3 ? 60 : Configuration.Taxi.Tier == 2 ? 50 : 40;
if (slope > maxSlope) {
gridNode.C_Cost = 1000;
gridNode.IsBlocked = true;
}
else gridNode.C_Cost += Mathf.RoundToInt((slope / maxSlope) * 1000f);
}
public void OnGridProcessed() {
}
#endregion
#region Road Prefabs
public IEnumerator OnCostMapGenerated() {
Debug.Log("[NPCTaxi] Processing road prefabs...");
_roadPrefabs = JsonConvert.DeserializeObject<Dictionary<string, List<SerializedVector3>>>(SERIALIZED_ROAD_NODES);
GameObject[] gameObjects = UnityEngine.Object.FindObjectsOfType<GameObject>();
int prefabCount = 0;
for (int i = 0; i < gameObjects.Length; i++) {
GameObject gameObject = gameObjects[i];
if (gameObject.name.Contains("road_")) {
string name = Core.Utility.GetFileNameWithoutExtension(gameObject.name);
List<SerializedVector3> list = FindPrefab(name);
if (list != null) {
prefabCount++;
Transform tr = gameObject.transform;
for (int y = 0; y < list.Count; y++) {
SerializedVector3 vector3 = list[y];
Vector3 v = tr.TransformPoint(vector3.X, vector3.Y, vector3.Z);
GridNode node = PathFinder.FindOrCreateCell(v);
node.Position = new Vector3(node.Position.x, v.y, node.Position.z);
node.C_Cost = 0;
node.IsBlocked = false;
}
yield return null;
}
}
}
Debug.Log($"[NPCTaxi] Processed {prefabCount} road prefabs");
}
private Dictionary<string, List<SerializedVector3>> _roadPrefabs = new Dictionary<string, List<SerializedVector3>>();
private struct SerializedVector3 {
public float X, Y, Z;
}
private List<SerializedVector3> FindPrefab(string name) {
foreach(KeyValuePair<string, List<SerializedVector3>> kvp in _roadPrefabs) {
if (name.StartsWith(kvp.Key, StringComparison.OrdinalIgnoreCase)) return kvp.Value;
}
return null;
}
#region Road Node Json
private const string SERIALIZED_ROAD_NODES = @"{'road_18x15':[{'X':-5.1,'Y':0,'Z':-10},{'X':-3.1,'Y':0,'Z':-10},{'X':-1.1,'Y':0,'Z':-10},{'X':0.9,'Y':0,'Z':-10},{'X':2.9,'Y':0,'Z':-10},{'X':4.9,'Y':0,'Z':-10},{'X':-5.1,'Y':0,'Z':-8},{'X':-3.1,'Y':0,'Z':-8},{'X':-1.1,'Y':0,'Z':-8},{'X':0.9,'Y':0,'Z':-8},{'X':2.9,'Y':0,'Z':-8},{'X':4.9,'Y':0,'Z':-8},{'X':-5.1,'Y':0,'Z':-6},{'X':-3.1,'Y':0,'Z':-6},{'X':-1.1,'Y':0,'Z':-6},{'X':0.9,'Y':0,'Z':-6},{'X':2.9,'Y':0,'Z':-6},{'X':4.9,'Y':0,'Z':-6},{'X':-5.1,'Y':0,'Z':-4},{'X':-3.1,'Y':0,'Z':-4},{'X':-1.1,'Y':0,'Z':-4},{'X':0.9,'Y':0,'Z':-4},{'X':2.9,'Y':0,'Z':-4},{'X':4.9,'Y':0,'Z':-4},{'X':-5.1,'Y':0,'Z':-2},{'X':-3.1,'Y':0,'Z':-2},{'X':-1.1,'Y':0,'Z':-2},{'X':0.9,'Y':0,'Z':-2},{'X':2.9,'Y':0,'Z':-2},{'X':4.9,'Y':0,'Z':-2},{'X':-5.1,'Y':0,'Z':0},{'X':-3.1,'Y':0,'Z':0},{'X':-1.1,'Y':0,'Z':0},{'X':0.9,'Y':0,'Z':0},{'X':2.9,'Y':0,'Z':0},{'X':4.9,'Y':0,'Z':0},{'X':-5.1,'Y':0,'Z':2},{'X':-3.1,'Y':0,'Z':2},{'X':-1.1,'Y':0,'Z':2},{'X':0.9,'Y':0,'Z':2},{'X':2.9,'Y':0,'Z':2},{'X':4.9,'Y':0,'Z':2},{'X':-5.1,'Y':0,'Z':4},{'X':-3.1,'Y':0,'Z':4},{'X':-1.1,'Y':0,'Z':4},{'X':0.9,'Y':0,'Z':4},{'X':2.9,'Y':0,'Z':4},{'X':4.9,'Y':0,'Z':4},{'X':-5.1,'Y':0,'Z':6},{'X':-3.1,'Y':0,'Z':6},{'X':-1.1,'Y':0,'Z':6},{'X':0.9,'Y':0,'Z':6},{'X':2.9,'Y':0,'Z':6},{'X':4.9,'Y':0,'Z':6},{'X':-5.1,'Y':0,'Z':8},{'X':-3.1,'Y':0,'Z':8},{'X':-1.1,'Y':0,'Z':8},{'X':0.9,'Y':0,'Z':8},{'X':2.9,'Y':0,'Z':8},{'X':4.9,'Y':0,'Z':8},{'X':-5.1,'Y':0,'Z':10},{'X':-3.1,'Y':0,'Z':10},{'X':-1.1,'Y':0,'Z':10},{'X':0.9,'Y':0,'Z':10},{'X':2.9,'Y':0,'Z':10},{'X':4.9,'Y':0,'Z':10}],'road_27x15':[{'X':-4.9,'Y':0,'Z':-14},{'X':-2.9,'Y':0,'Z':-14},{'X':-0.9,'Y':0,'Z':-14},{'X':1.1,'Y':0,'Z':-14},{'X':3,'Y':0,'Z':-14},{'X':5.1,'Y':0,'Z':-14},{'X':-4.9,'Y':0,'Z':-12},{'X':-2.9,'Y':0,'Z':-12},{'X':-0.9,'Y':0,'Z':-12},{'X':1.1,'Y':0,'Z':-12},{'X':3.1,'Y':0,'Z':-12},{'X':5.1,'Y':0,'Z':-12},{'X':-4.9,'Y':0,'Z':-10},{'X':-2.9,'Y':0,'Z':-10},{'X':-0.9,'Y':0,'Z':-10},{'X':1.1,'Y':0,'Z':-10},{'X':3.1,'Y':0,'Z':-10},{'X':5.1,'Y':0,'Z':-10},{'X':-4.9,'Y':0,'Z':-8},{'X':-2.9,'Y':0,'Z':-8},{'X':-0.9,'Y':0,'Z':-8},{'X':1.1,'Y':0,'Z':-8},{'X':3.1,'Y':0,'Z':-8},{'X':5.1,'Y':0,'Z':-8},{'X':-4.9,'Y':0,'Z':-6},{'X':-2.9,'Y':0,'Z':-6},{'X':-0.9,'Y':0,'Z':-6},{'X':1.1,'Y':0,'Z':-6},{'X':3.1,'Y':0,'Z':-6},{'X':5.1,'Y':0,'Z':-6},{'X':-4.9,'Y':0,'Z':-4},{'X':-2.9,'Y':0,'Z':-4},{'X':-0.9,'Y':0,'Z':-4},{'X':1.1,'Y':0,'Z':-4},{'X':3.1,'Y':0,'Z':-4},{'X':5.1,'Y':0,'Z':-4},{'X':-4.9,'Y':0,'Z':-2},{'X':-2.9,'Y':0,'Z':-2},{'X':-0.9,'Y':0,'Z':-2},{'X':1.1,'Y':0,'Z':-2},{'X':3.1,'Y':0,'Z':-2},{'X':5.1,'Y':0,'Z':-2},{'X':-4.9,'Y':0,'Z':0},{'X':-2.9,'Y':0,'Z':0},{'X':-0.9,'Y':0,'Z':0},{'X':1.1,'Y':0,'Z':0},{'X':3.1,'Y':0,'Z':0},{'X':5.1,'Y':0,'Z':0},{'X':-4.9,'Y':0,'Z':2},{'X':-2.9,'Y':0,'Z':2},{'X':-0.9,'Y':0,'Z':2},{'X':1.1,'Y':0,'Z':2},{'X':3.1,'Y':0,'Z':2},{'X':5.1,'Y':0,'Z':2},{'X':-4.9,'Y':0,'Z':4},{'X':-2.9,'Y':0,'Z':4},{'X':-0.9,'Y':0,'Z':4},{'X':1.1,'Y':0,'Z':4},{'X':3.1,'Y':0,'Z':4},{'X':5.1,'Y':0,'Z':4},{'X':-4.9,'Y':0,'Z':6},{'X':-2.9,'Y':0,'Z':6},{'X':-0.9,'Y':0,'Z':6},{'X':1.1,'Y':0,'Z':6},{'X':3.1,'Y':0,'Z':6},{'X':5.1,'Y':0,'Z':6},{'X':-4.9,'Y':0,'Z':8},{'X':-2.9,'Y':0,'Z':8},{'X':-0.9,'Y':0,'Z':8},{'X':1.1,'Y':0,'Z':8},{'X':3.1,'Y':0,'Z':8},{'X':5.1,'Y':0,'Z':8},{'X':-4.9,'Y':0,'Z':10},{'X':-2.9,'Y':0,'Z':10},{'X':-0.9,'Y':0,'Z':10},{'X':1.1,'Y':0,'Z':10},{'X':3.1,'Y':0,'Z':10},{'X':5.1,'Y':0,'Z':10},{'X':-4.9,'Y':0,'Z':12},{'X':-2.9,'Y':0,'Z':12},{'X':-0.9,'Y':0,'Z':12},{'X':1.1,'Y':0,'Z':12},{'X':3.1,'Y':0,'Z':12},{'X':5.1,'Y':0,'Z':12},{'X':-4.9,'Y':0,'Z':14},{'X':-2.9,'Y':0,'Z':14},{'X':-0.9,'Y':0,'Z':14},{'X':1.1,'Y':0,'Z':14},{'X':3.1,'Y':0,'Z':14},{'X':5.1,'Y':0,'Z':14}],'road_36x15':[{'X':-5,'Y':0,'Z':-18.9},{'X':-3,'Y':0,'Z':-18.9},{'X':-1,'Y':0,'Z':-18.9},{'X':1,'Y':0,'Z':-18.9},{'X':3,'Y':0,'Z':-18.9},{'X':5,'Y':0,'Z':-18.9},{'X':-5,'Y':0,'Z':-16.9},{'X':-3,'Y':0,'Z':-16.9},{'X':-1,'Y':0,'Z':-16.9},{'X':1,'Y':0,'Z':-16.9},{'X':3,'Y':0,'Z':-16.9},{'X':5,'Y':0,'Z':-16.9},{'X':-5,'Y':0,'Z':-14.9},{'X':-3,'Y':0,'Z':-14.9},{'X':-1,'Y':0,'Z':-14.9},{'X':1,'Y':0,'Z':-14.9},{'X':3,'Y':0,'Z':-14.9},{'X':5,'Y':0,'Z':-14.9},{'X':-5,'Y':0,'Z':-12.9},{'X':-3,'Y':0,'Z':-12.9},{'X':-1,'Y':0,'Z':-12.9},{'X':1,'Y':0,'Z':-12.9},{'X':3,'Y':0,'Z':-12.9},{'X':5,'Y':0,'Z':-12.9},{'X':-5,'Y':0,'Z':-10.9},{'X':-3,'Y':0,'Z':-10.9},{'X':-1,'Y':0,'Z':-10.9},{'X':1,'Y':0,'Z':-10.9},{'X':3,'Y':0,'Z':-10.9},{'X':5,'Y':0,'Z':-10.9},{'X':-5,'Y':0,'Z':-8.9},{'X':-3,'Y':0,'Z':-8.9},{'X':-1,'Y':0,'Z':-8.9},{'X':1,'Y':0,'Z':-8.9},{'X':3,'Y':0,'Z':-8.9},{'X':5,'Y':0,'Z':-8.9},{'X':-5,'Y':0,'Z':-6.9},{'X':-3,'Y':0,'Z':-6.9},{'X':-1,'Y':0,'Z':-6.9},{'X':1,'Y':0,'Z':-6.9},{'X':3,'Y':0,'Z':-6.9},{'X':5,'Y':0,'Z':-6.9},{'X':-5,'Y':0,'Z':-4.9},{'X':-3,'Y':0,'Z':-4.9},{'X':-1,'Y':0,'Z':-4.9},{'X':1,'Y':0,'Z':-4.9},{'X':3,'Y':0,'Z':-4.9},{'X':5,'Y':0,'Z':-4.9},{'X':-5,'Y':0,'Z':-2.9},{'X':-3,'Y':0,'Z':-2.9},{'X':-1,'Y':0,'Z':-2.9},{'X':1,'Y':0,'Z':-2.9},{'X':3,'Y':0,'Z':-2.9},{'X':5,'Y':0,'Z':-2.9},{'X':-5,'Y':0,'Z':-0.9},{'X':-3,'Y':0,'Z':-0.9},{'X':-1,'Y':0,'Z':-0.9},{'X':1,'Y':0,'Z':-0.9},{'X':3,'Y':0,'Z':-0.9},{'X':5,'Y':0,'Z':-0.9},{'X':-5,'Y':0,'Z':1.1},{'X':-3,'Y':0,'Z':1.1},{'X':-1,'Y':0,'Z':1.1},{'X':1,'Y':0,'Z':1.1},{'X':3,'Y':0,'Z':1.1},{'X':5,'Y':0,'Z':1.1},{'X':-5,'Y':0,'Z':3.1},{'X':-3,'Y':0,'Z':3.1},{'X':-1,'Y':0,'Z':3.1},{'X':1,'Y':0,'Z':3.1},{'X':3,'Y':0,'Z':3.1},{'X':5,'Y':0,'Z':3.1},{'X':-5,'Y':0,'Z':5.1},{'X':-3,'Y':0,'Z':5.1},{'X':-1,'Y':0,'Z':5.1},{'X':1,'Y':0,'Z':5.1},{'X':3,'Y':0,'Z':5.1},{'X':5,'Y':0,'Z':5.1},{'X':-5,'Y':0,'Z':7.1},{'X':-3,'Y':0,'Z':7.1},{'X':-1,'Y':0,'Z':7.1},{'X':1,'Y':0,'Z':7.1},{'X':3,'Y':0,'Z':7.1},{'X':5,'Y':0,'Z':7.1},{'X':-5,'Y':0,'Z':9.1},{'X':-3,'Y':0,'Z':9.1},{'X':-1,'Y':0,'Z':9.1},{'X':1,'Y':0,'Z':9.1},{'X':3,'Y':0,'Z':9.1},{'X':5,'Y':0,'Z':9.1},{'X':-5,'Y':0,'Z':11.1},{'X':-3,'Y':0,'Z':11.1},{'X':-1,'Y':0,'Z':11.1},{'X':1,'Y':0,'Z':11.1},{'X':3,'Y':0,'Z':11.1},{'X':5,'Y':0,'Z':11.1},{'X':-5,'Y':0,'Z':13.1},{'X':-3,'Y':0,'Z':13.1},{'X':-1,'Y':0,'Z':13.1},{'X':1,'Y':0,'Z':13.1},{'X':3,'Y':0,'Z':13.1},{'X':5,'Y':0,'Z':13.1},{'X':-5,'Y':0,'Z':15.1},{'X':-3,'Y':0,'Z':15.1},{'X':-1,'Y':0,'Z':15.1},{'X':1,'Y':0,'Z':15.1},{'X':3,'Y':0,'Z':15.1},{'X':5,'Y':0,'Z':15.1},{'X':-5,'Y':0,'Z':17.1},{'X':-3,'Y':0,'Z':17.1},{'X':-1,'Y':0,'Z':17.1},{'X':1,'Y':0,'Z':17.1},{'X':3,'Y':0,'Z':17.1},{'X':5,'Y':0,'Z':17.1}],'road_9x15':[{'X':-4.9,'Y':0,'Z':-5.5},{'X':-2.9,'Y':0,'Z':-5.5},{'X':-0.9,'Y':0,'Z':-5.5},{'X':1.1,'Y':0,'Z':-5.5},{'X':3.1,'Y':0,'Z':-5.5},{'X':5.1,'Y':0,'Z':-5.5},{'X':-4.9,'Y':0,'Z':-3.5},{'X':-2.9,'Y':0,'Z':-3.5},{'X':-0.9,'Y':0,'Z':-3.5},{'X':1.1,'Y':0,'Z':-3.5},{'X':3.1,'Y':0,'Z':-3.5},{'X':5.1,'Y':0,'Z':-3.5},{'X':-4.9,'Y':0,'Z':-1.5},{'X':-2.9,'Y':0,'Z':-1.5},{'X':-0.9,'Y':0,'Z':-1.5},{'X':1.1,'Y':0,'Z':-1.5},{'X':3.1,'Y':0,'Z':-1.5},{'X':5.1,'Y':0,'Z':-1.5},{'X':-4.9,'Y':0,'Z':0.5},{'X':-2.9,'Y':0,'Z':0.5},{'X':-0.9,'Y':0,'Z':0.5},{'X':1.1,'Y':0,'Z':0.5},{'X':3.1,'Y':0,'Z':0.5},{'X':5.1,'Y':0,'Z':0.5},{'X':-4.9,'Y':0,'Z':2.5},{'X':-2.9,'Y':0,'Z':2.5},{'X':-0.9,'Y':0,'Z':2.5},{'X':1.1,'Y':0,'Z':2.5},{'X':3.1,'Y':0,'Z':2.5},{'X':5.1,'Y':0,'Z':2.5},{'X':-4.9,'Y':0,'Z':4.5},{'X':-2.9,'Y':0,'Z':4.5},{'X':-0.9,'Y':0,'Z':4.5},{'X':1.1,'Y':0,'Z':4.5},{'X':3.1,'Y':0,'Z':4.5},{'X':5.1,'Y':0,'Z':4.5}],'road_9x15_end':[{'X':-5,'Y':0,'Z':-9.6},{'X':-3,'Y':0,'Z':-9.6},{'X':-1,'Y':0,'Z':-9.6},{'X':1,'Y':0,'Z':-9.6},{'X':3,'Y':0,'Z':-9.6},{'X':5,'Y':0,'Z':-9.6},{'X':-5,'Y':0,'Z':-7.6},{'X':-3,'Y':0,'Z':-7.6},{'X':-1,'Y':0,'Z':-7.6},{'X':1,'Y':0,'Z':-7.6},{'X':3,'Y':0,'Z':-7.6},{'X':5,'Y':0,'Z':-7.6},{'X':-5,'Y':0,'Z':-5.6},{'X':-3,'Y':0,'Z':-5.6},{'X':-1,'Y':0,'Z':-5.6},{'X':1,'Y':0,'Z':-5.6},{'X':3,'Y':0,'Z':-5.6},{'X':5,'Y':0,'Z':-5.6},{'X':-5,'Y':0,'Z':-3.6},{'X':-3,'Y':0,'Z':-3.6},{'X':-1,'Y':0,'Z':-3.6},{'X':1,'Y':0,'Z':-3.6},{'X':3,'Y':0,'Z':-3.6},{'X':5,'Y':0,'Z':-3.6},{'X':-5,'Y':0,'Z':-1.6},{'X':-3,'Y':0,'Z':-1.6},{'X':-1,'Y':0,'Z':-1.6},{'X':1,'Y':0,'Z':-1.6},{'X':3,'Y':0,'Z':-1.6},{'X':5,'Y':0,'Z':-1.6},{'X':-5,'Y':0,'Z':0.4},{'X':-3,'Y':0,'Z':0.4},{'X':-1,'Y':0,'Z':0.4},{'X':1,'Y':0,'Z':0.4},{'X':3,'Y':0,'Z':0.4},{'X':5,'Y':0,'Z':0.4},{'X':-5,'Y':0,'Z':2.4},{'X':-3,'Y':0,'Z':2.4},{'X':-1,'Y':0,'Z':2.4},{'X':1,'Y':0,'Z':2.4},{'X':3,'Y':0,'Z':2.4},{'X':5,'Y':0,'Z':2.4},{'X':-5,'Y':0,'Z':4.4},{'X':-3,'Y':0,'Z':4.4},{'X':-1,'Y':0,'Z':4.4},{'X':1,'Y':0,'Z':4.4},{'X':3,'Y':0,'Z':4.4},{'X':5,'Y':0,'Z':4.4}],'road_9x15_railway':[{'X':-5,'Y':0,'Z':-5.1},{'X':-3,'Y':0,'Z':-5.1},{'X':-1,'Y':0,'Z':-5.1},{'X':1,'Y':0,'Z':-5.1},{'X':3,'Y':0,'Z':-5.1},{'X':5,'Y':0,'Z':-5.1},{'X':-5,'Y':0,'Z':-3.1},{'X':-3,'Y':0,'Z':-3.1},{'X':-1,'Y':0,'Z':-3.1},{'X':1,'Y':0,'Z':-3.1},{'X':3,'Y':0,'Z':-3.1},{'X':5,'Y':0,'Z':-3.1},{'X':-5,'Y':0,'Z':-1.1},{'X':-3,'Y':0,'Z':-1.1},{'X':-1,'Y':0,'Z':-1.1},{'X':1,'Y':0,'Z':-1.1},{'X':3,'Y':0,'Z':-1.1},{'X':5,'Y':0,'Z':-1.1},{'X':-5,'Y':0,'Z':0.9},{'X':-3,'Y':0,'Z':0.9},{'X':-1,'Y':0,'Z':0.9},{'X':1,'Y':0,'Z':0.9},{'X':3,'Y':0,'Z':0.9},{'X':5,'Y':0,'Z':0.9},{'X':-5,'Y':0,'Z':2.9},{'X':-3,'Y':0,'Z':2.9},{'X':-1,'Y':0,'Z':2.9},{'X':1,'Y':0,'Z':2.9},{'X':3,'Y':0,'Z':2.9},{'X':5,'Y':0,'Z':2.9},{'X':-5,'Y':0,'Z':4.9},{'X':-3,'Y':0,'Z':4.9},{'X':-1,'Y':0,'Z':4.9},{'X':1,'Y':0,'Z':4.9},{'X':3,'Y':0,'Z':4.9},{'X':5,'Y':0,'Z':4.9}],'road_9x18_broken':[{'X':-4.9,'Y':0,'Z':-9.1},{'X':-2.9,'Y':0,'Z':-9.1},{'X':-0.9,'Y':0,'Z':-9.1},{'X':1.1,'Y':0,'Z':-9.1},{'X':3.1,'Y':0,'Z':-9.1},{'X':5.1,'Y':0,'Z':-9.1},{'X':-4.9,'Y':0,'Z':-7.1},{'X':-2.9,'Y':0,'Z':-7.1},{'X':-0.9,'Y':0,'Z':-7.1},{'X':1.1,'Y':0,'Z':-7.1},{'X':3.1,'Y':0,'Z':-7.1},{'X':5.1,'Y':0,'Z':-7.1},{'X':-4.9,'Y':0,'Z':-5.1},{'X':-2.9,'Y':0,'Z':-5.1},{'X':-0.9,'Y':0,'Z':-5.1},{'X':1.1,'Y':0,'Z':-5.1},{'X':3.1,'Y':0,'Z':-5.1},{'X':5.1,'Y':0,'Z':-5.1},{'X':-4.9,'Y':0,'Z':-3.1},{'X':-2.9,'Y':0,'Z':-3.1},{'X':-0.9,'Y':0,'Z':-3.1},{'X':1.1,'Y':0,'Z':-3.1},{'X':3.1,'Y':0,'Z':-3.1},{'X':5.1,'Y':0,'Z':-3.1},{'X':-4.9,'Y':0,'Z':-1.1},{'X':-2.9,'Y':0,'Z':-1.1},{'X':-0.9,'Y':0,'Z':-1.1},{'X':1.1,'Y':0,'Z':-1.1},{'X':3.1,'Y':0,'Z':-1.1},{'X':5.1,'Y':0,'Z':-1.1},{'X':-4.9,'Y':0,'Z':0.9},{'X':-2.9,'Y':0,'Z':0.9},{'X':-0.9,'Y':0,'Z':0.9},{'X':1.1,'Y':0,'Z':0.9},{'X':3.1,'Y':0,'Z':0.9},{'X':5.1,'Y':0,'Z':0.9},{'X':-4.9,'Y':0,'Z':2.9},{'X':-2.9,'Y':0,'Z':2.9},{'X':-0.9,'Y':0,'Z':2.9},{'X':1.1,'Y':0,'Z':2.9},{'X':3.1,'Y':0,'Z':2.9},{'X':5.1,'Y':0,'Z':2.9},{'X':-4.9,'Y':0,'Z':4.9},{'X':-2.9,'Y':0,'Z':4.9},{'X':-0.9,'Y':0,'Z':4.9},{'X':1.1,'Y':0,'Z':4.9},{'X':3.1,'Y':0,'Z':4.9},{'X':5.1,'Y':0,'Z':4.9},{'X':-4.9,'Y':0,'Z':6.9},{'X':-2.9,'Y':0,'Z':6.9},{'X':-0.9,'Y':0,'Z':6.9},{'X':1.1,'Y':0,'Z':6.9},{'X':3.1,'Y':0,'Z':6.9},{'X':5.1,'Y':0,'Z':6.9},{'X':-4.9,'Y':0,'Z':8.9},{'X':-2.9,'Y':0,'Z':8.9},{'X':-0.9,'Y':0,'Z':8.9},{'X':1.1,'Y':0,'Z':8.9},{'X':3.1,'Y':0,'Z':8.9},{'X':5.1,'Y':0,'Z':8.9}],'road_bend_15x15':[{'X':3,'Y':0,'Z':-1},{'X':5,'Y':0,'Z':-1},{'X':7,'Y':0,'Z':-1},{'X':9,'Y':0,'Z':-1},{'X':11,'Y':0,'Z':-1},{'X':13,'Y':0,'Z':-1},{'X':3,'Y':0,'Z':1},{'X':5,'Y':0,'Z':1},{'X':7,'Y':0,'Z':1},{'X':9,'Y':0,'Z':1},{'X':11,'Y':0,'Z':1},{'X':13,'Y':0,'Z':1},{'X':-1,'Y':0,'Z':3},{'X':1,'Y':0,'Z':3},{'X':3,'Y':0,'Z':3},{'X':5,'Y':0,'Z':3},{'X':7,'Y':0,'Z':3},{'X':9,'Y':0,'Z':3},{'X':11,'Y':0,'Z':3},{'X':13,'Y':0,'Z':3},{'X':-1,'Y':0,'Z':5},{'X':1,'Y':0,'Z':5},{'X':3,'Y':0,'Z':5},{'X':5,'Y':0,'Z':5},{'X':7,'Y':0,'Z':5},{'X':9,'Y':0,'Z':5},{'X':11,'Y':0,'Z':5},{'X':-1,'Y':0,'Z':7},{'X':1,'Y':0,'Z':7},{'X':3,'Y':0,'Z':7},{'X':5,'Y':0,'Z':7},{'X':7,'Y':0,'Z':7},{'X':9,'Y':0,'Z':7},{'X':11,'Y':0,'Z':7},{'X':-1,'Y':0,'Z':9},{'X':1,'Y':0,'Z':9},{'X':3,'Y':0,'Z':9},{'X':5,'Y':0,'Z':9},{'X':7,'Y':0,'Z':9},{'X':9,'Y':0,'Z':9},{'X':-1,'Y':0,'Z':11},{'X':1,'Y':0,'Z':11},{'X':3,'Y':0,'Z':11},{'X':5,'Y':0,'Z':11},{'X':7,'Y':0,'Z':11},{'X':-1,'Y':0,'Z':13},{'X':1,'Y':0,'Z':13},{'X':3,'Y':0,'Z':13}],'road_junction_15x15':[{'X':-4,'Y':0,'Z':-8},{'X':-2,'Y':0,'Z':-8},{'X':0,'Y':0,'Z':-8},{'X':2,'Y':0,'Z':-8},{'X':4,'Y':0,'Z':-8},{'X':-4,'Y':0,'Z':-6},{'X':-2,'Y':0,'Z':-6},{'X':0,'Y':0,'Z':-6},{'X':2,'Y':0,'Z':-6},{'X':4,'Y':0,'Z':-6},{'X':-8,'Y':0,'Z':-4},{'X':-6,'Y':0,'Z':-4},{'X':-4,'Y':0,'Z':-4},{'X':-2,'Y':0,'Z':-4},{'X':0,'Y':0,'Z':-4},{'X':2,'Y':0,'Z':-4},{'X':4,'Y':0,'Z':-4},{'X':6,'Y':0,'Z':-4},{'X':8,'Y':0,'Z':-4},{'X':-8,'Y':0,'Z':-2},{'X':-6,'Y':0,'Z':-2},{'X':-4,'Y':0,'Z':-2},{'X':-2,'Y':0,'Z':-2},{'X':0,'Y':0,'Z':-2},{'X':2,'Y':0,'Z':-2},{'X':4,'Y':0,'Z':-2},{'X':6,'Y':0,'Z':-2},{'X':8,'Y':0,'Z':-2},{'X':-8,'Y':0,'Z':0},{'X':-6,'Y':0,'Z':0},{'X':-4,'Y':0,'Z':0},{'X':-2,'Y':0,'Z':0},{'X':0,'Y':0,'Z':0},{'X':2,'Y':0,'Z':0},{'X':4,'Y':0,'Z':0},{'X':6,'Y':0,'Z':0},{'X':8,'Y':0,'Z':0},{'X':-8,'Y':0,'Z':2},{'X':-6,'Y':0,'Z':2},{'X':-4,'Y':0,'Z':2},{'X':-2,'Y':0,'Z':2},{'X':0,'Y':0,'Z':2},{'X':2,'Y':0,'Z':2},{'X':4,'Y':0,'Z':2},{'X':6,'Y':0,'Z':2},{'X':8,'Y':0,'Z':2},{'X':-8,'Y':0,'Z':4},{'X':-6,'Y':0,'Z':4},{'X':-4,'Y':0,'Z':4},{'X':-2,'Y':0,'Z':4},{'X':0,'Y':0,'Z':4},{'X':2,'Y':0,'Z':4},{'X':4,'Y':0,'Z':4},{'X':6,'Y':0,'Z':4},{'X':8,'Y':0,'Z':4},{'X':-4,'Y':0,'Z':6},{'X':-2,'Y':0,'Z':6},{'X':0,'Y':0,'Z':6},{'X':2,'Y':0,'Z':6},{'X':4,'Y':0,'Z':6},{'X':-4,'Y':0,'Z':8},{'X':-2,'Y':0,'Z':8},{'X':0,'Y':0,'Z':8},{'X':2,'Y':0,'Z':8},{'X':4,'Y':0,'Z':8}],'road_junctiont_15x15':[{'X':-4.5,'Y':0,'Z':-8.5},{'X':-2.5,'Y':0,'Z':-8.5},{'X':-0.5,'Y':0,'Z':-8.5},{'X':1.5,'Y':0,'Z':-8.5},{'X':3.5,'Y':0,'Z':-8.5},{'X':-4.5,'Y':0,'Z':-6.5},{'X':-2.5,'Y':0,'Z':-6.5},{'X':-0.5,'Y':0,'Z':-6.5},{'X':1.5,'Y':0,'Z':-6.5},{'X':3.5,'Y':0,'Z':-6.5},{'X':-8.5,'Y':0,'Z':-4.5},{'X':-6.5,'Y':0,'Z':-4.5},{'X':-4.5,'Y':0,'Z':-4.5},{'X':-2.5,'Y':0,'Z':-4.5},{'X':-0.5,'Y':0,'Z':-4.5},{'X':1.5,'Y':0,'Z':-4.5},{'X':3.5,'Y':0,'Z':-4.5},{'X':5.5,'Y':0,'Z':-4.5},{'X':7.5,'Y':0,'Z':-4.5},{'X':-8.5,'Y':0,'Z':-2.5},{'X':-6.5,'Y':0,'Z':-2.5},{'X':-4.5,'Y':0,'Z':-2.5},{'X':-2.5,'Y':0,'Z':-2.5},{'X':-0.5,'Y':0,'Z':-2.5},{'X':1.5,'Y':0,'Z':-2.5},{'X':3.5,'Y':0,'Z':-2.5},{'X':5.5,'Y':0,'Z':-2.5},{'X':7.5,'Y':0,'Z':-2.5},{'X':-8.5,'Y':0,'Z':-0.5},{'X':-6.5,'Y':0,'Z':-0.5},{'X':-4.5,'Y':0,'Z':-0.5},{'X':-2.5,'Y':0,'Z':-0.5},{'X':-0.5,'Y':0,'Z':-0.5},{'X':1.5,'Y':0,'Z':-0.5},{'X':3.5,'Y':0,'Z':-0.5},{'X':5.5,'Y':0,'Z':-0.5},{'X':7.5,'Y':0,'Z':-0.5},{'X':-8.5,'Y':0,'Z':1.5},{'X':-6.5,'Y':0,'Z':1.5},{'X':-4.5,'Y':0,'Z':1.5},{'X':-2.5,'Y':0,'Z':1.5},{'X':-0.5,'Y':0,'Z':1.5},{'X':1.5,'Y':0,'Z':1.5},{'X':3.5,'Y':0,'Z':1.5},{'X':5.5,'Y':0,'Z':1.5},{'X':7.5,'Y':0,'Z':1.5},{'X':-8.5,'Y':0,'Z':3.5},{'X':-6.5,'Y':0,'Z':3.5},{'X':-4.5,'Y':0,'Z':3.5},{'X':-2.5,'Y':0,'Z':3.5},{'X':-0.5,'Y':0,'Z':3.5},{'X':1.5,'Y':0,'Z':3.5},{'X':3.5,'Y':0,'Z':3.5},{'X':5.5,'Y':0,'Z':3.5},{'X':7.5,'Y':0,'Z':3.5},{'X':-8.5,'Y':0,'Z':5.5},{'X':-6.5,'Y':0,'Z':5.5},{'X':-4.5,'Y':0,'Z':5.5},{'X':-2.5,'Y':0,'Z':5.5},{'X':-0.5,'Y':0,'Z':5.5},{'X':1.5,'Y':0,'Z':5.5},{'X':3.5,'Y':0,'Z':5.5},{'X':5.5,'Y':0,'Z':5.5},{'X':7.5,'Y':0,'Z':5.5}],'road_nopavement_18x15':[{'X':-5.1,'Y':0,'Z':-10},{'X':-3,'Y':0,'Z':-10},{'X':-1,'Y':0,'Z':-10},{'X':1,'Y':0,'Z':-10},{'X':3,'Y':0,'Z':-10},{'X':-5,'Y':0,'Z':-8},{'X':-3,'Y':0,'Z':-8},{'X':-1,'Y':0,'Z':-8},{'X':1,'Y':0,'Z':-8},{'X':3,'Y':0,'Z':-8},{'X':-5,'Y':0,'Z':-6},{'X':-3,'Y':0,'Z':-6},{'X':-1,'Y':0,'Z':-6},{'X':1,'Y':0,'Z':-6},{'X':3,'Y':0,'Z':-6},{'X':-5,'Y':0,'Z':-4},{'X':-3,'Y':0,'Z':-4},{'X':-1,'Y':0,'Z':-4},{'X':1,'Y':0,'Z':-4},{'X':3,'Y':0,'Z':-4},{'X':-5,'Y':0,'Z':-2},{'X':-3,'Y':0,'Z':-2},{'X':-1,'Y':0,'Z':-2},{'X':1,'Y':0,'Z':-2},{'X':3,'Y':0,'Z':-2},{'X':-5,'Y':0,'Z':0},{'X':-3,'Y':0,'Z':0},{'X':-1,'Y':0,'Z':0},{'X':1,'Y':0,'Z':0},{'X':3,'Y':0,'Z':0},{'X':-5,'Y':0,'Z':2},{'X':-3,'Y':0,'Z':2},{'X':-1,'Y':0,'Z':2},{'X':1,'Y':0,'Z':2},{'X':3,'Y':0,'Z':2},{'X':-5,'Y':0,'Z':4},{'X':-3,'Y':0,'Z':4},{'X':-1,'Y':0,'Z':4},{'X':1,'Y':0,'Z':4},{'X':3,'Y':0,'Z':4},{'X':-5,'Y':0,'Z':6},{'X':-3,'Y':0,'Z':6},{'X':-1,'Y':0,'Z':6},{'X':1,'Y':0,'Z':6},{'X':3,'Y':0,'Z':6},{'X':-5,'Y':0,'Z':8},{'X':-3,'Y':0,'Z':8},{'X':-1,'Y':0,'Z':8},{'X':1,'Y':0,'Z':8},{'X':3,'Y':0,'Z':8},{'X':-5,'Y':0,'Z':10},{'X':-3,'Y':0,'Z':10},{'X':-1,'Y':0,'Z':10},{'X':1,'Y':0,'Z':10},{'X':3,'Y':0,'Z':10},{'X':5,'Y':0,'Z':-10},{'X':5,'Y':0,'Z':-8},{'X':5,'Y':0,'Z':-6},{'X':5,'Y':0,'Z':-4},{'X':5,'Y':0,'Z':-2},{'X':5,'Y':0,'Z':0},{'X':5,'Y':0,'Z':2},{'X':5,'Y':0,'Z':4},{'X':5,'Y':0,'Z':6},{'X':5,'Y':0,'Z':8},{'X':5,'Y':0,'Z':10}],'road_nopavement_27x15':[{'X':-3,'Y':0,'Z':-13.3},{'X':-1,'Y':0,'Z':-13.3},{'X':1,'Y':0,'Z':-13.3},{'X':3,'Y':0,'Z':-13.3},{'X':5,'Y':0,'Z':-13.3},{'X':-3,'Y':0,'Z':-11.3},{'X':-1,'Y':0,'Z':-11.3},{'X':1,'Y':0,'Z':-11.3},{'X':3,'Y':0,'Z':-11.3},{'X':5,'Y':0,'Z':-11.3},{'X':-3,'Y':0,'Z':-9.3},{'X':-1,'Y':0,'Z':-9.3},{'X':1,'Y':0,'Z':-9.3},{'X':3,'Y':0,'Z':-9.3},{'X':5,'Y':0,'Z':-9.3},{'X':-3,'Y':0,'Z':-7.3},{'X':-1,'Y':0,'Z':-7.3},{'X':1,'Y':0,'Z':-7.3},{'X':3,'Y':0,'Z':-7.3},{'X':5,'Y':0,'Z':-7.3},{'X':-3,'Y':0,'Z':-5.3},{'X':-1,'Y':0,'Z':-5.3},{'X':1,'Y':0,'Z':-5.3},{'X':3,'Y':0,'Z':-5.3},{'X':5,'Y':0,'Z':-5.3},{'X':-3,'Y':0,'Z':-3.3},{'X':-1,'Y':0,'Z':-3.3},{'X':1,'Y':0,'Z':-3.3},{'X':3,'Y':0,'Z':-3.3},{'X':5,'Y':0,'Z':-3.3},{'X':-3,'Y':0,'Z':-1.3},{'X':-1,'Y':0,'Z':-1.3},{'X':1,'Y':0,'Z':-1.3},{'X':3,'Y':0,'Z':-1.3},{'X':5,'Y':0,'Z':-1.3},{'X':-3,'Y':0,'Z':0.7},{'X':-1,'Y':0,'Z':0.7},{'X':1,'Y':0,'Z':0.7},{'X':3,'Y':0,'Z':0.7},{'X':5,'Y':0,'Z':0.7},{'X':-3,'Y':0,'Z':2.7},{'X':-1,'Y':0,'Z':2.7},{'X':1,'Y':0,'Z':2.7},{'X':3,'Y':0,'Z':2.7},{'X':5,'Y':0,'Z':2.7},{'X':-3,'Y':0,'Z':4.7},{'X':-1,'Y':0,'Z':4.7},{'X':1,'Y':0,'Z':4.7},{'X':3,'Y':0,'Z':4.7},{'X':5,'Y':0,'Z':4.7},{'X':-3,'Y':0,'Z':6.7},{'X':-1,'Y':0,'Z':6.7},{'X':1,'Y':0,'Z':6.7},{'X':3,'Y':0,'Z':6.7},{'X':5,'Y':0,'Z':6.7},{'X':-3,'Y':0,'Z':8.7},{'X':-1,'Y':0,'Z':8.7},{'X':1,'Y':0,'Z':8.7},{'X':3,'Y':0,'Z':8.7},{'X':5,'Y':0,'Z':8.7},{'X':-3,'Y':0,'Z':10.7},{'X':-1,'Y':0,'Z':10.7},{'X':1,'Y':0,'Z':10.7},{'X':3,'Y':0,'Z':10.7},{'X':5,'Y':0,'Z':10.7},{'X':-3,'Y':0,'Z':12.7},{'X':-1,'Y':0,'Z':12.7},{'X':1,'Y':0,'Z':12.7},{'X':3,'Y':0,'Z':12.7},{'X':5,'Y':0,'Z':12.7},{'X':-3,'Y':0,'Z':14.7},{'X':-1,'Y':0,'Z':14.7},{'X':1,'Y':0,'Z':14.7},{'X':3,'Y':0,'Z':14.7},{'X':5,'Y':0,'Z':14.7},{'X':-5,'Y':0,'Z':-13.3},{'X':-5,'Y':0,'Z':-11.3},{'X':-5,'Y':0,'Z':-9.3},{'X':-5,'Y':0,'Z':-7.3},{'X':-5,'Y':0,'Z':-5.3},{'X':-5,'Y':0,'Z':-3.3},{'X':-5,'Y':0,'Z':-1.3},{'X':-5,'Y':0,'Z':0.7},{'X':-5,'Y':0,'Z':2.7},{'X':-5,'Y':0,'Z':4.7},{'X':-5,'Y':0,'Z':6.7},{'X':-5,'Y':0,'Z':8.7},{'X':-5,'Y':0,'Z':10.7},{'X':-5,'Y':0,'Z':12.7},{'X':-5,'Y':0,'Z':14.7}],'road_nopavement_36x15':[{'X':-5.1,'Y':0,'Z':-18.9},{'X':-3.1,'Y':0,'Z':-18.9},{'X':-1.1,'Y':0,'Z':-18.9},{'X':0.9,'Y':0,'Z':-18.9},{'X':2.9,'Y':0,'Z':-18.9},{'X':4.9,'Y':0,'Z':-18.9},{'X':-5.1,'Y':0,'Z':-16.9},{'X':-3.1,'Y':0,'Z':-16.9},{'X':-1.1,'Y':0,'Z':-16.9},{'X':0.9,'Y':0,'Z':-16.9},{'X':2.9,'Y':0,'Z':-16.9},{'X':4.9,'Y':0,'Z':-16.9},{'X':-5.1,'Y':0,'Z':-14.9},{'X':-3.1,'Y':0,'Z':-14.9},{'X':-1.1,'Y':0,'Z':-14.9},{'X':0.9,'Y':0,'Z':-14.9},{'X':2.9,'Y':0,'Z':-14.9},{'X':4.9,'Y':0,'Z':-14.9},{'X':-5.1,'Y':0,'Z':-12.9},{'X':-3.1,'Y':0,'Z':-12.9},{'X':-1.1,'Y':0,'Z':-12.9},{'X':0.9,'Y':0,'Z':-12.9},{'X':2.9,'Y':0,'Z':-12.9},{'X':4.9,'Y':0,'Z':-12.9},{'X':-5.1,'Y':0,'Z':-10.9},{'X':-3.1,'Y':0,'Z':-10.9},{'X':-1.1,'Y':0,'Z':-10.9},{'X':0.9,'Y':0,'Z':-10.9},{'X':2.9,'Y':0,'Z':-10.9},{'X':4.9,'Y':0,'Z':-10.9},{'X':-5.1,'Y':0,'Z':-8.9},{'X':-3.1,'Y':0,'Z':-8.9},{'X':-1.1,'Y':0,'Z':-8.9},{'X':0.9,'Y':0,'Z':-8.9},{'X':2.9,'Y':0,'Z':-8.9},{'X':4.9,'Y':0,'Z':-8.9},{'X':-5.1,'Y':0,'Z':-6.9},{'X':-3.1,'Y':0,'Z':-6.9},{'X':-1.1,'Y':0,'Z':-6.9},{'X':0.9,'Y':0,'Z':-6.9},{'X':2.9,'Y':0,'Z':-6.9},{'X':4.9,'Y':0,'Z':-6.9},{'X':-5.1,'Y':0,'Z':-4.9},{'X':-3.1,'Y':0,'Z':-4.9},{'X':-1.1,'Y':0,'Z':-4.9},{'X':0.9,'Y':0,'Z':-4.9},{'X':2.9,'Y':0,'Z':-4.9},{'X':4.9,'Y':0,'Z':-4.9},{'X':-5.1,'Y':0,'Z':-2.9},{'X':-3.1,'Y':0,'Z':-2.9},{'X':-1.1,'Y':0,'Z':-2.9},{'X':0.9,'Y':0,'Z':-2.9},{'X':2.9,'Y':0,'Z':-2.9},{'X':4.9,'Y':0,'Z':-2.9},{'X':-5.1,'Y':0,'Z':-0.9},{'X':-3.1,'Y':0,'Z':-0.9},{'X':-1.1,'Y':0,'Z':-0.9},{'X':0.9,'Y':0,'Z':-0.9},{'X':2.9,'Y':0,'Z':-0.9},{'X':4.9,'Y':0,'Z':-0.9},{'X':-5.1,'Y':0,'Z':1.1},{'X':-3.1,'Y':0,'Z':1.1},{'X':-1.1,'Y':0,'Z':1.1},{'X':0.9,'Y':0,'Z':1.1},{'X':2.9,'Y':0,'Z':1.1},{'X':4.9,'Y':0,'Z':1.1},{'X':-5.1,'Y':0,'Z':3.1},{'X':-3.1,'Y':0,'Z':3.1},{'X':-1.1,'Y':0,'Z':3.1},{'X':0.9,'Y':0,'Z':3.1},{'X':2.9,'Y':0,'Z':3.1},{'X':4.9,'Y':0,'Z':3.1},{'X':-5.1,'Y':0,'Z':5.1},{'X':-3.1,'Y':0,'Z':5.1},{'X':-1.1,'Y':0,'Z':5.1},{'X':0.9,'Y':0,'Z':5.1},{'X':2.9,'Y':0,'Z':5.1},{'X':4.9,'Y':0,'Z':5.1},{'X':-5.1,'Y':0,'Z':7.1},{'X':-3.1,'Y':0,'Z':7.1},{'X':-1.1,'Y':0,'Z':7.1},{'X':0.9,'Y':0,'Z':7.1},{'X':2.9,'Y':0,'Z':7.1},{'X':4.9,'Y':0,'Z':7.1},{'X':-5.1,'Y':0,'Z':9.1},{'X':-3.1,'Y':0,'Z':9.1},{'X':-1.1,'Y':0,'Z':9.1},{'X':0.9,'Y':0,'Z':9.1},{'X':2.9,'Y':0,'Z':9.1},{'X':4.9,'Y':0,'Z':9.1},{'X':-5.1,'Y':0,'Z':11.1},{'X':-3.1,'Y':0,'Z':11.1},{'X':-1.1,'Y':0,'Z':11.1},{'X':0.9,'Y':0,'Z':11.1},{'X':2.9,'Y':0,'Z':11.1},{'X':4.9,'Y':0,'Z':11.1},{'X':-5.1,'Y':0,'Z':13.1},{'X':-3.1,'Y':0,'Z':13.1},{'X':-1.1,'Y':0,'Z':13.1},{'X':0.9,'Y':0,'Z':13.1},{'X':2.9,'Y':0,'Z':13.1},{'X':4.9,'Y':0,'Z':13.1},{'X':-5.1,'Y':0,'Z':15.1},{'X':-3.1,'Y':0,'Z':15.1},{'X':-1.1,'Y':0,'Z':15.1},{'X':0.9,'Y':0,'Z':15.1},{'X':2.9,'Y':0,'Z':15.1},{'X':4.9,'Y':0,'Z':15.1},{'X':-5.1,'Y':0,'Z':17.1},{'X':-3.1,'Y':0,'Z':17.1},{'X':-1.1,'Y':0,'Z':17.1},{'X':0.9,'Y':0,'Z':17.1},{'X':2.9,'Y':0,'Z':17.1},{'X':4.9,'Y':0,'Z':17.1}],'road_nopavement_9x15':[{'X':-5.1,'Y':0,'Z':-5.5},{'X':-3.1,'Y':0,'Z':-5.5},{'X':-1.1,'Y':0,'Z':-5.5},{'X':0.9,'Y':0,'Z':-5.5},{'X':2.9,'Y':0,'Z':-5.5},{'X':4.9,'Y':0,'Z':-5.5},{'X':-5.1,'Y':0,'Z':-3.5},{'X':-3.1,'Y':0,'Z':-3.5},{'X':-1.1,'Y':0,'Z':-3.5},{'X':0.9,'Y':0,'Z':-3.5},{'X':2.9,'Y':0,'Z':-3.5},{'X':4.9,'Y':0,'Z':-3.5},{'X':-5.1,'Y':0,'Z':-1.5},{'X':-3.1,'Y':0,'Z':-1.5},{'X':-1.1,'Y':0,'Z':-1.5},{'X':0.9,'Y':0,'Z':-1.5},{'X':2.9,'Y':0,'Z':-1.5},{'X':4.9,'Y':0,'Z':-1.5},{'X':-5.1,'Y':0,'Z':0.5},{'X':-3.1,'Y':0,'Z':0.5},{'X':-1.1,'Y':0,'Z':0.5},{'X':0.9,'Y':0,'Z':0.5},{'X':2.9,'Y':0,'Z':0.5},{'X':4.9,'Y':0,'Z':0.5},{'X':-5.1,'Y':0,'Z':2.5},{'X':-3.1,'Y':0,'Z':2.5},{'X':-1.1,'Y':0,'Z':2.5},{'X':0.9,'Y':0,'Z':2.5},{'X':2.9,'Y':0,'Z':2.5},{'X':4.9,'Y':0,'Z':2.5},{'X':-5.1,'Y':0,'Z':4.5},{'X':-3.1,'Y':0,'Z':4.5},{'X':-1.1,'Y':0,'Z':4.5},{'X':0.9,'Y':0,'Z':4.5},{'X':2.9,'Y':0,'Z':4.5},{'X':4.9,'Y':0,'Z':4.5}],'road_nopavement_9x15_end':[{'X':-5.1,'Y':0,'Z':-9.6},{'X':-3.1,'Y':0,'Z':-9.6},{'X':-1.1,'Y':0,'Z':-9.6},{'X':0.9,'Y':0,'Z':-9.6},{'X':2.9,'Y':0,'Z':-9.6},{'X':4.9,'Y':0,'Z':-9.6},{'X':-5.1,'Y':0,'Z':-7.6},{'X':-3.1,'Y':0,'Z':-7.6},{'X':-1.1,'Y':0,'Z':-7.6},{'X':0.9,'Y':0,'Z':-7.6},{'X':2.9,'Y':0,'Z':-7.6},{'X':4.9,'Y':0,'Z':-7.6},{'X':-5.1,'Y':0,'Z':-5.6},{'X':-3.1,'Y':0,'Z':-5.6},{'X':-1.1,'Y':0,'Z':-5.6},{'X':0.9,'Y':0,'Z':-5.6},{'X':2.9,'Y':0,'Z':-5.6},{'X':4.9,'Y':0,'Z':-5.6},{'X':-5.1,'Y':0,'Z':-3.6},{'X':-3.1,'Y':0,'Z':-3.6},{'X':-1.1,'Y':0,'Z':-3.6},{'X':0.9,'Y':0,'Z':-3.6},{'X':2.9,'Y':0,'Z':-3.6},{'X':4.9,'Y':0,'Z':-3.6},{'X':-5.1,'Y':0,'Z':-1.6},{'X':-3.1,'Y':0,'Z':-1.6},{'X':-1.1,'Y':0,'Z':-1.6},{'X':0.9,'Y':0,'Z':-1.6},{'X':2.9,'Y':0,'Z':-1.6},{'X':4.9,'Y':0,'Z':-1.6},{'X':-5.1,'Y':0,'Z':0.4},{'X':-3.1,'Y':0,'Z':0.4},{'X':-1.1,'Y':0,'Z':0.4},{'X':0.9,'Y':0,'Z':0.4},{'X':2.9,'Y':0,'Z':0.4},{'X':4.9,'Y':0,'Z':0.4},{'X':-5.1,'Y':0,'Z':2.4},{'X':-3.1,'Y':0,'Z':2.4},{'X':-1.1,'Y':0,'Z':2.4},{'X':0.9,'Y':0,'Z':2.4},{'X':2.9,'Y':0,'Z':2.4},{'X':4.9,'Y':0,'Z':2.4},{'X':-5.1,'Y':0,'Z':4.4},{'X':-3.1,'Y':0,'Z':4.4},{'X':-1.1,'Y':0,'Z':4.4},{'X':0.9,'Y':0,'Z':4.4},{'X':2.9,'Y':0,'Z':4.4},{'X':4.9,'Y':0,'Z':4.4}],'road_nopavement_9x15_railway':[{'X':-5,'Y':0,'Z':-5.5},{'X':-3,'Y':0,'Z':-5.5},{'X':-1,'Y':0,'Z':-5.5},{'X':1,'Y':0,'Z':-5.5},{'X':3,'Y':0,'Z':-5.5},{'X':5,'Y':0,'Z':-5.5},{'X':-5,'Y':0,'Z':-3.5},{'X':-3,'Y':0,'Z':-3.5},{'X':-1,'Y':0,'Z':-3.5},{'X':1,'Y':0,'Z':-3.5},{'X':3,'Y':0,'Z':-3.5},{'X':5,'Y':0,'Z':-3.5},{'X':-5,'Y':0,'Z':-1.5},{'X':-3,'Y':0,'Z':-1.5},{'X':-1,'Y':0,'Z':-1.5},{'X':1,'Y':0,'Z':-1.5},{'X':3,'Y':0,'Z':-1.5},{'X':5,'Y':0,'Z':-1.5},{'X':-5,'Y':0,'Z':0.5},{'X':-3,'Y':0,'Z':0.5},{'X':-1,'Y':0,'Z':0.5},{'X':1,'Y':0,'Z':0.5},{'X':3,'Y':0,'Z':0.5},{'X':5,'Y':0,'Z':0.5},{'X':-5,'Y':0,'Z':2.5},{'X':-3,'Y':0,'Z':2.5},{'X':-1,'Y':0,'Z':2.5},{'X':1,'Y':0,'Z':2.5},{'X':3,'Y':0,'Z':2.5},{'X':5,'Y':0,'Z':2.5},{'X':-5,'Y':0,'Z':4.5},{'X':-3,'Y':0,'Z':4.5},{'X':-1,'Y':0,'Z':4.5},{'X':1,'Y':0,'Z':4.5},{'X':3,'Y':0,'Z':4.5},{'X':5,'Y':0,'Z':4.5}],'road_nopavement_9x36_slope_600':[{'X':-37,'Y':-5.9,'Z':-5},{'X':-35,'Y':-5.8,'Z':-5},{'X':-33,'Y':-5.5,'Z':-5},{'X':-31,'Y':-5.3,'Z':-5},{'X':-29,'Y':-4.8,'Z':-5},{'X':-27,'Y':-4.4,'Z':-5},{'X':-25,'Y':-4,'Z':-5},{'X':-23,'Y':-3.5,'Z':-5},{'X':-21,'Y':-3,'Z':-5},{'X':-19,'Y':-2.6,'Z':-5},{'X':-17,'Y':-2.2,'Z':-5},{'X':-15,'Y':-1.8,'Z':-5},{'X':-13,'Y':-1.4,'Z':-5},{'X':-11,'Y':-0.9,'Z':-5},{'X':-9,'Y':-0.5,'Z':-5},{'X':-7,'Y':-0.1,'Z':-5},{'X':-5,'Y':0,'Z':-5},{'X':-3,'Y':0,'Z':-5},{'X':-1,'Y':0,'Z':-5},{'X':1,'Y':0,'Z':-5},{'X':-37,'Y':-5.9,'Z':-3},{'X':-35,'Y':-5.8,'Z':-3},{'X':-33,'Y':-5.5,'Z':-3},{'X':-31,'Y':-5.3,'Z':-3},{'X':-29,'Y':-4.8,'Z':-3},{'X':-27,'Y':-4.4,'Z':-3},{'X':-25,'Y':-4,'Z':-3},{'X':-23,'Y':-3.5,'Z':-3},{'X':-21,'Y':-3.1,'Z':-3},{'X':-19,'Y':-2.6,'Z':-3},{'X':-17,'Y':-2.2,'Z':-3},{'X':-15,'Y':-1.8,'Z':-3},{'X':-13,'Y':-1.4,'Z':-3},{'X':-11,'Y':-0.9,'Z':-3},{'X':-9,'Y':-0.5,'Z':-3},{'X':-7,'Y':-0.1,'Z':-3},{'X':-5,'Y':0,'Z':-3},{'X':-3,'Y':0,'Z':-3},{'X':-1,'Y':0,'Z':-3},{'X':1,'Y':0,'Z':-3},{'X':-37,'Y':-5.9,'Z':-1},{'X':-35,'Y':-5.8,'Z':-1},{'X':-33,'Y':-5.5,'Z':-1},{'X':-31,'Y':-5.3,'Z':-1},{'X':-29,'Y':-4.8,'Z':-1},{'X':-27,'Y':-4.4,'Z':-1},{'X':-25,'Y':-4,'Z':-1},{'X':-23,'Y':-3.5,'Z':-1},{'X':-21,'Y':-3.1,'Z':-1},{'X':-19,'Y':-2.6,'Z':-1},{'X':-17,'Y':-2.2,'Z':-1},{'X':-15,'Y':-1.8,'Z':-1},{'X':-13,'Y':-1.4,'Z':-1},{'X':-11,'Y':-0.9,'Z':-1},{'X':-9,'Y':-0.5,'Z':-1},{'X':-7,'Y':-0.1,'Z':-1},{'X':-5,'Y':0,'Z':-1},{'X':-3,'Y':0,'Z':-1},{'X':-1,'Y':0,'Z':-1},{'X':1,'Y':0,'Z':-1},{'X':-37,'Y':-5.9,'Z':1},{'X':-35,'Y':-5.8,'Z':1},{'X':-33,'Y':-5.5,'Z':1},{'X':-31,'Y':-5.3,'Z':1},{'X':-29,'Y':-4.8,'Z':1},{'X':-27,'Y':-4.4,'Z':1},{'X':-25,'Y':-4,'Z':1},{'X':-23,'Y':-3.5,'Z':1},{'X':-21,'Y':-3.1,'Z':1},{'X':-19,'Y':-2.6,'Z':1},{'X':-17,'Y':-2.2,'Z':1},{'X':-15,'Y':-1.8,'Z':1},{'X':-13,'Y':-1.4,'Z':1},{'X':-11,'Y':-0.9,'Z':1},{'X':-9,'Y':-0.5,'Z':1},{'X':-7,'Y':-0.1,'Z':1},{'X':-5,'Y':0,'Z':1},{'X':-3,'Y':0,'Z':1},{'X':-1,'Y':0,'Z':1},{'X':1,'Y':0,'Z':1},{'X':-37,'Y':-5.9,'Z':3},{'X':-35,'Y':-5.8,'Z':3},{'X':-33,'Y':-5.5,'Z':3},{'X':-31,'Y':-5.3,'Z':3},{'X':-29,'Y':-4.8,'Z':3},{'X':-27,'Y':-4.4,'Z':3},{'X':-25,'Y':-4,'Z':3},{'X':-23,'Y':-3.5,'Z':3},{'X':-21,'Y':-3.1,'Z':3},{'X':-19,'Y':-2.6,'Z':3},{'X':-17,'Y':-2.2,'Z':3},{'X':-15,'Y':-1.8,'Z':3},{'X':-13,'Y':-1.4,'Z':3},{'X':-11,'Y':-0.9,'Z':3},{'X':-9,'Y':-0.5,'Z':3},{'X':-7,'Y':-0.1,'Z':3},{'X':-5,'Y':0,'Z':3},{'X':-3,'Y':0,'Z':3},{'X':-1,'Y':0,'Z':3},{'X':1,'Y':0,'Z':3},{'X':-37,'Y':-5.9,'Z':5},{'X':-35,'Y':-5.8,'Z':5},{'X':-33,'Y':-5.5,'Z':5},{'X':-31,'Y':-5.3,'Z':5},{'X':-29,'Y':-4.8,'Z':5},{'X':-27,'Y':-4.4,'Z':5},{'X':-25,'Y':-4,'Z':5},{'X':-23,'Y':-3.5,'Z':5},{'X':-21,'Y':-3.1,'Z':5},{'X':-19,'Y':-2.6,'Z':5},{'X':-17,'Y':-2.2,'Z':5},{'X':-15,'Y':-1.8,'Z':5},{'X':-13,'Y':-1.4,'Z':5},{'X':-11,'Y':-0.9,'Z':5},{'X':-9,'Y':-0.5,'Z':5},{'X':-7,'Y':-0.1,'Z':5},{'X':-5,'Y':0,'Z':5},{'X':-3,'Y':0,'Z':5},{'X':-1,'Y':0,'Z':5},{'X':1,'Y':0,'Z':5}],'road_nopavement_bend_15x15':[{'X':3.6,'Y':0,'Z':-0.3},{'X':5.6,'Y':0,'Z':-0.3},{'X':7.6,'Y':0,'Z':-0.3},{'X':9.6,'Y':0,'Z':-0.3},{'X':11.6,'Y':0,'Z':-0.3},{'X':1.6,'Y':0,'Z':1.7},{'X':3.6,'Y':0,'Z':1.7},{'X':5.6,'Y':0,'Z':1.7},{'X':7.6,'Y':0,'Z':1.7},{'X':9.6,'Y':0,'Z':1.7},{'X':11.6,'Y':0,'Z':1.7},{'X':-0.4,'Y':0,'Z':3.7},{'X':1.6,'Y':0,'Z':3.7},{'X':3.6,'Y':0,'Z':3.7},{'X':5.6,'Y':0,'Z':3.7},{'X':7.6,'Y':0,'Z':3.7},{'X':9.6,'Y':0,'Z':3.7},{'X':11.6,'Y':0,'Z':3.7},{'X':-0.4
// ... [Code preview truncated due to length. Full source in attached file] ...