aboutsummaryrefslogtreecommitdiff
path: root/textures/base/pack/minimap_btn.png
diff options
context:
space:
mode:
Diffstat (limited to 'textures/base/pack/minimap_btn.png')
0 files changed, 0 insertions, 0 deletions
df96b89af35308716bbdc5ca37.tar.bz2'>forks-modpack-e96cc188665384df96b89af35308716bbdc5ca37.tar.bz2
forks-modpack-e96cc188665384df96b89af35308716bbdc5ca37.zip
Merge commit '5aad0930d1ddd63d9021d833a9379b4a01bd8414' as 'advtrains'
Diffstat
-rw-r--r--advtrains/.gitignore3
-rw-r--r--advtrains/advtrains/api_doc.txt190
-rw-r--r--advtrains/advtrains/atc.lua342
-rw-r--r--advtrains/advtrains/copytool.lua185
-rw-r--r--advtrains/advtrains/couple.lua192
-rw-r--r--advtrains/advtrains/craft_items.lua23
-rw-r--r--advtrains/advtrains/crafting.lua76
-rw-r--r--advtrains/advtrains/debugitems.lua53
-rw-r--r--advtrains/advtrains/debugringbuffer.lua44
-rw-r--r--advtrains/advtrains/depends.txt3
-rw-r--r--advtrains/advtrains/description.txt8
-rw-r--r--advtrains/advtrains/helpers.lua447
-rw-r--r--advtrains/advtrains/init.lua597
-rw-r--r--advtrains/advtrains/locale/advtrains.de.tr71
-rw-r--r--advtrains/advtrains/locale/advtrains.zh_CN.tr107
-rw-r--r--advtrains/advtrains/log.lua17
-rw-r--r--advtrains/advtrains/lzb.lua191
-rw-r--r--advtrains/advtrains/misc_nodes.lua118
-rw-r--r--advtrains/advtrains/models/advtrains_across.obj537
-rw-r--r--advtrains/advtrains/models/advtrains_dtrack_bumper_st.b3dbin0 -> 32927 bytes
-rw-r--r--advtrains/advtrains/models/advtrains_dtrack_bumper_st_30.b3dbin0 -> 48546 bytes
-rw-r--r--advtrains/advtrains/models/advtrains_dtrack_bumper_st_45.b3dbin0 -> 32926 bytes
-rw-r--r--advtrains/advtrains/models/advtrains_dtrack_bumper_st_60.b3dbin0 -> 48546 bytes
-rw-r--r--advtrains/advtrains/models/advtrains_dtrack_cr.b3dbin0 -> 28040 bytes
-rw-r--r--advtrains/advtrains/models/advtrains_dtrack_cr_30.b3dbin0 -> 28043 bytes
-rw-r--r--advtrains/advtrains/models/advtrains_dtrack_cr_45.b3dbin0 -> 34483 bytes
-rw-r--r--advtrains/advtrains/models/advtrains_dtrack_cr_60.b3dbin0 -> 34483 bytes
-rw-r--r--advtrains/advtrains/models/advtrains_dtrack_st.b3dbin0 -> 10712 bytes
-rw-r--r--advtrains/advtrains/models/advtrains_dtrack_st_30.b3dbin0 -> 20043 bytes
-rw-r--r--advtrains/advtrains/models/advtrains_dtrack_st_45.b3dbin0 -> 12235 bytes
-rw-r--r--advtrains/advtrains/models/advtrains_dtrack_st_60.b3dbin0 -> 20043 bytes
-rw-r--r--advtrains/advtrains/models/advtrains_dtrack_swlcr.b3dbin0 -> 36203 bytes
-rw-r--r--advtrains/advtrains/models/advtrains_dtrack_swlcr_30.b3dbin0 -> 39958 bytes
-rw-r--r--advtrains/advtrains/models/advtrains_dtrack_swlcr_45.b3dbin0 -> 41302 bytes
-rw-r--r--advtrains/advtrains/models/advtrains_dtrack_swlcr_60.b3dbin0 -> 46270 bytes
-rw-r--r--advtrains/advtrains/models/advtrains_dtrack_swlst.b3dbin0 -> 36203 bytes
-rw-r--r--advtrains/advtrains/models/advtrains_dtrack_swlst_30.b3dbin0 -> 39958 bytes
-rw-r--r--advtrains/advtrains/models/advtrains_dtrack_swlst_45.b3dbin0 -> 41302 bytes
-rw-r--r--advtrains/advtrains/models/advtrains_dtrack_swlst_60.b3dbin0 -> 46270 bytes
-rw-r--r--advtrains/advtrains/models/advtrains_dtrack_swrcr.b3dbin0 -> 36203 bytes
-rw-r--r--advtrains/advtrains/models/advtrains_dtrack_swrcr_30.b3dbin0 -> 46270 bytes
-rw-r--r--advtrains/advtrains/models/advtrains_dtrack_swrcr_45.b3dbin0 -> 41302 bytes
-rw-r--r--advtrains/advtrains/models/advtrains_dtrack_swrcr_60.b3dbin0 -> 39958 bytes
-rw-r--r--advtrains/advtrains/models/advtrains_dtrack_swrst.b3dbin0 -> 36203 bytes
-rw-r--r--advtrains/advtrains/models/advtrains_dtrack_swrst_30.b3dbin0 -> 46270 bytes
-rw-r--r--advtrains/advtrains/models/advtrains_dtrack_swrst_45.b3dbin0 -> 41302 bytes
-rw-r--r--advtrains/advtrains/models/advtrains_dtrack_swrst_60.b3dbin0 -> 39958 bytes
-rw-r--r--advtrains/advtrains/models/advtrains_dtrack_vst1.obj348
-rw-r--r--advtrains/advtrains/models/advtrains_dtrack_vst1_45.obj434
-rw-r--r--advtrains/advtrains/models/advtrains_dtrack_vst2.obj372
-rw-r--r--advtrains/advtrains/models/advtrains_dtrack_vst2_45.obj462
-rw-r--r--advtrains/advtrains/models/advtrains_dtrack_vst31.obj348
-rw-r--r--advtrains/advtrains/models/advtrains_dtrack_vst32.obj372
-rw-r--r--advtrains/advtrains/models/advtrains_dtrack_vst33.obj388
-rw-r--r--advtrains/advtrains/models/advtrains_modernwagon.b3dbin0 -> 172028 bytes
-rw-r--r--advtrains/advtrains/models/advtrains_platform_diag.b3dbin0 -> 1970 bytes
-rw-r--r--advtrains/advtrains/models/advtrains_platform_diag_low.b3dbin0 -> 1982 bytes
-rw-r--r--advtrains/advtrains/models/advtrains_retrosignal_off.b3dbin0 -> 13093 bytes
-rw-r--r--advtrains/advtrains/models/advtrains_retrosignal_off_30.b3dbin0 -> 13093 bytes
-rw-r--r--advtrains/advtrains/models/advtrains_retrosignal_off_45.b3dbin0 -> 13093 bytes
-rw-r--r--advtrains/advtrains/models/advtrains_retrosignal_off_60.b3dbin0 -> 13093 bytes
-rw-r--r--advtrains/advtrains/models/advtrains_retrosignal_on.b3dbin0 -> 13093 bytes
-rw-r--r--advtrains/advtrains/models/advtrains_retrosignal_on_30.b3dbin0 -> 13093 bytes
-rw-r--r--advtrains/advtrains/models/advtrains_retrosignal_on_45.b3dbin0 -> 13093 bytes
-rw-r--r--advtrains/advtrains/models/advtrains_retrosignal_on_60.b3dbin0 -> 13093 bytes
-rw-r--r--advtrains/advtrains/models/advtrains_signal.b3dbin0 -> 61544 bytes
-rw-r--r--advtrains/advtrains/models/advtrains_signal_30.b3dbin0 -> 61544 bytes
-rw-r--r--advtrains/advtrains/models/advtrains_signal_45.b3dbin0 -> 61544 bytes
-rw-r--r--advtrains/advtrains/models/advtrains_signal_60.b3dbin0 -> 61544 bytes
-rw-r--r--advtrains/advtrains/models/advtrains_signal_wall_l.b3dbin0 -> 40514 bytes
-rw-r--r--advtrains/advtrains/models/advtrains_signal_wall_r.b3dbin0 -> 40514 bytes
-rw-r--r--advtrains/advtrains/models/advtrains_signal_wall_t.b3dbin0 -> 40514 bytes
-rw-r--r--advtrains/advtrains/models/advtrains_track_cr.b3dbin0 -> 8023 bytes
-rw-r--r--advtrains/advtrains/models/advtrains_track_st.b3dbin0 -> 15831 bytes
-rw-r--r--advtrains/advtrains/models/advtrains_track_st_45.b3dbin0 -> 8935 bytes
-rw-r--r--advtrains/advtrains/models/trackplane.b3dbin0 -> 262 bytes
-rw-r--r--advtrains/advtrains/nodedb.lua343
-rw-r--r--advtrains/advtrains/occupation.lua207
-rw-r--r--advtrains/advtrains/p_mesecon_iface.lua54
-rw-r--r--advtrains/advtrains/passive.lua121
-rw-r--r--advtrains/advtrains/path.lua377
-rw-r--r--advtrains/advtrains/protection.lua197
-rw-r--r--advtrains/advtrains/settingtypes.txt47
-rw-r--r--advtrains/advtrains/signals.lua328
-rw-r--r--advtrains/advtrains/sounds/advtrains_crossing_bell.oggbin0 -> 47722 bytes
-rwxr-xr-xadvtrains/advtrains/textures/advtrains_across.pngbin0 -> 302 bytes
-rwxr-xr-xadvtrains/advtrains/textures/advtrains_across_anim.pngbin0 -> 524 bytes
-rwxr-xr-xadvtrains/advtrains/textures/advtrains_boiler.pngbin0 -> 413 bytes
-rwxr-xr-xadvtrains/advtrains/textures/advtrains_chimney.pngbin0 -> 309 bytes
-rw-r--r--advtrains/advtrains/textures/advtrains_copytool.pngbin0 -> 779 bytes
-rwxr-xr-xadvtrains/advtrains/textures/advtrains_couple.pngbin0 -> 339 bytes
-rw-r--r--advtrains/advtrains/textures/advtrains_cpl_lock.pngbin0 -> 209 bytes
-rw-r--r--advtrains/advtrains/textures/advtrains_cpl_unlock.pngbin0 -> 213 bytes
-rwxr-xr-xadvtrains/advtrains/textures/advtrains_discouple.pngbin0 -> 293 bytes
-rwxr-xr-xadvtrains/advtrains/textures/advtrains_driver_cab.pngbin0 -> 352 bytes
-rwxr-xr-xadvtrains/advtrains/textures/advtrains_dtrack_atc_placer.pngbin0 -> 1259 bytes
-rwxr-xr-xadvtrains/advtrains/textures/advtrains_dtrack_bumper_placer.pngbin0 -> 2213 bytes
-rwxr-xr-xadvtrains/advtrains/textures/advtrains_dtrack_detector_placer.pngbin0 -> 1253 bytes
-rwxr-xr-xadvtrains/advtrains/textures/advtrains_dtrack_load_placer.pngbin0 -> 1248 bytes
-rwxr-xr-xadvtrains/advtrains/textures/advtrains_dtrack_placer.pngbin0 -> 1097 bytes
-rwxr-xr-xadvtrains/advtrains/textures/advtrains_dtrack_rail.pngbin0 -> 4582 bytes
-rwxr-xr-xadvtrains/advtrains/textures/advtrains_dtrack_shared.pngbin0 -> 7141 bytes
-rwxr-xr-xadvtrains/advtrains/textures/advtrains_dtrack_shared_atc.pngbin0 -> 7215 bytes
-rwxr-xr-xadvtrains/advtrains/textures/advtrains_dtrack_shared_detector_off.pngbin0 -> 7180 bytes
-rwxr-xr-xadvtrains/advtrains/textures/advtrains_dtrack_shared_detector_on.pngbin0 -> 7181 bytes
-rwxr-xr-xadvtrains/advtrains/textures/advtrains_dtrack_shared_load.pngbin0 -> 7339 bytes
-rwxr-xr-xadvtrains/advtrains/textures/advtrains_dtrack_shared_unload.pngbin0 -> 7338 bytes
-rwxr-xr-xadvtrains/advtrains/textures/advtrains_dtrack_slopeplacer.pngbin0 -> 2415 bytes
-rwxr-xr-xadvtrains/advtrains/textures/advtrains_dtrack_unload_placer.pngbin0 -> 1260 bytes
-rwxr-xr-xadvtrains/advtrains/textures/advtrains_platform.pngbin0 -> 193 bytes
-rw-r--r--advtrains/advtrains/textures/advtrains_platform_diag.pngbin0 -> 93 bytes
-rwxr-xr-xadvtrains/advtrains/textures/advtrains_retrosignal.pngbin0 -> 8496 bytes
-rwxr-xr-xadvtrains/advtrains/textures/advtrains_retrosignal_inv.pngbin0 -> 2242 bytes
-rwxr-xr-xadvtrains/advtrains/textures/advtrains_signal_inv.pngbin0 -> 856 bytes
-rwxr-xr-xadvtrains/advtrains/textures/advtrains_signal_off.pngbin0 -> 5882 bytes
-rwxr-xr-xadvtrains/advtrains/textures/advtrains_signal_on.pngbin0 -> 5884 bytes
-rwxr-xr-xadvtrains/advtrains/textures/advtrains_signal_wall_off.pngbin0 -> 3056 bytes
-rwxr-xr-xadvtrains/advtrains/textures/advtrains_signal_wall_on.pngbin0 -> 3043 bytes
-rwxr-xr-xadvtrains/advtrains/textures/advtrains_track_cr.pngbin0 -> 33370 bytes
-rwxr-xr-xadvtrains/advtrains/textures/advtrains_track_cr_45.pngbin0 -> 33938 bytes
-rwxr-xr-xadvtrains/advtrains/textures/advtrains_track_placer.pngbin0 -> 32349 bytes
-rwxr-xr-xadvtrains/advtrains/textures/advtrains_track_st.pngbin0 -> 20405 bytes
-rwxr-xr-xadvtrains/advtrains/textures/advtrains_track_st_45.pngbin0 -> 39977 bytes
-rwxr-xr-xadvtrains/advtrains/textures/advtrains_track_swlcr.pngbin0 -> 33378 bytes
-rwxr-xr-xadvtrains/advtrains/textures/advtrains_track_swlcr_45.pngbin0 -> 45772 bytes
-rwxr-xr-xadvtrains/advtrains/textures/advtrains_track_swlst.pngbin0 -> 32321 bytes
-rwxr-xr-xadvtrains/advtrains/textures/advtrains_track_swlst_45.pngbin0 -> 46408 bytes
-rwxr-xr-xadvtrains/advtrains/textures/advtrains_track_swrcr.pngbin0 -> 33670 bytes
-rwxr-xr-xadvtrains/advtrains/textures/advtrains_track_swrcr_45.pngbin0 -> 46865 bytes
-rwxr-xr-xadvtrains/advtrains/textures/advtrains_track_swrst.pngbin0 -> 32654 bytes
-rwxr-xr-xadvtrains/advtrains/textures/advtrains_track_swrst_45.pngbin0 -> 47636 bytes
-rwxr-xr-xadvtrains/advtrains/textures/advtrains_trackworker.pngbin0 -> 328 bytes
-rw-r--r--advtrains/advtrains/textures/advtrains_wagon_placeholder.pngbin0 -> 723 bytes
-rwxr-xr-xadvtrains/advtrains/textures/advtrains_wheel.pngbin0 -> 582 bytes
-rwxr-xr-xadvtrains/advtrains/textures/drwho_screwdriver.pngbin0 -> 328 bytes
-rw-r--r--advtrains/advtrains/trackdb_legacy.lua27
-rw-r--r--advtrains/advtrains/trackplacer.lua438
-rw-r--r--advtrains/advtrains/tracks.lua742
-rw-r--r--advtrains/advtrains/trainhud.lua226
-rw-r--r--advtrains/advtrains/trainlogic.lua1255
-rw-r--r--advtrains/advtrains/wagons.lua1437
-rw-r--r--advtrains/advtrains_interlocking/approach.lua113
-rw-r--r--advtrains/advtrains_interlocking/ars.lua155
-rw-r--r--advtrains/advtrains_interlocking/database.lua599
-rw-r--r--advtrains/advtrains_interlocking/demosignals.lua111
-rw-r--r--advtrains/advtrains_interlocking/depends.txt2
-rw-r--r--advtrains/advtrains_interlocking/init.lua30
-rw-r--r--advtrains/advtrains_interlocking/models/at_il_tcb_node.obj248
-rw-r--r--advtrains/advtrains_interlocking/route_prog.lua548
-rw-r--r--advtrains/advtrains_interlocking/route_ui.lua152
-rw-r--r--advtrains/advtrains_interlocking/routesetting.lua357
-rw-r--r--advtrains/advtrains_interlocking/settingtypes.txt4
-rw-r--r--advtrains/advtrains_interlocking/signal_api.lua546
-rw-r--r--advtrains/advtrains_interlocking/tcb_ts_ui.lua789
-rw-r--r--advtrains/advtrains_interlocking/textures/advtrains_dtrack_npr_placer.pngbin0 -> 1238 bytes
-rw-r--r--advtrains/advtrains_interlocking/textures/advtrains_dtrack_shared_npr.pngbin0 -> 3176 bytes
-rw-r--r--advtrains/advtrains_interlocking/textures/at_il_route_end.pngbin0 -> 451 bytes
-rw-r--r--advtrains/advtrains_interlocking/textures/at_il_route_lock.pngbin0 -> 534 bytes
-rw-r--r--advtrains/advtrains_interlocking/textures/at_il_route_lock_edit.pngbin0 -> 533 bytes
-rw-r--r--advtrains/advtrains_interlocking/textures/at_il_route_set.pngbin0 -> 398 bytes
-rw-r--r--advtrains/advtrains_interlocking/textures/at_il_route_start.pngbin0 -> 380 bytes
-rw-r--r--advtrains/advtrains_interlocking/textures/at_il_routep_advance.pngbin0 -> 304 bytes
-rw-r--r--advtrains/advtrains_interlocking/textures/at_il_routep_end_here.pngbin0 -> 243 bytes
-rw-r--r--advtrains/advtrains_interlocking/textures/at_il_routep_end_over.pngbin0 -> 281 bytes
-rw-r--r--advtrains/advtrains_interlocking/textures/at_il_routep_end_over_last.pngbin0 -> 277 bytes
-rw-r--r--advtrains/advtrains_interlocking/textures/at_il_signal_asp_danger.pngbin0 -> 247 bytes
-rw-r--r--advtrains/advtrains_interlocking/textures/at_il_signal_asp_free.pngbin0 -> 245 bytes
-rw-r--r--advtrains/advtrains_interlocking/textures/at_il_signal_asp_slow.pngbin0 -> 245 bytes
-rw-r--r--advtrains/advtrains_interlocking/textures/at_il_signal_ip.pngbin0 -> 285 bytes
-rw-r--r--advtrains/advtrains_interlocking/textures/at_il_signal_off.pngbin0 -> 236 bytes
-rw-r--r--advtrains/advtrains_interlocking/textures/at_il_tcb_marker.pngbin0 -> 308 bytes
-rw-r--r--advtrains/advtrains_interlocking/textures/at_il_tcb_node.pngbin0 -> 279 bytes
-rw-r--r--advtrains/advtrains_interlocking/textures/at_il_tool.pngbin0 -> 337 bytes
-rw-r--r--advtrains/advtrains_interlocking/textures/at_il_turnout_cr_l.pngbin0 -> 314 bytes
-rw-r--r--advtrains/advtrains_interlocking/textures/at_il_turnout_cr_r.pngbin0 -> 298 bytes
-rw-r--r--advtrains/advtrains_interlocking/textures/at_il_turnout_free.pngbin0 -> 367 bytes
-rw-r--r--advtrains/advtrains_interlocking/textures/at_il_turnout_st.pngbin0 -> 229 bytes
-rw-r--r--advtrains/advtrains_interlocking/tool.lua66
-rw-r--r--advtrains/advtrains_interlocking/train_sections.lua199
-rw-r--r--advtrains/advtrains_interlocking/tsr_rail.lua56
-rw-r--r--advtrains/advtrains_itrainmap/depends.txt1
-rw-r--r--advtrains/advtrains_itrainmap/init.lua149
-rw-r--r--advtrains/advtrains_itrainmap/textures/itm_example.pngbin0 -> 154460 bytes
-rw-r--r--advtrains/advtrains_line_automation/depends.txt2
-rw-r--r--advtrains/advtrains_line_automation/init.lua47
-rw-r--r--advtrains/advtrains_line_automation/railwaytime.lua308
-rw-r--r--advtrains/advtrains_line_automation/readme.txt5
-rw-r--r--advtrains/advtrains_line_automation/scheduler.lua133
-rw-r--r--advtrains/advtrains_line_automation/settingtypes.txt6
-rw-r--r--advtrains/advtrains_line_automation/stoprail.lua218
-rw-r--r--advtrains/advtrains_line_automation/textures/advtrains_dtrack_shared_stop.pngbin0 -> 3306 bytes
-rw-r--r--advtrains/advtrains_line_automation/textures/advtrains_dtrack_stop_placer.pngbin0 -> 1238 bytes
-rw-r--r--advtrains/advtrains_luaautomation/README.txt288
-rw-r--r--advtrains/advtrains_luaautomation/active_common.lua175
-rw-r--r--advtrains/advtrains_luaautomation/atc_rail.lua194
-rw-r--r--advtrains/advtrains_luaautomation/chatcmds.lua84
-rw-r--r--advtrains/advtrains_luaautomation/depends.txt4
-rw-r--r--advtrains/advtrains_luaautomation/environment.lua362
-rw-r--r--advtrains/advtrains_luaautomation/init.lua109
-rw-r--r--advtrains/advtrains_luaautomation/interrupt.lua48
-rw-r--r--advtrains/advtrains_luaautomation/operation_panel.lua28
-rw-r--r--advtrains/advtrains_luaautomation/p_display.lua0
-rw-r--r--advtrains/advtrains_luaautomation/passive_api.txt24
-rw-r--r--advtrains/advtrains_luaautomation/pcnaming.lua76
-rw-r--r--advtrains/advtrains_luaautomation/textures/atlatc_oppanel.pngbin0 -> 631 bytes
-rw-r--r--advtrains/advtrains_luaautomation/textures/atlatc_pcnaming.pngbin0 -> 329 bytes
-rw-r--r--advtrains/advtrains_signals_ks/depends.txt2
-rw-r--r--advtrains/advtrains_signals_ks/init.lua255
-rw-r--r--advtrains/advtrains_signals_ks/init_degrotate_nodes.lua94
-rw-r--r--advtrains/advtrains_signals_ks/models/advtrains_signals_ks_head_dist.obj270
-rw-r--r--advtrains/advtrains_signals_ks/models/advtrains_signals_ks_head_main.obj286
-rw-r--r--advtrains/advtrains_signals_ks/models/advtrains_signals_ks_lamps_dist.obj1989
-rw-r--r--advtrains/advtrains_signals_ks/models/advtrains_signals_ks_lamps_main.obj2719
-rw-r--r--advtrains/advtrains_signals_ks/models/advtrains_signals_ks_main_smr0.obj4280
-rw-r--r--advtrains/advtrains_signals_ks/models/advtrains_signals_ks_main_smr30.obj4293
-rw-r--r--advtrains/advtrains_signals_ks/models/advtrains_signals_ks_main_smr45.obj4301
-rw-r--r--advtrains/advtrains_signals_ks/models/advtrains_signals_ks_main_smr60.obj4310
-rw-r--r--advtrains/advtrains_signals_ks/models/advtrains_signals_ks_mast.obj366
-rw-r--r--advtrains/advtrains_signals_ks/models/advtrains_signals_ks_mast_smr0.obj141
-rw-r--r--advtrains/advtrains_signals_ks/models/advtrains_signals_ks_mast_smr30.obj141
-rw-r--r--advtrains/advtrains_signals_ks/models/advtrains_signals_ks_mast_smr45.obj141
-rw-r--r--advtrains/advtrains_signals_ks/models/advtrains_signals_ks_mast_smr60.obj141
-rw-r--r--advtrains/advtrains_signals_ks/models/advtrains_signals_ks_sht_smr0.obj2942
-rw-r--r--advtrains/advtrains_signals_ks/models/advtrains_signals_ks_sht_smr30.obj2940
-rw-r--r--advtrains/advtrains_signals_ks/models/advtrains_signals_ks_sht_smr45.obj2933
-rw-r--r--advtrains/advtrains_signals_ks/models/advtrains_signals_ks_sht_smr60.obj2950
-rw-r--r--advtrains/advtrains_signals_ks/models/advtrains_signals_ks_sign_smr0.obj134
-rw-r--r--advtrains/advtrains_signals_ks/models/advtrains_signals_ks_sign_smr30.obj135
-rw-r--r--advtrains/advtrains_signals_ks/models/advtrains_signals_ks_sign_smr45.obj135
-rw-r--r--advtrains/advtrains_signals_ks/models/advtrains_signals_ks_sign_smr60.obj135
-rw-r--r--advtrains/advtrains_signals_ks/models/advtrains_signals_ks_zs_bottom.obj956
-rw-r--r--advtrains/advtrains_signals_ks/models/advtrains_signals_ks_zs_top.obj835
-rw-r--r--advtrains/advtrains_signals_ks/textures/advtrains_signals_ks_aspect_green.pngbin0 -> 155 bytes
-rw-r--r--advtrains/advtrains_signals_ks/textures/advtrains_signals_ks_aspect_red.pngbin0 -> 155 bytes
-rw-r--r--advtrains/advtrains_signals_ks/textures/advtrains_signals_ks_aspect_white.pngbin0 -> 155 bytes
-rw-r--r--advtrains/advtrains_signals_ks/textures/advtrains_signals_ks_aspect_yellow.pngbin0 -> 155 bytes
-rw-r--r--advtrains/advtrains_signals_ks/textures/advtrains_signals_ks_head.pngbin0 -> 260 bytes
-rw-r--r--advtrains/advtrains_signals_ks/textures/advtrains_signals_ks_hs_inv.pngbin0 -> 210 bytes
-rw-r--r--advtrains/advtrains_signals_ks/textures/advtrains_signals_ks_ltm_danger.pngbin0 -> 227 bytes
-rw-r--r--advtrains/advtrains_signals_ks/textures/advtrains_signals_ks_ltm_free.pngbin0 -> 215 bytes
-rw-r--r--advtrains/advtrains_signals_ks/textures/advtrains_signals_ks_ltm_shunt.pngbin0 -> 238 bytes
-rw-r--r--advtrains/advtrains_signals_ks/textures/advtrains_signals_ks_ltm_shuntd.pngbin0 -> 239 bytes
-rw-r--r--advtrains/advtrains_signals_ks/textures/advtrains_signals_ks_ltm_slow.pngbin0 -> 219 bytes
-rw-r--r--advtrains/advtrains_signals_ks/textures/advtrains_signals_ks_mast.pngbin0 -> 224 bytes
-rw-r--r--advtrains/advtrains_signals_ks/textures/advtrains_signals_ks_ra_inv.pngbin0 -> 252 bytes
-rw-r--r--advtrains/advtrains_signals_ks/textures/advtrains_signals_ks_sign_12.pngbin0 -> 197 bytes
-rw-r--r--advtrains/advtrains_signals_ks/textures/advtrains_signals_ks_sign_16.pngbin0 -> 190 bytes
-rw-r--r--advtrains/advtrains_signals_ks/textures/advtrains_signals_ks_sign_8.pngbin0 -> 174 bytes
-rw-r--r--advtrains/advtrains_signals_ks/textures/advtrains_signals_ks_sign_e.pngbin0 -> 166 bytes
-rw-r--r--advtrains/advtrains_signals_ks/textures/advtrains_signals_ks_sign_hfs.pngbin0 -> 193 bytes
-rw-r--r--advtrains/advtrains_signals_ks/textures/advtrains_signals_ks_signpost.pngbin0 -> 224 bytes
-rw-r--r--advtrains/advtrains_signals_ks/textures/advtrains_signals_ks_zs_7.pngbin0 -> 251 bytes
-rw-r--r--advtrains/advtrains_train_industrial/depends.txt3
-rw-r--r--advtrains/advtrains_train_industrial/init.lua107
-rw-r--r--advtrains/advtrains_train_industrial/models/advtrains_engine_industrial.b3dbin0 -> 138641 bytes
-rw-r--r--advtrains/advtrains_train_industrial/models/advtrains_engine_industrial_big.b3dbin0 -> 283441 bytes
-rw-r--r--advtrains/advtrains_train_industrial/models/advtrains_wagon_tank.b3dbin0 -> 155412 bytes
-rw-r--r--advtrains/advtrains_train_industrial/models/advtrains_wagon_wood.b3dbin0 -> 182813 bytes
-rw-r--r--advtrains/advtrains_train_industrial/sounds/advtrains_industrial_horn.oggbin0 -> 54380 bytes
-rw-r--r--advtrains/advtrains_train_industrial/textures/advtrains_engine_industrial.pngbin0 -> 23044 bytes
-rw-r--r--advtrains/advtrains_train_industrial/textures/advtrains_engine_industrial_big.pngbin0 -> 23765 bytes
-rw-r--r--advtrains/advtrains_train_industrial/textures/advtrains_engine_industrial_inv.pngbin0 -> 381 bytes
-rw-r--r--advtrains/advtrains_train_industrial/textures/advtrains_wagon_tank.pngbin0 -> 23411 bytes
-rw-r--r--advtrains/advtrains_train_industrial/textures/advtrains_wagon_tank_inv.pngbin0 -> 408 bytes
-rw-r--r--advtrains/advtrains_train_industrial/textures/advtrains_wagon_wood.pngbin0 -> 21622 bytes
-rw-r--r--advtrains/advtrains_train_industrial/textures/advtrains_wagon_wood_inv.pngbin0 -> 316 bytes
-rw-r--r--advtrains/advtrains_train_japan/depends.txt3
-rw-r--r--advtrains/advtrains_train_japan/init.lua140
-rw-r--r--advtrains/advtrains_train_japan/models/advtrains_engine_japan.b3dbin0 -> 437635 bytes
-rw-r--r--advtrains/advtrains_train_japan/models/advtrains_wagon_japan.b3dbin0 -> 554284 bytes
-rw-r--r--advtrains/advtrains_train_japan/sounds/advtrains_japan_horn.oggbin0 -> 39307 bytes
-rw-r--r--advtrains/advtrains_train_japan/textures/advtrains_engine_japan.pngbin0 -> 27935 bytes
-rw-r--r--advtrains/advtrains_train_japan/textures/advtrains_engine_japan_inv.pngbin0 -> 434 bytes
-rw-r--r--advtrains/advtrains_train_japan/textures/advtrains_wagon_japan.pngbin0 -> 54396 bytes
-rw-r--r--advtrains/advtrains_train_japan/textures/advtrains_wagon_japan_inv.pngbin0 -> 400 bytes
-rwxr-xr-xadvtrains/advtrains_train_steam/depends.txt3
-rwxr-xr-xadvtrains/advtrains_train_steam/init.lua253
-rwxr-xr-xadvtrains/advtrains_train_steam/models/advtrains_detailed_steam_engine.b3dbin0 -> 472151 bytes
-rwxr-xr-xadvtrains/advtrains_train_steam/models/advtrains_engine_steam.b3dbin0 -> 437126 bytes
-rw-r--r--advtrains/advtrains_train_steam/models/advtrains_passenger_wagon.b3dbin0 -> 145287 bytes
-rw-r--r--advtrains/advtrains_train_steam/models/advtrains_wagon.b3dbin0 -> 107352 bytes
-rwxr-xr-xadvtrains/advtrains_train_steam/models/advtrains_wagon_box.b3dbin0 -> 50385 bytes
-rw-r--r--advtrains/advtrains_train_steam/screenshot.pngbin0 -> 809738 bytes
-rw-r--r--advtrains/advtrains_train_steam/sounds/advtrains_steam_loop.oggbin0 -> 239037 bytes
-rw-r--r--advtrains/advtrains_train_steam/sounds/advtrains_steam_whistle.oggbin0 -> 56532 bytes
-rwxr-xr-xadvtrains/advtrains_train_steam/textures/advtrains_detailed_engine_steam_inv.pngbin0 -> 462 bytes
-rwxr-xr-xadvtrains/advtrains_train_steam/textures/advtrains_detailed_steam_engine.pngbin0 -> 30519 bytes
-rwxr-xr-xadvtrains/advtrains_train_steam/textures/advtrains_engine_steam.pngbin0 -> 31915 bytes
-rwxr-xr-xadvtrains/advtrains_train_steam/textures/advtrains_engine_steam_inv.pngbin0 -> 469 bytes
-rw-r--r--advtrains/advtrains_train_steam/textures/advtrains_wagon.pngbin0 -> 17701 bytes
-rwxr-xr-xadvtrains/advtrains_train_steam/textures/advtrains_wagon_box.pngbin0 -> 15197 bytes
-rwxr-xr-xadvtrains/advtrains_train_steam/textures/advtrains_wagon_box_inv.pngbin0 -> 347 bytes
-rwxr-xr-xadvtrains/advtrains_train_steam/textures/advtrains_wagon_inv.pngbin0 -> 699 bytes
-rw-r--r--advtrains/advtrains_train_subway/depends.txt3
-rw-r--r--advtrains/advtrains_train_subway/init.lua152
-rw-r--r--advtrains/advtrains_train_subway/models/advtrains_subway_wagon.b3dbin0 -> 460013 bytes
-rw-r--r--advtrains/advtrains_train_subway/sounds/advtrains_subway_arrive.oggbin0 -> 22658 bytes
-rw-r--r--advtrains/advtrains_train_subway/sounds/advtrains_subway_dclose.oggbin0 -> 14298 bytes
-rw-r--r--advtrains/advtrains_train_subway/sounds/advtrains_subway_depart.oggbin0 -> 39161 bytes
-rw-r--r--advtrains/advtrains_train_subway/sounds/advtrains_subway_dopen.oggbin0 -> 14307 bytes
-rw-r--r--advtrains/advtrains_train_subway/sounds/advtrains_subway_horn.oggbin0 -> 14370 bytes
-rw-r--r--advtrains/advtrains_train_subway/sounds/advtrains_subway_loop.oggbin0 -> 33319 bytes
-rw-r--r--advtrains/advtrains_train_subway/textures/advtrains_subway_wagon.pngbin0 -> 2102 bytes
-rw-r--r--advtrains/advtrains_train_subway/textures/advtrains_subway_wagon_inv.pngbin0 -> 842 bytes
-rw-r--r--advtrains/advtrains_train_subway/textures/advtrains_subway_wagon_line.pngbin0 -> 155 bytes
-rw-r--r--advtrains/advtrains_train_subway/textures/advtrains_subway_wagon_line0.pngbin0 -> 222 bytes
-rw-r--r--advtrains/advtrains_train_subway/textures/advtrains_subway_wagon_line0_.pngbin0 -> 166 bytes
-rw-r--r--advtrains/advtrains_train_subway/textures/advtrains_subway_wagon_line1.pngbin0 -> 218 bytes
-rw-r--r--advtrains/advtrains_train_subway/textures/advtrains_subway_wagon_line1_.pngbin0 -> 172 bytes
-rw-r--r--advtrains/advtrains_train_subway/textures/advtrains_subway_wagon_line2.pngbin0 -> 229 bytes
-rw-r--r--advtrains/advtrains_train_subway/textures/advtrains_subway_wagon_line2_.pngbin0 -> 173 bytes
-rw-r--r--advtrains/advtrains_train_subway/textures/advtrains_subway_wagon_line3.pngbin0 -> 219 bytes
-rw-r--r--advtrains/advtrains_train_subway/textures/advtrains_subway_wagon_line3_.pngbin0 -> 168 bytes
-rw-r--r--advtrains/advtrains_train_subway/textures/advtrains_subway_wagon_line4.pngbin0 -> 237 bytes
-rw-r--r--advtrains/advtrains_train_subway/textures/advtrains_subway_wagon_line4_.pngbin0 -> 169 bytes
-rw-r--r--advtrains/advtrains_train_subway/textures/advtrains_subway_wagon_line5.pngbin0 -> 228 bytes
-rw-r--r--advtrains/advtrains_train_subway/textures/advtrains_subway_wagon_line5_.pngbin0 -> 173 bytes
-rw-r--r--advtrains/advtrains_train_subway/textures/advtrains_subway_wagon_line6.pngbin0 -> 227 bytes
-rw-r--r--advtrains/advtrains_train_subway/textures/advtrains_subway_wagon_line6_.pngbin0 -> 174 bytes
-rw-r--r--advtrains/advtrains_train_subway/textures/advtrains_subway_wagon_line7.pngbin0 -> 233 bytes
-rw-r--r--advtrains/advtrains_train_subway/textures/advtrains_subway_wagon_line7_.pngbin0 -> 169 bytes
-rw-r--r--advtrains/advtrains_train_subway/textures/advtrains_subway_wagon_line8.pngbin0 -> 218 bytes
-rw-r--r--advtrains/advtrains_train_subway/textures/advtrains_subway_wagon_line8_.pngbin0 -> 167 bytes
-rw-r--r--advtrains/advtrains_train_subway/textures/advtrains_subway_wagon_line9.pngbin0 -> 228 bytes
-rw-r--r--advtrains/advtrains_train_subway/textures/advtrains_subway_wagon_line9_.pngbin0 -> 173 bytes
-rw-r--r--advtrains/advtrains_train_subway/textures/advtrains_subway_wagon_lineX.pngbin0 -> 239 bytes
-rw-r--r--advtrains/advtrains_train_subway/textures/advtrains_subway_wagon_line_0.pngbin0 -> 165 bytes
-rw-r--r--advtrains/advtrains_train_subway/textures/advtrains_subway_wagon_line_1.pngbin0 -> 170 bytes
-rw-r--r--advtrains/advtrains_train_subway/textures/advtrains_subway_wagon_line_2.pngbin0 -> 171 bytes
-rw-r--r--advtrains/advtrains_train_subway/textures/advtrains_subway_wagon_line_3.pngbin0 -> 165 bytes
-rw-r--r--advtrains/advtrains_train_subway/textures/advtrains_subway_wagon_line_4.pngbin0 -> 166 bytes
-rw-r--r--advtrains/advtrains_train_subway/textures/advtrains_subway_wagon_line_5.pngbin0 -> 171 bytes
-rw-r--r--advtrains/advtrains_train_subway/textures/advtrains_subway_wagon_line_6.pngbin0 -> 171 bytes
-rw-r--r--advtrains/advtrains_train_subway/textures/advtrains_subway_wagon_line_7.pngbin0 -> 166 bytes
-rw-r--r--advtrains/advtrains_train_subway/textures/advtrains_subway_wagon_line_8.pngbin0 -> 167 bytes
-rw-r--r--advtrains/advtrains_train_subway/textures/advtrains_subway_wagon_line_9.pngbin0 -> 171 bytes
-rw-r--r--advtrains/advtrains_train_subway/textures/advtrains_subway_wagon_livery.pngbin0 -> 26276 bytes
-rw-r--r--advtrains/advtrains_train_track/depends.txt4
-rw-r--r--advtrains/advtrains_train_track/init.lua409
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_bumper_st.b3dbin0 -> 32927 bytes
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_bumper_st_30.b3dbin0 -> 48546 bytes
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_bumper_st_45.b3dbin0 -> 32926 bytes
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_bumper_st_60.b3dbin0 -> 48546 bytes
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_cr.b3dbin0 -> 28040 bytes
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_cr_30.b3dbin0 -> 28043 bytes
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_cr_45.b3dbin0 -> 34483 bytes
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_cr_60.b3dbin0 -> 34483 bytes
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_s3_l.obj2335
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_s3_l_30.obj1882
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_s3_l_45.obj2710
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_s3_l_60.obj1888
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_s3_r.obj2335
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_s3_r_30.obj1889
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_s3_r_45.obj2710
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_s3_r_60.obj1882
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_s3_s.obj2339
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_s3_s_30.obj1888
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_s3_s_45.obj2707
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_s3_s_60.obj1888
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_st.b3dbin0 -> 10712 bytes
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_st_30.b3dbin0 -> 20043 bytes
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_st_45.b3dbin0 -> 12235 bytes
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_st_60.b3dbin0 -> 20043 bytes
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_swlcr.b3dbin0 -> 36203 bytes
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_swlcr_30.b3dbin0 -> 39958 bytes
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_swlcr_45.b3dbin0 -> 41302 bytes
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_swlcr_60.b3dbin0 -> 46270 bytes
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_swlst.b3dbin0 -> 36203 bytes
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_swlst_30.b3dbin0 -> 39958 bytes
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_swlst_45.b3dbin0 -> 41302 bytes
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_swlst_60.b3dbin0 -> 46270 bytes
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_swrcr.b3dbin0 -> 36203 bytes
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_swrcr_30.b3dbin0 -> 46270 bytes
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_swrcr_45.b3dbin0 -> 41302 bytes
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_swrcr_60.b3dbin0 -> 39958 bytes
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_swrst.b3dbin0 -> 36203 bytes
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_swrst_30.b3dbin0 -> 46270 bytes
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_swrst_45.b3dbin0 -> 41302 bytes
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_swrst_60.b3dbin0 -> 39958 bytes
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_sy_l.obj1936
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_sy_l_30.obj1414
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_sy_l_45.obj2033
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_sy_l_60.obj1390
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_sy_r.obj1929
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_sy_r_30.obj1402
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_sy_r_45.obj2037
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_sy_r_60.obj1402
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_vst1.obj348
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_vst1_45.obj434
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_vst2.obj372
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_vst2_45.obj462
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_vst31.obj348
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_vst32.obj372
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_vst33.obj388
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_xing4590_st.obj2196
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_xing90plusx_30l.obj2417
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_xing90plusx_30r.obj2378
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_xing90plusx_45l.obj1576
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_xing90plusx_45r.obj1557
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_xing90plusx_60l.obj2303
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_xing90plusx_60r.obj2280
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_xing_st.obj4963
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_xing_st_30.obj3476
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_xing_st_45.obj3177
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_xing_st_60.obj3492
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_xingdiag_30l45r.obj2317
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_xingdiag_30r45l.obj2294
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_xingdiag_60l30l.obj2556
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_xingdiag_60l30r.obj2556
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_xingdiag_60l45r.obj2206
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_xingdiag_60l60r.obj2229
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_xingdiag_60r-46l.obj2149
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_xingdiag_60r30l.obj2539
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_xingdiag_60r30r.obj2539
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_xingdiag_60r45l.obj2223
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_track_cr.b3dbin0 -> 8023 bytes
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_track_st.b3dbin0 -> 15831 bytes
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_track_st_45.b3dbin0 -> 8935 bytes
-rw-r--r--advtrains/advtrains_train_track/textures/advtrains_dtrack_atc_placer.pngbin0 -> 1259 bytes
-rw-r--r--advtrains/advtrains_train_track/textures/advtrains_dtrack_bumper_placer.pngbin0 -> 2213 bytes
-rw-r--r--advtrains/advtrains_train_track/textures/advtrains_dtrack_detector_placer.pngbin0 -> 1253 bytes
-rw-r--r--advtrains/advtrains_train_track/textures/advtrains_dtrack_load_placer.pngbin0 -> 1248 bytes
-rw-r--r--advtrains/advtrains_train_track/textures/advtrains_dtrack_placer.pngbin0 -> 1097 bytes
-rw-r--r--advtrains/advtrains_train_track/textures/advtrains_dtrack_rail.pngbin0 -> 4582 bytes
-rw-r--r--advtrains/advtrains_train_track/textures/advtrains_dtrack_s3_placer.pngbin0 -> 619 bytes
-rw-r--r--advtrains/advtrains_train_track/textures/advtrains_dtrack_shared.pngbin0 -> 7141 bytes
-rw-r--r--advtrains/advtrains_train_track/textures/advtrains_dtrack_shared_atc.pngbin0 -> 7215 bytes
-rw-r--r--advtrains/advtrains_train_track/textures/advtrains_dtrack_shared_detector_off.pngbin0 -> 7180 bytes
-rw-r--r--advtrains/advtrains_train_track/textures/advtrains_dtrack_shared_detector_on.pngbin0 -> 7181 bytes
-rw-r--r--advtrains/advtrains_train_track/textures/advtrains_dtrack_shared_load.pngbin0 -> 7339 bytes
-rw-r--r--advtrains/advtrains_train_track/textures/advtrains_dtrack_shared_unload.pngbin0 -> 7338 bytes
-rw-r--r--advtrains/advtrains_train_track/textures/advtrains_dtrack_slopeplacer.pngbin0 -> 2415 bytes
-rw-r--r--advtrains/advtrains_train_track/textures/advtrains_dtrack_sy_placer.pngbin0 -> 625 bytes
-rw-r--r--advtrains/advtrains_train_track/textures/advtrains_dtrack_unload_placer.pngbin0 -> 1260 bytes
-rw-r--r--advtrains/advtrains_train_track/textures/advtrains_dtrack_xing4590_placer.pngbin0 -> 468 bytes
-rw-r--r--advtrains/advtrains_train_track/textures/advtrains_dtrack_xing_placer.pngbin0 -> 549 bytes
-rw-r--r--advtrains/advtrains_train_track/textures/advtrains_dtrack_xingdiag_placer.pngbin0 -> 557 bytes
-rw-r--r--advtrains/advtrains_train_track/textures/advtrains_track_cr.pngbin0 -> 33370 bytes
-rw-r--r--advtrains/advtrains_train_track/textures/advtrains_track_cr_45.pngbin0 -> 33938 bytes
-rw-r--r--advtrains/advtrains_train_track/textures/advtrains_track_placer.pngbin0 -> 32349 bytes
-rw-r--r--advtrains/advtrains_train_track/textures/advtrains_track_st.pngbin0 -> 20405 bytes
-rw-r--r--advtrains/advtrains_train_track/textures/advtrains_track_st_45.pngbin0 -> 39977 bytes
-rw-r--r--advtrains/advtrains_train_track/textures/advtrains_track_swlcr.pngbin0 -> 33378 bytes
-rw-r--r--advtrains/advtrains_train_track/textures/advtrains_track_swlcr_45.pngbin0 -> 45772 bytes
-rw-r--r--advtrains/advtrains_train_track/textures/advtrains_track_swlst.pngbin0 -> 32321 bytes
-rw-r--r--advtrains/advtrains_train_track/textures/advtrains_track_swlst_45.pngbin0 -> 46408 bytes
-rw-r--r--advtrains/advtrains_train_track/textures/advtrains_track_swrcr.pngbin0 -> 33670 bytes
-rw-r--r--advtrains/advtrains_train_track/textures/advtrains_track_swrcr_45.pngbin0 -> 46865 bytes
-rw-r--r--advtrains/advtrains_train_track/textures/advtrains_track_swrst.pngbin0 -> 32654 bytes
-rw-r--r--advtrains/advtrains_train_track/textures/advtrains_track_swrst_45.pngbin0 -> 47636 bytes
-rw-r--r--advtrains/assets/AdvTrains_Additions.zipbin0 -> 889352 bytes
-rw-r--r--advtrains/assets/Weichenhebel-CooleLokAnimiert.zipbin0 -> 154594 bytes
-rw-r--r--advtrains/assets/Weichenhebel-CooleLokAnimiert/dampflock4pipe_animated.blendbin0 -> 859028 bytes
-rw-r--r--advtrains/assets/advtrains_across.xcfbin0 -> 13559 bytes
-rw-r--r--advtrains/assets/advtrains_newlocomotive.xcfbin0 -> 7462378 bytes
-rw-r--r--advtrains/assets/advtrains_wagon.pngbin0 -> 72273 bytes
-rw-r--r--advtrains/assets/andreaskreuz.blendbin0 -> 507904 bytes
-rw-r--r--advtrains/assets/andreaskreuz.blend1bin0 -> 507904 bytes
-rw-r--r--advtrains/assets/andreaskreuz.pngbin0 -> 69701 bytes
-rw-r--r--advtrains/assets/at_il_tcb_node.blendbin0 -> 483100 bytes
-rw-r--r--advtrains/assets/blender/engine-with-animation.blendbin0 -> 599504 bytes
-rw-r--r--advtrains/assets/blender/engine-with-animation_newtry.blendbin0 -> 638904 bytes
-rw-r--r--advtrains/assets/blender/gleis/advtrains_dtrack_shared.xcfbin0 -> 75136 bytes
-rw-r--r--advtrains/assets/blender/gleis/before_redo/detectorpart.pngbin0 -> 857 bytes
-rw-r--r--advtrains/assets/blender/gleis/before_redo/rail_my.blendbin0 -> 654772 bytes
-rw-r--r--advtrains/assets/blender/gleis/before_redo/rail_my_rt.blendbin0 -> 847060 bytes
-rw-r--r--advtrains/assets/blender/gleis/before_redo/rail_my_rt_final.blendbin0 -> 1015668 bytes
-rw-r--r--advtrains/assets/blender/gleis/before_redo/rail_my_rt_switches.blendbin0 -> 2184236 bytes
-rw-r--r--advtrains/assets/blender/gleis/before_redo/rail_my_rt_switches2.blendbin0 -> 2139340 bytes
-rw-r--r--advtrains/assets/blender/gleis/before_redo/rail_together.blendbin0 -> 1016920 bytes
-rw-r--r--advtrains/assets/blender/gleis/before_redo/rail_together.pngbin0 -> 233544 bytes
-rw-r--r--advtrains/assets/blender/gleis/before_redo/rail_together2.pngbin0 -> 312891 bytes
-rw-r--r--advtrains/assets/blender/gleis/before_redo/rail_together3.pngbin0 -> 309398 bytes
-rw-r--r--advtrains/assets/blender/gleis/before_redo/rail_verticals.blendbin0 -> 550748 bytes
-rw-r--r--advtrains/assets/blender/gleis/before_redo/rail_verticals3.blendbin0 -> 591800 bytes
-rw-r--r--advtrains/assets/blender/gleis/before_redo/rail_verticals45.blendbin0 -> 547788 bytes
-rw-r--r--advtrains/assets/blender/gleis/before_redo/rail_verticals45.blend11bin0 -> 547300 bytes
-rw-r--r--advtrains/assets/blender/gleis/infos/Grafik_weiche.pngbin0 -> 361700 bytes
-rw-r--r--advtrains/assets/blender/gleis/infos/breite1
-rw-r--r--advtrains/assets/blender/gleis/licence.txt~0
-rw-r--r--advtrains/assets/blender/gleis/rail_crossings.blendbin0 -> 444480 bytes
-rw-r--r--advtrains/assets/blender/gleis/rail_moreturnouts.blendbin0 -> 468819 bytes
-rw-r--r--advtrains/assets/blender/gleis/rail_redo.blendbin0 -> 1929280 bytes
-rw-r--r--advtrains/assets/blender/gleis/rail_redo_bk_curves.blendbin0 -> 791704 bytes
-rw-r--r--advtrains/assets/blender/gleis/rail_redo_bk_rswit.blendbin0 -> 1567640 bytes
-rw-r--r--advtrains/assets/blender/gleis/rail_redo_bk_straight.blendbin0 -> 707632 bytes
-rw-r--r--advtrains/assets/blender/gleis/rail_redo_bk_swit.blendbin0 -> 1189696 bytes
-rw-r--r--advtrains/assets/blender/gleis/texturen/rail.pngbin0 -> 2616 bytes
-rw-r--r--advtrains/assets/blender/gleis/texturen/uv.pngbin0 -> 2343 bytes
-rw-r--r--advtrains/assets/blender/gleis/uv_rails_all.pngbin0 -> 3692 bytes
-rw-r--r--advtrains/assets/blender/industrial/industry_loc.blendbin0 -> 652640 bytes
-rw-r--r--advtrains/assets/blender/industrial/industry_loc.blend11bin0 -> 659096 bytes
-rw-r--r--advtrains/assets/blender/industrial/industry_oil_ wagong.blendbin0 -> 693488 bytes
-rw-r--r--advtrains/assets/blender/industrial/industry_tree_wagong.blendbin0 -> 640056 bytes
-rw-r--r--advtrains/assets/blender/industrial/industry_tree_wagong.pngbin0 -> 316 bytes
-rw-r--r--advtrains/assets/blender/ks/advtrains_signals_ks_head_dist.obj270
-rw-r--r--advtrains/assets/blender/ks/advtrains_signals_ks_head_main.obj286
-rw-r--r--advtrains/assets/blender/ks/advtrains_signals_ks_lamps_dist.obj1989
-rw-r--r--advtrains/assets/blender/ks/advtrains_signals_ks_lamps_main.obj2719
-rw-r--r--advtrains/assets/blender/ks/advtrains_signals_ks_main_smr0.mtl42
-rw-r--r--advtrains/assets/blender/ks/advtrains_signals_ks_main_smr0.obj4280
-rw-r--r--advtrains/assets/blender/ks/advtrains_signals_ks_main_smr30.mtl42
-rw-r--r--advtrains/assets/blender/ks/advtrains_signals_ks_main_smr30.obj4293
-rw-r--r--advtrains/assets/blender/ks/advtrains_signals_ks_main_smr45.mtl42
-rw-r--r--advtrains/assets/blender/ks/advtrains_signals_ks_main_smr45.obj4301
-rw-r--r--advtrains/assets/blender/ks/advtrains_signals_ks_main_smr60.mtl42
-rw-r--r--advtrains/assets/blender/ks/advtrains_signals_ks_main_smr60.obj4310
-rw-r--r--advtrains/assets/blender/ks/advtrains_signals_ks_mast.obj366
-rw-r--r--advtrains/assets/blender/ks/advtrains_signals_ks_mast_smr0.obj141
-rw-r--r--advtrains/assets/blender/ks/advtrains_signals_ks_mast_smr30.obj141
-rw-r--r--advtrains/assets/blender/ks/advtrains_signals_ks_mast_smr45.obj141
-rw-r--r--advtrains/assets/blender/ks/advtrains_signals_ks_mast_smr60.obj141
-rw-r--r--advtrains/assets/blender/ks/advtrains_signals_ks_zs_bottom.obj956
-rw-r--r--advtrains/assets/blender/ks/advtrains_signals_ks_zs_top.obj835
-rw-r--r--advtrains/assets/blender/ks/signal_ks.blendbin0 -> 770684 bytes
-rw-r--r--advtrains/assets/blender/ks/signal_ks.blend1bin0 -> 770684 bytes
-rw-r--r--advtrains/assets/blender/ks/signal_ks_export.blendbin0 -> 880352 bytes
-rw-r--r--advtrains/assets/blender/ks/signal_ks_export.blend1bin0 -> 880352 bytes
-rw-r--r--advtrains/assets/blender/ks/signal_ks_exportd.blendbin0 -> 535508 bytes
-rw-r--r--advtrains/assets/blender/ks/signal_ks_exportd.blend1bin0 -> 535316 bytes
-rw-r--r--advtrains/assets/blender/ks/signal_ks_singlemesh.blendbin0 -> 703884 bytes
-rw-r--r--advtrains/assets/blender/ks/signal_ks_singlemesh.blend1bin0 -> 703884 bytes
-rw-r--r--advtrains/assets/blender/ks/signal_ks_singlemesh_final.blendbin0 -> 652332 bytes
-rw-r--r--advtrains/assets/blender/ks/signal_ks_singlemesh_final.blend1bin0 -> 661328 bytes
-rw-r--r--advtrains/assets/blender/ks/signal_ks_singlemesh_lampuv.pngbin0 -> 211402 bytes
-rw-r--r--advtrains/assets/blender/ks/signal_ks_singlemesh_lampuv.xcfbin0 -> 1558 bytes
-rw-r--r--advtrains/assets/blender/ks/signal_ks_singlemesh_shuntsig.blendbin0 -> 593572 bytes
-rw-r--r--advtrains/assets/blender/ks/signal_ks_singlemesh_shuntsig.blend1bin0 -> 593572 bytes
-rw-r--r--advtrains/assets/blender/ks/signal_ks_splt.blendbin0 -> 884984 bytes
-rw-r--r--advtrains/assets/blender/ks/signal_ks_splt.blend1bin0 -> 867672 bytes
-rw-r--r--advtrains/assets/blender/locomotive.blendbin0 -> 459600 bytes
-rw-r--r--advtrains/assets/blender/magnet_track.blendbin0 -> 516836 bytes
-rw-r--r--advtrains/assets/blender/mbb/advtrains_engine_japan.xcfbin0 -> 2621842 bytes
-rw-r--r--advtrains/assets/blender/mbb/jpn_engine_anim_uv.pngbin0 -> 274484 bytes
-rw-r--r--advtrains/assets/blender/mbb/jpn_wagon_anim_uv.pngbin0 -> 206208 bytes
-rw-r--r--advtrains/assets/blender/mbb/modern_japanlocomotive.blendbin0 -> 715116 bytes
-rw-r--r--advtrains/assets/blender/mbb/modern_japanlocomotive.blend1bin0 -> 715116 bytes
-rw-r--r--advtrains/assets/blender/mbb/modern_japanlocomotive.pngbin0 -> 204978 bytes
-rw-r--r--advtrains/assets/blender/mbb/modern_japanlocomotive.xcfbin0 -> 957175 bytes
-rw-r--r--advtrains/assets/blender/mbb/modern_japanlocomotive_anim.blendbin0 -> 1149060 bytes
-rw-r--r--advtrains/assets/blender/mbb/modern_japanlocomotive_anim.blend1bin0 -> 1170088 bytes
-rw-r--r--advtrains/assets/blender/mbb/modern_japanlocomotive_anim_uv.blendbin0 -> 1146996 bytes
-rw-r--r--advtrains/assets/blender/mbb/modern_japanlocomotive_anim_uv.blend1bin0 -> 1144108 bytes
-rw-r--r--advtrains/assets/blender/mbb/modern_japanlocomotive_windows.blendbin0 -> 790808 bytes
-rw-r--r--advtrains/assets/blender/mbb/modern_japanlocomotive_windows.blend1bin0 -> 790808 bytes
-rw-r--r--advtrains/assets/blender/mbb/modern_japanlocomotive_windows_join.blendbin0 -> 762448 bytes
-rw-r--r--advtrains/assets/blender/mbb/modern_japanlocomotive_windows_join.blend1bin0 -> 767528 bytes
-rw-r--r--advtrains/assets/blender/mbb/modern_locomotive.blendbin0 -> 732124 bytes
-rw-r--r--advtrains/assets/blender/mbb/modern_wagong.blendbin0 -> 471140 bytes
-rw-r--r--advtrains/assets/blender/mbb/modern_wagong.blend1bin0 -> 518316 bytes
-rw-r--r--advtrains/assets/blender/mbb/modern_wagong_uv.blendbin0 -> 571364 bytes
-rw-r--r--advtrains/assets/blender/mbb/modern_wagong_uv.blend1bin0 -> 575708 bytes
-rw-r--r--advtrains/assets/blender/mbb/modern_wagong_uv.pngbin0 -> 189564 bytes
-rw-r--r--advtrains/assets/blender/mbb/prellbock.blendbin0 -> 745176 bytes
-rw-r--r--advtrains/assets/blender/mbb/prellbock.blend1bin0 -> 485416 bytes
-rw-r--r--advtrains/assets/blender/mbb/prellbock.uv.pngbin0 -> 4034 bytes
-rw-r--r--advtrains/assets/blender/mbb/regio-lokomotive.blendbin0 -> 704160 bytes
-rw-r--r--advtrains/assets/blender/mbb/regio-waron.blendbin0 -> 545620 bytes
-rw-r--r--advtrains/assets/blender/mbb/retrosignal.blendbin0 -> 488920 bytes
-rw-r--r--advtrains/assets/blender/mbb/retrosignal.blend1bin0 -> 507800 bytes
-rw-r--r--advtrains/assets/blender/mbb/signal(2)_hoch.blendbin0 -> 472092 bytes
-rw-r--r--advtrains/assets/blender/mbb/signal(2)_unten.blendbin0 -> 472092 bytes
-rw-r--r--advtrains/assets/blender/mbb/signal.blendbin0 -> 570336 bytes
-rw-r--r--advtrains/assets/blender/mbb/signal.blend1bin0 -> 570336 bytes
-rw-r--r--advtrains/assets/blender/mbb/signal.pngbin0 -> 244314 bytes
-rw-r--r--advtrains/assets/blender/mbb/signal.xcfbin0 -> 881142 bytes
-rw-r--r--advtrains/assets/blender/mbb/signal2.pngbin0 -> 39924 bytes
-rw-r--r--advtrains/assets/blender/mbb/tr-logo.pngbin0 -> 197 bytes
-rw-r--r--advtrains/assets/blender/mbb/weichenhebel1.blendbin0 -> 493028 bytes
-rw-r--r--advtrains/assets/blender/mbb/weichenhebel2.blendbin0 -> 492996 bytes
-rw-r--r--advtrains/assets/blender/newlocomotive.blendbin0 -> 603376 bytes
-rw-r--r--advtrains/assets/blender/newlocomotive_uvs.pngbin0 -> 175030 bytes
-rw-r--r--advtrains/assets/blender/newwagon.blendbin0 -> 542188 bytes
-rw-r--r--advtrains/assets/blender/newwagon.pngbin0 -> 108762 bytes
-rw-r--r--advtrains/assets/blender/subway-train.blendbin0 -> 518888 bytes
-rw-r--r--advtrains/assets/blender/subway-train.pngbin0 -> 96773 bytes
-rw-r--r--advtrains/assets/blender/subway-train.xcfbin0 -> 92558 bytes
-rw-r--r--advtrains/assets/blender/subway-train_animate.blendbin0 -> 568668 bytes
-rw-r--r--advtrains/assets/blender/subway-train_animate_mirrored.blendbin0 -> 798328 bytes
-rw-r--r--advtrains/assets/blender/subway-train_animate_mirrored_solidify.blendbin0 -> 879916 bytes
-rw-r--r--advtrains/assets/blender/subway-train_animate_mirrored_solidify_uv.blendbin0 -> 836620 bytes
-rw-r--r--advtrains/assets/blender/subway-train_animate_mirrored_solidify_uv.pngbin0 -> 177111 bytes
-rw-r--r--advtrains/assets/blender/subway-train_animate_mirrored_solidify_uv.xcfbin0 -> 369791 bytes
-rw-r--r--advtrains/assets/blender/trackplane.blendbin0 -> 462200 bytes
-rw-r--r--advtrains/assets/blender/trackvertical1.blendbin0 -> 453656 bytes
-rw-r--r--advtrains/assets/blender/trackvertical1.pngbin0 -> 59146 bytes
-rw-r--r--advtrains/assets/blender/trackvertical2.blendbin0 -> 459216 bytes
-rw-r--r--advtrains/assets/blender/trackvertical2.pngbin0 -> 66755 bytes
-rw-r--r--advtrains/assets/dampflock4.blendbin0 -> 1000628 bytes
-rw-r--r--advtrains/assets/img_large/tcbex1.pngbin0 -> 546408 bytes
-rw-r--r--advtrains/assets/img_large/tcbex2.pngbin0 -> 174379 bytes
-rw-r--r--advtrains/assets/img_large/tcbex3.pngbin0 -> 927810 bytes
-rw-r--r--advtrains/assets/init.lua0
-rw-r--r--advtrains/assets/interlocking.html.LyXconv/0_home_moritz_Home_Projekte_Minetest_minetest_m___s_assets_lyx_img_screenshot_20180830_142551.eps34162
-rw-r--r--advtrains/assets/interlocking.html.LyXconv/0_home_moritz_Home_Projekte_Minetest_minetest_m___s_assets_lyx_img_screenshot_20180830_142551.pngbin0 -> 257012 bytes
-rw-r--r--advtrains/assets/interlocking.html.LyXconv/10_home_moritz_Home_Projekte_Minetest_minetest_____lyx_img_Bildschirmfoto_2019-01-15_19-28-09.pngbin0 -> 135195 bytes
-rw-r--r--advtrains/assets/interlocking.html.LyXconv/11_home_moritz_Home_Projekte_Minetest_minetest_mods_advtrains_assets_lyx_img_arslin_ex1.pngbin0 -> 32940 bytes
-rw-r--r--advtrains/assets/interlocking.html.LyXconv/12_home_moritz_Home_Projekte_Minetest_minetest_mods_advtrains_assets_lyx_img_arslin_ex2.pngbin0 -> 2205 bytes
-rw-r--r--advtrains/assets/interlocking.html.LyXconv/13_home_moritz_Home_Projekte_Minetest_minetest_mods_advtrains_assets_lyx_img_ars_ex1.pngbin0 -> 65581 bytes
-rw-r--r--advtrains/assets/interlocking.html.LyXconv/1_home_moritz_Home_Projekte_Minetest_minetest_m____lyx_img_Bildschirmfoto_2018-08-30_14-26-35.eps69401
-rw-r--r--advtrains/assets/interlocking.html.LyXconv/1_home_moritz_Home_Projekte_Minetest_minetest_m____lyx_img_Bildschirmfoto_2018-08-30_14-26-35.pngbin0 -> 392215 bytes
-rw-r--r--advtrains/assets/interlocking.html.LyXconv/2_home_moritz_Home_Projekte_Minetest_minetest_m____lyx_img_Bildschirmfoto_2018-08-30_14-32-48.eps62462
-rw-r--r--advtrains/assets/interlocking.html.LyXconv/2_home_moritz_Home_Projekte_Minetest_minetest_m____lyx_img_Bildschirmfoto_2018-08-30_14-32-48.pngbin0 -> 467151 bytes
-rw-r--r--advtrains/assets/interlocking.html.LyXconv/3_home_moritz_Home_Projekte_Minetest_minetest_m____lyx_img_Bildschirmfoto_2018-08-30_14-27-25.eps15074
-rw-r--r--advtrains/assets/interlocking.html.LyXconv/3_home_moritz_Home_Projekte_Minetest_minetest_m____lyx_img_Bildschirmfoto_2018-08-30_14-27-25.pngbin0 -> 58974 bytes
-rw-r--r--advtrains/assets/interlocking.html.LyXconv/4_home_moritz_Home_Projekte_Minetest_minetest_m____lyx_img_Bildschirmfoto_2018-08-30_14-28-32.eps33895
-rw-r--r--advtrains/assets/interlocking.html.LyXconv/4_home_moritz_Home_Projekte_Minetest_minetest_m____lyx_img_Bildschirmfoto_2018-08-30_14-28-32.pngbin0 -> 180489 bytes
-rw-r--r--advtrains/assets/interlocking.html.LyXconv/5_home_moritz_Home_Projekte_Minetest_minetest_m____lyx_img_Bildschirmfoto_2018-08-30_14-51-25.eps41321
-rw-r--r--advtrains/assets/interlocking.html.LyXconv/5_home_moritz_Home_Projekte_Minetest_minetest_m____lyx_img_Bildschirmfoto_2018-08-30_14-51-25.pngbin0 -> 298898 bytes
-rw-r--r--advtrains/assets/interlocking.html.LyXconv/6_home_moritz_Home_Projekte_Minetest_minetest_mods_advtrains_assets_lyx_img_route_ex1.eps18740
-rw-r--r--advtrains/assets/interlocking.html.LyXconv/6_home_moritz_Home_Projekte_Minetest_minetest_mods_advtrains_assets_lyx_img_route_ex1.pngbin0 -> 9681 bytes
-rw-r--r--advtrains/assets/interlocking.html.LyXconv/7_home_moritz_Home_Projekte_Minetest_minetest_mods_advtrains_assets_lyx_img_route_ex2.eps12586
-rw-r--r--advtrains/assets/interlocking.html.LyXconv/7_home_moritz_Home_Projekte_Minetest_minetest_mods_advtrains_assets_lyx_img_route_ex2.pngbin0 -> 9374 bytes
-rw-r--r--advtrains/assets/interlocking.html.LyXconv/8_home_moritz_Home_Projekte_Minetest_minetest_mods_advtrains_assets_lyx_img_assign_signal.eps27704
-rw-r--r--advtrains/assets/interlocking.html.LyXconv/8_home_moritz_Home_Projekte_Minetest_minetest_mods_advtrains_assets_lyx_img_assign_signal.pngbin0 -> 117671 bytes
-rw-r--r--advtrains/assets/interlocking.html.LyXconv/9_home_moritz_Home_Projekte_Minetest_minetest_mods_advtrains_assets_lyx_img_route_ex3.eps18740
-rw-r--r--advtrains/assets/interlocking.html.LyXconv/9_home_moritz_Home_Projekte_Minetest_minetest_mods_advtrains_assets_lyx_img_route_ex3.pngbin0 -> 11544 bytes
-rw-r--r--advtrains/assets/interlocking.html.LyXconv/interlocking.4ct30
-rw-r--r--advtrains/assets/interlocking.html.LyXconv/interlocking.4tc29
-rw-r--r--advtrains/assets/interlocking.html.LyXconv/interlocking.aux4
-rw-r--r--advtrains/assets/interlocking.html.LyXconv/interlocking.css117
-rw-r--r--advtrains/assets/interlocking.html.LyXconv/interlocking.dvibin0 -> 65604 bytes
-rw-r--r--advtrains/assets/interlocking.html.LyXconv/interlocking.html830
-rw-r--r--advtrains/assets/interlocking.html.LyXconv/interlocking.idvbin0 -> 569 bytes
-rw-r--r--advtrains/assets/interlocking.html.LyXconv/interlocking.lg166
-rw-r--r--advtrains/assets/interlocking.html.LyXconv/interlocking.log555
-rw-r--r--advtrains/assets/interlocking.html.LyXconv/interlocking.pdfbin0 -> 1419828 bytes
-rw-r--r--advtrains/assets/interlocking.html.LyXconv/interlocking.tex745
-rw-r--r--advtrains/assets/interlocking.html.LyXconv/interlocking.tex.dep7
-rw-r--r--advtrains/assets/interlocking.html.LyXconv/interlocking.tex.dep-pdf57
-rw-r--r--advtrains/assets/interlocking.html.LyXconv/interlocking.tmp2
-rw-r--r--advtrains/assets/interlocking.html.LyXconv/interlocking.xref73
-rw-r--r--advtrains/assets/interlocking.lyx2026
-rw-r--r--advtrains/assets/interlocking.lyx~2017
-rw-r--r--advtrains/assets/larger rails.xcfbin0 -> 1239132 bytes
-rw-r--r--advtrains/assets/lyx_img/Bildschirmfoto_2018-08-30_14-26-35.pngbin0 -> 392215 bytes
-rw-r--r--advtrains/assets/lyx_img/Bildschirmfoto_2018-08-30_14-27-25.pngbin0 -> 58974 bytes
-rw-r--r--advtrains/assets/lyx_img/Bildschirmfoto_2018-08-30_14-28-32.pngbin0 -> 180489 bytes
-rw-r--r--advtrains/assets/lyx_img/Bildschirmfoto_2018-08-30_14-32-48.pngbin0 -> 467151 bytes
-rw-r--r--advtrains/assets/lyx_img/Bildschirmfoto_2018-08-30_14-51-25.pngbin0 -> 298898 bytes
-rw-r--r--advtrains/assets/lyx_img/Bildschirmfoto_2019-01-15_19-28-09.pngbin0 -> 135195 bytes
-rw-r--r--advtrains/assets/lyx_img/ars_ex1.pngbin0 -> 65581 bytes
-rw-r--r--advtrains/assets/lyx_img/arslin_ex1.pngbin0 -> 32940 bytes
-rw-r--r--advtrains/assets/lyx_img/arslin_ex2.pngbin0 -> 2205 bytes
-rw-r--r--advtrains/assets/lyx_img/assign_signal.pngbin0 -> 117671 bytes
-rw-r--r--advtrains/assets/lyx_img/route_ex1.pngbin0 -> 9681 bytes
-rw-r--r--advtrains/assets/lyx_img/route_ex2.pngbin0 -> 9374 bytes
-rw-r--r--advtrains/assets/lyx_img/route_ex3.pngbin0 -> 11544 bytes
-rw-r--r--advtrains/assets/lyx_img/screenshot_20180830_142551.pngbin0 -> 257012 bytes
-rw-r--r--advtrains/assets/magleves_lockomotive.blendbin0 -> 747680 bytes
-rw-r--r--advtrains/assets/magleves_track.blendbin0 -> 464960 bytes
-rw-r--r--advtrains/assets/magleves_wagon.blendbin0 -> 709904 bytes
-rw-r--r--advtrains/assets/manual.html.LyXconv/0_home_moritz_Home_Projekte_Minetest_minetest_m___nual_img_Bildschirmfoto_2016-09-17_09-43-29.pngbin0 -> 9345 bytes
-rw-r--r--advtrains/assets/manual.html.LyXconv/10_home_moritz_Home_Projekte_Minetest_minetest____nual_img_Bildschirmfoto_2016-09-17_09-48-54.pngbin0 -> 14032 bytes
-rw-r--r--advtrains/assets/manual.html.LyXconv/11_home_moritz_Home_Projekte_Minetest_minetest____nual_img_Bildschirmfoto_2016-09-17_09-50-27.pngbin0 -> 4246 bytes
-rw-r--r--advtrains/assets/manual.html.LyXconv/12_home_moritz_Home_Projekte_Minetest_minetest____nual_img_Bildschirmfoto_2016-09-17_09-51-02.pngbin0 -> 3704 bytes
-rw-r--r--advtrains/assets/manual.html.LyXconv/13_home_moritz_Home_Projekte_Minetest_minetest____nual_img_Bildschirmfoto_2016-09-17_09-58-39.pngbin0 -> 6880 bytes
-rw-r--r--advtrains/assets/manual.html.LyXconv/14_home_moritz_Home_Projekte_Minetest_minetest____nual_img_Bildschirmfoto_2016-09-17_09-58-20.pngbin0 -> 10375 bytes
-rw-r--r--advtrains/assets/manual.html.LyXconv/15_home_moritz_Home_Projekte_Minetest_minetest____nual_img_Bildschirmfoto_2017-03-09_11-33-09.pngbin0 -> 3496 bytes
-rw-r--r--advtrains/assets/manual.html.LyXconv/16_home_moritz_Home_Projekte_Minetest_minetest____nual_img_Bildschirmfoto_2017-03-09_11-42-49.pngbin0 -> 25657 bytes
-rw-r--r--advtrains/assets/manual.html.LyXconv/17_home_moritz_Home_Projekte_Minetest_minetest____ssets_manual_img_screenshot_20161203_231622.pngbin0 -> 108256 bytes
-rw-r--r--advtrains/assets/manual.html.LyXconv/1_home_moritz_Home_Projekte_Minetest_minetest_m___nual_img_Bildschirmfoto_2016-09-17_10-04-12.pngbin0 -> 72813 bytes
-rw-r--r--advtrains/assets/manual.html.LyXconv/2_home_moritz_Home_Projekte_Minetest_minetest_m___nual_img_Bildschirmfoto_2016-09-17_10-04-57.pngbin0 -> 105448 bytes
-rw-r--r--advtrains/assets/manual.html.LyXconv/3_home_moritz_Home_Projekte_Minetest_minetest_m___nual_img_Bildschirmfoto_2016-09-17_10-05-51.pngbin0 -> 93538 bytes
-rw-r--r--advtrains/assets/manual.html.LyXconv/4_home_moritz_Home_Projekte_Minetest_minetest_m___nual_img_Bildschirmfoto_2016-09-17_10-07-13.pngbin0 -> 83521 bytes
-rw-r--r--advtrains/assets/manual.html.LyXconv/5_home_moritz_Home_Projekte_Minetest_minetest_m___nual_img_Bildschirmfoto_2016-09-17_09-56-34.pngbin0 -> 2789 bytes
-rw-r--r--advtrains/assets/manual.html.LyXconv/6_home_moritz_Home_Projekte_Minetest_minetest_m___nual_img_Bildschirmfoto_2016-09-17_10-08-02.pngbin0 -> 107762 bytes
-rw-r--r--advtrains/assets/manual.html.LyXconv/7_home_moritz_Home_Projekte_Minetest_minetest_m___nual_img_Bildschirmfoto_2016-09-17_10-09-01.pngbin0 -> 112579 bytes
-rw-r--r--advtrains/assets/manual.html.LyXconv/8_home_moritz_Home_Projekte_Minetest_minetest_m___nual_img_Bildschirmfoto_2016-09-17_10-10-15.pngbin0 -> 114075 bytes
-rw-r--r--advtrains/assets/manual.html.LyXconv/9_home_moritz_Home_Projekte_Minetest_minetest_m___nual_img_Bildschirmfoto_2016-09-17_09-45-38.pngbin0 -> 16695 bytes
-rw-r--r--advtrains/assets/manual.html.LyXconv/manual.css112
-rw-r--r--advtrains/assets/manual.html.LyXconv/manual.html236
-rw-r--r--advtrains/assets/manual.lyx630
-rw-r--r--advtrains/assets/manual.odtbin0 -> 1047714 bytes
-rw-r--r--advtrains/assets/manual_img/Bildschirmfoto_2016-09-17_09-43-29.pngbin0 -> 9345 bytes
-rw-r--r--advtrains/assets/manual_img/Bildschirmfoto_2016-09-17_09-45-38.pngbin0 -> 16695 bytes
-rw-r--r--advtrains/assets/manual_img/Bildschirmfoto_2016-09-17_09-46-21.pngbin0 -> 18834 bytes
-rw-r--r--advtrains/assets/manual_img/Bildschirmfoto_2016-09-17_09-48-54.pngbin0 -> 14032 bytes
-rw-r--r--advtrains/assets/manual_img/Bildschirmfoto_2016-09-17_09-50-27.pngbin0 -> 4246 bytes
-rw-r--r--advtrains/assets/manual_img/Bildschirmfoto_2016-09-17_09-51-02.pngbin0 -> 3704 bytes
-rw-r--r--advtrains/assets/manual_img/Bildschirmfoto_2016-09-17_09-52-17.pngbin0 -> 13788 bytes
-rw-r--r--advtrains/assets/manual_img/Bildschirmfoto_2016-09-17_09-52-40.pngbin0 -> 13889 bytes
-rw-r--r--advtrains/assets/manual_img/Bildschirmfoto_2016-09-17_09-53-01.pngbin0 -> 15473 bytes
-rw-r--r--advtrains/assets/manual_img/Bildschirmfoto_2016-09-17_09-56-34.pngbin0 -> 2789 bytes
-rw-r--r--advtrains/assets/manual_img/Bildschirmfoto_2016-09-17_09-58-20.pngbin0 -> 10375 bytes
-rw-r--r--advtrains/assets/manual_img/Bildschirmfoto_2016-09-17_09-58-39.pngbin0 -> 6880 bytes
-rw-r--r--advtrains/assets/manual_img/Bildschirmfoto_2016-09-17_10-04-12.pngbin0 -> 72813 bytes
-rw-r--r--advtrains/assets/manual_img/Bildschirmfoto_2016-09-17_10-04-57.pngbin0 -> 105448 bytes
-rw-r--r--advtrains/assets/manual_img/Bildschirmfoto_2016-09-17_10-05-51.pngbin0 -> 93538 bytes
-rw-r--r--advtrains/assets/manual_img/Bildschirmfoto_2016-09-17_10-07-13.pngbin0 -> 83521 bytes
-rw-r--r--advtrains/assets/manual_img/Bildschirmfoto_2016-09-17_10-08-02.pngbin0 -> 107762 bytes
-rw-r--r--advtrains/assets/manual_img/Bildschirmfoto_2016-09-17_10-09-01.pngbin0 -> 112579 bytes
-rw-r--r--advtrains/assets/manual_img/Bildschirmfoto_2016-09-17_10-10-15.pngbin0 -> 114075 bytes
-rw-r--r--advtrains/assets/manual_img/Bildschirmfoto_2016-12-13_19-25-26.pngbin0 -> 15044 bytes
-rw-r--r--advtrains/assets/manual_img/Bildschirmfoto_2017-03-09_11-33-09.pngbin0 -> 3496 bytes
-rw-r--r--advtrains/assets/manual_img/Bildschirmfoto_2017-03-09_11-42-49.pngbin0 -> 25657 bytes
-rw-r--r--advtrains/assets/manual_img/screenshot_20161203_223055.pngbin0 -> 824772 bytes
-rw-r--r--advtrains/assets/manual_img/screenshot_20161203_223328.pngbin0 -> 526640 bytes
-rw-r--r--advtrains/assets/manual_img/screenshot_20161203_230644.pngbin0 -> 610738 bytes
-rw-r--r--advtrains/assets/manual_img/screenshot_20161203_230648.pngbin0 -> 555494 bytes
-rw-r--r--advtrains/assets/manual_img/screenshot_20161203_231622.pngbin0 -> 108256 bytes
-rw-r--r--advtrains/assets/manual_img/screenshot_20161203_232335.pngbin0 -> 1607786 bytes
-rw-r--r--advtrains/assets/manual_img/screenshot_20161203_232545.pngbin0 -> 1527310 bytes
-rw-r--r--advtrains/assets/mbbrailtextures/advtrains_dtrack_rail.pngbin0 -> 4582 bytes
-rw-r--r--advtrains/assets/mbbrailtextures/advtrains_dtrack_rail_atc.pngbin0 -> 4596 bytes
-rw-r--r--advtrains/assets/mbbrailtextures/advtrains_dtrack_rail_detector_on.pngbin0 -> 4579 bytes
-rw-r--r--advtrains/assets/modern_japan_lockomotive.blendbin0 -> 892480 bytes
-rw-r--r--advtrains/assets/modern_japan_wagon.blendbin0 -> 856968 bytes
-rw-r--r--advtrains/assets/oldmodels/locomotive.b3dbin0 -> 181112 bytes
-rw-r--r--advtrains/assets/oldmodels/trackvertical1.b3dbin0 -> 629 bytes
-rw-r--r--advtrains/assets/oldmodels/trackvertical2.b3dbin0 -> 869 bytes
-rw-r--r--advtrains/assets/schild.blendbin0 -> 513160 bytes
-rw-r--r--advtrains/assets/schild.blend1bin0 -> 513160 bytes
-rw-r--r--advtrains/assets/schild.pngbin0 -> 28705 bytes
-rw-r--r--advtrains/assets/schild_flaeche.pngbin0 -> 526 bytes
-rw-r--r--advtrains/assets/signal_wall.blendbin0 -> 512620 bytes
-rw-r--r--advtrains/assets/signal_wall.pngbin0 -> 107155 bytes
-rw-r--r--advtrains/assets/signal_wall_ceiling.blendbin0 -> 512620 bytes
-rw-r--r--advtrains/assets/uban_fancy.blendbin0 -> 1020740 bytes
-rw-r--r--advtrains/assets/wagonfancytexture.pngbin0 -> 42023 bytes
-rw-r--r--advtrains/assets/wagong_fancy.blendbin0 -> 1044484 bytes
-rw-r--r--advtrains/atc_command.txt83
-rw-r--r--advtrains/description.txt2
-rw-r--r--advtrains/license.txt198
-rw-r--r--advtrains/license_media.txt68
-rw-r--r--advtrains/modpack.txt0
-rw-r--r--advtrains/privilege_guide.txt43
-rw-r--r--advtrains/readme.txt47
-rw-r--r--advtrains/screenshot.pngbin0 -> 809738 bytes
729 files changed, 520507 insertions, 0 deletions
diff --git a/advtrains/.gitignore b/advtrains/.gitignore
new file mode 100644
index 0000000..b3180de
--- /dev/null
+++ b/advtrains/.gitignore
@@ -0,0 +1,3 @@
+## Eclipse project files & directories
+.project
+.settings
diff --git a/advtrains/advtrains/api_doc.txt b/advtrains/advtrains/api_doc.txt
new file mode 100644
index 0000000..0256713
--- /dev/null
+++ b/advtrains/advtrains/api_doc.txt
@@ -0,0 +1,190 @@
+Advanced Trains [advtrains] API documentation
+--------
+To use the API, mods must depend on 'advtrains'.
+All boolean values in definition tables default to 'false' and can be omitted.
+### Wagons
+Wagons are registered using the function
+
+advtrains.register_wagon(name, prototype, description, inventory_image)
+- 'name' is the internal name of the wagon. It should follow the mod naming convention, however, this is not enforced.
+ For compatibility reasons, if a mod name is omitted, the wagon will be registered in the advtrains: namespace.
+ Example: A wagon with name="engine_tgv" will be registered as "advtrains:engine_tgv".
+ !IMPORTANT! You must not append a ":" at the start of the name, even if you want to bypass the mod naming convention check. This is because internally the register_wagon function
+ appends a ":" automatically.
+- 'prototype' is the lua entity prototype. The regular definition keys for luaentites apply. Additional required and optional properties see below. DO NOT define 'on_step', 'on_activate', 'on_punch', 'on_rightclick' and 'get_staticdata' since these will be overridden. Use 'custom_*' instead.
+- 'description' is the description of the inventory item that is used to place the wagon.
+- 'inventory_image' is the inventory image of said item.
+
+# Wagon prototype properties
+{
+ ... all regular luaentity properties (mesh, textures, collisionbox a.s.o)...
+ drives_on = {default=true},
+ ^- used to define the tracktypes (see below) that wagon can drive on. The tracktype identifiers are given as keys, similar to privileges)
+ max_speed = 10,
+ ^- optional, default 10: defines the maximum speed this wagon can drive. The maximum speed of a train is determined by the wagon with the lowest max_speed value.
+ seats = {
+ ^- contains zero or more seat definitions. A seat is a place where a player can be attached when getting on a wagon.
+ {
+ name="Left front window",
+ ^- display name of this seat
+ attach_offset={x=0, y=10, z=0},
+ ^- this value is passed to 'set_attach'
+ view_offset={x=0, y=6, z=0},
+ ^- player:set_eye_offset is called with this parameter.
+ group="default"
+ ^- optional. Defines the seat group. See 'seat_groups' below
+ -!- Note: driving_ctrl_access field has moved to seat group definition,
+ -!- but is still partwise supported here. If you don't use seat groups yet,
+ -!- you really should change NOW!
+ },
+ },
+ seat_groups = {
+ ^- If defined, activates advanced seating behavior. See "seating behavior".
+ default = {
+ name = "Seats"
+ ^- name of this seat group, to be shown in get-on menu.
+ access_to = {"foo", "bar"}
+ ^- List of seat groups you can access from this seat using the menu when sitting inside the train.
+ require_doors_open = true
+ ^- Only allow getting on and off if doors are open.
+ driving_ctrl_access=false,
+ ^- If the seat is a driver stand, and players sitting here should get access to the train's driving control.
+ }
+ }
+ assign_to_seat_group = {"default"},
+ ^- optional, like seat_groups. When player right_clicks the wagon, player will be assigned to the first free seat group in the list.
+
+ doors={
+ ^- optional. If defined, defines door animation frames. Opposite door has to be closed during animation period.
+ ^- Remember, advtrains can't handle doors on both sides opened simultaneously.
+ open={
+ [-1]={frames={x=0, y=20}, time=1}, -- open left doors
+ [1]={frames={x=40, y=60}, time=1} -- open right doors
+ sound = <simpleSoundSpec>
+ ^- The sound file of the doors opening. If none is specified, nothing is played.
+ },
+ close={
+ [-1]={frames={x=20, y=40}, time=1}, -- close left doors
+ [1]={frames={x=60, y=80}, time=1} -- close right doors
+ sound = <simpleSoundSpec>
+ ^- The sound file of the doors closing. If none is specified, nothing is played.
+ }
+ },
+ door_entry={ 1.5, -1.5 }
+ ^- optional. If defined, defines the locations of the doors on the model as distance from the object center on the path.
+ ^- Getting on by walking in then takes effect.
+ ^- Positive values mean front, negative ones back. Resulting position is automatically shifted to the right side.
+
+ wagon_span=2,
+ ^- How far this wagon extends from its base position. Is the half of the wagon length.
+ ^- Used to determine in which distance the other wagons have to be positioned. Will require tweaking.
+ extent_h = 1,
+ ^- Determines the collision box extent in x/z direction. Defaults to 1 (=3x3)
+ ^- The actual bounding box size is (extent_h*2)+1, so 0 means 1x1, 1 means 3x3 and 2 means 5x5
+ extent_v = 2,
+ ^- Determines the collision box extent in y direction. Defaults to 2 (=3).
+ ^- The actual bounding box size is extent_v+1, so 0 means 1, 1 means 2, 2 means 3 a.s.o.
+ horn_sound = <simpleSoundSpec>,
+ ^- The sound file of the horn. If none is specified, this wagon can't sound a horn. The specified sound file will be looped.
+
+ drops = {"default:steelblock 3"}
+ ^- List of itemstrings what to drop when the wagon is destroyed
+
+ has_inventory = false
+ ^- If this wagon has an inventory. The inventory is saved with the wagon.
+ ^- the following settings are ignored if not.
+ inventory_list_sizes = {
+ box=8*6,
+ },
+ ^- List of assignments of type list_name=size.
+ ^- For every entry, an inventory list is created with the specified size.
+ get_inventory_formspec = function(self, player_name, inventory_name)
+ return "<a formspec>"
+ end,
+ ^- Function that should return the formspec to be displayed when <player> requests to open the wagon's inventory.
+ ^- advtrains.standard_inventory_formspec can be used for ordinary wagons with inventories to show
+ ^- both the inventory grid and a 'Wagon properties' button.
+ ^- Use "list["..inventory_name..";<list_name>;<X>,<Y>;<W>,<H>;<Start>]" to display a wagon's inventory list.
+
+ custom_on_step = function(self, dtime) end
+ ^- optional: Execute custom code on every step
+ custom_on_activate = function(self, dtime_s) end
+ ^- optional: Execute custom code on activate. Staticdata does not need to be saved and restored since all properties written in 'self' are preserved over unloads.
+ custom_on_velocity_change = function(self, velocity, old_velocity) end
+ ^- optional: Function that is called whenever the train's velocity changes or every 2 seconds. Used to call 'self.object:update_animation()' if needed.
+ ^- for compatibility reasons the name 'update_animation' for this function is still supported.
+
+}
+
+# Notes on wagons
+
+- Every wagon has the field 'id' which assigns each wagon a random id.
+- Properties written in the Lua Entity (self) are discarded when the wagon entity is unloaded. At the moment there is no way to store data inside a wagon persistently.
+- Assuming Z Axis as the axis parallel to the tracks and Y Axis as the one pointing into the sky, wagon models should be dimensioned in a way that:
+ - their origin is centered in X and Z direction
+ - their origin lies 0.5 units above the bottom of the model
+ - the overall extent in X and Y direction is <=3 units
+- wagon_span is then the distance between the model origin and the Z axis extent.
+
+# Seating behavior
+If the advanced seating behavior is active, clicking on a wagon will immediately get you on that wagon depending on the entries in assign_to_seat_group.
+If all seat groups are full, if the doors are closed or if you are not authorized to enter this seat group(e.g. driver stands), will show a warning.
+On a train, right-clicking the wagon will make you get off the train unless:
+- the doors are closed and it requires open doors.
+- you have access to a seat group specified in access_to (you may enter it and it's not full)
+- you are the owner and can access the wagon preferences
+In case there's no possibility, does nothing.
+In case there are multiple possibilities, will show a form.
+
+If you can't enter or leave a train because the doors are closed, holding the Sneak key while right-clicking bypasses the "doors have to be open" enforcement.
+
+### Tracks
+Most modders will be satisfied with the built-in tracks. If cog railways, maglev trains and mine trains are added, it is necessary to understand the definition of tracks. Although the tracks API is there, explaining it would require more effort than me creating the wanted definitions myself. Contact me if you need to register your own rails using my registration functions.
+
+However, it is still possible to register single rails by understanding the node properties of rails.
+minetest.register_node(nodename, {
+ ... usual node definition ...
+ groups = {
+ advtrains_track = 1,
+ advtrains_track_<tracktype>=1
+ ^- these groups tell that the node is a track
+ not_blocking_trains=1,
+ ^- this group tells that the node should not block trains although it's walkable.
+ },
+
+ at_rail_y = 0,
+ ^- Height of this rail node (the y position of a wagon that stands centered on this rail)
+ at_conns = {
+ [1] = { c=0..15, y=0..1 },
+ [2] = { c=0..15, y=0..1 },
+ ( [3] = { c=0..15, y=0..1 }, )
+ ( [4] = { c=0..15, y=0..1 }, )
+ }
+ ^- Connections of this rail. There can be up to 4 connections.
+ 2 connections are a normal rail, 3 connections a turnout (1->2 and 2/3->1) and 4 connections a crossing (1<>2 and 3<>4)
+ c is the direction of the connection (0-16) and y is the height of the connection (rail will only connect when this matches)
+
+ can_dig=function(pos)
+ return not advtrains.get_train_at_pos(pos)
+ end,
+ after_dig_node=function(pos)
+ advtrains.ndb.update(pos)
+ end,
+ after_place_node=function(pos)
+ advtrains.ndb.update(pos)
+ end,
+ ^- the code in these 3 default minetest API functions is required for advtrains to work, however you can add your own code
+
+ advtrains = {
+ on_train_enter=function(pos, train_id, train, index) end
+ ^- called when a train enters the rail
+ on_train_leave=function(pos, train_id, train, index) end
+ ^- called when a train leaves the rail
+
+ -- The following function is only in effect when interlocking is enabled:
+ on_train_approach = function(pos, train_id, train, index, lzbdata)
+ ^- called when a train is approaching this position, called exactly once for every path recalculation (which can happen at any time)
+ ^- This is called so that if the train would start braking now, it would come to halt about(wide approx) 5 nodes before the rail.
+ ^- lzbdata should be ignored and nothing should be assigned to it
+ }
+})
diff --git a/advtrains/advtrains/atc.lua b/advtrains/advtrains/atc.lua
new file mode 100644
index 0000000..20f52b9
--- /dev/null
+++ b/advtrains/advtrains/atc.lua
@@ -0,0 +1,342 @@
+--atc.lua
+--registers and controls the ATC system
+
+local atc={}
+
+local eval_conditional
+
+-- ATC persistence table. advtrains.atc is created by init.lua when it loads the save file.
+atc.controllers = {}
+function atc.load_data(data)
+ local temp = data and data.controllers or {}
+ --transcode atc controller data to node hashes: table access times for numbers are far less than for strings
+ for pts, data in pairs(temp) do
+ if type(pts)=="number" then
+ pts=minetest.pos_to_string(minetest.get_position_from_hash(pts))
+ end
+ atc.controllers[pts] = data
+ end
+end
+function atc.save_data()
+ return {controllers = atc.controllers}
+end
+--contents: {command="...", arrowconn=0-15 where arrow points}
+
+--general
+function atc.train_set_command(train, command, arrow)
+ atc.train_reset_command(train, true)
+ train.atc_delay = 0
+ train.atc_arrow = arrow
+ train.atc_command = command
+end
+
+function atc.send_command(pos, par_tid)
+ local pts=minetest.pos_to_string(pos)
+ if atc.controllers[pts] then
+ --atprint("Called send_command at "..pts)
+ local train_id = par_tid or advtrains.get_train_at_pos(pos)
+ if train_id then
+ if advtrains.trains[train_id] then
+ --atprint("send_command inside if: "..sid(train_id))
+ if atc.controllers[pts].arrowconn then
+ atlog("ATC controller at",pts,": This controller had an arrowconn of", atc.controllers[pts].arrowconn, "set. Since this field is now deprecated, it was removed.")
+ atc.controllers[pts].arrowconn = nil
+ end
+
+ local train = advtrains.trains[train_id]
+ local index = advtrains.path_lookup(train, pos)
+
+ local iconnid = 1
+ if index then
+ iconnid = train.path_cn[index]
+ else
+ atwarn("ATC rail at", pos, ": Rail not on train's path! Can't determine arrow direction. Assuming +!")
+ end
+
+ local command = atc.controllers[pts].command
+ command = eval_conditional(command, iconnid==1, train.velocity)
+ if not command then command="" end
+ command=string.match(command, "^%s*(.*)$")
+
+ if command == "" then
+ atprint("Sending ATC Command to", train_id, ": Not modifying, conditional evaluated empty.")
+ return true
+ end
+
+ atc.train_set_command(train, command, iconnid==1)
+ atprint("Sending ATC Command to", train_id, ":", command, "iconnid=",iconnid)
+ return true
+
+ else
+ atwarn("ATC rail at", pos, ": Sending command failed: The train",train_id,"does not exist. This seems to be a bug.")
+ end
+ else
+ atwarn("ATC rail at", pos, ": Sending command failed: There's no train at this position. This seems to be a bug.")
+ end
+ else
+ atwarn("ATC rail at", pos, ": Sending command failed: Entry for controller not found.")
+ atwarn("ATC rail at", pos, ": Please visit controller and click 'Save'")
+ end
+ return false
+end
+
+-- Resets any ATC commands the train is currently executing, including the target speed (tarvelocity) it is instructed to hold
+-- if keep_tarvel is set, does not clear the tarvelocity
+function atc.train_reset_command(train, keep_tarvel)
+ train.atc_command=nil
+ train.atc_delay=nil
+ train.atc_brake_target=nil
+ train.atc_wait_finish=nil
+ train.atc_arrow=nil
+ if not keep_tarvel then
+ train.tarvelocity=nil
+ end
+end
+
+--nodes
+local idxtrans={static=1, mesecon=2, digiline=3}
+local apn_func=function(pos)
+ -- FIX for long-persisting ndb bug: there's no node in parameter 2 of this function!
+ local meta=minetest.get_meta(pos)
+ if meta then
+ meta:set_string("infotext", attrans("ATC controller, unconfigured."))
+ meta:set_string("formspec", atc.get_atc_controller_formspec(pos, meta))
+ end
+end
+
+advtrains.atc_function = function(def, preset, suffix, rotation)
+ return {
+ after_place_node=apn_func,
+ after_dig_node=function(pos)
+ return advtrains.pcall(function()
+ advtrains.invalidate_all_paths(pos)
+ advtrains.ndb.clear(pos)
+ local pts=minetest.pos_to_string(pos)
+ atc.controllers[pts]=nil
+ end)
+ end,
+ on_receive_fields = function(pos, formname, fields, player)
+ return advtrains.pcall(function()
+ if advtrains.is_protected(pos, player:get_player_name()) then
+ minetest.record_protection_violation(pos, player:get_player_name())
+ return
+ end
+ local meta=minetest.get_meta(pos)
+ if meta then
+ if not fields.save then
+ --maybe only the dropdown changed
+ if fields.mode then
+ meta:set_string("mode", idxtrans[fields.mode])
+ if fields.mode=="digiline" then
+ meta:set_string("infotext", attrans("ATC controller, mode @1\nChannel: @2", (fields.mode or "?"), meta:get_string("command")) )
+ else
+ meta:set_string("infotext", attrans("ATC controller, mode @1\nCommand: @2", (fields.mode or "?"), meta:get_string("command")) )
+ end
+ meta:set_string("formspec", atc.get_atc_controller_formspec(pos, meta))
+ end
+ return
+ end
+ meta:set_string("mode", idxtrans[fields.mode])
+ meta:set_string("command", fields.command)
+ meta:set_string("command_on", fields.command_on)
+ meta:set_string("channel", fields.channel)
+ if fields.mode=="digiline" then
+ meta:set_string("infotext", attrans("ATC controller, mode @1\nChannel: @2", (fields.mode or "?"), meta:get_string("command")) )
+ else
+ meta:set_string("infotext", attrans("ATC controller, mode @1\nCommand: @2", (fields.mode or "?"), meta:get_string("command")) )
+ end
+ meta:set_string("formspec", atc.get_atc_controller_formspec(pos, meta))
+
+ local pts=minetest.pos_to_string(pos)
+ local _, conns=advtrains.get_rail_info_at(pos, advtrains.all_tracktypes)
+ atc.controllers[pts]={command=fields.command}
+ if #advtrains.occ.get_trains_at(pos) > 0 then
+ atc.send_command(pos)
+ end
+ end
+ end)
+ end,
+ advtrains = {
+ on_train_enter = function(pos, train_id)
+ atc.send_command(pos)
+ end,
+ },
+ }
+end
+
+function atc.get_atc_controller_formspec(pos, meta)
+ local mode=tonumber(meta:get_string("mode")) or 1
+ local command=meta:get_string("command")
+ local command_on=meta:get_string("command_on")
+ local channel=meta:get_string("channel")
+ local formspec="size[8,6]"
+ -- "dropdown[0,0;3;mode;static,mesecon,digiline;"..mode.."]"
+ if mode<3 then
+ formspec=formspec.."field[0.5,1.5;7,1;command;"..attrans("Command")..";"..minetest.formspec_escape(command).."]"
+ if tonumber(mode)==2 then
+ formspec=formspec.."field[0.5,3;7,1;command_on;"..attrans("Command (on)")..";"..minetest.formspec_escape(command_on).."]"
+ end
+ else
+ formspec=formspec.."field[0.5,1.5;7,1;channel;"..attrans("Digiline channel")..";"..minetest.formspec_escape(channel).."]"
+ end
+ return formspec.."button_exit[0.5,4.5;7,1;save;"..attrans("Save").."]"
+end
+
+--from trainlogic.lua train step
+local matchptn={
+ ["SM"]=function(id, train)
+ train.tarvelocity=train.max_speed
+ return 2
+ end,
+ ["S([0-9]+)"]=function(id, train, match)
+ train.tarvelocity=tonumber(match)
+ return #match+1
+ end,
+ ["B([0-9]+)"]=function(id, train, match)
+ if train.velocity>tonumber(match) then
+ train.atc_brake_target=tonumber(match)
+ if not train.tarvelocity or train.tarvelocity>train.atc_brake_target then
+ train.tarvelocity=train.atc_brake_target
+ end
+ end
+ return #match+1
+ end,
+ ["BB"]=function(id, train)
+ train.atc_brake_target = -1
+ train.tarvelocity = 0
+ return 2
+ end,
+ ["W"]=function(id, train)
+ train.atc_wait_finish=true
+ return 1
+ end,
+ ["D([0-9]+)"]=function(id, train, match)
+ train.atc_delay=tonumber(match)
+ return #match+1
+ end,
+ ["R"]=function(id, train)
+ if train.velocity<=0 then
+ advtrains.invert_train(id)
+ advtrains.train_ensure_init(id, train)
+ -- no one minds if this failed... this shouldn't even be called without train being initialized...
+ else
+ atwarn(sid(id), attrans("ATC Reverse command warning: didn't reverse train, train moving!"))
+ end
+ return 1
+ end,
+ ["O([LRC])"]=function(id, train, match)
+ local tt={L=-1, R=1, C=0}
+ local arr=train.atc_arrow and 1 or -1
+ train.door_open = tt[match]*arr
+ return 2
+ end,
+}
+
+eval_conditional = function(command, arrow, speed)
+ --conditional statement?
+ local is_cond, cond_applies, compare
+ local cond, rest=string.match(command, "^I([%+%-])(.+)$")
+ if cond then
+ is_cond=true
+ if cond=="+" then
+ cond_applies=arrow
+ end
+ if cond=="-" then
+ cond_applies=not arrow
+ end
+ else
+ cond, compare, rest=string.match(command, "^I([<>]=?)([0-9]+)(.+)$")
+ if cond and compare then
+ is_cond=true
+ if cond=="<" then
+ cond_applies=speed<tonumber(compare)
+ end
+ if cond==">" then
+ cond_applies=speed>tonumber(compare)
+ end
+ if cond=="<=" then
+ cond_applies=speed<=tonumber(compare)
+ end
+ if cond==">=" then
+ cond_applies=speed>=tonumber(compare)
+ end
+ end
+ end
+ if is_cond then
+ atprint("Evaluating if statement: "..command)
+ atprint("Cond: "..(cond or "nil"))
+ atprint("Applies: "..(cond_applies and "true" or "false"))
+ atprint("Rest: "..rest)
+ --find end of conditional statement
+ local nest, pos, elsepos=0, 1
+ while nest>=0 do
+ if pos>#rest then
+ atwarn(sid(id), attrans("ATC command syntax error: I statement not closed: @1",command))
+ return ""
+ end
+ local char=string.sub(rest, pos, pos)
+ if char=="I" then
+ nest=nest+1
+ end
+ if char==";" then
+ nest=nest-1
+ end
+ if nest==0 and char=="E" then
+ elsepos=pos+0
+ end
+ pos=pos+1
+ end
+ if not elsepos then elsepos=pos-1 end
+ if cond_applies then
+ command=string.sub(rest, 1, elsepos-1)..string.sub(rest, pos)
+ else
+ command=string.sub(rest, elsepos+1, pos-2)..string.sub(rest, pos)
+ end
+ atprint("Result: "..command)
+ end
+ return command
+end
+
+function atc.execute_atc_command(id, train)
+ --strip whitespaces
+ local command=string.match(train.atc_command, "^%s*(.*)$")
+
+
+ if string.match(command, "^%s*$") then
+ train.atc_command=nil
+ return
+ end
+
+ train.atc_command = eval_conditional(command, train.atc_arrow, train.velocity)
+
+ if not train.atc_command then return end
+ command=string.match(train.atc_command, "^%s*(.*)$")
+
+ if string.match(command, "^%s*$") then
+ train.atc_command=nil
+ return
+ end
+
+ for pattern, func in pairs(matchptn) do
+ local match=string.match(command, "^"..pattern)
+ if match then
+ local patlen=func(id, train, match)
+
+ atprint("Executing: "..string.sub(command, 1, patlen))
+
+ train.atc_command=string.sub(command, patlen+1)
+ if train.atc_delay<=0 and not train.atc_wait_finish then
+ --continue (recursive, cmds shouldn't get too long, and it's a end-recursion.)
+ atc.execute_atc_command(id, train)
+ end
+ return
+ end
+ end
+ atwarn(sid(id), attrans("ATC command parse error: Unknown command: @1", command))
+ atc.train_reset_command(train, true)
+end
+
+
+
+--move table to desired place
+advtrains.atc=atc
diff --git a/advtrains/advtrains/copytool.lua b/advtrains/advtrains/copytool.lua
new file mode 100644
index 0000000..dc18081
--- /dev/null
+++ b/advtrains/advtrains/copytool.lua
@@ -0,0 +1,185 @@
+--clipboard = {trainlen = number, [n] = {type = string, flipped = bool, }
+
+-- Yaw is in radians. There are 2pi rad in a circle. North is the 0 point and the angle increases anticlockwise.
+-- 4.712389 = 1.5pi; sin(1.5pi) = -1
+-- 7.853981 = 2.5pi; sin(2.5pi) = 1
+
+minetest.register_tool("advtrains:copytool", {
+ description = attrans("Train copy/paste tool\n\nLeft-click: copy train\nRight-click: paste train"),
+ inventory_image = "advtrains_copytool.png",
+ wield_image = "advtrains_copytool.png",
+ stack_max = 1,
+ -- Paste: Take the clipboard and the player yaw, and attempt to place a new train in the world.
+ -- The front of the train is used as the start of the new train and it proceeds backwards from
+ -- the direction of travel.
+ on_place = function(itemstack, placer, pointed_thing)
+ return advtrains.pcall(function()
+ if ((not pointed_thing.type == "node") or (not placer.get_player_name)) then
+ return
+ end
+ local pname = placer:get_player_name()
+
+ local node=minetest.get_node_or_nil(pointed_thing.under)
+ if not node then atprint("[advtrains]Ignore at placer position") return itemstack end
+ local nodename=node.name
+ if(not advtrains.is_track_and_drives_on(nodename, {default=true})) then
+ atprint("no track here, not placing.")
+ return itemstack
+ end
+ if not minetest.check_player_privs(placer, {train_operator = true }) then
+ minetest.chat_send_player(pname, "You don't have the train_operator privilege.")
+ return itemstack
+ end
+ if not minetest.check_player_privs(placer, {train_admin = true }) and minetest.is_protected(pointed_thing.under, placer:get_player_name()) then
+ return itemstack
+ end
+ local tconns=advtrains.get_track_connections(node.name, node.param2)
+ local yaw = placer:get_look_horizontal()
+ local plconnid = advtrains.yawToClosestConn(yaw, tconns)
+
+ local prevpos = advtrains.get_adjacent_rail(pointed_thing.under, tconns, plconnid, {default=true})
+ if not prevpos then
+ minetest.chat_send_player(pname, "The track you are trying to place the wagon on is not long enough!")
+ return
+ end
+
+ local meta = itemstack:get_meta()
+ if not meta then
+ minetest.chat_send_player(pname, attrans("The clipboard couldn't access the metadata. Paste failed."))
+ return
+ end
+ local clipboard = meta:get_string("clipboard")
+ if (clipboard == "") then
+ minetest.chat_send_player(pname, "The clipboard is empty.");
+ return
+ end
+ clipboard = minetest.deserialize(clipboard)
+ if (clipboard.wagons == nil) then
+ minetest.chat_send_player(pname, "The clipboard is empty.");
+ return
+ end
+
+ local wagons = {}
+ local n = 1
+ for _, wagonProto in pairs(clipboard.wagons) do
+ local wagon = advtrains.create_wagon(wagonProto.type, pname)
+ advtrains.wagons[wagon].wagon_flipped = wagonProto.wagon_flipped
+ wagons[n] = wagon
+ n = n + 1
+ end
+
+ local id=advtrains.create_new_train_at(pointed_thing.under, plconnid, 0, wagons)
+ local train = advtrains.trains[id]
+ train.off_track = train.end_index<train.path_trk_b
+ if (train.off_track) then
+ minetest.chat_send_player(pname, "Back of train would end up off track, cancelling.")
+ advtrains.remove_train(id)
+ return
+ end
+ train.text_outside = clipboard.text_outside
+ train.text_inside = clipboard.text_inside
+ train.routingcode = clipboard.routingcode
+ train.line = clipboard.line
+
+ return
+ end)
+ end,
+ -- Copy: Take the pointed-at train and put it on the clipboard
+ on_use = function(itemstack, user, pointed_thing)
+ if not user:get_player_name() then return end
+ if (pointed_thing.type ~= "object") then return end
+
+ local le = pointed_thing.ref:get_luaentity()
+ if (le == nil) then
+ minetest.chat_send_player(user:get_player_name(), "No such lua entity!")
+ return
+ end
+
+ local wagon = advtrains.wagons[le.id]
+ if (not (le.id and advtrains.wagons[le.id])) then
+ minetest.chat_send_player(user:get_player_name(), string.format("No such wagon: %s", le.id))
+ return
+ end
+
+ local train = advtrains.trains[wagon.train_id]
+ if (not train) then
+ minetest.chat_send_player(user:get_player_name(), string.format("No such train: %s", wagon.train_id))
+ return
+ end
+
+ -- Record the train length. The paste operation should require this much free space.
+ local clipboard = {
+ trainlen = math.ceil(train.trainlen),
+ text_outside = train.text_outside,
+ text_inside = train.text_inside,
+ routingcode = train.routingcode,
+ line = train.line,
+ wagons = {}
+ }
+ local trainLength = math.ceil(train.trainlen)
+
+ local n = 1
+ for _, wagonid in pairs(train.trainparts) do
+ local wagon = advtrains.wagons[wagonid]
+ clipboard.wagons[n] = {
+ wagon_flipped = wagon.wagon_flipped,
+ type = wagon.type
+ }
+ n = n + 1
+ end
+
+
+ local function flip_clipboard(wagon_clipboard)
+ local flipped = {}
+ local numWagons = #wagon_clipboard
+ for k, v in ipairs(wagon_clipboard) do
+ local otherSide = (numWagons-k)+1
+ flipped[otherSide] = v
+ local wagon = flipped[otherSide]
+ wagon.wagon_flipped = not wagon.wagon_flipped
+ end
+ return flipped
+ end
+
+ local function is_loco(wagon_id)
+ local wagon = advtrains.wagons[wagon_id]
+ if (not wagon) then return false end
+ local wagon_proto = advtrains.wagon_prototypes[wagon.type or wagon.entity_name]
+ if wagon_proto and wagon_proto.is_locomotive then
+ return true
+ end
+ return false
+ end
+
+ -- Decide on a new 'front of train' and possibly flip the train.
+ -- Locomotive on one end = loco-hauled, that end is front;
+ -- if (advtrains.wagons[train.trainparts[1]].is_locomotive) then -- do nothing, train is already in right order
+ local numWagons = #train.trainparts
+ local backLoco = train.trainparts[numWagons]
+ backLoco = is_loco(backLoco)
+ local frontLoco = train.trainparts[1]
+ frontLoco = is_loco(frontLoco)
+ if ((backLoco) and (not frontLoco)) then
+ clipboard.wagons = flip_clipboard(clipboard.wagons)
+ --minetest.chat_send_player(user:get_player_name(), "Flipped train: Loco-hauled")
+ end
+ -- locomotives on both ends = train is push-pull / multi-unit, has no front, do nothing
+ -- no locomotives on ends = rake of wagons, front is end closest to where player copied.
+ if ((not frontLoco) and (not backLoco)) then
+
+ if (wagon.pos_in_trainparts / numWagons > 0.5) then -- towards the end of the rain
+ clipboard.wagons = flip_clipboard(clipboard.wagons)
+ --minetest.chat_send_player(user:get_player_name(), "Flipped train: Rake")
+ end
+ end
+
+ local meta = itemstack:get_meta()
+ if not meta then
+ minetest.chat_send_player(pname, attrans("The clipboard couldn't access the metadata. Copy failed."))
+ return
+ end
+ meta:set_string("clipboard", minetest.serialize(clipboard))
+ minetest.chat_send_player(user:get_player_name(), attrans("Train copied!"))
+ return itemstack
+ end
+}) \ No newline at end of file
diff --git a/advtrains/advtrains/couple.lua b/advtrains/advtrains/couple.lua
new file mode 100644
index 0000000..1b213c2
--- /dev/null
+++ b/advtrains/advtrains/couple.lua
@@ -0,0 +1,192 @@
+--couple.lua
+--defines couple entities.
+
+--advtrains:discouple
+--set into existing trains to split them when punched.
+--they are attached to the wagons.
+--[[fields
+wagon
+
+wagons keep their couple entity minetest-internal id inside the field discouple_id. if it refers to nowhere, they will spawn a new one if player is near
+]]
+
+local couple_max_dist=3
+
+minetest.register_entity("advtrains:discouple", {
+ visual="sprite",
+ textures = {"advtrains_discouple.png"},
+ collisionbox = {-0.3,-0.3,-0.3, 0.3,0.3,0.3},
+ visual_size = {x=0.7, y=0.7},
+ initial_sprite_basepos = {x=0, y=0},
+
+ is_discouple=true,
+ static_save = false,
+ on_activate=function(self, staticdata)
+ if staticdata=="DISCOUPLE" then
+ --couple entities have no right to exist further...
+ atprint("Discouple loaded from staticdata, destroying")
+ self.object:remove()
+ return
+ end
+ self.object:set_armor_groups({immortal=1})
+ end,
+ get_staticdata=function() return "DISCOUPLE" end,
+ on_punch=function(self, player)
+ return advtrains.pcall(function()
+ local pname = player:get_player_name()
+ if pname and pname~="" and self.wagon then
+ if advtrains.safe_decouple_wagon(self.wagon.id, pname) then
+ self.object:remove()
+ else
+ minetest.add_entity(self.object:getpos(), "advtrains:lockmarker")
+ end
+ end
+ end)
+ end,
+ on_step=function(self, dtime)
+ return advtrains.pcall(function()
+ if not self.wagon then
+ self.object:remove()
+ return
+ end
+ --getyaw seems to be a reliable method to check if an object is loaded...if it returns nil, it is not.
+ if not self.wagon.object:getyaw() then
+ self.object:remove()
+ return
+ end
+ if not self.wagon:train() or self.wagon:train().velocity > 0 then
+ self.object:remove()
+ return
+ end
+ end)
+ end,
+})
+
+-- advtrains:couple
+-- Couple entity
+local function lockmarker(obj)
+ minetest.add_entity(obj:get_pos(), "advtrains:lockmarker")
+ obj:remove()
+end
+
+minetest.register_entity("advtrains:couple", {
+ visual="sprite",
+ textures = {"advtrains_couple.png"},
+ collisionbox = {-0.3,-0.3,-0.3, 0.3,0.3,0.3},
+ visual_size = {x=0.7, y=0.7},
+ initial_sprite_basepos = {x=0, y=0},
+
+ is_couple=true,
+ static_save = false,
+ on_activate=function(self, staticdata)
+ return advtrains.pcall(function()
+ if staticdata=="COUPLE" then
+ --couple entities have no right to exist further...
+ atprint("Couple loaded from staticdata, destroying")
+ self.object:remove()
+ return
+ end
+ self.object:set_armor_groups({immmortal=1})
+ end)
+ end,
+ get_staticdata=function(self) return "COUPLE" end,
+ on_rightclick=function(self, clicker)
+ return advtrains.pcall(function()
+ if not self.train_id_1 or not self.train_id_2 then return end
+
+ local pname=clicker
+ if type(clicker)~="string" then pname=clicker:get_player_name() end
+
+ if advtrains.safe_couple_trains(self.train_id_1, self.train_id_2, self.t1_is_front, self.t2_is_front, pname) then
+ self.object:remove()
+ else
+ lockmarker(self.object)
+ end
+ end)
+ end,
+ on_step=function(self, dtime)
+ return advtrains.pcall(function()
+ advtrains.atprint_context_tid=self.train_id_1
+
+ if not self.train_id_1 or not self.train_id_2 then atprint("Couple: train ids not set!") self.object:remove() return end
+ local train1=advtrains.trains[self.train_id_1]
+ local train2=advtrains.trains[self.train_id_2]
+ if not train1 or not train2 then
+ atprint("Couple: trains missing, destroying")
+ self.object:remove()
+ return
+ end
+
+ --shh, silence here, this is an on-step callback!
+ if not advtrains.train_ensure_init(self.train_id_1, train1) then
+ --atwarn("Train",self.train_id_1,"is not initialized! Operation aborted!")
+ return
+ end
+ if not advtrains.train_ensure_init(self.train_id_2, train2) then
+ --atwarn("Train",self.train_id_2,"is not initialized! Operation aborted!")
+ return
+ end
+
+ if train1.velocity>0 or train2.velocity>0 then
+ if not self.position_set then --ensures that train stands a single time before check fires. Using flag below
+ return
+ end
+ atprint("Couple: train is moving, destroying")
+ self.object:remove()
+ return
+ end
+
+ if not self.position_set then
+ local tp1
+ if self.t1_is_front then
+ tp1=advtrains.path_get_interpolated(train1, train1.index)
+ else
+ tp1=advtrains.path_get_interpolated(train1, train1.end_index)
+ end
+ local tp2
+ if self.t2_is_front then
+ tp2=advtrains.path_get_interpolated(train2, train2.index)
+ else
+ tp2=advtrains.path_get_interpolated(train2, train2.end_index)
+ end
+ local pos_median=advtrains.pos_median(tp1, tp2)
+ if not vector.equals(pos_median, self.object:getpos()) then
+ self.object:setpos(pos_median)
+ end
+ self.position_set=true
+ end
+ atprintbm("couple step", t)
+ advtrains.atprint_context_tid=nil
+
+ end)
+ end,
+})
+minetest.register_entity("advtrains:lockmarker", {
+ visual="sprite",
+ textures = {"advtrains_cpl_lock.png"},
+ collisionbox = {-0.3,-0.3,-0.3, 0.3,0.3,0.3},
+ visual_size = {x=0.7, y=0.7},
+ initial_sprite_basepos = {x=0, y=0},
+
+ is_lockmarker=true,
+ static_save = false,
+ on_activate=function(self, staticdata)
+ return advtrains.pcall(function()
+ if staticdata=="COUPLE" then
+ --couple entities have no right to exist further...
+ atprint("Couple loaded from staticdata, destroying")
+ self.object:remove()
+ return
+ end
+ self.object:set_armor_groups({immmortal=1})
+ self.life=5
+ end)
+ end,
+ get_staticdata=function(self) return "COUPLE" end,
+ on_step=function(self, dtime)
+ self.life=(self.life or 5)-dtime
+ if self.life<0 then
+ self.object:remove()
+ end
+ end,
+})
diff --git a/advtrains/advtrains/craft_items.lua b/advtrains/advtrains/craft_items.lua
new file mode 100644
index 0000000..0e693eb
--- /dev/null
+++ b/advtrains/advtrains/craft_items.lua
@@ -0,0 +1,23 @@
+
+core.register_craftitem("advtrains:boiler", {
+ description = attrans("Boiler"),
+ inventory_image = "advtrains_boiler.png",
+})
+
+
+core.register_craftitem("advtrains:driver_cab", {
+ description = attrans("driver's cab"),
+ inventory_image = "advtrains_driver_cab.png",
+})
+
+
+core.register_craftitem("advtrains:wheel", {
+ description = attrans("Wheel"),
+ inventory_image = "advtrains_wheel.png",
+})
+
+
+core.register_craftitem("advtrains:chimney", {
+ description = attrans("Chimney"),
+ inventory_image = "advtrains_chimney.png",
+})
diff --git a/advtrains/advtrains/crafting.lua b/advtrains/advtrains/crafting.lua
new file mode 100644
index 0000000..cb0813c
--- /dev/null
+++ b/advtrains/advtrains/crafting.lua
@@ -0,0 +1,76 @@
+--advtrains by orwell96, see readme.txt and license.txt
+--crafting.lua
+--registers crafting recipes
+
+--tracks: see advtrains_train_track
+--signals
+minetest.register_craft({
+ output = 'advtrains:retrosignal_off 2',
+ recipe = {
+ {'dye:red', 'default:steel_ingot', 'default:steel_ingot'},
+ {'', '', 'default:steel_ingot'},
+ {'', '', 'default:steel_ingot'},
+ },
+})
+minetest.register_craft({
+ output = 'advtrains:signal_off 2',
+ recipe = {
+ {'', 'dye:red', 'default:steel_ingot'},
+ {'', 'dye:dark_green', 'default:steel_ingot'},
+ {'', '', 'default:steel_ingot'},
+ },
+})
+
+--trackworker
+minetest.register_craft({
+ output = 'advtrains:trackworker',
+ recipe = {
+ {'default:diamond'},
+ {'screwdriver:screwdriver'},
+ {'default:steel_ingot'},
+ },
+})
+
+--boiler
+minetest.register_craft({
+ output = 'advtrains:boiler',
+ recipe = {
+ {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'},
+ {'doors:trapdoor_steel', '', 'default:steel_ingot'},
+ {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'},
+ },
+})
+
+--drivers'cab
+minetest.register_craft({
+ output = 'advtrains:driver_cab',
+ recipe = {
+ {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'},
+ {'', '', 'default:glass'},
+ {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'},
+ },
+})
+
+--drivers'cab
+minetest.register_craft({
+ output = 'advtrains:wheel',
+ recipe = {
+ {'', 'default:steel_ingot', ''},
+ {'default:steel_ingot', 'group:stick', 'default:steel_ingot'},
+ {'', 'default:steel_ingot', ''},
+ },
+})
+
+--chimney
+minetest.register_craft({
+ output = 'advtrains:chimney',
+ recipe = {
+ {'', 'default:steel_ingot', ''},
+ {'', 'default:steel_ingot', 'default:torch'},
+ {'', 'default:steel_ingot', ''},
+ },
+})
+
+
+--misc_nodes
+--crafts for platforms see misc_nodes.lua
diff --git a/advtrains/advtrains/debugitems.lua b/advtrains/advtrains/debugitems.lua
new file mode 100644
index 0000000..e672308
--- /dev/null
+++ b/advtrains/advtrains/debugitems.lua
@@ -0,0 +1,53 @@
+minetest.register_tool("advtrains:tunnelborer",
+{
+ description = "tunnelborer",
+ groups = {cracky=1}, -- key=name, value=rating; rating=1..3.
+ inventory_image = "drwho_screwdriver.png",
+ wield_image = "drwho_screwdriver.png",
+ stack_max = 1,
+ range = 7.0,
+
+ on_place = function(itemstack, placer, pointed_thing)
+
+ end,
+ --[[
+ ^ Shall place item and return the leftover itemstack
+ ^ default: minetest.item_place ]]
+ on_use = function(itemstack, user, pointed_thing)
+ if pointed_thing.type=="node" then
+ for x=-1,1 do
+ for y=-1,1 do
+ for z=-1,1 do
+ minetest.remove_node(vector.add(pointed_thing.under, {x=x, y=y, z=z}))
+ end
+ end
+ end
+ end
+ end,
+}
+)
+
+minetest.register_chatcommand("atyaw",
+ {
+ params = "angledeg conn1 conn2",
+ description = "",
+ func = function(name, param)
+ local angledegs, conn1s, conn2s = string.match(param, "^(%S+)%s(%S+)%s(%S+)$")
+ if angledegs and conn1s and conn2s then
+ local angledeg, conn1, conn2 = angledegs+0,conn1s+0,conn2s+0
+ local yaw = angledeg*math.pi/180
+ local yaw1 = advtrains.dir_to_angle(conn1)
+ local yaw2 = advtrains.dir_to_angle(conn2)
+ local adiff1 = advtrains.minAngleDiffRad(yaw, yaw1)
+ local adiff2 = advtrains.minAngleDiffRad(yaw, yaw2)
+
+ atdebug("yaw1",atfloor(yaw1*180/math.pi))
+ atdebug("yaw2",atfloor(yaw2*180/math.pi))
+ atdebug("dif1",atfloor(adiff1*180/math.pi))
+ atdebug("dif2",atfloor(adiff2*180/math.pi))
+
+ minetest.chat_send_all(advtrains.yawToAnyDir(yaw))
+ return true, advtrains.yawToDirection(yaw, conn1, conn2)
+ end
+ end,
+})
diff --git a/advtrains/advtrains/debugringbuffer.lua b/advtrains/advtrains/debugringbuffer.lua
new file mode 100644
index 0000000..704c0c5
--- /dev/null
+++ b/advtrains/advtrains/debugringbuffer.lua
@@ -0,0 +1,44 @@
+--so, some ringbuffers one for each train
+
+local ringbuflen=1000
+
+local ringbufs={}
+local ringbufcnt={}
+
+function advtrains.drb_record(tid, msg)
+ if not ringbufs[tid] then
+ ringbufs[tid]={}
+ ringbufcnt[tid]=0
+ end
+ ringbufs[tid][ringbufcnt[tid]]=msg
+ ringbufcnt[tid]=ringbufcnt[tid]+1
+ if ringbufcnt[tid] > ringbuflen then
+ ringbufcnt[tid]=0
+ end
+end
+function advtrains.drb_dump(tid)
+ atdebug("Debug ring buffer output for '"..tid.."':")
+ local stopcnt=ringbufcnt[tid]
+ if not stopcnt then
+ atdebug("ID unknown!")
+ return
+ end
+ repeat
+ atdebug(ringbufs[tid][ringbufcnt[tid]])
+ ringbufcnt[tid]=ringbufcnt[tid]+1
+ if ringbufcnt[tid] > ringbuflen then
+ ringbufcnt[tid]=0
+ end
+ until ringbufcnt[tid]==stopcnt
+end
+
+minetest.register_chatcommand("atdebug_show",
+ {
+ params = "train sid", -- Short parameter description
+ description = "Dump debug log", -- Full description
+ privs = {train_operator=true}, -- Require the "privs" privilege to run
+ func = function(name, param)
+ advtrains.drb_dump(param)
+ end, -- Called when command is run.
+ -- Returns boolean success and text output.
+ })
diff --git a/advtrains/advtrains/depends.txt b/advtrains/advtrains/depends.txt
new file mode 100644
index 0000000..1815e54
--- /dev/null
+++ b/advtrains/advtrains/depends.txt
@@ -0,0 +1,3 @@
+default
+mesecons?
+digtron? \ No newline at end of file
diff --git a/advtrains/advtrains/description.txt b/advtrains/advtrains/description.txt
new file mode 100644
index 0000000..bb13b97
--- /dev/null
+++ b/advtrains/advtrains/description.txt
@@ -0,0 +1,8 @@
+Advanced Trains v1.3.8, by orwell and contributors. Also see readme.
+Good-looking, realistic trains for minetest.
+
+For crafting recipes, see manual.pdf
+
+Website: http://advtrains.bleipb.de/
+Manual: https://github.com/orwell96/advtrains/blob/master/manual.pdf
+Forum : https://forum.minetest.net/viewtopic.php?f=11&t=14726
diff --git a/advtrains/advtrains/helpers.lua b/advtrains/advtrains/helpers.lua
new file mode 100644
index 0000000..65f25ba
--- /dev/null
+++ b/advtrains/advtrains/helpers.lua
@@ -0,0 +1,447 @@
+--advtrains by orwell96, see readme.txt
+
+local dir_trans_tbl={
+ [0]={x=0, z=1, y=0},
+ [1]={x=1, z=2, y=0},
+ [2]={x=1, z=1, y=0},
+ [3]={x=2, z=1, y=0},
+ [4]={x=1, z=0, y=0},
+ [5]={x=2, z=-1, y=0},
+ [6]={x=1, z=-1, y=0},
+ [7]={x=1, z=-2, y=0},
+ [8]={x=0, z=-1, y=0},
+ [9]={x=-1, z=-2, y=0},
+ [10]={x=-1, z=-1, y=0},
+ [11]={x=-2, z=-1, y=0},
+ [12]={x=-1, z=0, y=0},
+ [13]={x=-2, z=1, y=0},
+ [14]={x=-1, z=1, y=0},
+ [15]={x=-1, z=2, y=0},
+}
+
+local dir_angle_tbl={}
+for d,v in pairs(dir_trans_tbl) do
+ local uvec = vector.normalize(v)
+ dir_angle_tbl[d] = math.atan2(-uvec.x, uvec.z)
+end
+
+
+function advtrains.dir_to_angle(dir)
+ return dir_angle_tbl[dir] or error("advtrains: in helpers.lua/dir_to_angle() given dir="..(dir or "nil"))
+end
+
+function advtrains.dirCoordSet(coord, dir)
+ return vector.add(coord, advtrains.dirToCoord(dir))
+end
+advtrains.pos_add_dir = advtrains.dirCoordSet
+
+function advtrains.pos_add_angle(pos, ang)
+ -- 0 is +Z -> meaning of sin/cos swapped
+ return vector.add(pos, {x = -math.sin(ang), y = 0, z = math.cos(ang)})
+end
+
+function advtrains.dirToCoord(dir)
+ return dir_trans_tbl[dir] or error("advtrains: in helpers.lua/dir_to_vector() given dir="..(dir or "nil"))
+end
+advtrains.dir_to_vector = advtrains.dirToCoord
+
+function advtrains.maxN(list, expectstart)
+ local n=expectstart or 0
+ while list[n] do
+ n=n+1
+ end
+ return n-1
+end
+
+function advtrains.minN(list, expectstart)
+ local n=expectstart or 0
+ while list[n] do
+ n=n-1
+ end
+ return n+1
+end
+
+function atround(number)
+ return math.floor(number+0.5)
+end
+atfloor = math.floor
+
+
+function advtrains.round_vector_floor_y(vec)
+ return {x=math.floor(vec.x+0.5), y=math.floor(vec.y), z=math.floor(vec.z+0.5)}
+end
+
+function advtrains.yawToDirection(yaw, conn1, conn2)
+ if not conn1 or not conn2 then
+ error("given nil to yawToDirection: conn1="..(conn1 or "nil").." conn2="..(conn1 or "nil"))
+ end
+ local yaw1 = advtrains.dir_to_angle(conn1)
+ local yaw2 = advtrains.dir_to_angle(conn2)
+ local adiff1 = advtrains.minAngleDiffRad(yaw, yaw1)
+ local adiff2 = advtrains.minAngleDiffRad(yaw, yaw2)
+
+ if math.abs(adiff2)<math.abs(adiff1) then
+ return conn2
+ else
+ return conn1
+ end
+end
+
+function advtrains.yawToAnyDir(yaw)
+ local min_conn, min_diff=0, 10
+ for conn, vec in pairs(advtrains.dir_trans_tbl) do
+ local yaw1 = advtrains.dir_to_angle(conn)
+ local diff = math.abs(advtrains.minAngleDiffRad(yaw, yaw1))
+ if diff < min_diff then
+ min_conn = conn
+ min_diff = diff
+ end
+ end
+ return min_conn
+end
+function advtrains.yawToClosestConn(yaw, conns)
+ local min_connid, min_diff=1, 10
+ for connid, conn in ipairs(conns) do
+ local yaw1 = advtrains.dir_to_angle(conn.c)
+ local diff = math.abs(advtrains.minAngleDiffRad(yaw, yaw1))
+ if diff < min_diff then
+ min_connid = connid
+ min_diff = diff
+ end
+ end
+ return min_connid
+end
+
+local pi, pi2 = math.pi, 2*math.pi
+function advtrains.minAngleDiffRad(r1, r2)
+ while r1>pi2 do
+ r1=r1-pi2
+ end
+ while r1<0 do
+ r1=r1+pi2
+ end
+ while r2>pi2 do
+ r2=r2-pi2
+ end
+ while r1<0 do
+ r2=r2+pi2
+ end
+ local try1=r2-r1
+ local try2=r2+pi2-r1
+ local try3=r2-pi2-r1
+
+ local minabs = math.min(math.abs(try1), math.abs(try2), math.abs(try3))
+ if minabs==math.abs(try1) then
+ return try1
+ end
+ if minabs==math.abs(try2) then
+ return try2
+ end
+ if minabs==math.abs(try3) then
+ return try3
+ end
+end
+
+
+-- Takes 2 connections (0...AT_CMAX) as argument
+-- Returns the angle median of those 2 positions from the pov
+-- of standing on the cdir1 side and looking towards cdir2
+-- cdir1 - >NODE> - cdir2
+function advtrains.conn_angle_median(cdir1, cdir2)
+ local ang1 = advtrains.dir_to_angle(advtrains.oppd(cdir1))
+ local ang2 = advtrains.dir_to_angle(cdir2)
+ return ang1 + advtrains.minAngleDiffRad(ang1, ang2)/2
+end
+
+function advtrains.merge_tables(a, ...)
+ local new={}
+ for _,t in ipairs({a,...}) do
+ for k,v in pairs(t) do new[k]=v end
+ end
+ return new
+end
+function advtrains.save_keys(tbl, keys)
+ local new={}
+ for _,key in ipairs(keys) do
+ new[key] = tbl[key]
+ end
+ return new
+end
+
+function advtrains.get_real_index_position(path, index)
+ if not path or not index then return end
+
+ local first_pos=path[math.floor(index)]
+ local second_pos=path[math.floor(index)+1]
+
+ if not first_pos or not second_pos then return nil end
+
+ local factor=index-math.floor(index)
+ local actual_pos={x=first_pos.x-(first_pos.x-second_pos.x)*factor, y=first_pos.y-(first_pos.y-second_pos.y)*factor, z=first_pos.z-(first_pos.z-second_pos.z)*factor,}
+ return actual_pos
+end
+function advtrains.pos_median(pos1, pos2)
+ return {x=pos1.x-(pos1.x-pos2.x)*0.5, y=pos1.y-(pos1.y-pos2.y)*0.5, z=pos1.z-(pos1.z-pos2.z)*0.5}
+end
+function advtrains.abs_ceil(i)
+ return math.ceil(math.abs(i))*math.sign(i)
+end
+
+function advtrains.serialize_inventory(inv)
+ local ser={}
+ local liszts=inv:get_lists()
+ for lisztname, liszt in pairs(liszts) do
+ ser[lisztname]={}
+ for idx, item in ipairs(liszt) do
+ local istring=item:to_string()
+ if istring~="" then
+ ser[lisztname][idx]=istring
+ end
+ end
+ end
+ return minetest.serialize(ser)
+end
+function advtrains.deserialize_inventory(sers, inv)
+ local ser=minetest.deserialize(sers)
+ if ser then
+ inv:set_lists(ser)
+ return true
+ end
+ return false
+end
+
+--is_protected wrapper that checks for protection_bypass privilege
+function advtrains.is_protected(pos, name)
+ if not name then
+ error("advtrains.is_protected() called without name parameter!")
+ end
+ if minetest.check_player_privs(name, {protection_bypass=true}) then
+ --player can bypass protection
+ return false
+ end
+ return minetest.is_protected(pos, name)
+end
+
+function advtrains.is_creative(name)
+ if not name then
+ error("advtrains.is_creative() called without name parameter!")
+ end
+ if minetest.check_player_privs(name, {creative=true}) then
+ return true
+ end
+ return minetest.settings:get_bool("creative_mode")
+end
+
+function advtrains.is_damage_enabled(name)
+ if not name then
+ error("advtrains.is_damage_enabled() called without name parameter!")
+ end
+ if minetest.check_player_privs(name, "train_admin") then
+ return false
+ end
+ return minetest.settings:get_bool("enable_damage")
+end
+
+function advtrains.ms_to_kmh(speed)
+ return speed * 3.6
+end
+
+-- 4 possible inputs:
+-- integer: just do that modulo calculation
+-- table with c set: rotate c
+-- table with tables: rotate each
+-- table with integers: rotate each (probably no use case)
+function advtrains.rotate_conn_by(conn, rotate)
+ if tonumber(conn) then
+ return (conn+rotate)%AT_CMAX
+ elseif conn.c then
+ return { c = (conn.c+rotate)%AT_CMAX, y = conn.y}
+ end
+ local tmp={}
+ for connid, data in ipairs(conn) do
+ tmp[connid]=advtrains.rotate_conn_by(data, rotate)
+ end
+ return tmp
+end
+
+
+function advtrains.oppd(dir)
+ return advtrains.rotate_conn_by(dir, AT_CMAX/2)
+end
+--conn_to_match like rotate_conn_by
+--other_conns have to be a table of conn tables!
+function advtrains.conn_matches_to(conn, other_conns)
+ if tonumber(conn) then
+ for connid, data in ipairs(other_conns) do
+ if advtrains.oppd(conn) == data.c then return connid end
+ end
+ return false
+ elseif conn.c then
+ for connid, data in ipairs(other_conns) do
+ local cmp = advtrains.oppd(conn)
+ if cmp.c == data.c and (cmp.y or 0) == (data.y or 0) then return connid end
+ end
+ return false
+ end
+ local tmp={}
+ for connid, data in ipairs(conn) do
+ local backmatch = advtrains.conn_matches_to(data, other_conns)
+ if backmatch then return backmatch, connid end --returns <connid of other rail> <connid of this rail>
+ end
+ return false
+end
+
+-- Going from the rail at pos (does not need to be rounded) along connection with id conn_idx, if there is a matching rail, return it and the matching connid
+-- returns: <adjacent pos>, <conn index of adjacent>, <my conn index>, <railheight of adjacent>
+-- parameter this_conns_p is connection table of this rail and is optional, is determined by get_rail_info_at if not provided.
+function advtrains.get_adjacent_rail(this_posnr, this_conns_p, conn_idx, drives_on)
+ local this_pos = advtrains.round_vector_floor_y(this_posnr)
+ local this_conns = this_conns_p
+ if not this_conns then
+ _, this_conns = advtrains.get_rail_info_at(this_pos)
+ end
+ if not conn_idx then
+ for coni, _ in ipairs(this_conns) do
+ local adj_pos, adj_conn_idx, _, nry, nco = advtrains.get_adjacent_rail(this_pos, this_conns, coni)
+ if adj_pos then return adj_pos,adj_conn_idx,coni,nry, nco end
+ end
+ return nil
+ end
+
+ local conn = this_conns[conn_idx]
+ local conn_y = conn.y or 0
+ local adj_pos = advtrains.dirCoordSet(this_pos, conn.c);
+
+ while conn_y>=1 do
+ conn_y = conn_y - 1
+ adj_pos.y = adj_pos.y + 1
+ end
+
+ local nextnode_ok, nextconns, nextrail_y=advtrains.get_rail_info_at(adj_pos, drives_on)
+ if not nextnode_ok then
+ adj_pos.y = adj_pos.y - 1
+ conn_y = conn_y + 1
+ nextnode_ok, nextconns, nextrail_y=advtrains.get_rail_info_at(adj_pos, drives_on)
+ if not nextnode_ok then
+ return nil
+ end
+ end
+ local adj_connid = advtrains.conn_matches_to({c=conn.c, y=conn_y}, nextconns)
+ if adj_connid then
+ return adj_pos, adj_connid, conn_idx, nextrail_y, nextconns
+ end
+ return nil
+end
+
+-- when a train enters a rail on connid 'conn', which connid will it go out?
+-- nconns: number of connections in connection table:
+-- 2 = straight rail; 3 = turnout, 4 = crossing, 5 = three-way turnout (5th entry is a stub)
+-- returns: connid_out
+local connlku={[2]={2,1}, [3]={2,1,1}, [4]={2,1,4,3}, [5]={2,1,1,1}}
+function advtrains.get_matching_conn(conn, nconns)
+ return connlku[nconns][conn]
+end
+
+function advtrains.random_id()
+ local idst=""
+ for i=0,5 do
+ idst=idst..(math.random(0,9))
+ end
+ return idst
+end
+-- Shorthand for pos_to_string and round_vector_floor_y
+function advtrains.roundfloorpts(pos)
+ return minetest.pos_to_string(advtrains.round_vector_floor_y(pos))
+end
+
+-- insert an element into a table if it does not yet exist there
+-- equalfunc is a function to compare equality, defaults to ==
+-- returns true if the element was inserted
+function advtrains.insert_once(tab, elem, equalfunc)
+ for _,e in pairs(tab) do
+ if equalfunc and equalfunc(elem, e) or e==elem then return false end
+ end
+ tab[#tab+1] = elem
+ return true
+end
+
+local hext = { [0]="0",[1]="1",[2]="2",[3]="3",[4]="4",[5]="5",[6]="6",[7]="7",[8]="8",[9]="9",[10]="A",[11]="B",[12]="C",[13]="D",[14]="E",[15]="F"}
+local dect = { ["0"]=0,["1"]=1,["2"]=2,["3"]=3,["4"]=4,["5"]=5,["6"]=6,["7"]=7,["8"]=8,["9"]=9,["A"]=10,["B"]=11,["C"]=12,["D"]=13,["E"]=14,["F"]=15}
+
+local f = atfloor
+
+local function hex(i)
+ local x=i+32768
+ local c4 = x % 16
+ x = f(x / 16)
+ local c3 = x % 16
+ x = f(x / 16)
+ local c2 = x % 16
+ x = f(x / 16)
+ local c1 = x % 16
+ return (hext[c1]) .. (hext[c2]) .. (hext[c3]) .. (hext[c4])
+end
+
+local function c(s,i) return dect[string.sub(s,i,i)] end
+
+local function dec(s)
+ return (c(s,1)*4096 + c(s,2)*256 + c(s,3)*16 + c(s,4))-32768
+end
+-- Takes a position vector and outputs a encoded value suitable as table index
+-- This is essentially a hexadecimal representation of the position (+32768)
+-- Order (YYY)YXXXXZZZZ
+function advtrains.encode_pos(pos)
+ return hex(pos.y) .. hex(pos.x) .. hex(pos.z)
+end
+
+-- decodes a position encoded with encode_pos
+function advtrains.decode_pos(pts)
+ if not pts or not #pts==6 then return nil end
+ local stry = string.sub(pts, 1,4)
+ local strx = string.sub(pts, 5,8)
+ local strz = string.sub(pts, 9,12)
+ return vector.new(dec(strx), dec(stry), dec(strz))
+end
+
+--[[ Benchmarking code
+local tdt = {}
+local tlt = {}
+local tet = {}
+
+for i=1,1000000 do
+ tdt[i] = vector.new(math.random(-65536, 65535), math.random(-65536, 65535), math.random(-65536, 65535))
+ if i%1000 == 0 then
+ tlt[#tlt+1] = tdt[i]
+ end
+end
+
+local t1=os.clock()
+for i=1,1000000 do
+ local pe = advtrains.encode_pos(tdt[i])
+ local pb = advtrains.decode_pos(pe)
+ tet[pe] = i
+end
+for i,v in ipairs(tlt) do
+ local lk = tet[advtrains.encode_pos(v)]
+end
+atdebug("endec",os.clock()-t1,"s")
+
+tet = {}
+
+t1=os.clock()
+for i=1,1000000 do
+ local pe = minetest.pos_to_string(tdt[i])
+ local pb = minetest.string_to_pos(pe)
+ tet[pe] = i
+end
+for i,v in ipairs(tlt) do
+ local lk = tet[minetest.pos_to_string(v)]
+end
+atdebug("pts",os.clock()-t1,"s")
+
+--Results:
+--2018-11-29 16:57:08: ACTION[Main]: [advtrains]endec 1.786451 s
+--2018-11-29 16:57:10: ACTION[Main]: [advtrains]pts 2.566377 s
+]]
+
+
diff --git a/advtrains/advtrains/init.lua b/advtrains/advtrains/init.lua
new file mode 100644
index 0000000..d6c3c92
--- /dev/null
+++ b/advtrains/advtrains/init.lua
@@ -0,0 +1,597 @@
+
+--[[
+Advanced Trains - Minetest Mod
+
+Copyright (C) 2016-2020 Moritz Blei (orwell96) and contributors
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as
+ published by the Free Software Foundation, either version 3 of the
+ License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+]]
+
+local lot = os.clock()
+minetest.log("action", "[advtrains] Loading...")
+
+-- There is no need to support 0.4.x anymore given that the compatitability with it is already broken by 1bb1d825f46af3562554c12fba35a31b9f7973ff
+attrans = minetest.get_translator ("advtrains")
+
+--advtrains
+
+DUMP_DEBUG_SAVE = false
+GENERATE_ATRICIFIAL_LAG = false
+
+--Constant for maximum connection value/division of the circle
+AT_CMAX = 16
+
+advtrains = {trains={}, player_to_train_mapping={}}
+
+-- get wagon loading range
+advtrains.wagon_load_range = tonumber(minetest.settings:get("advtrains_wagon_load_range"))
+if not advtrains.wagon_load_range then
+ advtrains.wagon_load_range = tonumber(minetest.settings:get("active_block_range"))*16
+end
+
+--pcall
+local no_action=false
+
+local function reload_saves()
+ atwarn("Restoring saved state in 1 second...")
+ no_action=true
+ advtrains.lock_path_inval = false
+ --read last save state and continue, as if server was restarted
+ for aoi, le in pairs(minetest.luaentities) do
+ if le.is_wagon then
+ le.object:remove()
+ end
+ end
+ minetest.after(1, function()
+ advtrains.load()
+ atwarn("Reload successful!")
+ advtrains.ndb.restore_all()
+ end)
+end
+
+function advtrains.pcall(fun)
+ if no_action then return end
+
+ local succ, return1, return2, return3, return4=xpcall(fun, function(err)
+ atwarn("Lua Error occured: ", err)
+ atwarn(debug.traceback())
+ if advtrains.atprint_context_tid then
+ advtrains.path_print(advtrains.trains[advtrains.atprint_context_tid], atdebug)
+ atwarn(advtrains.trains[advtrains.atprint_context_tid].debug)
+ end
+ end)
+ if not succ then
+ reload_saves()
+ else
+ return return1, return2, return3, return4
+ end
+end
+
+
+advtrains.modpath = minetest.get_modpath("advtrains")
+
+--Advtrains dump (special treatment of pos and sigd)
+function atdump(t, intend)
+ local str
+ if type(t)=="table" then
+ if t.x and t.y and t.z then
+ str=minetest.pos_to_string(t)
+ elseif t.p and t.s then -- interlocking sigd
+ str="S["..minetest.pos_to_string(t.p).."/"..t.s.."]"
+ elseif advtrains.lines and t.s and t.m then -- RwT
+ str=advtrains.lines.rwt.to_string(t)
+ else
+ str="{"
+ local intd = (intend or "") .. " "
+ for k,v in pairs(t) do
+ if type(k)~="string" or not string.match(k, "^path[_]?") then
+ -- do not print anything path-related
+ str = str .. "\n" .. intd .. atdump(k, intd) .. " = " ..atdump(v, intd)
+ end
+ end
+ str = str .. "\n" .. (intend or "") .. "}"
+ end
+ elseif type(t)=="boolean" then
+ if t then
+ str="true"
+ else
+ str="false"
+ end
+ elseif type(t)=="function" then
+ str="<function>"
+ elseif type(t)=="userdata" then
+ str="<userdata>"
+ else
+ str=""..t
+ end
+ return str
+end
+
+function advtrains.print_concat_table(a)
+ local str=""
+ local stra=""
+ local t
+ for i=1,20 do
+ t=a[i]
+ if t==nil then
+ stra=stra.."nil "
+ else
+ str=str..stra
+ stra=""
+ str=str..atdump(t).." "
+ end
+ end
+ return str
+end
+
+atprint=function() end
+atlog=function(t, ...)
+ local text=advtrains.print_concat_table({t, ...})
+ minetest.log("action", "[advtrains]"..text)
+end
+atwarn=function(t, ...)
+ local text=advtrains.print_concat_table({t, ...})
+ minetest.log("warning", "[advtrains]"..text)
+ minetest.chat_send_all("[advtrains] -!- "..text)
+end
+sid=function(id) if id then return string.sub(id, -6) end end
+
+
+--ONLY use this function for temporary debugging. for consistent debug prints use atprint
+atdebug=function(t, ...)
+ local text=advtrains.print_concat_table({t, ...})
+ minetest.log("action", "[advtrains]"..text)
+ minetest.chat_send_all("[advtrains]"..text)
+end
+
+if minetest.settings:get_bool("advtrains_enable_debugging") then
+ atprint=function(t, ...)
+ local context=advtrains.atprint_context_tid or ""
+ if not context then return end
+ local text=advtrains.print_concat_table({t, ...})
+ advtrains.drb_record(context, text)
+
+ --atlog("@@",advtrains.atprint_context_tid,t,...)
+ end
+ dofile(advtrains.modpath.."/debugringbuffer.lua")
+
+end
+
+function assertt(var, typ)
+ if type(var)~=typ then
+ error("Assertion failed, variable has to be of type "..typ)
+ end
+end
+
+dofile(advtrains.modpath.."/helpers.lua");
+--dofile(advtrains.modpath.."/debugitems.lua");
+
+advtrains.meseconrules =
+{{x=0, y=0, z=-1},
+ {x=1, y=0, z=0},
+ {x=-1, y=0, z=0},
+ {x=0, y=0, z=1},
+ {x=1, y=1, z=0},
+ {x=1, y=-1, z=0},
+ {x=-1, y=1, z=0},
+ {x=-1, y=-1, z=0},
+ {x=0, y=1, z=1},
+ {x=0, y=-1, z=1},
+ {x=0, y=1, z=-1},
+ {x=0, y=-1, z=-1},
+ {x=0, y=-2, z=0}}
+
+advtrains.fpath=minetest.get_worldpath().."/advtrains"
+
+dofile(advtrains.modpath.."/path.lua")
+dofile(advtrains.modpath.."/trainlogic.lua")
+dofile(advtrains.modpath.."/trainhud.lua")
+dofile(advtrains.modpath.."/trackplacer.lua")
+dofile(advtrains.modpath.."/copytool.lua")
+dofile(advtrains.modpath.."/tracks.lua")
+dofile(advtrains.modpath.."/occupation.lua")
+dofile(advtrains.modpath.."/atc.lua")
+dofile(advtrains.modpath.."/wagons.lua")
+dofile(advtrains.modpath.."/protection.lua")
+
+dofile(advtrains.modpath.."/trackdb_legacy.lua")
+dofile(advtrains.modpath.."/nodedb.lua")
+dofile(advtrains.modpath.."/couple.lua")
+
+dofile(advtrains.modpath.."/signals.lua")
+dofile(advtrains.modpath.."/misc_nodes.lua")
+dofile(advtrains.modpath.."/crafting.lua")
+dofile(advtrains.modpath.."/craft_items.lua")
+
+dofile(advtrains.modpath.."/log.lua")
+dofile(advtrains.modpath.."/passive.lua")
+if mesecon then
+ dofile(advtrains.modpath.."/p_mesecon_iface.lua")
+end
+
+
+dofile(advtrains.modpath.."/lzb.lua")
+
+
+--load/save
+
+-- backup variables, used if someone should accidentally delete a sub-mod
+local MDS_interlocking, MDS_lines
+
+
+advtrains.fpath=minetest.get_worldpath().."/advtrains"
+dofile(advtrains.modpath.."/log.lua")
+function advtrains.read_component(name)
+ local path = advtrains.fpath.."_"..name
+ minetest.log("action", "[advtrains] loading "..path)
+ local file, err = io.open(path, "r")
+ if not file then
+ minetest.log("warning", " Failed to read advtrains save data from file "..path..": "..(err or "Unknown Error"))
+ minetest.log("warning", " (this is normal when first enabling advtrains on this world)")
+ return
+ end
+ local tbl = minetest.deserialize(file:read("*a"))
+ file:close()
+ return tbl
+end
+
+function advtrains.avt_load()
+ -- check for new, split advtrains save file
+
+ local version = advtrains.read_component("version")
+ local tbl
+ if version and version == 3 then
+ -- we are dealing with the new, split-up system
+ minetest.log("action", "[advtrains] loading savefiles version 3")
+ local il_save = {
+ tcbs = true,
+ ts = true,
+ signalass = true,
+ rs_locks = true,
+ rs_callbacks = true,
+ influence_points = true,
+ npr_rails = true,
+ }
+ tbl={
+ trains = true,
+ wagon_save = true,
+ ptmap = true,
+ atc = true,
+ ndb = true,
+ lines = true,
+ version = 2,
+ }
+ for i,k in pairs(il_save) do
+ il_save[i] = advtrains.read_component("interlocking_"..i)
+ end
+ for i,k in pairs(tbl) do
+ tbl[i] = advtrains.read_component(i)
+ end
+ tbl["interlocking"] = il_save
+ else
+ local file, err = io.open(advtrains.fpath, "r")
+ if not file then
+ minetest.log("warning", " Failed to read advtrains save data from file "..advtrains.fpath..": "..(err or "Unknown Error"))
+ minetest.log("warning", " (this is normal when first enabling advtrains on this world)")
+ return
+ else
+ tbl = minetest.deserialize(file:read("*a"))
+ file:close()
+ end
+ end
+ if type(tbl) == "table" then
+ if tbl.version then
+ --congrats, we have the new save format.
+ advtrains.trains = tbl.trains
+ --Save the train id into the train table to avoid having to pass id around
+ for id, train in pairs(advtrains.trains) do
+ train.id = id
+ end
+ advtrains.wagons = tbl.wagon_save
+ advtrains.player_to_train_mapping = tbl.ptmap or {}
+ advtrains.ndb.load_data(tbl.ndb)
+ advtrains.atc.load_data(tbl.atc)
+ if advtrains.interlocking then
+ advtrains.interlocking.db.load(tbl.interlocking)
+ else
+ MDS_interlocking = tbl.interlocking
+ end
+ if advtrains.lines then
+ advtrains.lines.load(tbl.lines)
+ else
+ MDS_lines = tbl.lines
+ end
+ --remove wagon_save entries that are not part of a train
+ local todel=advtrains.merge_tables(advtrains.wagon_save)
+ for tid, train in pairs(advtrains.trains) do
+ train.id = tid
+ for _, wid in ipairs(train.trainparts) do
+ todel[wid]=nil
+ end
+ end
+ for wid, _ in pairs(todel) do
+ atwarn("Removing unused wagon", wid, "from wagon_save table.")
+ advtrains.wagon_save[wid]=nil
+ end
+ else
+ --oh no, its the old one...
+ advtrains.trains=tbl
+ --load ATC
+ advtrains.fpath_atc=minetest.get_worldpath().."/advtrains_atc"
+ local file, err = io.open(advtrains.fpath_atc, "r")
+ if not file then
+ local er=err or "Unknown Error"
+ atprint("Failed loading advtrains atc save file "..er)
+ else
+ local tbl = minetest.deserialize(file:read("*a"))
+ if type(tbl) == "table" then
+ advtrains.atc.controllers=tbl.controllers
+ end
+ file:close()
+ end
+ --load wagon saves
+ advtrains.fpath_ws=minetest.get_worldpath().."/advtrains_wagon_save"
+ local file, err = io.open(advtrains.fpath_ws, "r")
+ if not file then
+ local er=err or "Unknown Error"
+ atprint("Failed loading advtrains save file "..er)
+ else
+ local tbl = minetest.deserialize(file:read("*a"))
+ if type(tbl) == "table" then
+ advtrains.wagon_save=tbl
+ end
+ file:close()
+ end
+ end
+ else
+ minetest.log("error", " Failed to deserialize advtrains save data: Not a table!")
+ end
+end
+
+advtrains.save_component = function (tbl, name)
+ -- Saves each component of the advtrains file separately
+ --
+ -- required for now to shrink the advtrains db to overcome lua
+ -- limitations.
+ local datastr = minetest.serialize(tbl)
+ if not datastr then
+ minetest.log("error", " Failed to serialize advtrains save data!")
+ return
+ end
+ local path = advtrains.fpath.."_"..name
+ local success = minetest.safe_file_write(path, datastr)
+
+ if not success then
+ minetest.log("error", " Failed to write advtrains save data to file "..path)
+ end
+
+end
+
+advtrains.avt_save = function(remove_players_from_wagons)
+ --atprint("saving")
+
+ if remove_players_from_wagons then
+ for w_id, data in pairs(advtrains.wagons) do
+ data.seatp={}
+ end
+ advtrains.player_to_train_mapping={}
+ end
+
+ local tmp_trains={}
+ for id, train in pairs(advtrains.trains) do
+ --first, deep_copy the train
+ if #train.trainparts > 0 then
+ local v=advtrains.save_keys(train, {
+ "last_pos", "last_connid", "last_frac", "velocity", "tarvelocity",
+ "trainparts", "recently_collided_with_env",
+ "atc_brake_target", "atc_wait_finish", "atc_command", "atc_delay", "door_open",
+ "text_outside", "text_inside", "line", "routingcode",
+ "il_sections", "speed_restriction", "is_shunt", "points_split", "autocouple"
+ })
+ --then save it
+ tmp_trains[id]=v
+ else
+ atwarn("Train",id,"had no wagons left because of some bug. It is being deleted. Wave it goodbye!")
+ advtrains.remove_train(id)
+ end
+ end
+
+ for id, wdata in pairs(advtrains.wagons) do
+ local _,proto = advtrains.get_wagon_prototype(wdata)
+ if proto.has_inventory then
+ local inv=minetest.get_inventory({type="detached", name="advtrains_wgn_"..id})
+ if inv then -- inventory is not initialized when wagon was never loaded
+ -- TOOD: What happens with unloading rails when they don't find the inventory?
+ wdata.ser_inv=advtrains.serialize_inventory(inv)
+ end
+ end
+ -- TODO apply save-keys here too
+ -- TODO temp
+ wdata.dcpl_lock = nil
+ end
+
+ --versions:
+ -- 1 - Initial new save format.
+ -- 2 - version as of tss branch 11-2018+
+ local il_save
+ if advtrains.interlocking then
+ il_save = advtrains.interlocking.db.save()
+ else
+ il_save = MDS_interlocking
+ end
+ local ln_save
+ if advtrains.lines then
+ ln_save = advtrains.lines.save()
+ else
+ ln_save = MDS_lines
+ end
+
+ local save_tbl={
+ trains = tmp_trains,
+ wagon_save = advtrains.wagons,
+ ptmap = advtrains.player_to_train_mapping,
+ atc = advtrains.atc.save_data(),
+ ndb = advtrains.ndb.save_data(),
+ lines = ln_save,
+ version = 3,
+ }
+ for i,k in pairs(save_tbl) do
+ advtrains.save_component(k,i)
+ end
+
+ for i,k in pairs(il_save) do
+ advtrains.save_component(k,"interlocking_"..i)
+ end
+
+ if DUMP_DEBUG_SAVE then
+ local file, err = io.open(advtrains.fpath.."_DUMP", "w")
+ if err then
+ return
+ end
+ file:write(dump(save_tbl))
+ file:close()
+ end
+end
+
+--## MAIN LOOP ##--
+--Calls all subsequent main tasks of both advtrains and atlatc
+local init_load=false
+local save_interval=20
+local save_timer=save_interval
+advtrains.mainloop_runcnt=0
+
+
+local t = 0
+minetest.register_globalstep(function(dtime_mt)
+ return advtrains.pcall(function()
+ advtrains.mainloop_runcnt=advtrains.mainloop_runcnt+1
+ --atprint("Running the main loop, runcnt",advtrains.mainloop_runcnt)
+ --call load once. see advtrains.load() comment
+ if not init_load then
+ advtrains.load()
+ end
+
+ local dtime
+ if GENERATE_ATRICIFIAL_LAG then
+ dtime = 0.2
+ if os.clock()<t then
+ return
+ end
+
+ t = os.clock()+0.2
+ else
+ --limit dtime: if trains move too far in one step, automation may cause stuck and wrongly braking trains
+ dtime=dtime_mt
+ if dtime>0.2 then
+ atprint("Limiting dtime to 0.2!")
+ dtime=0.2
+ end
+ end
+
+ advtrains.mainloop_trainlogic(dtime)
+ if advtrains_itm_mainloop then
+ advtrains_itm_mainloop(dtime)
+ end
+ if atlatc then
+ atlatc.mainloop_stepcode(dtime)
+ atlatc.interrupt.mainloop(dtime)
+ end
+ if advtrains.lines then
+ advtrains.lines.step(dtime)
+ end
+
+ --trigger a save when necessary
+ save_timer=save_timer-dtime
+ if save_timer<=0 then
+ local t=os.clock()
+ --save
+ advtrains.save()
+ save_timer=save_interval
+ atprintbm("saving", t)
+ end
+ end)
+end)
+
+--if something goes wrong in these functions, there is no help. no pcall here.
+
+--## MAIN LOAD ROUTINE ##
+-- Causes the loading of everything
+-- first time called in main loop (after the init phase) because luaautomation has to initialize first.
+function advtrains.load()
+ advtrains.avt_load() --loading advtrains. includes ndb at advtrains.ndb.load_data()
+ if atlatc then
+ atlatc.load() --includes interrupts
+ end
+ if advtrains_itm_init then
+ advtrains_itm_init()
+ end
+ init_load=true
+ no_action=false
+ atlog("[load_all]Loaded advtrains save files")
+end
+
+--## MAIN SAVE ROUTINE ##
+-- Causes the saving of everything
+function advtrains.save(remove_players_from_wagons)
+ if not init_load then
+ --wait... we haven't loaded yet?!
+ atwarn("Instructed to save() but load() was never called!")
+ return
+ end
+ advtrains.avt_save(remove_players_from_wagons) --saving advtrains. includes ndb at advtrains.ndb.save_data()
+ if atlatc then
+ atlatc.save()
+ end
+ atprint("[save_all]Saved advtrains save files")
+
+ --TODO very simple yet hacky workaround for the "green signals" bug
+ advtrains.invalidate_all_paths()
+end
+minetest.register_on_shutdown(advtrains.save)
+
+-- This chat command provides a solution to the problem known on the LinuxWorks server
+-- There are many players that joined a single time, got on a train and then left forever
+-- These players still occupy seats in the trains.
+minetest.register_chatcommand("at_empty_seats",
+ {
+ params = "", -- Short parameter description
+ description = "Detach all players, especially the offline ones, from all trains. Use only when no one serious is on a train.", -- Full description
+ privs = {train_operator=true, server=true}, -- Require the "privs" privilege to run
+ func = function(name, param)
+ return advtrains.pcall(function()
+ atwarn("Data is being saved. While saving, advtrains will remove the players from trains. Save files will be reloaded afterwards!")
+ advtrains.save(true)
+ reload_saves()
+ end)
+ end,
+})
+-- This chat command solves another problem: Trains getting randomly stuck.
+minetest.register_chatcommand("at_reroute",
+ {
+ params = "",
+ description = "Delete all train routes, force them to recalculate",
+ privs = {train_operator=true}, -- Only train operator is required, since this is relatively safe.
+ func = function(name, param)
+ return advtrains.pcall(function()
+ advtrains.invalidate_all_paths()
+ return true, "Successfully invalidated train routes"
+ end)
+ end,
+})
+
+
+local tot=(os.clock()-lot)*1000
+minetest.log("action", "[advtrains] Loaded in "..tot.."ms")
+
diff --git a/advtrains/advtrains/locale/advtrains.de.tr b/advtrains/advtrains/locale/advtrains.de.tr
new file mode 100644
index 0000000..f0d797f
--- /dev/null
+++ b/advtrains/advtrains/locale/advtrains.de.tr
@@ -0,0 +1,71 @@
+# textdomain: advtrains
+This wagon is owned by @1, you can't destroy it.=Dieser Waggon gehört @1, du kannst ihn nicht abbauen.
+Warning: If you destroy this wagon, you only get some steel back! If you are sure, hold Sneak and left-click the wagon.=Warnung: Du erhältst nur etwas Stahl zurück. Wenn du sicher bist, dass du den Waggon zerstören willst, halte 'Schleichen' und klicke links.
+Show Inventory=Zeige Inventar
+Select seat:=Wähle einen Sitzplatz aus:
+ATC controller, unconfigured.=Zugbeeinflussungsschiene, nicht konfiguiert.
+ATC controller=Zugbeeinflussungsschiene
+ATC controller, mode @1@nChannel: @2=Zugbeeinflussungsschiene in Betriebsart "@1"@nKanal: @2
+ATC controller, mode @1@nCommand: @2=Zugbeeinflussungsschiene in Betriebsart "@1"@nBefehl: @2
+Command=Befehl
+Command (on)=Befehl (wenn ein)
+Digiline channel=Digiline-Kanal
+Save=Speichern
+ATC Reverse command warning: didn't reverse train, train moving!=Zugbeeinflussung - Warnung: Befehl 'R' nicht ausgeführt, Zug in Bewegung!
+ATC command syntax error: I statement not closed: @1=Zugbeeinflussung - Syntaxfehler: I-Anweisung nicht geschlossen: @1
+ATC command parse error: Unknown command: @1=Zugbeeinflussung - Fehler: Unbekannter Befehl: @1
+This position is protected!=Diese Position ist geschützt!
+You need to own at least one neighboring wagon to destroy this couple.=Du musst Besitzer eines angrenzenden Waggons sein, um hier abzukuppeln.
+@1 Platform (low)=Niedriger @1-Bahnsteig
+@1 Platform (high)=Hoher @1-Bahnsteig
+off=aus
+on=ein
+Lampless Signal (@1)=Mechanisches Signal (@1)
+Signal (@1)=Lichtsignal (@1)
+Track Worker Tool@n@nLeft-click: change rail type (straight/curve/switch)@nRight-click: rotate rail/bumper/signal/etc.=Schienenwerkzeug@n@nLinksklick: Schienentyp ändern, Rechtsklick: Objekt drehen.
+This node can't be rotated using the trackworker!=Kann diesen Block nicht mit dem Schienenwerkzeug drehen.
+This node can't be changed using the trackworker!=Kann diesen Block nicht mit dem Schienenwerkzeug bearbeiten.
+Can't place: not pointing at node=Kann nicht platzieren: Du zeigst nicht auf einen Block.
+Can't place: space occupied!=Kann nicht platzieren: Platz besetzt.
+Can't place: protected position!=Kann nicht platzieren: Position geschützt.
+Can't place: Not enough slope items left (@1 required)=Kann nicht platzieren: nicht genug Steigungsblöcke, es werden insgesamt @1 benötigt.
+Can't place: There's no slope of length @1=Kann nicht platzieren: Keine Steigung der Länge @1 definiert.
+Can't place: no supporting node at upper end.=Kann nicht platzieren: kein unterstützender Block am Ende der Steigung.
+Deprecated Track=ausrangierte Schiene, nicht verwenden.
+Track=Schiene
+Bumper=Prellbock
+Detector Rail=Detektorschiene
+Speed:=Geschw.:
+Target:=Zielges.:
+@1 Slope=@1 Steigung
+Can't get on: wagon full or doors closed!=Kann nicht einsteigen: Waggon voll oder Türen geschlossen.
+Use Sneak+rightclick to bypass closed doors!=Nutze Sneak+Rechtsklick, um die Türnotöffnung zu aktivieren und trotzdem einzusteigen.
+Lock couples=Kupplungen sperren
+Save wagon properties=Waggon-Einstellungen speichern
+Doors are closed! Use Sneak+rightclick to ignore the closed doors and get off!=Türen sind geschlossen! Sneak+Rechtsklick, um die Türnotöffnung zu aktivieren und trotzdem auszusteigen.
+Wagon properties=Waggon-Einstellungen
+Get off=Aussteigen
+Get off (forced)=Aussteigen (erzwingen)
+(Doors closed)=(Türen geschlossen)
+Access to @1=Zugang zu @1
+Default Seat=Standardsitzplatz
+Default Seat (driver stand)=Standardsitzplatz (Führerstand)
+Driver Stand=Führerstand
+Driver Stand (left)=Führerstand Links
+Driver Stand (right)=Führerstand Rechts
+Industrial Train Engine=Industrielle Lokomotive
+Industrial tank wagon=Tankwaggon
+Industrial wood wagon=Holztransportwaggon
+Japanese Train Engine=Japanische Personenzug-Lokomotive
+Japanese Train Wagon=Japanischer Personenzug-Passagierwaggon
+Steam Engine=Dampflokomotive
+Detailed Steam Engine=detaillierte Dampflokomotive
+Passenger Wagon=Passagierwaggon
+Box wagon=Güterwaggon
+Subway Passenger Wagon=U-Bahn-Waggon
+The wagon's inventory is not empty!=Das Inventar dieses Waggons ist nicht leer!
+This track can not be changed!=Diese Schiene kann nicht geändert werden!
+This track can not be rotated!=Diese Schiene kann nicht gedreht werden!
+Position is occupied by a train.=Ein Zug steht an dieser Position.
+There's a Track Circuit Break here.=Hier ist eine Gleisabschnittsgrenze (TCB).
+There's a Signal Influence Point here.=Hier ist ein Signal-Beeinflussungspunkt.
diff --git a/advtrains/advtrains/locale/advtrains.zh_CN.tr b/advtrains/advtrains/locale/advtrains.zh_CN.tr
new file mode 100644
index 0000000..ef9c99b
--- /dev/null
+++ b/advtrains/advtrains/locale/advtrains.zh_CN.tr
@@ -0,0 +1,107 @@
+# textdomain: advtrains
+
+# Advtrains Core (unorganized)
+This wagon is owned by @1, you can't destroy it.=这是@1的车厢, 你不能摧毁它.
+Warning: If you destroy this wagon, you only get some steel back! If you are sure, hold Sneak and left-click the wagon.=警告: 如果你摧毁此车厢, 你只能拿到一些钢方块. 如果你确定要摧毁这个车厢,请按潜行键并左键单击此车厢.
+ATC controller, unconfigured.=ATC控制器 (未配置)
+ATC controller=ATC控制器
+ATC controller, mode @1@nChannel: @2=ATC控制器@n模式: @1@n频道: @2
+ATC controller, mode @1@nCommand: @2=ATC控制器@n模式: @1@n命令: @2
+Command=命令
+Command (on)=命令(激活时)
+Digiline channel=Digiline 频道
+ATC Reverse command warning: didn't reverse train, train moving!=ATC警告:未执行“R”命令, 火车在移动
+ATC command syntax error: I statement not closed: @1=ATC语法错误: "I"命令不完整: @1
+ATC command parse error: Unknown command: @1=ATC语法错误: 未知命令: @1
+This position is protected!=这里已被保护.
+You need to own at least one neighboring wagon to destroy this couple.=你必须至少拥有其中一个车厢才能解耦这两个车厢.
+This node can't be rotated using the trackworker!=你不能使用铁路调整工具旋转这个方块.
+This node can't be changed using the trackworker!=你不能使用铁路调整工具调整这个方块.
+Can't place: not pointing at node=无法放置: 你没有选择任何方块.
+Can't place: space occupied!=无法放置: 此区域已被占用.
+Can't place: protected position!=无法放置: 此区域已被保护.
+Can't place: Not enough slope items left (@1 required)=无法放置: 你没有足够的铁路斜坡放置工具 (你需要@1个)
+Can't place: There's no slope of length @1=无法放置: advtrains不支持长度为@1m的斜坡.
+Can't place: no supporting node at upper end.=无法放置: 较高端没有支撑方块.
+Deprecated Track=请不要使用
+Can't get on: wagon full or doors closed!=无法上车: 车门已关闭或车厢已满
+Use Sneak+rightclick to bypass closed doors!=请使用潜行+右键上车
+Lock couples=锁定连接处
+Doors are closed! Use Sneak+rightclick to ignore the closed doors and get off!=车门已关闭, 请使用潜行+右键单击下车
+Access to @1=可前往@1
+The clipboard couldn't access the metadata. Paste failed.=无法粘贴: 剪贴板无法访问元数据
+The clipboard couldn't access the metadata. Copy failed.=无法复制: 剪贴板无法访问元数据
+
+# Train HUD/Formspecs
+Speed:=速度:
+Target:=目标速度:
+Show Inventory=显示物品栏
+Select seat:=请选择座位
+Wagon properties=车厢属性
+Save wagon properties=保存车厢属性
+Text displayed outside on train=车厢外部显示
+Text displayed inside train=车厢内部显示
+Line=火车线路
+Routingcode=路由码
+Get off=下车
+Get off (forced)=强制下车
+(Doors closed)=(车门已关闭)
+
+# General
+Save=保存
+# "off" and "on" can be translated differently depending on the context and are therefore not translated.
+off=off
+on=on
+
+# Line automation
+Station Code=车站代码
+Station Name=车站名称
+Door Delay=车门关闭时间
+Departure Speed=出发速度
+Stop Time=停站时间
+
+# Items
+Track Worker Tool@n@nLeft-click: change rail type (straight/curve/switch)@nRight-click: rotate rail/bumper/signal/etc.=铁路调整工具@n@n左键单击: 切换轨道类型@n右键单击: 旋转方块
+Passive Component Naming Tool@n@nRight-click to name a passive component.=被动元件命名工具@n@n右键单击命名所选元件.
+Train copy/paste tool@n@nLeft-click: copy train@nRight-click: paste train=火车复制工具@n@n左键单击: 复制@n右键单击: 粘帖
+Track=铁轨
+Perpendicular Diamond Crossing Track=垂直交叉铁轨
+45/90 Degree Diamond Crossing Track=45度交叉铁轨
+Unloading Track=卸货铁轨
+Loading Track=装货铁轨
+Bumper=保险杠
+Detector Rail=探测铁轨
+@1 Slope=@1斜坡
+@1 Platform (low)=50cm高的@1站台
+@1 Platform (high)=1m高的@1站台
+@1 Platform (45 degree)=1m高的@1站台 (45度)
+Lampless Signal (@1)=臂板信号机 (@1)
+Signal (@1)=信号灯 (@1)
+Wallmounted Signal (l)=壁挂式信号灯 (左侧)
+Wallmounted Signal (r)=壁挂式信号灯 (右侧)
+Wallmounted Signal (t)=悬挂式信号灯
+Andrew's Cross=铁路道口信号灯
+Boiler=锅炉
+driver's cab=驾驶室
+Wheel=车轮
+Chimney=烟囱
+
+# Seats
+Default Seat=默认座位
+Default Seat (driver stand)=默认座位 (司机座位)
+Driver Stand=司机座位
+Driver Stand (left)=左侧司机座位
+Driver Stand (right)=右侧司机座位
+
+# Wagon/engine types
+Industrial Train Engine=工业用火车头
+Big Industrial Train Engine=大型工业用火车头
+Industrial tank wagon=液体运输车厢
+Industrial wood wagon=木材运输车厢
+Japanese Train Engine=高速列车车头
+Japanese Train Wagon=高速列车车厢
+Steam Engine=蒸汽机车
+Detailed Steam Engine=精细的蒸汽机车
+Passenger Wagon=客车
+Box Wagon=货运车厢
+Subway Passenger Wagon=地铁车厢
diff --git a/advtrains/advtrains/log.lua b/advtrains/advtrains/log.lua
new file mode 100644
index 0000000..d7053a2
--- /dev/null
+++ b/advtrains/advtrains/log.lua
@@ -0,0 +1,17 @@
+-- Log accesses to driver stands and changes to switches
+
+advtrains.log = function() end
+
+if minetest.settings:get_bool("advtrains_enable_logging") then
+ advtrains.logfile = advtrains.fpath .. "_log"
+
+ local log = io.open(advtrains.logfile, "a+")
+
+ function advtrains.log (event, player, pos, data)
+ log:write(os.date()..": "..event.." by "..player.." at "..minetest.pos_to_string(pos).." -- "..(data or "").."\n")
+ end
+
+ minetest.register_on_shutdown(function()
+ log:close()
+ end)
+end
diff --git a/advtrains/advtrains/lzb.lua b/advtrains/advtrains/lzb.lua
new file mode 100644
index 0000000..6cbf4ab
--- /dev/null
+++ b/advtrains/advtrains/lzb.lua
@@ -0,0 +1,191 @@
+-- lzb.lua
+-- Enforced and/or automatic train override control, providing the on_train_approach callback
+
+--[[
+Documentation of train.lzb table
+train.lzb = {
+ trav = Current index that the traverser has advanced so far
+ oncoming = table containing oncoming signals, in order of appearance on the path
+ {
+ pos = position of the point
+ idx = where this is on the path
+ spd = speed allowed to pass
+ fun = function(pos, id, train, index, speed, lzbdata)
+ -- Function that determines what to do on the train in the moment it drives over that point.
+ }
+}
+each step, for every item in "oncoming", we need to determine the location to start braking (+ some safety margin)
+and, if we passed this point for at least one of the items, initiate brake.
+When speed has dropped below, say 3, decrease the margin to zero, so that trains actually stop at the signal IP.
+The spd variable and travsht need to be updated on every aspect change. it's probably best to reset everything when any aspect changes
+]]
+
+
+local params = {
+ BRAKE_SPACE = 10,
+ AWARE_ZONE = 50,
+
+ ADD_STAND = 2.5,
+ ADD_SLOW = 1.5,
+ ADD_FAST = 7,
+ ZONE_ROLL = 2,
+ ZONE_HOLD = 5, -- added on top of ZONE_ROLL
+ ZONE_VSLOW = 3, -- When speed is <2, still allow accelerating
+
+ DST_FACTOR = 1.5,
+
+ SHUNT_SPEED_MAX = advtrains.SHUNT_SPEED_MAX,
+}
+
+function advtrains.set_lzb_param(par, val)
+ if params[par] and tonumber(val) then
+ params[par] = tonumber(val)
+ else
+ error("Inexistant param or not a number")
+ end
+end
+
+
+local function look_ahead(id, train)
+
+ local acc = advtrains.get_acceleration(train, 1)
+ local vel = train.velocity
+ local brakedst = ( -(vel*vel) / (2*acc) ) * params.DST_FACTOR
+
+ local brake_i = advtrains.path_get_index_by_offset(train, train.index, brakedst + params.BRAKE_SPACE)
+ --local aware_i = advtrains.path_get_index_by_offset(train, brake_i, AWARE_ZONE)
+
+ local lzb = train.lzb
+ local trav = lzb.trav
+
+ --train.debug = lspd
+
+ while trav <= brake_i do
+ trav = trav + 1
+ local pos = advtrains.path_get(train, trav)
+ -- check offtrack
+ if trav > train.path_trk_f then
+ table.insert(lzb.oncoming, {
+ pos = pos,
+ idx = trav-1,
+ spd = 0,
+ })
+ else
+ -- run callbacks
+ -- Note: those callbacks are defined in trainlogic.lua for consistency with the other node callbacks
+ advtrains.tnc_call_approach_callback(pos, id, train, trav, lzb.data)
+
+ end
+ end
+
+ lzb.trav = trav
+
+end
+
+--[[
+Distance needed to accelerate from v0 to v1 with constant acceleration a:
+
+ v1 - v0 a / v1 - v0 \ 2 v1^2 - v0^2
+s = v0 * ------- + - * | ------- | = -----------
+ a 2 \ a / 2*a
+]]
+
+local function apply_control(id, train)
+ local lzb = train.lzb
+
+ local i = 1
+ while i<=#lzb.oncoming do
+ if lzb.oncoming[i].idx < train.index then
+ local ent = lzb.oncoming[i]
+ if ent.fun then
+ ent.fun(ent.pos, id, train, ent.idx, ent.spd, lzb.data)
+ end
+
+ table.remove(lzb.oncoming, i)
+ else
+ i = i + 1
+ end
+ end
+
+ for i, it in ipairs(lzb.oncoming) do
+ local a = advtrains.get_acceleration(train, 1) --should be negative
+ local v0 = train.velocity
+ local v1 = it.spd
+ if v1 and v1 <= v0 then
+ local s = (v1*v1 - v0*v0) / (2*a)
+
+ local st = s + params.ADD_SLOW
+ if v0 > 3 then
+ st = s + params.ADD_FAST
+ end
+ if v0<=0 then
+ st = s + params.ADD_STAND
+ end
+
+ local i = advtrains.path_get_index_by_offset(train, it.idx, -st)
+
+ --train.debug = dump({v0f=v0*f, aff=a*f*f,v0=v0, v1=v1, f=f, a=a, s=s, st=st, i=i, idx=train.index})
+ if i <= train.index then
+ -- Gotcha! Braking...
+ train.ctrl.lzb = 1
+ --train.debug = train.debug .. "BRAKE!!!"
+ return
+ end
+
+ i = advtrains.path_get_index_by_offset(train, i, -params.ZONE_ROLL)
+ if i <= train.index and v0>1 then
+ -- roll control
+ train.ctrl.lzb = 2
+ return
+ end
+ i = advtrains.path_get_index_by_offset(train, i, -params.ZONE_HOLD)
+ if i <= train.index and v0>1 then
+ -- hold speed
+ train.ctrl.lzb = 3
+ return
+ end
+ end
+ end
+ train.ctrl.lzb = nil
+end
+
+local function invalidate(train)
+ train.lzb = {
+ trav = atfloor(train.index),
+ data = {},
+ oncoming = {},
+ }
+end
+
+function advtrains.lzb_invalidate(train)
+ invalidate(train)
+end
+
+-- Add LZB control point
+-- udata: User-defined additional data
+function advtrains.lzb_add_checkpoint(train, index, speed, callback, udata)
+ local lzb = train.lzb
+ local pos = advtrains.path_get(train, index)
+ table.insert(lzb.oncoming, {
+ pos = pos,
+ idx = index,
+ spd = speed,
+ fun = callback,
+ udata = udata,
+ })
+end
+
+
+advtrains.te_register_on_new_path(function(id, train)
+ invalidate(train)
+ look_ahead(id, train)
+end)
+
+advtrains.te_register_on_update(function(id, train)
+ if not train.path or not train.lzb then
+ atprint("LZB run: no path on train, skip step")
+ return
+ end
+ look_ahead(id, train)
+ apply_control(id, train)
+end, true)
diff --git a/advtrains/advtrains/misc_nodes.lua b/advtrains/advtrains/misc_nodes.lua
new file mode 100644
index 0000000..93d5572
--- /dev/null
+++ b/advtrains/advtrains/misc_nodes.lua
@@ -0,0 +1,118 @@
+--all nodes that do not fit in any other category
+
+function advtrains.register_platform(modprefix, preset)
+ local ndef=minetest.registered_nodes[preset]
+ if not ndef then
+ minetest.log("warning", " register_platform couldn't find preset node "..preset)
+ return
+ end
+ local btex=ndef.tiles
+ if type(btex)=="table" then
+ btex=btex[1]
+ end
+ local desc=ndef.description or ""
+ local nodename=string.match(preset, ":(.+)$")
+ minetest.register_node(modprefix .. ":platform_low_"..nodename, {
+ description = attrans("@1 Platform (low)", desc),
+ tiles = {btex.."^advtrains_platform.png", btex, btex, btex, btex, btex},
+ groups = {cracky = 1, not_blocking_trains = 1, platform=1},
+ sounds = default.node_sound_stone_defaults(),
+ drawtype = "nodebox",
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-0.5, -0.1, -0.1, 0.5, 0 , 0.5},
+ {-0.5, -0.5, 0 , 0.5, -0.1, 0.5}
+ },
+ },
+ paramtype2="facedir",
+ paramtype = "light",
+ sunlight_propagates = true,
+ })
+ minetest.register_node(modprefix .. ":platform_high_"..nodename, {
+ description = attrans("@1 Platform (high)", desc),
+ tiles = {btex.."^advtrains_platform.png", btex, btex, btex, btex, btex},
+ groups = {cracky = 1, not_blocking_trains = 1, platform=2},
+ sounds = default.node_sound_stone_defaults(),
+ drawtype = "nodebox",
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-0.5, 0.3, 0, 0.5, 0.5, 0.5},
+ {-0.5, -0.5, 0.1 , 0.5, 0.3, 0.5}
+ },
+ },
+ paramtype2="facedir",
+ paramtype = "light",
+ sunlight_propagates = true,
+ })
+ local diagonalbox = {
+ type = "fixed",
+ fixed = {
+ {-0.5, -0.5, 0.5, -0.25, 0.5, -0.8 },
+ {-0.25, -0.5, 0.5 , 0, 0.5, -0.55},
+ {0, -0.5, 0.5 , 0.25, 0.5, -0.3 },
+ {0.25 , -0.5, 0.5, 0.5, 0.5, -0.05}
+ }
+ }
+ minetest.register_node(modprefix..":platform_45_"..nodename, {
+ description = attrans("@1 Platform (45 degree)", desc),
+ groups = {cracky = 1, not_blocking_trains = 1, platform=2},
+ sounds = default.node_sound_stone_defaults(),
+ drawtype = "mesh",
+ mesh = "advtrains_platform_diag.b3d",
+ selection_box = diagonalbox,
+ collision_box = diagonalbox,
+ tiles = {btex, btex.."^advtrains_platform_diag.png"},
+ paramtype2 = "facedir",
+ paramtype = "light",
+ sunlight_propagates = true,
+ })
+ local diagonalbox_low = {
+ type = "fixed",
+ fixed = {
+ {-0.5, -0.5, 0.5, -0.25, 0, -0.8 },
+ {-0.25, -0.5, 0.5 , 0, 0, -0.55},
+ {0, -0.5, 0.5 , 0.25, 0, -0.3 },
+ {0.25 , -0.5, 0.5, 0.5, 0, -0.05}
+ }
+ }
+ minetest.register_node(modprefix..":platform_45_low_"..nodename, {
+ description = attrans("@1 Platform (low, 45 degree)", desc),
+ groups = {cracky = 1, not_blocking_trains = 1, platform=2},
+ sounds = default.node_sound_stone_defaults(),
+ drawtype = "mesh",
+ mesh = "advtrains_platform_diag_low.b3d",
+ selection_box = diagonalbox_low,
+ collision_box = diagonalbox_low,
+ tiles = {btex, btex.."^advtrains_platform_diag.png"},
+ paramtype2 = "facedir",
+ paramtype = "light",
+ sunlight_propagates = true,
+ })
+ minetest.register_craft({
+ type="shapeless",
+ output = modprefix .. ":platform_high_"..nodename.." 4",
+ recipe = {
+ "dye:yellow", preset, preset
+ },
+ })
+ minetest.register_craft({
+ type="shapeless",
+ output = modprefix .. ":platform_low_"..nodename.." 4",
+ recipe = {
+ "dye:yellow", preset
+ },
+ })
+ minetest.register_craft({
+ type="shapeless",
+ output = modprefix .. ":platform_45_"..nodename.." 2",
+ recipe = {
+ "dye:yellow", preset, preset, preset
+ }
+ })
+end
+
+
+advtrains.register_platform("advtrains", "default:stonebrick")
+advtrains.register_platform("advtrains", "default:sandstonebrick")
diff --git a/advtrains/advtrains/models/advtrains_across.obj b/advtrains/advtrains/models/advtrains_across.obj
new file mode 100644
index 0000000..4ebf393
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_across.obj
@@ -0,0 +1,537 @@
+# Blender v2.78 (sub 0) OBJ File: 'andreaskreuz.blend'
+# www.blender.org
+o Cube
+v 0.183133 0.500062 -0.365883
+v 0.300122 0.552646 -0.365883
+v 0.300122 0.552646 -0.337392
+v 0.183133 0.500062 -0.337392
+v -0.300121 1.575195 -0.365883
+v -0.183133 1.627780 -0.365883
+v -0.183133 1.627780 -0.337392
+v -0.300121 1.575195 -0.337392
+v -0.035079 -0.503415 -0.299723
+v -0.035079 1.055075 -0.299723
+v -0.024805 -0.503415 -0.324528
+v -0.024805 1.055075 -0.324528
+v -0.000000 -0.503415 -0.334802
+v -0.000000 1.055075 -0.334802
+v 0.024805 -0.503415 -0.324528
+v 0.024805 1.055075 -0.324528
+v 0.035079 -0.503415 -0.299723
+v 0.035079 1.055075 -0.299723
+v 0.024805 -0.503415 -0.274918
+v 0.024805 1.055075 -0.274918
+v -0.000000 -0.503415 -0.264644
+v -0.000000 1.055075 -0.264644
+v -0.024805 -0.503415 -0.274918
+v -0.024805 1.055075 -0.274918
+v -0.000000 -0.698893 -0.299723
+v -0.032318 0.979391 -0.365883
+v -0.084671 1.095865 -0.365883
+v 0.084671 1.031976 -0.365883
+v 0.032318 1.148450 -0.365883
+v 0.084671 1.031976 -0.337392
+v 0.032318 1.148450 -0.337392
+v -0.032318 0.979391 -0.337392
+v -0.084671 1.095865 -0.337392
+v -0.133841 1.055075 -0.323880
+v -0.096352 1.055075 -0.376499
+v -0.115909 0.988154 -0.323880
+v -0.083444 1.006899 -0.376499
+v -0.066920 0.939165 -0.323880
+v -0.048176 0.971631 -0.376499
+v -0.000000 0.921234 -0.323880
+v -0.000000 0.958722 -0.376499
+v 0.066920 0.939165 -0.323880
+v 0.048176 0.971631 -0.376499
+v 0.115909 0.988154 -0.323880
+v 0.083443 1.006899 -0.376499
+v 0.133841 1.055075 -0.323880
+v 0.096352 1.055075 -0.376499
+v 0.115909 1.121995 -0.323880
+v 0.083443 1.103251 -0.376499
+v 0.066920 1.170984 -0.323880
+v 0.048176 1.138518 -0.376499
+v 0.000000 1.188915 -0.323880
+v 0.000000 1.151427 -0.376499
+v -0.066920 1.170984 -0.323880
+v -0.048176 1.138518 -0.376499
+v -0.115909 1.121995 -0.323880
+v -0.083444 1.103251 -0.376499
+v -0.115909 0.988154 -0.376499
+v -0.133841 1.055075 -0.376499
+v -0.066920 0.939165 -0.376499
+v -0.000000 0.921234 -0.376499
+v 0.066920 0.939165 -0.376499
+v 0.115909 0.988154 -0.376499
+v 0.133841 1.055075 -0.376499
+v 0.115909 1.121995 -0.376499
+v 0.066920 1.170984 -0.376499
+v 0.000000 1.188915 -0.376499
+v -0.066920 1.170984 -0.376499
+v -0.115909 1.121995 -0.376499
+v -0.094673 1.000415 -0.376499
+v -0.109318 1.055075 -0.376499
+v -0.054659 0.960402 -0.376499
+v -0.000000 0.945756 -0.376499
+v 0.054659 0.960402 -0.376499
+v 0.094672 1.000415 -0.376499
+v 0.109318 1.055075 -0.376499
+v 0.094672 1.109734 -0.376499
+v 0.054659 1.149747 -0.376499
+v 0.000000 1.164393 -0.376499
+v -0.054659 1.149747 -0.376499
+v -0.094672 1.109734 -0.376499
+v -0.094673 1.000415 -0.397361
+v -0.109318 1.055075 -0.397361
+v -0.054659 0.960402 -0.397361
+v -0.000000 0.945756 -0.397361
+v 0.054659 0.960402 -0.397361
+v 0.094672 1.000415 -0.397361
+v 0.109318 1.055075 -0.397361
+v 0.094672 1.109734 -0.459571
+v 0.054659 1.149747 -0.459571
+v 0.000000 1.164393 -0.459571
+v -0.054659 1.149747 -0.459571
+v -0.094672 1.109734 -0.459571
+v -0.083444 1.006899 -0.397361
+v -0.096352 1.055075 -0.397361
+v -0.048176 0.971631 -0.397361
+v -0.000000 0.958722 -0.397361
+v 0.048176 0.971631 -0.397361
+v 0.083443 1.006899 -0.397361
+v 0.096352 1.055075 -0.397361
+v 0.083443 1.103251 -0.459571
+v 0.048176 1.138518 -0.459571
+v 0.000000 1.151427 -0.459571
+v -0.048176 1.138518 -0.459571
+v -0.083444 1.103251 -0.459571
+v 0.084671 1.095865 -0.337392
+v 0.032318 0.979391 -0.337392
+v -0.032318 1.148450 -0.337392
+v -0.084671 1.031976 -0.337392
+v -0.032318 1.148450 -0.365883
+v -0.084671 1.031976 -0.365883
+v 0.084671 1.095865 -0.365883
+v 0.032318 0.979391 -0.365883
+v 0.300122 1.575195 -0.337392
+v 0.183133 1.627780 -0.337392
+v 0.183133 1.627780 -0.365883
+v 0.300122 1.575195 -0.365883
+v -0.183133 0.500062 -0.337392
+v -0.300121 0.552646 -0.337392
+v -0.300121 0.552646 -0.365883
+v -0.183133 0.500062 -0.365883
+vt 0.9201 0.4239
+vt 0.9201 0.4892
+vt 0.9044 0.4892
+vt 0.9044 0.4239
+vt 0.1944 0.7581
+vt 0.2101 0.7581
+vt 0.2101 0.8279
+vt 0.1944 0.8279
+vt 0.2539 0.3060
+vt 0.2539 0.0160
+vt 0.3247 0.0160
+vt 0.3247 0.3060
+vt 0.4596 0.8350
+vt 0.7496 0.8350
+vt 0.7496 0.8507
+vt 0.4596 0.8507
+vt 0.2539 0.6281
+vt 0.2539 0.3381
+vt 0.3247 0.3381
+vt 0.3247 0.6281
+vt 0.7609 0.4251
+vt 0.7609 0.1508
+vt 0.7767 0.1508
+vt 0.7767 0.4251
+vt 0.2081 0.7222
+vt 0.2081 0.0160
+vt 0.2218 0.0199
+vt 0.2218 0.7261
+vt 0.0434 0.0160
+vt 0.0434 0.9840
+vt 0.0297 0.9840
+vt 0.0297 0.0160
+vt 0.0160 0.9840
+vt 0.0160 0.0160
+vt 0.1623 0.0183
+vt 0.1623 0.9082
+vt 0.1486 0.9060
+vt 0.1486 0.0160
+vt 0.1350 0.9082
+vt 0.1350 0.0183
+vt 0.0755 0.9840
+vt 0.0755 0.0160
+vt 0.0892 0.0160
+vt 0.0892 0.9840
+vt 0.7932 0.9090
+vt 0.7830 0.8984
+vt 0.7830 0.8836
+vt 0.7932 0.8734
+vt 0.8076 0.8737
+vt 0.8178 0.8844
+vt 0.8178 0.8991
+vt 0.8076 0.9093
+vt 0.1029 0.0160
+vt 0.1029 0.9840
+vt 0.1944 0.7261
+vt 0.1944 0.0199
+vt 0.2199 0.8822
+vt 0.2124 0.8943
+vt 0.2019 0.8972
+vt 0.1944 0.8892
+vt 0.1944 0.8750
+vt 0.2019 0.8629
+vt 0.2124 0.8600
+vt 0.2199 0.8680
+vt 0.8087 0.4251
+vt 0.8087 0.1508
+vt 0.8245 0.1508
+vt 0.8245 0.4251
+vt 0.4275 0.3381
+vt 0.4275 0.6281
+vt 0.3567 0.6281
+vt 0.3567 0.3381
+vt 0.6653 0.4408
+vt 0.6653 0.1508
+vt 0.6811 0.1508
+vt 0.6811 0.4408
+vt 0.5625 0.3060
+vt 0.5625 0.0160
+vt 0.6333 0.0160
+vt 0.6333 0.3060
+vt 0.7433 0.4931
+vt 0.7723 0.4931
+vt 0.7723 0.5268
+vt 0.7433 0.5268
+vt 0.7723 0.5650
+vt 0.7433 0.5650
+vt 0.7723 0.5975
+vt 0.7433 0.5975
+vt 0.9044 0.2874
+vt 0.9334 0.2874
+vt 0.9334 0.3198
+vt 0.9044 0.3198
+vt 0.9334 0.3581
+vt 0.9044 0.3581
+vt 0.9334 0.3918
+vt 0.9044 0.3918
+vt 0.8566 0.8329
+vt 0.8856 0.8329
+vt 0.8856 0.8708
+vt 0.8566 0.8708
+vt 0.8856 0.9063
+vt 0.8566 0.9063
+vt 0.9334 0.2553
+vt 0.9044 0.2553
+vt 0.9044 0.2220
+vt 0.9334 0.2220
+vt 0.9044 0.1838
+vt 0.9334 0.1838
+vt 0.7029 0.1188
+vt 0.6791 0.1050
+vt 0.6653 0.0812
+vt 0.6653 0.0536
+vt 0.6791 0.0298
+vt 0.7029 0.0160
+vt 0.7305 0.0160
+vt 0.7543 0.0298
+vt 0.7681 0.0536
+vt 0.7681 0.0812
+vt 0.7543 0.1050
+vt 0.7305 0.1188
+vt 0.9044 0.1508
+vt 0.9334 0.1508
+vt 0.7433 0.4729
+vt 0.7723 0.4729
+vt 0.4596 0.7507
+vt 0.4596 0.7124
+vt 0.4787 0.6793
+vt 0.5118 0.6602
+vt 0.5501 0.6602
+vt 0.5832 0.6793
+vt 0.6023 0.7124
+vt 0.6023 0.7507
+vt 0.5832 0.7838
+vt 0.5501 0.8029
+vt 0.5118 0.8029
+vt 0.4787 0.7838
+vt 0.3408 0.6733
+vt 0.3096 0.6733
+vt 0.3061 0.6602
+vt 0.3443 0.6602
+vt 0.2826 0.6889
+vt 0.2730 0.6793
+vt 0.2669 0.7160
+vt 0.2539 0.7124
+vt 0.2669 0.7472
+vt 0.2539 0.7507
+vt 0.2826 0.7742
+vt 0.2730 0.7838
+vt 0.3096 0.7898
+vt 0.3061 0.8029
+vt 0.3408 0.7898
+vt 0.3443 0.8029
+vt 0.3679 0.7742
+vt 0.3774 0.7838
+vt 0.3835 0.7472
+vt 0.3966 0.7507
+vt 0.3835 0.7160
+vt 0.3966 0.7124
+vt 0.3679 0.6889
+vt 0.3774 0.6793
+vt 0.8044 0.4994
+vt 0.8044 0.4729
+vt 0.8159 0.4729
+vt 0.8159 0.4994
+vt 0.9044 0.6442
+vt 0.9044 0.6187
+vt 0.9159 0.6187
+vt 0.9159 0.6442
+vt 0.8460 0.0160
+vt 0.8460 0.0429
+vt 0.8001 0.0429
+vt 0.8001 0.0160
+vt 0.2773 0.8808
+vt 0.2539 0.8808
+vt 0.2539 0.8350
+vt 0.2773 0.8350
+vt 0.7112 0.4729
+vt 0.7112 0.4994
+vt 0.6997 0.4994
+vt 0.6997 0.4729
+vt 0.9044 0.6715
+vt 0.9159 0.6715
+vt 0.8460 0.0742
+vt 0.8001 0.0742
+vt 0.3048 0.8808
+vt 0.3048 0.8350
+vt 0.7112 0.5306
+vt 0.6997 0.5306
+vt 0.8460 0.1014
+vt 0.8001 0.1014
+vt 0.3290 0.8808
+vt 0.3290 0.8693
+vt 0.7112 0.5582
+vt 0.6997 0.5582
+vt 0.7302 0.7561
+vt 0.7440 0.7323
+vt 0.7509 0.7341
+vt 0.7353 0.7611
+vt 0.7440 0.7047
+vt 0.7509 0.7029
+vt 0.7302 0.6809
+vt 0.7353 0.6758
+vt 0.7064 0.6671
+vt 0.7083 0.6602
+vt 0.6789 0.6671
+vt 0.6770 0.6602
+vt 0.6550 0.6809
+vt 0.6500 0.6758
+vt 0.6413 0.7047
+vt 0.6344 0.7029
+vt 0.6413 0.7323
+vt 0.6344 0.7341
+vt 0.6550 0.7561
+vt 0.6500 0.7611
+vt 0.6789 0.7699
+vt 0.6770 0.7768
+vt 0.7064 0.7699
+vt 0.7083 0.7768
+vt 0.9024 0.7257
+vt 0.9024 0.7491
+vt 0.8566 0.7491
+vt 0.8566 0.7257
+vt 0.7112 0.5746
+vt 0.6653 0.5746
+vt 0.8896 0.0160
+vt 0.8896 0.0400
+vt 0.8781 0.0400
+vt 0.8781 0.0160
+vt 0.8044 0.5306
+vt 0.8159 0.5306
+vt 0.9024 0.7766
+vt 0.8566 0.7766
+vt 0.8896 0.0675
+vt 0.8781 0.0675
+vt 0.8044 0.5582
+vt 0.8159 0.5582
+vt 0.9024 0.8008
+vt 0.8909 0.8008
+vt 0.8896 0.0912
+vt 0.8781 0.0912
+vt 0.3756 0.8659
+vt 0.3756 0.8350
+vt 0.3872 0.8350
+vt 0.4215 0.8659
+vt 0.3436 0.8808
+vt 0.3436 0.8693
+vt 0.3756 0.8949
+vt 0.4215 0.8949
+vt 0.7987 0.8413
+vt 0.7830 0.8413
+vt 0.7830 0.6602
+vt 0.7987 0.6602
+vt 0.4596 0.0160
+vt 0.5304 0.0160
+vt 0.5304 0.3060
+vt 0.4596 0.3060
+vt 0.8723 0.6936
+vt 0.8566 0.6936
+vt 0.8566 0.5125
+vt 0.8723 0.5125
+vt 0.8723 0.4572
+vt 0.8566 0.4572
+vt 0.9044 0.5213
+vt 0.9201 0.5213
+vt 0.9201 0.5866
+vt 0.9044 0.5866
+vt 0.5304 0.6281
+vt 0.4596 0.6281
+vt 0.4596 0.3381
+vt 0.5304 0.3381
+vt 0.3567 0.0160
+vt 0.4275 0.0160
+vt 0.4275 0.3060
+vt 0.3567 0.3060
+vt 0.8723 0.4251
+vt 0.8566 0.4251
+vt 0.8566 0.1508
+vt 0.8723 0.1508
+vt 0.7289 0.4251
+vt 0.7131 0.4251
+vt 0.7131 0.1508
+vt 0.7289 0.1508
+vt 0.6333 0.6281
+vt 0.5625 0.6281
+vt 0.5625 0.3381
+vt 0.6333 0.3381
+vn 0.4100 -0.9121 0.0000
+vn -0.4100 0.9121 0.0000
+vn 0.0000 0.0000 -1.0000
+vn 0.9121 0.4100 0.0000
+vn 0.0000 0.0000 1.0000
+vn -0.9121 -0.4100 0.0000
+vn -0.9239 0.0000 -0.3827
+vn -0.3827 0.0000 -0.9239
+vn 0.3827 0.0000 -0.9239
+vn 0.9239 0.0000 -0.3827
+vn 0.9239 0.0000 0.3827
+vn 0.3827 0.0000 0.9239
+vn 0.0000 1.0000 0.0000
+vn -0.3827 0.0000 0.9239
+vn -0.9239 0.0000 0.3827
+vn 0.0000 -1.0000 0.0000
+vn -0.9659 -0.2588 0.0000
+vn -0.7071 -0.7071 0.0000
+vn -0.2588 -0.9659 -0.0000
+vn 0.2588 -0.9659 0.0000
+vn 0.7071 -0.7071 0.0000
+vn 0.9659 -0.2588 0.0000
+vn 0.9659 0.2588 0.0000
+vn 0.7071 0.7071 0.0000
+vn 0.2588 0.9659 0.0000
+vn -0.2588 0.9659 -0.0000
+vn -0.7071 0.7071 0.0000
+vn -0.9659 0.2588 0.0000
+vn 0.1966 -0.7339 -0.6502
+vn -0.1967 -0.7339 -0.6502
+vn -0.9121 0.4100 0.0000
+vn 0.4100 0.9121 0.0000
+vn -0.4100 -0.9121 0.0000
+vn 0.9121 -0.4100 -0.0000
+s off
+f 1/1/1 2/2/1 3/3/1 4/4/1
+f 5/5/2 8/6/2 7/7/2 6/8/2
+f 27/9/3 5/10/3 6/11/3 29/12/3
+f 29/13/4 6/14/4 7/15/4 31/16/4
+f 31/17/5 7/18/5 8/19/5 33/20/5
+f 26/21/6 1/22/6 4/23/6 32/24/6
+f 9/25/7 10/26/7 12/27/7 11/28/7
+f 11/29/8 12/30/8 14/31/8 13/32/8
+f 13/32/9 14/31/9 16/33/9 15/34/9
+f 15/35/10 16/36/10 18/37/10 17/38/10
+f 17/38/11 18/37/11 20/39/11 19/40/11
+f 19/41/12 20/42/12 22/43/12 21/44/12
+f 12/45/13 10/46/13 24/47/13 22/48/13 20/49/13 18/50/13 16/51/13 14/52/13
+f 21/44/14 22/43/14 24/53/14 23/54/14
+f 23/55/15 24/56/15 10/26/15 9/25/15
+f 9/57/16 11/58/16 13/59/16 15/60/16 17/61/16 19/62/16 21/63/16 23/64/16
+f 5/65/6 27/66/6 33/67/6 8/68/6
+f 3/69/5 30/70/5 32/71/5 4/72/5
+f 2/73/4 28/74/4 30/75/4 3/76/4
+f 1/77/3 26/78/3 28/79/3 2/80/3
+f 34/81/17 59/82/17 58/83/17 36/84/17
+f 36/84/18 58/83/18 60/85/18 38/86/18
+f 38/86/19 60/85/19 61/87/19 40/88/19
+f 40/89/20 61/90/20 62/91/20 42/92/20
+f 42/92/21 62/91/21 63/93/21 44/94/21
+f 44/94/22 63/93/22 64/95/22 46/96/22
+f 46/97/23 64/98/23 65/99/23 48/100/23
+f 48/100/24 65/99/24 66/101/24 50/102/24
+f 50/103/25 66/104/25 67/105/25 52/106/25
+f 52/106/26 67/105/26 68/107/26 54/108/26
+f 37/109/3 35/110/3 57/111/3 55/112/3 53/113/3 51/114/3 49/115/3 47/116/3 45/117/3 43/118/3 41/119/3 39/120/3
+f 54/108/27 68/107/27 69/121/27 56/122/27
+f 56/123/28 69/124/28 59/82/28 34/81/28
+f 34/125/5 36/126/5 38/127/5 40/128/5 42/129/5 44/130/5 46/131/5 48/132/5 50/133/5 52/134/5 54/135/5 56/136/5
+f 71/137/3 70/138/3 58/139/3 59/140/3
+f 70/138/3 72/141/3 60/142/3 58/139/3
+f 72/141/3 73/143/3 61/144/3 60/142/3
+f 73/143/3 74/145/3 62/146/3 61/144/3
+f 74/145/3 75/147/3 63/148/3 62/146/3
+f 75/147/3 76/149/3 64/150/3 63/148/3
+f 76/149/3 77/151/3 65/152/3 64/150/3
+f 77/151/3 78/153/3 66/154/3 65/152/3
+f 78/153/3 79/155/3 67/156/3 66/154/3
+f 79/155/3 80/157/3 68/158/3 67/156/3
+f 80/157/3 81/159/3 69/160/3 68/158/3
+f 81/159/3 71/137/3 59/140/3 69/160/3
+f 74/161/20 73/162/20 85/163/20 86/164/20
+f 37/165/24 39/166/24 96/167/24 94/168/24
+f 81/169/27 80/170/27 92/171/27 93/172/27
+f 51/173/19 53/174/19 103/175/19 102/176/19
+f 73/177/19 72/178/19 84/179/19 85/180/19
+f 35/181/23 37/165/23 94/168/23 95/182/23
+f 80/170/26 79/183/26 91/184/26 92/171/26
+f 49/185/18 51/173/18 102/176/18 101/186/18
+f 72/178/18 70/187/18 82/188/18 84/179/18
+f 79/183/25 78/189/25 90/190/25 91/184/25
+f 47/191/17 49/185/17 101/186/17 100/192/17
+f 70/187/17 71/193/17 83/194/17 82/188/17
+f 95/195/3 94/196/3 82/197/3 83/198/3
+f 94/196/3 96/199/3 84/200/3 82/197/3
+f 96/199/3 97/201/3 85/202/3 84/200/3
+f 97/201/3 98/203/3 86/204/3 85/202/3
+f 98/203/3 99/205/3 87/206/3 86/204/3
+f 99/205/3 100/207/3 88/208/3 87/206/3
+f 100/207/29 101/209/29 89/210/29 88/208/29
+f 101/209/3 102/211/3 90/212/3 89/210/3
+f 102/211/3 103/213/3 91/214/3 90/212/3
+f 103/213/3 104/215/3 92/216/3 91/214/3
+f 104/215/3 105/217/3 93/218/3 92/216/3
+f 105/217/30 95/195/30 83/198/30 93/218/30
+f 53/219/20 55/220/20 104/221/20 103/222/20
+f 71/193/28 81/223/28 93/224/28 83/194/28
+f 39/225/25 41/226/25 97/227/25 96/228/25
+f 75/229/21 74/161/21 86/164/21 87/230/21
+f 55/220/21 57/231/21 105/232/21 104/221/21
+f 41/226/26 43/233/26 98/234/26 97/227/26
+f 76/235/22 75/229/22 87/230/22 88/236/22
+f 57/231/22 35/237/22 95/238/22 105/232/22
+f 43/233/27 45/239/27 99/240/27 98/234/27
+f 77/241/23 76/242/23 88/243/23 89/244/23
+f 45/245/28 47/191/28 100/192/28 99/246/28
+f 78/247/24 77/241/24 89/244/24 90/248/24
+f 120/249/31 119/250/31 109/251/31 111/252/31
+f 112/253/3 110/254/3 116/255/3 117/256/3
+f 110/257/31 108/258/31 115/259/31 116/260/31
+f 117/261/32 116/260/32 115/259/32 114/262/32
+f 121/263/33 118/264/33 119/265/33 120/266/33
+f 119/267/5 118/268/5 107/269/5 109/270/5
+f 108/271/5 106/272/5 114/273/5 115/274/5
+f 113/275/34 107/276/34 118/277/34 121/278/34
+f 117/279/34 114/280/34 106/281/34 112/282/34
+f 121/283/3 120/284/3 111/285/3 113/286/3
diff --git a/advtrains/advtrains/models/advtrains_dtrack_bumper_st.b3d b/advtrains/advtrains/models/advtrains_dtrack_bumper_st.b3d
new file mode 100644
index 0000000..a6d9745
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_dtrack_bumper_st.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_dtrack_bumper_st_30.b3d b/advtrains/advtrains/models/advtrains_dtrack_bumper_st_30.b3d
new file mode 100644
index 0000000..5f5b3f4
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_dtrack_bumper_st_30.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_dtrack_bumper_st_45.b3d b/advtrains/advtrains/models/advtrains_dtrack_bumper_st_45.b3d
new file mode 100644
index 0000000..f13ae75
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_dtrack_bumper_st_45.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_dtrack_bumper_st_60.b3d b/advtrains/advtrains/models/advtrains_dtrack_bumper_st_60.b3d
new file mode 100644
index 0000000..59a2285
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_dtrack_bumper_st_60.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_dtrack_cr.b3d b/advtrains/advtrains/models/advtrains_dtrack_cr.b3d
new file mode 100644
index 0000000..c708292
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_dtrack_cr.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_dtrack_cr_30.b3d b/advtrains/advtrains/models/advtrains_dtrack_cr_30.b3d
new file mode 100644
index 0000000..7ca0bda
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_dtrack_cr_30.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_dtrack_cr_45.b3d b/advtrains/advtrains/models/advtrains_dtrack_cr_45.b3d
new file mode 100644
index 0000000..b22ea0d
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_dtrack_cr_45.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_dtrack_cr_60.b3d b/advtrains/advtrains/models/advtrains_dtrack_cr_60.b3d
new file mode 100644
index 0000000..e9b16d6
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_dtrack_cr_60.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_dtrack_st.b3d b/advtrains/advtrains/models/advtrains_dtrack_st.b3d
new file mode 100644
index 0000000..c240416
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_dtrack_st.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_dtrack_st_30.b3d b/advtrains/advtrains/models/advtrains_dtrack_st_30.b3d
new file mode 100644
index 0000000..fd77e66
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_dtrack_st_30.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_dtrack_st_45.b3d b/advtrains/advtrains/models/advtrains_dtrack_st_45.b3d
new file mode 100644
index 0000000..af3afb1
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_dtrack_st_45.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_dtrack_st_60.b3d b/advtrains/advtrains/models/advtrains_dtrack_st_60.b3d
new file mode 100644
index 0000000..6cb19e6
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_dtrack_st_60.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_dtrack_swlcr.b3d b/advtrains/advtrains/models/advtrains_dtrack_swlcr.b3d
new file mode 100644
index 0000000..8b1ac0e
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_dtrack_swlcr.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_dtrack_swlcr_30.b3d b/advtrains/advtrains/models/advtrains_dtrack_swlcr_30.b3d
new file mode 100644
index 0000000..6def7ab
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_dtrack_swlcr_30.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_dtrack_swlcr_45.b3d b/advtrains/advtrains/models/advtrains_dtrack_swlcr_45.b3d
new file mode 100644
index 0000000..cc874ca
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_dtrack_swlcr_45.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_dtrack_swlcr_60.b3d b/advtrains/advtrains/models/advtrains_dtrack_swlcr_60.b3d
new file mode 100644
index 0000000..1472a00
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_dtrack_swlcr_60.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_dtrack_swlst.b3d b/advtrains/advtrains/models/advtrains_dtrack_swlst.b3d
new file mode 100644
index 0000000..ecdb326
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_dtrack_swlst.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_dtrack_swlst_30.b3d b/advtrains/advtrains/models/advtrains_dtrack_swlst_30.b3d
new file mode 100644
index 0000000..fd6e91d
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_dtrack_swlst_30.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_dtrack_swlst_45.b3d b/advtrains/advtrains/models/advtrains_dtrack_swlst_45.b3d
new file mode 100644
index 0000000..dae694e
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_dtrack_swlst_45.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_dtrack_swlst_60.b3d b/advtrains/advtrains/models/advtrains_dtrack_swlst_60.b3d
new file mode 100644
index 0000000..8f2b0e2
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_dtrack_swlst_60.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_dtrack_swrcr.b3d b/advtrains/advtrains/models/advtrains_dtrack_swrcr.b3d
new file mode 100644
index 0000000..4610826
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_dtrack_swrcr.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_dtrack_swrcr_30.b3d b/advtrains/advtrains/models/advtrains_dtrack_swrcr_30.b3d
new file mode 100644
index 0000000..71b87f3
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_dtrack_swrcr_30.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_dtrack_swrcr_45.b3d b/advtrains/advtrains/models/advtrains_dtrack_swrcr_45.b3d
new file mode 100644
index 0000000..5457972
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_dtrack_swrcr_45.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_dtrack_swrcr_60.b3d b/advtrains/advtrains/models/advtrains_dtrack_swrcr_60.b3d
new file mode 100644
index 0000000..167a3ff
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_dtrack_swrcr_60.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_dtrack_swrst.b3d b/advtrains/advtrains/models/advtrains_dtrack_swrst.b3d
new file mode 100644
index 0000000..69b6996
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_dtrack_swrst.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_dtrack_swrst_30.b3d b/advtrains/advtrains/models/advtrains_dtrack_swrst_30.b3d
new file mode 100644
index 0000000..19ee483
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_dtrack_swrst_30.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_dtrack_swrst_45.b3d b/advtrains/advtrains/models/advtrains_dtrack_swrst_45.b3d
new file mode 100644
index 0000000..70d051f
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_dtrack_swrst_45.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_dtrack_swrst_60.b3d b/advtrains/advtrains/models/advtrains_dtrack_swrst_60.b3d
new file mode 100644
index 0000000..69a58fb
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_dtrack_swrst_60.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_dtrack_vst1.obj b/advtrains/advtrains/models/advtrains_dtrack_vst1.obj
new file mode 100644
index 0000000..33d9bf3
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_dtrack_vst1.obj
@@ -0,0 +1,348 @@
+# Blender v2.78 (sub 0) OBJ File: 'rail_redo.blend'
+# www.blender.org
+o dtrack_vst1_Cube.031
+v 0.753760 -0.500000 -0.500000
+v 0.753760 -0.500000 0.500000
+v 0.753760 -0.000000 0.500000
+v -0.753760 -0.500000 -0.500000
+v -0.753760 -0.500000 0.500000
+v -0.753760 -0.000000 0.500000
+v 0.329165 -0.196108 0.171599
+v 0.329165 -0.032047 0.171599
+v 0.329165 -0.367707 -0.171599
+v 0.329165 -0.203646 -0.171599
+v 0.462280 -0.196108 0.171599
+v 0.462280 -0.032047 0.171599
+v 0.462280 -0.367707 -0.171599
+v 0.462280 -0.203646 -0.171599
+v 0.412289 0.040000 0.500000
+v 0.412289 -0.460000 -0.500000
+v 0.560528 -0.460000 -0.500000
+v 0.560528 0.040000 0.500000
+v 0.474055 0.060000 0.500000
+v 0.474055 -0.440000 -0.500000
+v 0.498762 -0.440000 -0.500000
+v 0.498762 0.060000 0.500000
+v 0.474055 0.110000 0.500000
+v 0.474055 -0.390000 -0.500000
+v 0.498762 -0.390000 -0.500000
+v 0.498762 0.110000 0.500000
+v 0.529645 -0.385000 -0.500000
+v 0.529645 0.115000 0.500000
+v 0.443172 0.115000 0.500000
+v 0.443172 -0.385000 -0.500000
+v 0.529645 -0.360000 -0.500000
+v 0.529645 0.140000 0.500000
+v 0.443172 0.140000 0.500000
+v 0.443172 -0.360000 -0.500000
+v 0.741194 -0.042500 0.435000
+v -0.741194 -0.042500 0.435000
+v -0.741194 -0.102500 0.315000
+v 0.741194 -0.102500 0.315000
+v 0.741193 0.007500 0.435000
+v -0.741194 0.007500 0.435000
+v -0.741194 -0.052500 0.315000
+v 0.741194 -0.052500 0.315000
+v -0.011733 2.879186 0.500000
+v -0.011732 2.379186 -0.500001
+v -0.011733 2.900814 0.500000
+v -0.011732 2.400814 -0.500000
+v 0.011732 2.379186 -0.500000
+v 0.011732 2.879186 0.500000
+v 0.011732 2.400814 -0.500000
+v 0.011732 2.900814 0.500000
+v -0.412289 -0.460000 -0.500000
+v -0.412289 0.040000 0.500000
+v -0.560528 0.040000 0.500000
+v -0.560528 -0.460000 -0.500000
+v -0.474055 -0.440000 -0.500000
+v -0.474055 0.060000 0.500000
+v -0.498762 0.060000 0.500000
+v -0.498762 -0.440000 -0.500000
+v -0.474055 -0.390000 -0.500000
+v -0.474055 0.110000 0.500000
+v -0.498762 0.110000 0.500000
+v -0.498762 -0.390000 -0.500000
+v -0.529645 0.115000 0.500000
+v -0.529645 -0.385000 -0.500000
+v -0.443172 -0.385000 -0.500000
+v -0.443172 0.115000 0.500000
+v -0.529645 0.140000 0.500000
+v -0.529645 -0.360000 -0.500000
+v -0.443172 -0.360000 -0.500000
+v -0.443172 0.140000 0.500000
+v -0.741194 -0.477500 -0.435000
+v 0.741194 -0.477500 -0.435000
+v 0.741194 -0.417500 -0.315000
+v -0.741194 -0.417500 -0.315000
+v -0.741193 -0.427500 -0.435000
+v 0.741194 -0.427500 -0.435000
+v 0.741194 -0.367500 -0.315000
+v -0.741194 -0.367500 -0.315000
+v 0.741194 -0.166069 0.187862
+v -0.741194 -0.166069 0.187862
+v -0.741194 -0.226069 0.067862
+v 0.741194 -0.226069 0.067862
+v 0.741193 -0.116069 0.187862
+v -0.741194 -0.116069 0.187862
+v -0.741194 -0.176069 0.067862
+v 0.741194 -0.176069 0.067862
+v -0.741194 -0.353931 -0.187862
+v 0.741194 -0.353931 -0.187862
+v 0.741194 -0.293931 -0.067862
+v -0.741194 -0.293931 -0.067862
+v -0.741193 -0.303931 -0.187862
+v 0.741194 -0.303931 -0.187862
+v 0.741194 -0.243931 -0.067862
+v -0.741194 -0.243931 -0.067862
+v -0.329165 -0.196108 0.171599
+v -0.329165 -0.032047 0.171599
+v -0.329165 -0.367707 -0.171599
+v -0.329165 -0.203646 -0.171599
+v -0.462280 -0.196108 0.171599
+v -0.462280 -0.032047 0.171599
+v -0.462280 -0.367707 -0.171599
+v -0.462280 -0.203646 -0.171599
+vt 0.7427 0.1169
+vt 0.7427 0.3317
+vt 0.6400 0.3317
+vt 0.6400 0.1169
+vt 0.8260 0.3317
+vt 0.8260 0.4343
+vt 0.7427 0.4343
+vt 0.8260 0.1169
+vt 0.7427 0.0142
+vt 0.8260 0.0142
+vt 0.5691 0.2971
+vt 0.5691 0.9229
+vt 0.5378 0.9229
+vt 0.5378 0.2971
+vt 0.3413 0.2971
+vt 0.3819 0.2971
+vt 0.3819 0.9229
+vt 0.3413 0.9229
+vt 0.4291 0.9855
+vt 0.4678 0.9730
+vt 0.4833 0.9730
+vt 0.5219 0.9855
+vt 0.6097 0.9229
+vt 0.6097 0.2971
+vt 0.4678 0.2470
+vt 0.4291 0.2345
+vt 0.5219 0.2345
+vt 0.4833 0.2470
+vt 0.4833 0.2783
+vt 0.4678 0.2783
+vt 0.4132 0.2971
+vt 0.4132 0.9229
+vt 0.4678 0.9417
+vt 0.4833 0.9417
+vt 0.5182 0.9229
+vt 0.5182 0.2971
+vt 0.4328 0.2971
+vt 0.4328 0.9229
+vt 0.5026 0.9229
+vt 0.5026 0.2971
+vt 0.4485 0.2971
+vt 0.4485 0.9229
+vt 0.5026 0.2814
+vt 0.4485 0.2814
+vt 0.4485 0.9386
+vt 0.5026 0.9386
+vt 0.9588 0.9625
+vt 0.8837 0.9625
+vt 0.8837 0.0348
+vt 0.9588 0.0348
+vt 0.9901 0.9625
+vt 0.9901 0.0348
+vt 0.9588 0.0035
+vt 0.8837 0.0035
+vt 0.8524 0.0348
+vt 0.8524 0.9625
+vt 0.9588 0.9938
+vt 0.8837 0.9938
+vt 0.6554 0.3627
+vt 0.6690 0.3627
+vt 0.6690 0.9885
+vt 0.6554 0.9885
+vt 0.6972 0.9885
+vt 0.6837 0.9885
+vt 0.6837 0.3627
+vt 0.6972 0.3627
+vt 0.7119 0.3627
+vt 0.7119 0.9885
+vt 0.5691 0.2971
+vt 0.5691 0.9229
+vt 0.5378 0.9229
+vt 0.5378 0.2971
+vt 0.3413 0.2971
+vt 0.3819 0.2971
+vt 0.3819 0.9229
+vt 0.3413 0.9229
+vt 0.4291 0.9855
+vt 0.4678 0.9730
+vt 0.4833 0.9730
+vt 0.5219 0.9855
+vt 0.6097 0.9229
+vt 0.6097 0.2971
+vt 0.4678 0.2470
+vt 0.4291 0.2345
+vt 0.5219 0.2345
+vt 0.4833 0.2470
+vt 0.4833 0.2783
+vt 0.4678 0.2783
+vt 0.4132 0.2971
+vt 0.4132 0.9229
+vt 0.4678 0.9417
+vt 0.4833 0.9417
+vt 0.5182 0.9229
+vt 0.5182 0.2971
+vt 0.4328 0.2971
+vt 0.4328 0.9229
+vt 0.5026 0.9229
+vt 0.5026 0.2971
+vt 0.4485 0.2971
+vt 0.4485 0.9229
+vt 0.5026 0.2814
+vt 0.4485 0.2814
+vt 0.4485 0.9386
+vt 0.5026 0.9386
+vt 0.9588 0.9625
+vt 0.8837 0.9625
+vt 0.8837 0.0348
+vt 0.9588 0.0348
+vt 0.9901 0.9625
+vt 0.9901 0.0348
+vt 0.9588 0.0035
+vt 0.8837 0.0035
+vt 0.8524 0.0348
+vt 0.8524 0.9625
+vt 0.9588 0.9938
+vt 0.8837 0.9938
+vt 0.9588 0.9625
+vt 0.8837 0.9625
+vt 0.8837 0.0348
+vt 0.9588 0.0348
+vt 0.9901 0.9625
+vt 0.9901 0.0348
+vt 0.9588 0.0035
+vt 0.8837 0.0035
+vt 0.8524 0.0348
+vt 0.8524 0.9625
+vt 0.9588 0.9938
+vt 0.8837 0.9938
+vt 0.9588 0.9625
+vt 0.8837 0.9625
+vt 0.8837 0.0348
+vt 0.9588 0.0348
+vt 0.9901 0.9625
+vt 0.9901 0.0348
+vt 0.9588 0.0035
+vt 0.8837 0.0035
+vt 0.8524 0.0348
+vt 0.8524 0.9625
+vt 0.9588 0.9938
+vt 0.8837 0.9938
+vt 0.7427 0.1169
+vt 0.6400 0.1169
+vt 0.6400 0.3317
+vt 0.7427 0.3317
+vt 0.7427 0.4343
+vt 0.8260 0.4343
+vt 0.8260 0.3317
+vt 0.8260 0.1169
+vt 0.8260 0.0142
+vt 0.7427 0.0142
+vt 1.2064 -0.1190
+vt -0.2978 -0.1190
+vt -0.2978 -0.6179
+vt 1.2064 -0.6179
+vt -0.2924 0.9963
+vt -0.2924 -0.0015
+vt 1.2117 -0.0015
+vt 1.2117 0.9963
+vt 1.2064 0.9965
+vt 1.6526 0.1041
+vt -0.2978 0.9965
+vt -0.7440 0.1041
+vn -1.0000 0.0000 -0.0000
+vn 0.0000 0.0000 -1.0000
+vn -0.0000 0.0000 1.0000
+vn 0.0000 0.8944 -0.4472
+vn 1.0000 0.0000 0.0000
+vn -0.2782 0.8591 -0.4296
+vn 0.2782 0.8591 -0.4296
+vn 0.1433 -0.8852 0.4426
+vn -0.1433 -0.8852 0.4426
+vn 0.0000 -0.8944 0.4472
+vn 0.0000 -1.0000 0.0000
+g dtrack_vst1_Cube.031_SlopeRailMaterial
+s off
+f 8/1/1 10/2/1 9/3/1 7/4/1
+f 10/2/2 14/5/2 13/6/2 9/7/2
+f 12/8/3 8/1/3 7/9/3 11/10/3
+f 12/8/4 14/5/4 10/2/4 8/1/4
+f 22/11/5 21/12/5 25/13/5 26/14/5
+f 15/15/6 19/16/6 20/17/6 16/18/6
+f 16/19/2 20/20/2 21/21/2 17/22/2
+f 17/23/7 21/12/7 22/11/7 18/24/7
+f 19/25/3 15/26/3 18/27/3 22/28/3
+f 26/29/3 23/30/3 19/25/3 22/28/3
+f 19/16/1 23/31/1 24/32/1 20/17/1
+f 21/21/2 20/20/2 24/33/2 25/34/2
+f 26/14/8 25/13/8 27/35/8 28/36/8
+f 24/32/9 23/31/9 29/37/9 30/38/9
+f 28/36/5 27/35/5 31/39/5 32/40/5
+f 30/38/1 29/37/1 33/41/1 34/42/1
+f 31/39/4 34/42/4 33/41/4 32/40/4
+f 23/30/3 26/29/3 28/43/3 32/40/3 33/41/3 29/44/3
+f 24/33/2 30/45/2 34/42/2 31/39/2 27/46/2 25/34/2
+f 39/47/4 42/48/4 41/49/4 40/50/4
+f 35/51/3 39/47/3 40/50/3 36/52/3
+f 36/53/1 40/50/1 41/49/1 37/54/1
+f 37/55/2 41/49/2 42/48/2 38/56/2
+f 39/47/5 35/57/5 38/58/5 42/48/5
+f 43/59/1 45/60/1 46/61/1 44/62/1
+f 47/63/5 49/64/5 50/65/5 48/66/5
+f 43/67/10 44/68/10 47/63/10 48/66/10
+f 45/60/4 50/65/4 49/64/4 46/61/4
+f 58/69/1 57/70/1 61/71/1 62/72/1
+f 51/73/7 55/74/7 56/75/7 52/76/7
+f 52/77/3 56/78/3 57/79/3 53/80/3
+f 53/81/6 57/70/6 58/69/6 54/82/6
+f 55/83/2 51/84/2 54/85/2 58/86/2
+f 62/87/2 59/88/2 55/83/2 58/86/2
+f 55/74/5 59/89/5 60/90/5 56/75/5
+f 57/79/3 56/78/3 60/91/3 61/92/3
+f 62/72/9 61/71/9 63/93/9 64/94/9
+f 60/90/8 59/89/8 65/95/8 66/96/8
+f 64/94/1 63/93/1 67/97/1 68/98/1
+f 66/96/5 65/95/5 69/99/5 70/100/5
+f 67/97/4 70/100/4 69/99/4 68/98/4
+f 59/88/2 62/87/2 64/101/2 68/98/2 69/99/2 65/102/2
+f 60/91/3 66/103/3 70/100/3 67/97/3 63/104/3 61/92/3
+f 75/105/4 78/106/4 77/107/4 76/108/4
+f 71/109/2 75/105/2 76/108/2 72/110/2
+f 72/111/5 76/108/5 77/107/5 73/112/5
+f 73/113/3 77/107/3 78/106/3 74/114/3
+f 75/105/1 71/115/1 74/116/1 78/106/1
+f 83/117/4 86/118/4 85/119/4 84/120/4
+f 79/121/3 83/117/3 84/120/3 80/122/3
+f 80/123/1 84/120/1 85/119/1 81/124/1
+f 81/125/2 85/119/2 86/118/2 82/126/2
+f 83/117/5 79/127/5 82/128/5 86/118/5
+f 91/129/4 94/130/4 93/131/4 92/132/4
+f 87/133/2 91/129/2 92/132/2 88/134/2
+f 88/135/5 92/132/5 93/131/5 89/136/5
+f 89/137/3 93/131/3 94/130/3 90/138/3
+f 91/129/1 87/139/1 90/140/1 94/130/1
+f 96/141/5 95/142/5 97/143/5 98/144/5
+f 98/144/2 97/145/2 101/146/2 102/147/2
+f 100/148/3 99/149/3 95/150/3 96/141/3
+f 100/148/4 96/141/4 98/144/4 102/147/4
+g dtrack_vst1_Cube.031_SlopeGravelMaterial
+f 3/151/3 6/152/3 5/153/3 2/154/3
+f 1/155/11 2/156/11 5/157/11 4/158/11
+f 1/159/5 3/151/5 2/160/5
+f 6/152/1 4/161/1 5/162/1
+f 4/161/4 6/152/4 3/151/4 1/159/4
diff --git a/advtrains/advtrains/models/advtrains_dtrack_vst1_45.obj b/advtrains/advtrains/models/advtrains_dtrack_vst1_45.obj
new file mode 100644
index 0000000..8ff8343
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_dtrack_vst1_45.obj
@@ -0,0 +1,434 @@
+# Blender v2.78 (sub 0) OBJ File: 'rail_redo.blend'
+# www.blender.org
+o dtrack_vst1_45_Cube.033
+v 0.111416 -0.221340 0.354093
+v 0.111416 -0.057279 0.354093
+v 0.354093 -0.342660 0.111416
+v 0.354093 -0.178600 0.111416
+v 0.205542 -0.221340 0.448220
+v 0.205542 -0.057279 0.448220
+v 0.448220 -0.342660 0.205543
+v 0.448220 -0.178600 0.205543
+v -0.208358 0.039814 0.791422
+v 0.791423 -0.460000 -0.208357
+v 0.896243 -0.460000 -0.103536
+v -0.103538 0.039814 0.896242
+v -0.164683 0.059814 0.835097
+v 0.835098 -0.440000 -0.164682
+v 0.852568 -0.440000 -0.147212
+v -0.147213 0.059814 0.852567
+v -0.164683 0.109814 0.835097
+v 0.835098 -0.390000 -0.164682
+v 0.852568 -0.390000 -0.147212
+v -0.147213 0.109814 0.852567
+v 0.874406 -0.385000 -0.125374
+v -0.125375 0.114814 0.874405
+v -0.186520 0.114814 0.813259
+v 0.813260 -0.385000 -0.186519
+v 0.874406 -0.360000 -0.125374
+v -0.125375 0.139814 0.874405
+v -0.186520 0.139814 0.813259
+v 0.813260 -0.360000 -0.186519
+v 0.476117 -0.186104 0.572089
+v -0.572088 -0.186104 -0.476117
+v -0.656942 -0.143684 -0.391265
+v 0.391264 -0.143684 0.656941
+v 0.476117 -0.236104 0.572089
+v -0.572088 -0.236104 -0.476117
+v -0.656941 -0.193684 -0.391265
+v 0.391264 -0.193684 0.656942
+v -0.508186 2.879001 0.491594
+v 0.491594 2.379186 -0.508186
+v -0.508186 2.900629 0.491593
+v 0.491594 2.400814 -0.508186
+v 0.508186 2.379186 -0.491594
+v -0.491594 2.879001 0.508186
+v 0.508186 2.400814 -0.491594
+v -0.491594 2.900629 0.508186
+v 0.208358 -0.460000 -0.791421
+v -0.791423 0.039814 0.208357
+v -0.896244 0.039814 0.103537
+v 0.103537 -0.460000 -0.896242
+v 0.164682 -0.440000 -0.835097
+v -0.835099 0.059815 0.164682
+v -0.852568 0.059814 0.147212
+v 0.147212 -0.440000 -0.852567
+v 0.164682 -0.390000 -0.835097
+v -0.835099 0.109815 0.164682
+v -0.852568 0.109814 0.147212
+v 0.147212 -0.390000 -0.852567
+v -0.874406 0.114814 0.125374
+v 0.125375 -0.385000 -0.874404
+v 0.186520 -0.385000 -0.813259
+v -0.813261 0.114815 0.186520
+v -0.874406 0.139814 0.125374
+v 0.125375 -0.360000 -0.874404
+v 0.186520 -0.360000 -0.813259
+v -0.813261 0.139814 0.186520
+v -0.230055 -0.407095 -0.818151
+v 0.818151 -0.407095 0.230055
+v 0.733298 -0.364675 0.314908
+v -0.314908 -0.364675 -0.733299
+v -0.230055 -0.357095 -0.818151
+v 0.818151 -0.357095 0.230056
+v 0.733298 -0.314675 0.314908
+v -0.314908 -0.314675 -0.733298
+v 0.314908 -0.105511 0.733298
+v -0.733298 -0.105511 -0.314908
+v -0.818151 -0.063091 -0.230056
+v 0.230055 -0.063091 0.818151
+v 0.314908 -0.155511 0.733298
+v -0.733298 -0.155511 -0.314908
+v -0.818151 -0.113091 -0.230055
+v 0.230055 -0.113091 0.818151
+v -0.391264 -0.326502 -0.656942
+v 0.656941 -0.326502 0.391265
+v 0.572089 -0.284082 0.476118
+v -0.476117 -0.284082 -0.572089
+v -0.391264 -0.276502 -0.656941
+v 0.656942 -0.276502 0.391265
+v 0.572088 -0.234082 0.476117
+v -0.476117 -0.234082 -0.572089
+v -0.354093 -0.221340 -0.111416
+v -0.354093 -0.057279 -0.111416
+v -0.111416 -0.342660 -0.354093
+v -0.111416 -0.178600 -0.354093
+v -0.448220 -0.221340 -0.205543
+v -0.448220 -0.057279 -0.205543
+v -0.205543 -0.342660 -0.448220
+v -0.205543 -0.178600 -0.448220
+v -0.069408 -0.487406 -0.978798
+v 0.978798 -0.487406 0.069409
+v 0.893945 -0.444986 0.154261
+v -0.154261 -0.444986 -0.893945
+v -0.069408 -0.437406 -0.978798
+v 0.978798 -0.437406 0.069409
+v 0.893945 -0.394986 0.154261
+v -0.154261 -0.394986 -0.893945
+v 0.069408 -0.032780 0.978798
+v -0.978798 -0.032780 -0.069409
+v -0.893945 -0.075200 -0.154261
+v 0.154261 -0.075200 0.893945
+v 0.069408 0.017220 0.978797
+v -0.978798 0.017220 -0.069409
+v -0.893945 -0.025200 -0.154261
+v 0.154261 -0.025200 0.893945
+v -0.029561 -0.500000 -1.029558
+v 1.029558 -0.500000 0.029561
+v -1.029558 -0.500000 -0.029561
+v -1.029558 0.000000 -0.029561
+v 0.029561 -0.500000 1.029558
+v 0.029561 0.000000 1.029558
+v -0.500000 0.000000 1.559119
+v -1.559119 0.000000 0.500000
+v -0.499999 0.000000 0.499999
+v -1.559120 -0.500000 0.500000
+v -0.500000 -0.500000 1.559119
+v -0.500003 -0.500000 0.500000
+vt 0.7427 0.1169
+vt 0.7427 0.3317
+vt 0.6400 0.3317
+vt 0.6400 0.1169
+vt 0.8260 0.3317
+vt 0.8260 0.4343
+vt 0.7427 0.4343
+vt 0.8260 0.1169
+vt 0.7427 0.0142
+vt 0.8260 0.0142
+vt 0.5691 0.2971
+vt 0.5691 0.9229
+vt 0.5378 0.9229
+vt 0.5378 0.2971
+vt 0.3413 0.2971
+vt 0.3819 0.2971
+vt 0.3819 0.9229
+vt 0.3413 0.9229
+vt 0.4291 0.9855
+vt 0.4678 0.9730
+vt 0.4833 0.9730
+vt 0.5219 0.9855
+vt 0.6097 0.9229
+vt 0.6097 0.2971
+vt 0.4678 0.2470
+vt 0.4291 0.2345
+vt 0.5219 0.2345
+vt 0.4833 0.2470
+vt 0.4833 0.2783
+vt 0.4678 0.2783
+vt 0.4132 0.2971
+vt 0.4132 0.9229
+vt 0.4678 0.9417
+vt 0.4833 0.9417
+vt 0.5182 0.9229
+vt 0.5182 0.2971
+vt 0.4328 0.2971
+vt 0.4328 0.9229
+vt 0.5026 0.9229
+vt 0.5026 0.2971
+vt 0.4485 0.2971
+vt 0.4485 0.9229
+vt 0.5026 0.2814
+vt 0.4485 0.2814
+vt 0.4485 0.9386
+vt 0.5026 0.9386
+vt 0.9588 0.9625
+vt 0.9588 0.9938
+vt 0.8837 0.9938
+vt 0.8837 0.9625
+vt 0.8524 0.0348
+vt 0.8837 0.0348
+vt 0.8524 0.9625
+vt 0.9588 0.0035
+vt 0.9588 0.0348
+vt 0.8837 0.0035
+vt 0.9901 0.9625
+vt 0.9901 0.0348
+vt 0.6554 0.3627
+vt 0.6690 0.3627
+vt 0.6690 0.9885
+vt 0.6554 0.9885
+vt 0.6972 0.9885
+vt 0.6837 0.9885
+vt 0.6837 0.3627
+vt 0.6972 0.3627
+vt 0.7119 0.3627
+vt 0.7119 0.9885
+vt 0.5691 0.2971
+vt 0.5691 0.9229
+vt 0.5378 0.9229
+vt 0.5378 0.2971
+vt 0.3413 0.2971
+vt 0.3819 0.2971
+vt 0.3819 0.9229
+vt 0.3413 0.9229
+vt 0.4291 0.9855
+vt 0.4678 0.9730
+vt 0.4833 0.9730
+vt 0.5219 0.9855
+vt 0.6097 0.9229
+vt 0.6097 0.2971
+vt 0.4678 0.2470
+vt 0.4291 0.2345
+vt 0.5219 0.2345
+vt 0.4833 0.2470
+vt 0.4833 0.2783
+vt 0.4678 0.2783
+vt 0.4132 0.2971
+vt 0.4132 0.9229
+vt 0.4678 0.9417
+vt 0.4833 0.9417
+vt 0.5182 0.9229
+vt 0.5182 0.2971
+vt 0.4328 0.2971
+vt 0.4328 0.9229
+vt 0.5026 0.9229
+vt 0.5026 0.2971
+vt 0.4485 0.2971
+vt 0.4485 0.9229
+vt 0.5026 0.2814
+vt 0.4485 0.2814
+vt 0.4485 0.9386
+vt 0.5026 0.9386
+vt 0.9588 0.9625
+vt 0.8837 0.9625
+vt 0.8837 0.0348
+vt 0.9588 0.0348
+vt 0.9901 0.9625
+vt 0.9901 0.0348
+vt 0.9588 0.0035
+vt 0.8837 0.0035
+vt 0.8524 0.0348
+vt 0.8524 0.9625
+vt 0.9588 0.9938
+vt 0.8837 0.9938
+vt 0.9588 0.9625
+vt 0.9588 0.9938
+vt 0.8837 0.9938
+vt 0.8837 0.9625
+vt 0.8524 0.0348
+vt 0.8837 0.0348
+vt 0.8524 0.9625
+vt 0.9588 0.0035
+vt 0.9588 0.0348
+vt 0.8837 0.0035
+vt 0.9901 0.9625
+vt 0.9901 0.0348
+vt 0.9588 0.9625
+vt 0.8837 0.9625
+vt 0.8837 0.0348
+vt 0.9588 0.0348
+vt 0.9901 0.9625
+vt 0.9901 0.0348
+vt 0.9588 0.0035
+vt 0.8837 0.0035
+vt 0.8524 0.0348
+vt 0.8524 0.9625
+vt 0.9588 0.9938
+vt 0.8837 0.9938
+vt 0.7427 0.1169
+vt 0.6400 0.1169
+vt 0.6400 0.3317
+vt 0.7427 0.3317
+vt 0.7427 0.4343
+vt 0.8260 0.4343
+vt 0.8260 0.3317
+vt 0.8260 0.1169
+vt 0.8260 0.0142
+vt 0.7427 0.0142
+vt 0.9588 0.9625
+vt 0.8837 0.9625
+vt 0.8837 0.0348
+vt 0.9588 0.0348
+vt 0.9901 0.9625
+vt 0.9901 0.0348
+vt 0.9588 0.0035
+vt 0.8837 0.0035
+vt 0.8524 0.0348
+vt 0.8524 0.9625
+vt 0.9588 0.9938
+vt 0.8837 0.9938
+vt 0.9588 0.9625
+vt 0.8837 0.9625
+vt 0.8837 0.0348
+vt 0.9588 0.0348
+vt 0.9901 0.9625
+vt 0.9901 0.0348
+vt 0.9588 0.0035
+vt 0.8837 0.0035
+vt 0.8524 0.0348
+vt 0.8524 0.9625
+vt 0.9588 0.9938
+vt 0.8837 0.9938
+vt -0.3235 0.5003
+vt 0.6181 0.0296
+vt 0.6181 0.5003
+vt 0.6188 0.9848
+vt -0.3228 0.5141
+vt 0.6188 0.5141
+vt 0.0669 1.0031
+vt 0.0669 0.5045
+vt 0.0669 0.0059
+vt 1.1195 0.0059
+vt 1.1195 1.0031
+vt 0.1925 0.0071
+vt 0.1925 0.5057
+vt -0.3061 0.0071
+vt -0.4317 1.0031
+vt -0.4317 0.0059
+vt 1.1341 0.0071
+vt 1.1341 1.0043
+vt 0.1925 1.0043
+vt 1.1202 0.9906
+vt 0.4151 0.9906
+vt 0.4151 0.5199
+vt 1.1202 0.5199
+vt 0.4050 0.0285
+vt 1.1101 0.0285
+vt 1.1101 0.4992
+vt 0.4050 0.4992
+vt -0.3061 1.0043
+vt 1.1174 0.5141
+vt 1.1174 0.9848
+vt 1.1167 0.0296
+vt 1.1167 0.5003
+vn -0.7071 0.0000 -0.7071
+vn 0.7071 0.0000 -0.7071
+vn -0.7071 0.0000 0.7071
+vn 0.2357 0.9428 -0.2357
+vn 0.7071 0.0000 0.7071
+vn 0.0189 0.9017 -0.4319
+vn 0.4319 0.9017 -0.0189
+vn -0.1263 -0.9320 0.3397
+vn -0.3397 -0.9320 0.1263
+vn -0.2357 -0.9428 0.2357
+vn 0.0000 -1.0000 0.0000
+vn 0.0000 1.0000 0.0000
+vn 0.0000 0.0000 1.0000
+vn -1.0000 0.0000 0.0000
+g dtrack_vst1_45_Cube.033_SlopeRailMaterial
+s off
+f 2/1/1 4/2/1 3/3/1 1/4/1
+f 4/2/2 8/5/2 7/6/2 3/7/2
+f 6/8/3 2/1/3 1/9/3 5/10/3
+f 6/8/4 8/5/4 4/2/4 2/1/4
+f 16/11/5 15/12/5 19/13/5 20/14/5
+f 9/15/6 13/16/6 14/17/6 10/18/6
+f 10/19/2 14/20/2 15/21/2 11/22/2
+f 11/23/7 15/12/7 16/11/7 12/24/7
+f 13/25/3 9/26/3 12/27/3 16/28/3
+f 20/29/3 17/30/3 13/25/3 16/28/3
+f 13/16/1 17/31/1 18/32/1 14/17/1
+f 15/21/2 14/20/2 18/33/2 19/34/2
+f 20/14/8 19/13/8 21/35/8 22/36/8
+f 18/32/9 17/31/9 23/37/9 24/38/9
+f 22/36/5 21/35/5 25/39/5 26/40/5
+f 24/38/1 23/37/1 27/41/1 28/42/1
+f 25/39/4 28/42/4 27/41/4 26/40/4
+f 17/30/3 20/29/3 22/43/3 26/40/3 27/41/3 23/44/3
+f 18/33/2 24/45/2 28/42/2 25/39/2 21/46/2 19/34/2
+f 32/47/5 36/48/5 33/49/5 29/50/5
+f 34/51/2 30/52/2 29/50/2 33/53/2
+f 35/54/1 31/55/1 30/52/1 34/56/1
+f 36/57/3 32/47/3 31/55/3 35/58/3
+f 32/47/4 29/50/4 30/52/4 31/55/4
+f 37/59/1 39/60/1 40/61/1 38/62/1
+f 41/63/5 43/64/5 44/65/5 42/66/5
+f 37/67/10 38/68/10 41/63/10 42/66/10
+f 39/60/4 44/65/4 43/64/4 40/61/4
+f 52/69/1 51/70/1 55/71/1 56/72/1
+f 45/73/7 49/74/7 50/75/7 46/76/7
+f 46/77/3 50/78/3 51/79/3 47/80/3
+f 47/81/6 51/70/6 52/69/6 48/82/6
+f 49/83/2 45/84/2 48/85/2 52/86/2
+f 56/87/2 53/88/2 49/83/2 52/86/2
+f 49/74/5 53/89/5 54/90/5 50/75/5
+f 51/79/3 50/78/3 54/91/3 55/92/3
+f 56/72/9 55/71/9 57/93/9 58/94/9
+f 54/90/8 53/89/8 59/95/8 60/96/8
+f 58/94/1 57/93/1 61/97/1 62/98/1
+f 60/96/5 59/95/5 63/99/5 64/100/5
+f 61/97/4 64/100/4 63/99/4 62/98/4
+f 53/88/2 56/87/2 58/101/2 62/98/2 63/99/2 59/102/2
+f 54/91/3 60/103/3 64/100/3 61/97/3 57/104/3 55/92/3
+f 69/105/4 72/106/4 71/107/4 70/108/4
+f 65/109/2 69/105/2 70/108/2 66/110/2
+f 66/111/5 70/108/5 71/107/5 67/112/5
+f 67/113/3 71/107/3 72/106/3 68/114/3
+f 69/105/1 65/115/1 68/116/1 72/106/1
+f 76/117/5 80/118/5 77/119/5 73/120/5
+f 78/121/2 74/122/2 73/120/2 77/123/2
+f 79/124/1 75/125/1 74/122/1 78/126/1
+f 80/127/3 76/117/3 75/125/3 79/128/3
+f 76/117/4 73/120/4 74/122/4 75/125/4
+f 85/129/4 88/130/4 87/131/4 86/132/4
+f 81/133/2 85/129/2 86/132/2 82/134/2
+f 82/135/5 86/132/5 87/131/5 83/136/5
+f 83/137/3 87/131/3 88/130/3 84/138/3
+f 85/129/1 81/139/1 84/140/1 88/130/1
+f 90/141/5 89/142/5 91/143/5 92/144/5
+f 92/144/2 91/145/2 95/146/2 96/147/2
+f 94/148/3 93/149/3 89/150/3 90/141/3
+f 94/148/4 90/141/4 92/144/4 96/147/4
+f 101/151/4 104/152/4 103/153/4 102/154/4
+f 97/155/2 101/151/2 102/154/2 98/156/2
+f 98/157/5 102/154/5 103/153/5 99/158/5
+f 99/159/3 103/153/3 104/152/3 100/160/3
+f 101/151/1 97/161/1 100/162/1 104/152/1
+f 109/163/4 112/164/4 111/165/4 110/166/4
+f 105/167/3 109/163/3 110/166/3 106/168/3
+f 106/169/1 110/166/1 111/165/1 107/170/1
+f 107/171/2 111/165/2 112/164/2 108/172/2
+f 109/163/5 105/173/5 108/174/5 112/164/5
+g dtrack_vst1_45_Cube.033_SlopeGravelMaterial
+f 114/175/5 118/176/5 117/177/5
+f 116/178/1 113/179/1 115/180/1
+f 116/181/4 121/182/4 118/183/4 114/184/4 113/185/4
+f 115/186/11 124/187/11 122/188/11
+f 116/181/12 120/189/12 121/182/12
+f 118/183/12 121/182/12 119/190/12
+f 113/191/11 114/192/11 117/193/11 124/187/11 115/186/11
+f 121/194/13 120/195/13 122/196/13 124/197/13
+f 119/198/14 121/199/14 124/200/14 123/201/14
+f 123/202/11 124/187/11 117/193/11
+f 116/178/1 115/180/1 122/203/1 120/204/1
+f 117/177/5 118/176/5 119/205/5 123/206/5
diff --git a/advtrains/advtrains/models/advtrains_dtrack_vst2.obj b/advtrains/advtrains/models/advtrains_dtrack_vst2.obj
new file mode 100644
index 0000000..444ce42
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_dtrack_vst2.obj
@@ -0,0 +1,372 @@
+# Blender v2.78 (sub 0) OBJ File: 'rail_redo.blend'
+# www.blender.org
+o dtrack_vst2_Cube.032
+v 0.753760 0.000000 -0.500000
+v 0.753760 0.000000 0.500000
+v 0.753760 0.500000 0.500000
+v -0.753760 0.000000 -0.500000
+v -0.753760 0.000000 0.500000
+v -0.753760 0.500000 0.500000
+v 0.329165 0.303892 0.171599
+v 0.329165 0.467953 0.171599
+v 0.329165 0.132293 -0.171599
+v 0.329165 0.296354 -0.171599
+v 0.462280 0.303892 0.171599
+v 0.462280 0.467953 0.171599
+v 0.462280 0.132293 -0.171599
+v 0.462280 0.296354 -0.171599
+v 0.412289 0.540000 0.500000
+v 0.412289 0.040000 -0.500000
+v 0.560528 0.040000 -0.500000
+v 0.560528 0.540000 0.500000
+v 0.474055 0.560000 0.500000
+v 0.474055 0.060000 -0.500000
+v 0.498762 0.060000 -0.500000
+v 0.498762 0.560000 0.500000
+v 0.474055 0.610000 0.500000
+v 0.474055 0.110000 -0.500000
+v 0.498762 0.110000 -0.500000
+v 0.498762 0.610000 0.500000
+v 0.529645 0.115000 -0.500000
+v 0.529645 0.615000 0.500000
+v 0.443172 0.615000 0.500000
+v 0.443172 0.115000 -0.500000
+v 0.529645 0.140000 -0.500000
+v 0.529645 0.640000 0.500000
+v 0.443172 0.640000 0.500000
+v 0.443172 0.140000 -0.500000
+v 0.741194 0.457500 0.435000
+v -0.741194 0.457500 0.435000
+v -0.741194 0.397500 0.315000
+v 0.741194 0.397500 0.315000
+v 0.741193 0.507500 0.435000
+v -0.741194 0.507500 0.435000
+v -0.741194 0.447500 0.315000
+v 0.741194 0.447500 0.315000
+v -0.011733 3.379186 0.500000
+v -0.011732 2.879186 -0.500001
+v -0.011733 3.400814 0.500000
+v -0.011732 2.900814 -0.500000
+v 0.011732 2.879186 -0.500000
+v 0.011732 3.379186 0.500000
+v 0.011732 2.900814 -0.500000
+v 0.011732 3.400814 0.500000
+v -0.412289 0.040000 -0.500000
+v -0.412289 0.540000 0.500000
+v -0.560528 0.540000 0.500000
+v -0.560528 0.040000 -0.500000
+v -0.474055 0.060000 -0.500000
+v -0.474055 0.560000 0.500000
+v -0.498762 0.560000 0.500000
+v -0.498762 0.060000 -0.500000
+v -0.474055 0.110000 -0.500000
+v -0.474055 0.610000 0.500000
+v -0.498762 0.610000 0.500000
+v -0.498762 0.110000 -0.500000
+v -0.529645 0.615000 0.500000
+v -0.529645 0.115000 -0.500000
+v -0.443172 0.115000 -0.500000
+v -0.443172 0.615000 0.500000
+v -0.529645 0.640000 0.500000
+v -0.529645 0.140000 -0.500000
+v -0.443172 0.140000 -0.500000
+v -0.443172 0.640000 0.500000
+v -0.741194 0.022500 -0.435000
+v 0.741194 0.022500 -0.435000
+v 0.741194 0.082500 -0.315000
+v -0.741194 0.082500 -0.315000
+v -0.741193 0.072500 -0.435000
+v 0.741194 0.072500 -0.435000
+v 0.741194 0.132500 -0.315000
+v -0.741194 0.132500 -0.315000
+v 0.741194 0.333931 0.187862
+v -0.741194 0.333931 0.187862
+v -0.741194 0.273931 0.067862
+v 0.741194 0.273931 0.067862
+v 0.741193 0.383931 0.187862
+v -0.741194 0.383931 0.187862
+v -0.741194 0.323931 0.067862
+v 0.741194 0.323931 0.067862
+v -0.741194 0.146069 -0.187862
+v 0.741194 0.146069 -0.187862
+v 0.741194 0.206069 -0.067862
+v -0.741194 0.206069 -0.067862
+v -0.741193 0.196069 -0.187862
+v 0.741194 0.196069 -0.187862
+v 0.741194 0.256069 -0.067862
+v -0.741194 0.256069 -0.067862
+v -0.329165 0.303892 0.171599
+v -0.329165 0.467953 0.171599
+v -0.329165 0.132293 -0.171599
+v -0.329165 0.296354 -0.171599
+v -0.462280 0.303892 0.171599
+v -0.462280 0.467953 0.171599
+v -0.462280 0.132293 -0.171599
+v -0.462280 0.296354 -0.171599
+v 0.753760 -0.500000 0.500000
+v 0.753760 -0.500000 -0.500000
+v -0.753760 -0.500000 0.500000
+v -0.753760 -0.500000 -0.500000
+vt 0.7427 0.1169
+vt 0.7427 0.3317
+vt 0.6400 0.3317
+vt 0.6400 0.1169
+vt 0.8260 0.3317
+vt 0.8260 0.4343
+vt 0.7427 0.4343
+vt 0.8260 0.1169
+vt 0.7427 0.0142
+vt 0.8260 0.0142
+vt 0.5691 0.2971
+vt 0.5691 0.9229
+vt 0.5378 0.9229
+vt 0.5378 0.2971
+vt 0.3413 0.2971
+vt 0.3819 0.2971
+vt 0.3819 0.9229
+vt 0.3413 0.9229
+vt 0.4291 0.9855
+vt 0.4678 0.9730
+vt 0.4833 0.9730
+vt 0.5219 0.9855
+vt 0.6097 0.9229
+vt 0.6097 0.2971
+vt 0.4678 0.2470
+vt 0.4291 0.2345
+vt 0.5219 0.2345
+vt 0.4833 0.2470
+vt 0.4833 0.2783
+vt 0.4678 0.2783
+vt 0.4132 0.2971
+vt 0.4132 0.9229
+vt 0.4678 0.9417
+vt 0.4833 0.9417
+vt 0.5182 0.9229
+vt 0.5182 0.2971
+vt 0.4328 0.2971
+vt 0.4328 0.9229
+vt 0.5026 0.9229
+vt 0.5026 0.2971
+vt 0.4485 0.2971
+vt 0.4485 0.9229
+vt 0.5026 0.2814
+vt 0.4485 0.2814
+vt 0.4485 0.9386
+vt 0.5026 0.9386
+vt 0.9588 0.9625
+vt 0.8837 0.9625
+vt 0.8837 0.0348
+vt 0.9588 0.0348
+vt 0.9901 0.9625
+vt 0.9901 0.0348
+vt 0.9588 0.0035
+vt 0.8837 0.0035
+vt 0.8524 0.0348
+vt 0.8524 0.9625
+vt 0.9588 0.9938
+vt 0.8837 0.9938
+vt 0.6554 0.3627
+vt 0.6690 0.3627
+vt 0.6690 0.9885
+vt 0.6554 0.9885
+vt 0.6972 0.9885
+vt 0.6837 0.9885
+vt 0.6837 0.3627
+vt 0.6972 0.3627
+vt 0.7119 0.3627
+vt 0.7119 0.9885
+vt 0.5691 0.2971
+vt 0.5691 0.9229
+vt 0.5378 0.9229
+vt 0.5378 0.2971
+vt 0.3413 0.2971
+vt 0.3819 0.2971
+vt 0.3819 0.9229
+vt 0.3413 0.9229
+vt 0.4291 0.9855
+vt 0.4678 0.9730
+vt 0.4833 0.9730
+vt 0.5219 0.9855
+vt 0.6097 0.9229
+vt 0.6097 0.2971
+vt 0.4678 0.2470
+vt 0.4291 0.2345
+vt 0.5219 0.2345
+vt 0.4833 0.2470
+vt 0.4833 0.2783
+vt 0.4678 0.2783
+vt 0.4132 0.2971
+vt 0.4132 0.9229
+vt 0.4678 0.9417
+vt 0.4833 0.9417
+vt 0.5182 0.9229
+vt 0.5182 0.2971
+vt 0.4328 0.2971
+vt 0.4328 0.9229
+vt 0.5026 0.9229
+vt 0.5026 0.2971
+vt 0.4485 0.2971
+vt 0.4485 0.9229
+vt 0.5026 0.2814
+vt 0.4485 0.2814
+vt 0.4485 0.9386
+vt 0.5026 0.9386
+vt 0.9588 0.9625
+vt 0.8837 0.9625
+vt 0.8837 0.0348
+vt 0.9588 0.0348
+vt 0.9901 0.9625
+vt 0.9901 0.0348
+vt 0.9588 0.0035
+vt 0.8837 0.0035
+vt 0.8524 0.0348
+vt 0.8524 0.9625
+vt 0.9588 0.9938
+vt 0.8837 0.9938
+vt 0.9588 0.9625
+vt 0.8837 0.9625
+vt 0.8837 0.0348
+vt 0.9588 0.0348
+vt 0.9901 0.9625
+vt 0.9901 0.0348
+vt 0.9588 0.0035
+vt 0.8837 0.0035
+vt 0.8524 0.0348
+vt 0.8524 0.9625
+vt 0.9588 0.9938
+vt 0.8837 0.9938
+vt 0.9588 0.9625
+vt 0.8837 0.9625
+vt 0.8837 0.0348
+vt 0.9588 0.0348
+vt 0.9901 0.9625
+vt 0.9901 0.0348
+vt 0.9588 0.0035
+vt 0.8837 0.0035
+vt 0.8524 0.0348
+vt 0.8524 0.9625
+vt 0.9588 0.9938
+vt 0.8837 0.9938
+vt 0.7427 0.1169
+vt 0.6400 0.1169
+vt 0.6400 0.3317
+vt 0.7427 0.3317
+vt 0.7427 0.4343
+vt 0.8260 0.4343
+vt 0.8260 0.3317
+vt 0.8260 0.1169
+vt 0.8260 0.0142
+vt 0.7427 0.0142
+vt 1.2113 -0.1167
+vt -0.2846 -0.1167
+vt -0.2846 -0.6128
+vt 1.2113 -0.6128
+vt -0.2852 0.4989
+vt 1.2107 0.4989
+vt 1.2107 0.9950
+vt -0.2852 0.9950
+vt 1.2113 0.9927
+vt 1.6551 0.1052
+vt -0.2846 0.9927
+vt -0.7284 0.1052
+vt -0.2873 0.9952
+vt -0.2873 0.0029
+vt 1.2086 0.0029
+vt 1.2086 0.9952
+vt 0.7066 0.9945
+vt -0.2857 0.9945
+vt -0.2857 0.4984
+vt 0.7066 0.4984
+vt 1.2107 0.9918
+vt -0.2852 0.9918
+vt -0.2852 0.4956
+vt 1.2107 0.4956
+vt 0.7071 0.9996
+vt -0.2852 0.9996
+vt -0.2852 0.5034
+vt 0.7071 0.5034
+vn -1.0000 0.0000 -0.0000
+vn 0.0000 0.0000 -1.0000
+vn -0.0000 0.0000 1.0000
+vn 0.0000 0.8944 -0.4472
+vn 1.0000 0.0000 0.0000
+vn -0.2782 0.8591 -0.4296
+vn 0.2782 0.8591 -0.4296
+vn 0.1433 -0.8852 0.4426
+vn -0.1433 -0.8852 0.4426
+vn 0.0000 -0.8944 0.4472
+vn 0.0000 -1.0000 0.0000
+g dtrack_vst2_Cube.032_SlopeRailMaterial
+s off
+f 8/1/1 10/2/1 9/3/1 7/4/1
+f 10/2/2 14/5/2 13/6/2 9/7/2
+f 12/8/3 8/1/3 7/9/3 11/10/3
+f 12/8/4 14/5/4 10/2/4 8/1/4
+f 22/11/5 21/12/5 25/13/5 26/14/5
+f 15/15/6 19/16/6 20/17/6 16/18/6
+f 16/19/2 20/20/2 21/21/2 17/22/2
+f 17/23/7 21/12/7 22/11/7 18/24/7
+f 19/25/3 15/26/3 18/27/3 22/28/3
+f 26/29/3 23/30/3 19/25/3 22/28/3
+f 19/16/1 23/31/1 24/32/1 20/17/1
+f 21/21/2 20/20/2 24/33/2 25/34/2
+f 26/14/8 25/13/8 27/35/8 28/36/8
+f 24/32/9 23/31/9 29/37/9 30/38/9
+f 28/36/5 27/35/5 31/39/5 32/40/5
+f 30/38/1 29/37/1 33/41/1 34/42/1
+f 31/39/4 34/42/4 33/41/4 32/40/4
+f 23/30/3 26/29/3 28/43/3 32/40/3 33/41/3 29/44/3
+f 24/33/2 30/45/2 34/42/2 31/39/2 27/46/2 25/34/2
+f 39/47/4 42/48/4 41/49/4 40/50/4
+f 35/51/3 39/47/3 40/50/3 36/52/3
+f 36/53/1 40/50/1 41/49/1 37/54/1
+f 37/55/2 41/49/2 42/48/2 38/56/2
+f 39/47/5 35/57/5 38/58/5 42/48/5
+f 43/59/1 45/60/1 46/61/1 44/62/1
+f 47/63/5 49/64/5 50/65/5 48/66/5
+f 43/67/10 44/68/10 47/63/10 48/66/10
+f 45/60/4 50/65/4 49/64/4 46/61/4
+f 58/69/1 57/70/1 61/71/1 62/72/1
+f 51/73/7 55/74/7 56/75/7 52/76/7
+f 52/77/3 56/78/3 57/79/3 53/80/3
+f 53/81/6 57/70/6 58/69/6 54/82/6
+f 55/83/2 51/84/2 54/85/2 58/86/2
+f 62/87/2 59/88/2 55/83/2 58/86/2
+f 55/74/5 59/89/5 60/90/5 56/75/5
+f 57/79/3 56/78/3 60/91/3 61/92/3
+f 62/72/9 61/71/9 63/93/9 64/94/9
+f 60/90/8 59/89/8 65/95/8 66/96/8
+f 64/94/1 63/93/1 67/97/1 68/98/1
+f 66/96/5 65/95/5 69/99/5 70/100/5
+f 67/97/4 70/100/4 69/99/4 68/98/4
+f 59/88/2 62/87/2 64/101/2 68/98/2 69/99/2 65/102/2
+f 60/91/3 66/103/3 70/100/3 67/97/3 63/104/3 61/92/3
+f 75/105/4 78/106/4 77/107/4 76/108/4
+f 71/109/2 75/105/2 76/108/2 72/110/2
+f 72/111/5 76/108/5 77/107/5 73/112/5
+f 73/113/3 77/107/3 78/106/3 74/114/3
+f 75/105/1 71/115/1 74/116/1 78/106/1
+f 83/117/4 86/118/4 85/119/4 84/120/4
+f 79/121/3 83/117/3 84/120/3 80/122/3
+f 80/123/1 84/120/1 85/119/1 81/124/1
+f 81/125/2 85/119/2 86/118/2 82/126/2
+f 83/117/5 79/127/5 82/128/5 86/118/5
+f 91/129/4 94/130/4 93/131/4 92/132/4
+f 87/133/2 91/129/2 92/132/2 88/134/2
+f 88/135/5 92/132/5 93/131/5 89/136/5
+f 89/137/3 93/131/3 94/130/3 90/138/3
+f 91/129/1 87/139/1 90/140/1 94/130/1
+f 96/141/5 95/142/5 97/143/5 98/144/5
+f 98/144/2 97/145/2 101/146/2 102/147/2
+f 100/148/3 99/149/3 95/150/3 96/141/3
+f 100/148/4 96/141/4 98/144/4 102/147/4
+g dtrack_vst2_Cube.032_SlopeGravelMaterial
+f 3/151/3 6/152/3 5/153/3 2/154/3
+f 4/155/2 1/156/2 104/157/2 106/158/2
+f 1/159/5 3/151/5 2/160/5
+f 6/152/1 4/161/1 5/162/1
+f 4/161/4 6/152/4 3/151/4 1/159/4
+f 104/163/11 103/164/11 105/165/11 106/166/11
+f 5/167/1 4/168/1 106/169/1 105/170/1
+f 2/171/3 5/172/3 105/173/3 103/174/3
+f 1/175/5 2/176/5 103/177/5 104/178/5
diff --git a/advtrains/advtrains/models/advtrains_dtrack_vst2_45.obj b/advtrains/advtrains/models/advtrains_dtrack_vst2_45.obj
new file mode 100644
index 0000000..5dc708b
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_dtrack_vst2_45.obj
@@ -0,0 +1,462 @@
+# Blender v2.78 (sub 0) OBJ File: 'rail_redo.blend'
+# www.blender.org
+o dtrack_vst2_45_Cube.035
+v 0.111416 0.278660 0.354093
+v 0.111416 0.442721 0.354093
+v 0.354093 0.157340 0.111416
+v 0.354093 0.321400 0.111416
+v 0.205542 0.278660 0.448220
+v 0.205542 0.442721 0.448220
+v 0.448220 0.157340 0.205543
+v 0.448220 0.321400 0.205543
+v -0.208358 0.539814 0.791422
+v 0.791423 0.040000 -0.208357
+v 0.896243 0.040000 -0.103536
+v -0.103538 0.539814 0.896242
+v -0.164683 0.559814 0.835097
+v 0.835098 0.060000 -0.164682
+v 0.852568 0.060000 -0.147212
+v -0.147213 0.559814 0.852567
+v -0.164683 0.609814 0.835097
+v 0.835098 0.110000 -0.164682
+v 0.852568 0.110000 -0.147212
+v -0.147213 0.609814 0.852567
+v 0.874406 0.115000 -0.125374
+v -0.125375 0.614814 0.874405
+v -0.186520 0.614814 0.813259
+v 0.813260 0.115000 -0.186519
+v 0.874406 0.140000 -0.125374
+v -0.125375 0.639814 0.874405
+v -0.186520 0.639814 0.813259
+v 0.813260 0.140000 -0.186519
+v 0.476117 0.313896 0.572089
+v -0.572088 0.313896 -0.476117
+v -0.656942 0.356316 -0.391265
+v 0.391264 0.356316 0.656941
+v 0.476117 0.263896 0.572089
+v -0.572088 0.263896 -0.476117
+v -0.656941 0.306316 -0.391265
+v 0.391264 0.306316 0.656942
+v -0.508186 3.379001 0.491594
+v 0.491594 2.879186 -0.508186
+v -0.508186 3.400629 0.491593
+v 0.491594 2.900814 -0.508186
+v 0.508186 2.879186 -0.491594
+v -0.491594 3.379001 0.508186
+v 0.508186 2.900814 -0.491594
+v -0.491594 3.400629 0.508186
+v 0.208358 0.040000 -0.791421
+v -0.791423 0.539814 0.208357
+v -0.896244 0.539814 0.103537
+v 0.103537 0.040000 -0.896242
+v 0.164682 0.060000 -0.835097
+v -0.835099 0.559815 0.164682
+v -0.852568 0.559814 0.147212
+v 0.147212 0.060000 -0.852567
+v 0.164682 0.110000 -0.835097
+v -0.835099 0.609815 0.164682
+v -0.852568 0.609814 0.147212
+v 0.147212 0.110000 -0.852567
+v -0.874406 0.614814 0.125374
+v 0.125375 0.115000 -0.874404
+v 0.186520 0.115000 -0.813259
+v -0.813261 0.614815 0.186520
+v -0.874406 0.639814 0.125374
+v 0.125375 0.140000 -0.874404
+v 0.186520 0.140000 -0.813259
+v -0.813261 0.639814 0.186520
+v -0.230055 0.092905 -0.818151
+v 0.818151 0.092905 0.230055
+v 0.733298 0.135325 0.314908
+v -0.314908 0.135325 -0.733299
+v -0.230055 0.142905 -0.818151
+v 0.818151 0.142905 0.230056
+v 0.733298 0.185325 0.314908
+v -0.314908 0.185325 -0.733298
+v 0.314908 0.394489 0.733298
+v -0.733298 0.394489 -0.314908
+v -0.818151 0.436909 -0.230056
+v 0.230055 0.436909 0.818151
+v 0.314908 0.344489 0.733298
+v -0.733298 0.344489 -0.314908
+v -0.818151 0.386909 -0.230055
+v 0.230055 0.386909 0.818151
+v -0.391264 0.173498 -0.656942
+v 0.656941 0.173498 0.391265
+v 0.572089 0.215918 0.476118
+v -0.476117 0.215918 -0.572089
+v -0.391264 0.223498 -0.656941
+v 0.656942 0.223498 0.391265
+v 0.572088 0.265918 0.476117
+v -0.476117 0.265918 -0.572089
+v -0.354093 0.278660 -0.111416
+v -0.354093 0.442721 -0.111416
+v -0.111416 0.157340 -0.354093
+v -0.111416 0.321400 -0.354093
+v -0.448220 0.278660 -0.205543
+v -0.448220 0.442721 -0.205543
+v -0.205543 0.157340 -0.448220
+v -0.205543 0.321400 -0.448220
+v -0.069408 0.012594 -0.978798
+v 0.978798 0.012594 0.069409
+v 0.893945 0.055014 0.154261
+v -0.154261 0.055014 -0.893945
+v -0.069408 0.062594 -0.978798
+v 0.978798 0.062594 0.069409
+v 0.893945 0.105014 0.154261
+v -0.154261 0.105014 -0.893945
+v 0.069408 0.467220 0.978798
+v -0.978798 0.467220 -0.069409
+v -0.893945 0.424800 -0.154261
+v 0.154261 0.424800 0.893945
+v 0.069408 0.517220 0.978797
+v -0.978798 0.517220 -0.069409
+v -0.893945 0.474800 -0.154261
+v 0.154261 0.474800 0.893945
+v -0.029561 -0.000000 -1.029558
+v 1.029558 0.000000 0.029561
+v -1.029558 -0.000000 -0.029561
+v -1.029558 0.500000 -0.029561
+v 0.029561 0.000000 1.029558
+v 0.029561 0.500000 1.029558
+v -0.500000 0.500000 1.559119
+v -1.559119 0.500000 0.500000
+v -0.499999 0.500000 0.499999
+v -1.559120 -0.000000 0.500000
+v -0.500000 0.000000 1.559119
+v -0.500003 0.000000 0.500000
+v 1.029558 -0.500000 0.029561
+v -0.029561 -0.500000 -1.029558
+v 0.029561 -0.500000 1.029558
+v -1.029558 -0.500000 -0.029561
+v -0.500003 -0.500000 0.500000
+v -0.500000 -0.500000 1.559119
+v -1.559120 -0.500000 0.500000
+vt 0.7427 0.1169
+vt 0.7427 0.3317
+vt 0.6400 0.3317
+vt 0.6400 0.1169
+vt 0.8260 0.3317
+vt 0.8260 0.4343
+vt 0.7427 0.4343
+vt 0.8260 0.1169
+vt 0.7427 0.0142
+vt 0.8260 0.0142
+vt 0.5691 0.2971
+vt 0.5691 0.9229
+vt 0.5378 0.9229
+vt 0.5378 0.2971
+vt 0.3413 0.2971
+vt 0.3819 0.2971
+vt 0.3819 0.9229
+vt 0.3413 0.9229
+vt 0.4291 0.9855
+vt 0.4678 0.9730
+vt 0.4833 0.9730
+vt 0.5219 0.9855
+vt 0.6097 0.9229
+vt 0.6097 0.2971
+vt 0.4678 0.2470
+vt 0.4291 0.2345
+vt 0.5219 0.2345
+vt 0.4833 0.2470
+vt 0.4833 0.2783
+vt 0.4678 0.2783
+vt 0.4132 0.2971
+vt 0.4132 0.9229
+vt 0.4678 0.9417
+vt 0.4833 0.9417
+vt 0.5182 0.9229
+vt 0.5182 0.2971
+vt 0.4328 0.2971
+vt 0.4328 0.9229
+vt 0.5026 0.9229
+vt 0.5026 0.2971
+vt 0.4485 0.2971
+vt 0.4485 0.9229
+vt 0.5026 0.2814
+vt 0.4485 0.2814
+vt 0.4485 0.9386
+vt 0.5026 0.9386
+vt 0.9588 0.9625
+vt 0.9588 0.9938
+vt 0.8837 0.9938
+vt 0.8837 0.9625
+vt 0.8524 0.0348
+vt 0.8837 0.0348
+vt 0.8524 0.9625
+vt 0.9588 0.0035
+vt 0.9588 0.0348
+vt 0.8837 0.0035
+vt 0.9901 0.9625
+vt 0.9901 0.0348
+vt 0.6554 0.3627
+vt 0.6690 0.3627
+vt 0.6690 0.9885
+vt 0.6554 0.9885
+vt 0.6972 0.9885
+vt 0.6837 0.9885
+vt 0.6837 0.3627
+vt 0.6972 0.3627
+vt 0.7119 0.3627
+vt 0.7119 0.9885
+vt 0.5691 0.2971
+vt 0.5691 0.9229
+vt 0.5378 0.9229
+vt 0.5378 0.2971
+vt 0.3413 0.2971
+vt 0.3819 0.2971
+vt 0.3819 0.9229
+vt 0.3413 0.9229
+vt 0.4291 0.9855
+vt 0.4678 0.9730
+vt 0.4833 0.9730
+vt 0.5219 0.9855
+vt 0.6097 0.9229
+vt 0.6097 0.2971
+vt 0.4678 0.2470
+vt 0.4291 0.2345
+vt 0.5219 0.2345
+vt 0.4833 0.2470
+vt 0.4833 0.2783
+vt 0.4678 0.2783
+vt 0.4132 0.2971
+vt 0.4132 0.9229
+vt 0.4678 0.9417
+vt 0.4833 0.9417
+vt 0.5182 0.9229
+vt 0.5182 0.2971
+vt 0.4328 0.2971
+vt 0.4328 0.9229
+vt 0.5026 0.9229
+vt 0.5026 0.2971
+vt 0.4485 0.2971
+vt 0.4485 0.9229
+vt 0.5026 0.2814
+vt 0.4485 0.2814
+vt 0.4485 0.9386
+vt 0.5026 0.9386
+vt 0.9588 0.9625
+vt 0.8837 0.9625
+vt 0.8837 0.0348
+vt 0.9588 0.0348
+vt 0.9901 0.9625
+vt 0.9901 0.0348
+vt 0.9588 0.0035
+vt 0.8837 0.0035
+vt 0.8524 0.0348
+vt 0.8524 0.9625
+vt 0.9588 0.9938
+vt 0.8837 0.9938
+vt 0.9588 0.9625
+vt 0.9588 0.9938
+vt 0.8837 0.9938
+vt 0.8837 0.9625
+vt 0.8524 0.0348
+vt 0.8837 0.0348
+vt 0.8524 0.9625
+vt 0.9588 0.0035
+vt 0.9588 0.0348
+vt 0.8837 0.0035
+vt 0.9901 0.9625
+vt 0.9901 0.0348
+vt 0.9588 0.9625
+vt 0.8837 0.9625
+vt 0.8837 0.0348
+vt 0.9588 0.0348
+vt 0.9901 0.9625
+vt 0.9901 0.0348
+vt 0.9588 0.0035
+vt 0.8837 0.0035
+vt 0.8524 0.0348
+vt 0.8524 0.9625
+vt 0.9588 0.9938
+vt 0.8837 0.9938
+vt 0.7427 0.1169
+vt 0.6400 0.1169
+vt 0.6400 0.3317
+vt 0.7427 0.3317
+vt 0.7427 0.4343
+vt 0.8260 0.4343
+vt 0.8260 0.3317
+vt 0.8260 0.1169
+vt 0.8260 0.0142
+vt 0.7427 0.0142
+vt 0.9588 0.9625
+vt 0.8837 0.9625
+vt 0.8837 0.0348
+vt 0.9588 0.0348
+vt 0.9901 0.9625
+vt 0.9901 0.0348
+vt 0.9588 0.0035
+vt 0.8837 0.0035
+vt 0.8524 0.0348
+vt 0.8524 0.9625
+vt 0.9588 0.9938
+vt 0.8837 0.9938
+vt 0.9588 0.9625
+vt 0.8837 0.9625
+vt 0.8837 0.0348
+vt 0.9588 0.0348
+vt 0.9901 0.9625
+vt 0.9901 0.0348
+vt 0.9588 0.0035
+vt 0.8837 0.0035
+vt 0.8524 0.0348
+vt 0.8524 0.9625
+vt 0.9588 0.9938
+vt 0.8837 0.9938
+vt -0.2938 0.5095
+vt 0.6540 0.0358
+vt 0.6540 0.5096
+vt 0.6549 0.9852
+vt -0.2928 0.5114
+vt 0.6549 0.5114
+vt 0.1047 0.9953
+vt 0.1047 0.4934
+vt 0.1047 -0.0085
+vt 1.1643 -0.0085
+vt 1.1643 0.9953
+vt 1.1568 0.5114
+vt 0.6549 0.0377
+vt 1.1568 0.0377
+vt -0.3972 0.9953
+vt -0.3972 -0.0085
+vt 1.1431 0.5009
+vt 0.4334 0.5009
+vt 0.4334 0.0272
+vt 1.1431 0.0272
+vt 1.1431 0.9747
+vt 0.4334 0.9747
+vt 0.7633 0.9654
+vt 0.0536 0.9654
+vt 0.0536 0.4916
+vt 0.7633 0.4916
+vt 1.1559 0.5096
+vt 1.1559 0.9833
+vt 0.6540 0.9833
+vt 0.1053 -0.0176
+vt 0.1052 0.4843
+vt -0.3966 -0.0176
+vt 1.0530 -0.0176
+vt 1.0530 0.9861
+vt 0.1053 0.9861
+vt -0.3966 0.9861
+vt 0.0536 0.0179
+vt 0.7633 0.0179
+vt -0.2928 0.0377
+vt -0.2938 0.9833
+vt 0.0455 0.1273
+vt 1.0492 0.1273
+vt 1.0492 0.6011
+vt 0.0455 0.6011
+vt 1.1568 0.9852
+vt 1.1559 0.0358
+vn -0.7071 0.0000 -0.7071
+vn 0.7071 0.0000 -0.7071
+vn -0.7071 0.0000 0.7071
+vn 0.2357 0.9428 -0.2357
+vn 0.7071 0.0000 0.7071
+vn 0.0189 0.9017 -0.4319
+vn 0.4319 0.9017 -0.0189
+vn -0.1263 -0.9320 0.3397
+vn -0.3397 -0.9320 0.1263
+vn -0.2357 -0.9428 0.2357
+vn 0.0000 1.0000 0.0000
+vn -0.0000 0.0000 1.0000
+vn -1.0000 0.0000 0.0000
+vn 0.0000 -1.0000 0.0000
+g dtrack_vst2_45_Cube.035_SlopeRailMaterial
+s off
+f 2/1/1 4/2/1 3/3/1 1/4/1
+f 4/2/2 8/5/2 7/6/2 3/7/2
+f 6/8/3 2/1/3 1/9/3 5/10/3
+f 6/8/4 8/5/4 4/2/4 2/1/4
+f 16/11/5 15/12/5 19/13/5 20/14/5
+f 9/15/6 13/16/6 14/17/6 10/18/6
+f 10/19/2 14/20/2 15/21/2 11/22/2
+f 11/23/7 15/12/7 16/11/7 12/24/7
+f 13/25/3 9/26/3 12/27/3 16/28/3
+f 20/29/3 17/30/3 13/25/3 16/28/3
+f 13/16/1 17/31/1 18/32/1 14/17/1
+f 15/21/2 14/20/2 18/33/2 19/34/2
+f 20/14/8 19/13/8 21/35/8 22/36/8
+f 18/32/9 17/31/9 23/37/9 24/38/9
+f 22/36/5 21/35/5 25/39/5 26/40/5
+f 24/38/1 23/37/1 27/41/1 28/42/1
+f 25/39/4 28/42/4 27/41/4 26/40/4
+f 17/30/3 20/29/3 22/43/3 26/40/3 27/41/3 23/44/3
+f 18/33/2 24/45/2 28/42/2 25/39/2 21/46/2 19/34/2
+f 32/47/5 36/48/5 33/49/5 29/50/5
+f 34/51/2 30/52/2 29/50/2 33/53/2
+f 35/54/1 31/55/1 30/52/1 34/56/1
+f 36/57/3 32/47/3 31/55/3 35/58/3
+f 32/47/4 29/50/4 30/52/4 31/55/4
+f 37/59/1 39/60/1 40/61/1 38/62/1
+f 41/63/5 43/64/5 44/65/5 42/66/5
+f 37/67/10 38/68/10 41/63/10 42/66/10
+f 39/60/4 44/65/4 43/64/4 40/61/4
+f 52/69/1 51/70/1 55/71/1 56/72/1
+f 45/73/7 49/74/7 50/75/7 46/76/7
+f 46/77/3 50/78/3 51/79/3 47/80/3
+f 47/81/6 51/70/6 52/69/6 48/82/6
+f 49/83/2 45/84/2 48/85/2 52/86/2
+f 56/87/2 53/88/2 49/83/2 52/86/2
+f 49/74/5 53/89/5 54/90/5 50/75/5
+f 51/79/3 50/78/3 54/91/3 55/92/3
+f 56/72/9 55/71/9 57/93/9 58/94/9
+f 54/90/8 53/89/8 59/95/8 60/96/8
+f 58/94/1 57/93/1 61/97/1 62/98/1
+f 60/96/5 59/95/5 63/99/5 64/100/5
+f 61/97/4 64/100/4 63/99/4 62/98/4
+f 53/88/2 56/87/2 58/101/2 62/98/2 63/99/2 59/102/2
+f 54/91/3 60/103/3 64/100/3 61/97/3 57/104/3 55/92/3
+f 69/105/4 72/106/4 71/107/4 70/108/4
+f 65/109/2 69/105/2 70/108/2 66/110/2
+f 66/111/5 70/108/5 71/107/5 67/112/5
+f 67/113/3 71/107/3 72/106/3 68/114/3
+f 69/105/1 65/115/1 68/116/1 72/106/1
+f 76/117/5 80/118/5 77/119/5 73/120/5
+f 78/121/2 74/122/2 73/120/2 77/123/2
+f 79/124/1 75/125/1 74/122/1 78/126/1
+f 80/127/3 76/117/3 75/125/3 79/128/3
+f 76/117/4 73/120/4 74/122/4 75/125/4
+f 85/129/4 88/130/4 87/131/4 86/132/4
+f 81/133/2 85/129/2 86/132/2 82/134/2
+f 82/135/5 86/132/5 87/131/5 83/136/5
+f 83/137/3 87/131/3 88/130/3 84/138/3
+f 85/129/1 81/139/1 84/140/1 88/130/1
+f 90/141/5 89/142/5 91/143/5 92/144/5
+f 92/144/2 91/145/2 95/146/2 96/147/2
+f 94/148/3 93/149/3 89/150/3 90/141/3
+f 94/148/4 90/141/4 92/144/4 96/147/4
+f 101/151/4 104/152/4 103/153/4 102/154/4
+f 97/155/2 101/151/2 102/154/2 98/156/2
+f 98/157/5 102/154/5 103/153/5 99/158/5
+f 99/159/3 103/153/3 104/152/3 100/160/3
+f 101/151/1 97/161/1 100/162/1 104/152/1
+f 109/163/4 112/164/4 111/165/4 110/166/4
+f 105/167/3 109/163/3 110/166/3 106/168/3
+f 106/169/1 110/166/1 111/165/1 107/170/1
+f 107/171/2 111/165/2 112/164/2 108/172/2
+f 109/163/5 105/173/5 108/174/5 112/164/5
+g dtrack_vst2_45_Cube.035_SlopeGravelMaterial
+f 114/175/5 118/176/5 117/177/5
+f 116/178/1 113/179/1 115/180/1
+f 116/181/4 121/182/4 118/183/4 114/184/4 113/185/4
+f 122/186/1 115/180/1 128/187/1 131/188/1
+f 116/181/11 120/189/11 121/182/11
+f 118/183/11 121/182/11 119/190/11
+f 124/191/12 122/192/12 131/193/12 129/194/12
+f 121/195/12 120/196/12 122/192/12 124/191/12
+f 119/197/13 121/198/13 124/199/13 123/200/13
+f 117/177/5 123/201/5 130/202/5 127/203/5
+f 128/204/14 129/205/14 131/206/14
+f 126/207/14 125/208/14 127/209/14 129/205/14 128/204/14
+f 130/210/14 129/205/14 127/209/14
+f 123/200/13 124/199/13 129/211/13 130/212/13
+f 115/180/1 113/179/1 126/213/1 128/187/1
+f 114/175/5 117/177/5 127/203/5 125/214/5
+f 113/215/2 114/216/2 125/217/2 126/218/2
+f 116/178/1 115/180/1 122/186/1 120/219/1
+f 117/177/5 118/176/5 119/220/5 123/201/5
diff --git a/advtrains/advtrains/models/advtrains_dtrack_vst31.obj b/advtrains/advtrains/models/advtrains_dtrack_vst31.obj
new file mode 100644
index 0000000..c4cb84f
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_dtrack_vst31.obj
@@ -0,0 +1,348 @@
+# Blender v2.78 (sub 0) OBJ File: 'rail_redo.blend'
+# www.blender.org
+o dtrack_vst31_Cube.000
+v 0.753760 -0.500000 -0.500000
+v 0.753760 -0.500000 0.500000
+v 0.753760 -0.166667 0.500000
+v -0.753760 -0.500000 -0.500000
+v -0.753760 -0.500000 0.500000
+v -0.753760 -0.166667 0.500000
+v 0.329165 -0.308041 0.171599
+v 0.329165 -0.143980 0.171599
+v 0.329165 -0.422440 -0.171599
+v 0.329165 -0.258379 -0.171599
+v 0.462280 -0.308041 0.171599
+v 0.462280 -0.143980 0.171599
+v 0.462280 -0.422440 -0.171599
+v 0.462280 -0.258379 -0.171599
+v 0.412289 -0.126667 0.500000
+v 0.412289 -0.460000 -0.500000
+v 0.560528 -0.460000 -0.500000
+v 0.560528 -0.126667 0.500000
+v 0.474055 -0.106667 0.500000
+v 0.474055 -0.440000 -0.500000
+v 0.498762 -0.440000 -0.500000
+v 0.498762 -0.106667 0.500000
+v 0.474055 -0.056667 0.500000
+v 0.474055 -0.390000 -0.500000
+v 0.498762 -0.390000 -0.500000
+v 0.498762 -0.056667 0.500000
+v 0.529645 -0.385000 -0.500000
+v 0.529645 -0.051667 0.500000
+v 0.443172 -0.051667 0.500000
+v 0.443172 -0.385000 -0.500000
+v 0.529645 -0.360000 -0.500000
+v 0.529645 -0.026667 0.500000
+v 0.443172 -0.026667 0.500000
+v 0.443172 -0.360000 -0.500000
+v 0.741194 -0.198333 0.435000
+v -0.741194 -0.198333 0.435000
+v -0.741194 -0.238333 0.315000
+v 0.741194 -0.238333 0.315000
+v 0.741193 -0.148333 0.435000
+v -0.741194 -0.148333 0.435000
+v -0.741194 -0.188333 0.315000
+v 0.741194 -0.188333 0.315000
+v -0.011733 2.712519 0.500000
+v -0.011732 2.379186 -0.500001
+v -0.011733 2.734147 0.500000
+v -0.011732 2.400814 -0.500000
+v 0.011732 2.379186 -0.500000
+v 0.011732 2.712519 0.500000
+v 0.011732 2.400814 -0.500000
+v 0.011732 2.734148 0.500000
+v -0.412289 -0.460000 -0.500000
+v -0.412289 -0.126667 0.500000
+v -0.560528 -0.126667 0.500000
+v -0.560528 -0.460000 -0.500000
+v -0.474055 -0.440000 -0.500000
+v -0.474055 -0.106666 0.500000
+v -0.498762 -0.106667 0.500000
+v -0.498762 -0.440000 -0.500000
+v -0.474055 -0.390000 -0.500000
+v -0.474055 -0.056666 0.500000
+v -0.498762 -0.056667 0.500000
+v -0.498762 -0.390000 -0.500000
+v -0.529645 -0.051667 0.500000
+v -0.529645 -0.385000 -0.500000
+v -0.443172 -0.385000 -0.500000
+v -0.443172 -0.051666 0.500000
+v -0.529645 -0.026667 0.500000
+v -0.529645 -0.360000 -0.500000
+v -0.443172 -0.360000 -0.500000
+v -0.443172 -0.026666 0.500000
+v -0.741194 -0.488333 -0.435000
+v 0.741194 -0.488333 -0.435000
+v 0.741194 -0.448333 -0.315000
+v -0.741194 -0.448333 -0.315000
+v -0.741193 -0.438333 -0.435000
+v 0.741194 -0.438333 -0.435000
+v 0.741194 -0.398333 -0.315000
+v -0.741194 -0.398333 -0.315000
+v 0.741194 -0.280713 0.187862
+v -0.741194 -0.280713 0.187862
+v -0.741194 -0.320713 0.067862
+v 0.741194 -0.320713 0.067862
+v 0.741193 -0.230713 0.187862
+v -0.741194 -0.230713 0.187862
+v -0.741194 -0.270713 0.067862
+v 0.741194 -0.270713 0.067862
+v -0.741194 -0.405954 -0.187862
+v 0.741194 -0.405954 -0.187862
+v 0.741194 -0.365954 -0.067862
+v -0.741194 -0.365954 -0.067862
+v -0.741193 -0.355954 -0.187862
+v 0.741194 -0.355954 -0.187862
+v 0.741194 -0.315954 -0.067862
+v -0.741194 -0.315954 -0.067862
+v -0.329165 -0.308041 0.171599
+v -0.329165 -0.143980 0.171599
+v -0.329165 -0.422440 -0.171599
+v -0.329165 -0.258379 -0.171599
+v -0.462280 -0.308041 0.171599
+v -0.462280 -0.143980 0.171599
+v -0.462280 -0.422440 -0.171599
+v -0.462280 -0.258379 -0.171599
+vt 0.7427 0.1169
+vt 0.7427 0.3317
+vt 0.6400 0.3317
+vt 0.6400 0.1169
+vt 0.8260 0.3317
+vt 0.8260 0.4343
+vt 0.7427 0.4343
+vt 0.8260 0.1169
+vt 0.7427 0.0142
+vt 0.8260 0.0142
+vt 0.5691 0.2971
+vt 0.5691 0.9229
+vt 0.5378 0.9229
+vt 0.5378 0.2971
+vt 0.3413 0.2971
+vt 0.3819 0.2971
+vt 0.3819 0.9229
+vt 0.3413 0.9229
+vt 0.4291 0.9855
+vt 0.4678 0.9730
+vt 0.4833 0.9730
+vt 0.5219 0.9855
+vt 0.6097 0.9229
+vt 0.6097 0.2971
+vt 0.4678 0.2470
+vt 0.4291 0.2345
+vt 0.5219 0.2345
+vt 0.4833 0.2470
+vt 0.4833 0.2783
+vt 0.4678 0.2783
+vt 0.4132 0.2971
+vt 0.4132 0.9229
+vt 0.4678 0.9417
+vt 0.4833 0.9417
+vt 0.5182 0.9229
+vt 0.5182 0.2971
+vt 0.4328 0.2971
+vt 0.4328 0.9229
+vt 0.5026 0.9229
+vt 0.5026 0.2971
+vt 0.4485 0.2971
+vt 0.4485 0.9229
+vt 0.5026 0.2814
+vt 0.4485 0.2814
+vt 0.4485 0.9386
+vt 0.5026 0.9386
+vt 0.9588 0.9625
+vt 0.8837 0.9625
+vt 0.8837 0.0348
+vt 0.9588 0.0348
+vt 0.9901 0.9625
+vt 0.9901 0.0348
+vt 0.9588 0.0035
+vt 0.8837 0.0035
+vt 0.8524 0.0348
+vt 0.8524 0.9625
+vt 0.9588 0.9938
+vt 0.8837 0.9938
+vt 0.6554 0.3627
+vt 0.6690 0.3627
+vt 0.6690 0.9885
+vt 0.6554 0.9885
+vt 0.6972 0.9885
+vt 0.6837 0.9885
+vt 0.6837 0.3627
+vt 0.6972 0.3627
+vt 0.7119 0.3627
+vt 0.7119 0.9885
+vt 0.5691 0.2971
+vt 0.5691 0.9229
+vt 0.5378 0.9229
+vt 0.5378 0.2971
+vt 0.3413 0.2971
+vt 0.3819 0.2971
+vt 0.3819 0.9229
+vt 0.3413 0.9229
+vt 0.4291 0.9855
+vt 0.4678 0.9730
+vt 0.4833 0.9730
+vt 0.5219 0.9855
+vt 0.6097 0.9229
+vt 0.6097 0.2971
+vt 0.4678 0.2470
+vt 0.4291 0.2345
+vt 0.5219 0.2345
+vt 0.4833 0.2470
+vt 0.4833 0.2783
+vt 0.4678 0.2783
+vt 0.4132 0.2971
+vt 0.4132 0.9229
+vt 0.4678 0.9417
+vt 0.4833 0.9417
+vt 0.5182 0.9229
+vt 0.5182 0.2971
+vt 0.4328 0.2971
+vt 0.4328 0.9229
+vt 0.5026 0.9229
+vt 0.5026 0.2971
+vt 0.4485 0.2971
+vt 0.4485 0.9229
+vt 0.5026 0.2814
+vt 0.4485 0.2814
+vt 0.4485 0.9386
+vt 0.5026 0.9386
+vt 0.9588 0.9625
+vt 0.8837 0.9625
+vt 0.8837 0.0348
+vt 0.9588 0.0348
+vt 0.9901 0.9625
+vt 0.9901 0.0348
+vt 0.9588 0.0035
+vt 0.8837 0.0035
+vt 0.8524 0.0348
+vt 0.8524 0.9625
+vt 0.9588 0.9938
+vt 0.8837 0.9938
+vt 0.9588 0.9625
+vt 0.8837 0.9625
+vt 0.8837 0.0348
+vt 0.9588 0.0348
+vt 0.9901 0.9625
+vt 0.9901 0.0348
+vt 0.9588 0.0035
+vt 0.8837 0.0035
+vt 0.8524 0.0348
+vt 0.8524 0.9625
+vt 0.9588 0.9938
+vt 0.8837 0.9938
+vt 0.9588 0.9625
+vt 0.8837 0.9625
+vt 0.8837 0.0348
+vt 0.9588 0.0348
+vt 0.9901 0.9625
+vt 0.9901 0.0348
+vt 0.9588 0.0035
+vt 0.8837 0.0035
+vt 0.8524 0.0348
+vt 0.8524 0.9625
+vt 0.9588 0.9938
+vt 0.8837 0.9938
+vt 0.7427 0.1169
+vt 0.6400 0.1169
+vt 0.6400 0.3317
+vt 0.7427 0.3317
+vt 0.7427 0.4343
+vt 0.8260 0.4343
+vt 0.8260 0.3317
+vt 0.8260 0.1169
+vt 0.8260 0.0142
+vt 0.7427 0.0142
+vt 1.1949 -0.0470
+vt -0.3152 -0.0470
+vt -0.3152 -0.3809
+vt 1.1949 -0.3809
+vt -0.3120 1.0015
+vt -0.3120 -0.0002
+vt 1.1981 -0.0002
+vt 1.1981 1.0015
+vt 1.1949 1.0089
+vt 1.5117 0.0586
+vt -0.3152 1.0089
+vt -0.6320 0.0586
+vn -1.0000 0.0000 -0.0000
+vn 0.0000 0.0000 -1.0000
+vn -0.0000 0.0000 1.0000
+vn 0.0000 0.9487 -0.3162
+vn 1.0000 0.0000 0.0000
+vn -0.2936 0.9069 -0.3023
+vn 0.2936 0.9069 -0.3023
+vn 0.1518 -0.9377 0.3126
+vn -0.1518 -0.9377 0.3126
+vn 0.0000 -0.9487 0.3162
+vn 0.0000 -1.0000 0.0000
+g dtrack_vst31_Cube.000_SlopeRailMaterial
+s off
+f 8/1/1 10/2/1 9/3/1 7/4/1
+f 10/2/2 14/5/2 13/6/2 9/7/2
+f 12/8/3 8/1/3 7/9/3 11/10/3
+f 12/8/4 14/5/4 10/2/4 8/1/4
+f 22/11/5 21/12/5 25/13/5 26/14/5
+f 15/15/6 19/16/6 20/17/6 16/18/6
+f 16/19/2 20/20/2 21/21/2 17/22/2
+f 17/23/7 21/12/7 22/11/7 18/24/7
+f 19/25/3 15/26/3 18/27/3 22/28/3
+f 26/29/3 23/30/3 19/25/3 22/28/3
+f 19/16/1 23/31/1 24/32/1 20/17/1
+f 21/21/2 20/20/2 24/33/2 25/34/2
+f 26/14/8 25/13/8 27/35/8 28/36/8
+f 24/32/9 23/31/9 29/37/9 30/38/9
+f 28/36/5 27/35/5 31/39/5 32/40/5
+f 30/38/1 29/37/1 33/41/1 34/42/1
+f 31/39/4 34/42/4 33/41/4 32/40/4
+f 23/30/3 26/29/3 28/43/3 32/40/3 33/41/3 29/44/3
+f 24/33/2 30/45/2 34/42/2 31/39/2 27/46/2 25/34/2
+f 39/47/4 42/48/4 41/49/4 40/50/4
+f 35/51/3 39/47/3 40/50/3 36/52/3
+f 36/53/1 40/50/1 41/49/1 37/54/1
+f 37/55/2 41/49/2 42/48/2 38/56/2
+f 39/47/5 35/57/5 38/58/5 42/48/5
+f 43/59/1 45/60/1 46/61/1 44/62/1
+f 47/63/5 49/64/5 50/65/5 48/66/5
+f 43/67/10 44/68/10 47/63/10 48/66/10
+f 45/60/4 50/65/4 49/64/4 46/61/4
+f 58/69/1 57/70/1 61/71/1 62/72/1
+f 51/73/7 55/74/7 56/75/7 52/76/7
+f 52/77/3 56/78/3 57/79/3 53/80/3
+f 53/81/6 57/70/6 58/69/6 54/82/6
+f 55/83/2 51/84/2 54/85/2 58/86/2
+f 62/87/2 59/88/2 55/83/2 58/86/2
+f 55/74/5 59/89/5 60/90/5 56/75/5
+f 57/79/3 56/78/3 60/91/3 61/92/3
+f 62/72/9 61/71/9 63/93/9 64/94/9
+f 60/90/8 59/89/8 65/95/8 66/96/8
+f 64/94/1 63/93/1 67/97/1 68/98/1
+f 66/96/5 65/95/5 69/99/5 70/100/5
+f 67/97/4 70/100/4 69/99/4 68/98/4
+f 59/88/2 62/87/2 64/101/2 68/98/2 69/99/2 65/102/2
+f 60/91/3 66/103/3 70/100/3 67/97/3 63/104/3 61/92/3
+f 75/105/4 78/106/4 77/107/4 76/108/4
+f 71/109/2 75/105/2 76/108/2 72/110/2
+f 72/111/5 76/108/5 77/107/5 73/112/5
+f 73/113/3 77/107/3 78/106/3 74/114/3
+f 75/105/1 71/115/1 74/116/1 78/106/1
+f 83/117/4 86/118/4 85/119/4 84/120/4
+f 79/121/3 83/117/3 84/120/3 80/122/3
+f 80/123/1 84/120/1 85/119/1 81/124/1
+f 81/125/2 85/119/2 86/118/2 82/126/2
+f 83/117/5 79/127/5 82/128/5 86/118/5
+f 91/129/4 94/130/4 93/131/4 92/132/4
+f 87/133/2 91/129/2 92/132/2 88/134/2
+f 88/135/5 92/132/5 93/131/5 89/136/5
+f 89/137/3 93/131/3 94/130/3 90/138/3
+f 91/129/1 87/139/1 90/140/1 94/130/1
+f 96/141/5 95/142/5 97/143/5 98/144/5
+f 98/144/2 97/145/2 101/146/2 102/147/2
+f 100/148/3 99/149/3 95/150/3 96/141/3
+f 100/148/4 96/141/4 98/144/4 102/147/4
+g dtrack_vst31_Cube.000_SlopeGravelMaterial
+f 3/151/3 6/152/3 5/153/3 2/154/3
+f 1/155/11 2/156/11 5/157/11 4/158/11
+f 1/159/5 3/151/5 2/160/5
+f 6/152/1 4/161/1 5/162/1
+f 4/161/4 6/152/4 3/151/4 1/159/4
diff --git a/advtrains/advtrains/models/advtrains_dtrack_vst32.obj b/advtrains/advtrains/models/advtrains_dtrack_vst32.obj
new file mode 100644
index 0000000..297d46b
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_dtrack_vst32.obj
@@ -0,0 +1,372 @@
+# Blender v2.78 (sub 0) OBJ File: 'rail_redo.blend'
+# www.blender.org
+o dtrack_vst32_Cube.028
+v 0.753760 -0.166667 -0.500000
+v 0.753760 -0.166667 0.500000
+v 0.753760 0.166667 0.500000
+v -0.753760 -0.166667 -0.500000
+v -0.753760 -0.166667 0.500000
+v -0.753760 0.166667 0.500000
+v 0.329165 0.025292 0.171599
+v 0.329165 0.189353 0.171599
+v 0.329165 -0.089107 -0.171599
+v 0.329165 0.074954 -0.171599
+v 0.462280 0.025292 0.171599
+v 0.462280 0.189353 0.171599
+v 0.462280 -0.089107 -0.171599
+v 0.462280 0.074954 -0.171599
+v 0.412289 0.206667 0.500000
+v 0.412289 -0.126667 -0.500000
+v 0.560528 -0.126667 -0.500000
+v 0.560528 0.206667 0.500000
+v 0.474055 0.226667 0.500000
+v 0.474055 -0.106667 -0.500000
+v 0.498762 -0.106667 -0.500000
+v 0.498762 0.226667 0.500000
+v 0.474055 0.276667 0.500000
+v 0.474055 -0.056667 -0.500000
+v 0.498762 -0.056667 -0.500000
+v 0.498762 0.276667 0.500000
+v 0.529645 -0.051667 -0.500000
+v 0.529645 0.281667 0.500000
+v 0.443172 0.281667 0.500000
+v 0.443172 -0.051667 -0.500000
+v 0.529645 -0.026667 -0.500000
+v 0.529645 0.306667 0.500000
+v 0.443172 0.306667 0.500000
+v 0.443172 -0.026667 -0.500000
+v 0.741194 0.135000 0.435000
+v -0.741194 0.135000 0.435000
+v -0.741194 0.095000 0.315000
+v 0.741194 0.095000 0.315000
+v 0.741193 0.185000 0.435000
+v -0.741194 0.185000 0.435000
+v -0.741194 0.145000 0.315000
+v 0.741194 0.145000 0.315000
+v -0.011733 3.045853 0.500000
+v -0.011732 2.712519 -0.500001
+v -0.011733 3.067481 0.500000
+v -0.011732 2.734147 -0.500000
+v 0.011732 2.712519 -0.500000
+v 0.011732 3.045853 0.500000
+v 0.011732 2.734147 -0.500000
+v 0.011732 3.067481 0.500000
+v -0.412289 -0.126667 -0.500000
+v -0.412289 0.206667 0.500000
+v -0.560528 0.206667 0.500000
+v -0.560528 -0.126667 -0.500000
+v -0.474055 -0.106667 -0.500000
+v -0.474055 0.226667 0.500000
+v -0.498762 0.226667 0.500000
+v -0.498762 -0.106667 -0.500000
+v -0.474055 -0.056667 -0.500000
+v -0.474055 0.276667 0.500000
+v -0.498762 0.276667 0.500000
+v -0.498762 -0.056667 -0.500000
+v -0.529645 0.281667 0.500000
+v -0.529645 -0.051667 -0.500000
+v -0.443172 -0.051667 -0.500000
+v -0.443172 0.281667 0.500000
+v -0.529645 0.306667 0.500000
+v -0.529645 -0.026667 -0.500000
+v -0.443172 -0.026667 -0.500000
+v -0.443172 0.306667 0.500000
+v -0.741194 -0.155000 -0.435000
+v 0.741194 -0.155000 -0.435000
+v 0.741194 -0.115000 -0.315000
+v -0.741194 -0.115000 -0.315000
+v -0.741193 -0.105000 -0.435000
+v 0.741194 -0.105000 -0.435000
+v 0.741194 -0.065000 -0.315000
+v -0.741194 -0.065000 -0.315000
+v 0.741194 0.052621 0.187862
+v -0.741194 0.052621 0.187862
+v -0.741194 0.012621 0.067862
+v 0.741194 0.012621 0.067862
+v 0.741193 0.102621 0.187862
+v -0.741194 0.102621 0.187862
+v -0.741194 0.062621 0.067862
+v 0.741194 0.062621 0.067862
+v -0.741194 -0.072621 -0.187862
+v 0.741194 -0.072621 -0.187862
+v 0.741194 -0.032621 -0.067862
+v -0.741194 -0.032621 -0.067862
+v -0.741193 -0.022621 -0.187862
+v 0.741194 -0.022621 -0.187862
+v 0.741194 0.017379 -0.067862
+v -0.741194 0.017379 -0.067862
+v -0.329165 0.025293 0.171599
+v -0.329165 0.189353 0.171599
+v -0.329165 -0.089107 -0.171599
+v -0.329165 0.074954 -0.171599
+v -0.462280 0.025293 0.171599
+v -0.462280 0.189353 0.171599
+v -0.462280 -0.089107 -0.171599
+v -0.462280 0.074954 -0.171599
+v 0.753760 -0.500000 0.500000
+v 0.753760 -0.500000 -0.500000
+v -0.753760 -0.500000 0.500000
+v -0.753760 -0.500000 -0.500000
+vt 0.7427 0.1169
+vt 0.7427 0.3317
+vt 0.6400 0.3317
+vt 0.6400 0.1169
+vt 0.8260 0.3317
+vt 0.8260 0.4343
+vt 0.7427 0.4343
+vt 0.8260 0.1169
+vt 0.7427 0.0142
+vt 0.8260 0.0142
+vt 0.5691 0.2971
+vt 0.5691 0.9229
+vt 0.5378 0.9229
+vt 0.5378 0.2971
+vt 0.3413 0.2971
+vt 0.3819 0.2971
+vt 0.3819 0.9229
+vt 0.3413 0.9229
+vt 0.4291 0.9855
+vt 0.4678 0.9730
+vt 0.4833 0.9730
+vt 0.5219 0.9855
+vt 0.6097 0.9229
+vt 0.6097 0.2971
+vt 0.4678 0.2470
+vt 0.4291 0.2345
+vt 0.5219 0.2345
+vt 0.4833 0.2470
+vt 0.4833 0.2783
+vt 0.4678 0.2783
+vt 0.4132 0.2971
+vt 0.4132 0.9229
+vt 0.4678 0.9417
+vt 0.4833 0.9417
+vt 0.5182 0.9229
+vt 0.5182 0.2971
+vt 0.4328 0.2971
+vt 0.4328 0.9229
+vt 0.5026 0.9229
+vt 0.5026 0.2971
+vt 0.4485 0.2971
+vt 0.4485 0.9229
+vt 0.5026 0.2814
+vt 0.4485 0.2814
+vt 0.4485 0.9386
+vt 0.5026 0.9386
+vt 0.9588 0.9625
+vt 0.8837 0.9625
+vt 0.8837 0.0348
+vt 0.9588 0.0348
+vt 0.9901 0.9625
+vt 0.9901 0.0348
+vt 0.9588 0.0035
+vt 0.8837 0.0035
+vt 0.8524 0.0348
+vt 0.8524 0.9625
+vt 0.9588 0.9938
+vt 0.8837 0.9938
+vt 0.6554 0.3627
+vt 0.6690 0.3627
+vt 0.6690 0.9885
+vt 0.6554 0.9885
+vt 0.6972 0.9885
+vt 0.6837 0.9885
+vt 0.6837 0.3627
+vt 0.6972 0.3627
+vt 0.7119 0.3627
+vt 0.7119 0.9885
+vt 0.5691 0.2971
+vt 0.5691 0.9229
+vt 0.5378 0.9229
+vt 0.5378 0.2971
+vt 0.3413 0.2971
+vt 0.3819 0.2971
+vt 0.3819 0.9229
+vt 0.3413 0.9229
+vt 0.4291 0.9855
+vt 0.4678 0.9730
+vt 0.4833 0.9730
+vt 0.5219 0.9855
+vt 0.6097 0.9229
+vt 0.6097 0.2971
+vt 0.4678 0.2470
+vt 0.4291 0.2345
+vt 0.5219 0.2345
+vt 0.4833 0.2470
+vt 0.4833 0.2783
+vt 0.4678 0.2783
+vt 0.4132 0.2971
+vt 0.4132 0.9229
+vt 0.4678 0.9417
+vt 0.4833 0.9417
+vt 0.5182 0.9229
+vt 0.5182 0.2971
+vt 0.4328 0.2971
+vt 0.4328 0.9229
+vt 0.5026 0.9229
+vt 0.5026 0.2971
+vt 0.4485 0.2971
+vt 0.4485 0.9229
+vt 0.5026 0.2814
+vt 0.4485 0.2814
+vt 0.4485 0.9386
+vt 0.5026 0.9386
+vt 0.9588 0.9625
+vt 0.8837 0.9625
+vt 0.8837 0.0348
+vt 0.9588 0.0348
+vt 0.9901 0.9625
+vt 0.9901 0.0348
+vt 0.9588 0.0035
+vt 0.8837 0.0035
+vt 0.8524 0.0348
+vt 0.8524 0.9625
+vt 0.9588 0.9938
+vt 0.8837 0.9938
+vt 0.9588 0.9625
+vt 0.8837 0.9625
+vt 0.8837 0.0348
+vt 0.9588 0.0348
+vt 0.9901 0.9625
+vt 0.9901 0.0348
+vt 0.9588 0.0035
+vt 0.8837 0.0035
+vt 0.8524 0.0348
+vt 0.8524 0.9625
+vt 0.9588 0.9938
+vt 0.8837 0.9938
+vt 0.9588 0.9625
+vt 0.8837 0.9625
+vt 0.8837 0.0348
+vt 0.9588 0.0348
+vt 0.9901 0.9625
+vt 0.9901 0.0348
+vt 0.9588 0.0035
+vt 0.8837 0.0035
+vt 0.8524 0.0348
+vt 0.8524 0.9625
+vt 0.9588 0.9938
+vt 0.8837 0.9938
+vt 0.7427 0.1169
+vt 0.6400 0.1169
+vt 0.6400 0.3317
+vt 0.7427 0.3317
+vt 0.7427 0.4343
+vt 0.8260 0.4343
+vt 0.8260 0.3317
+vt 0.8260 0.1169
+vt 0.8260 0.0142
+vt 0.7427 0.0142
+vt 1.2169 -0.0660
+vt -0.3162 -0.0660
+vt -0.3162 -0.4050
+vt 1.2169 -0.4050
+vt -0.3102 0.3256
+vt 1.2229 0.3256
+vt 1.2229 0.6646
+vt -0.3102 0.6646
+vt 1.2169 1.0060
+vt 1.5385 0.0412
+vt -0.3162 1.0060
+vt -0.6378 0.0412
+vt -0.3132 1.0050
+vt -0.3132 -0.0119
+vt 1.2199 -0.0119
+vt 1.2199 1.0050
+vt -0.3075 0.6587
+vt 0.7095 0.6587
+vt 0.7095 0.9977
+vt -0.3075 0.9977
+vt 1.2229 1.0022
+vt -0.3102 1.0022
+vt -0.3102 0.6632
+vt 1.2229 0.6632
+vt 0.7067 0.6635
+vt -0.3102 0.6635
+vt -0.3102 0.3245
+vt 0.7067 0.3245
+vn -1.0000 0.0000 -0.0000
+vn 0.0000 0.0000 -1.0000
+vn -0.0000 0.0000 1.0000
+vn 0.0000 0.9487 -0.3162
+vn 1.0000 0.0000 0.0000
+vn -0.2936 0.9069 -0.3023
+vn 0.2936 0.9069 -0.3023
+vn 0.1518 -0.9377 0.3126
+vn -0.1518 -0.9377 0.3126
+vn 0.0000 -0.9487 0.3162
+vn 0.0000 -1.0000 0.0000
+g dtrack_vst32_Cube.028_SlopeRailMaterial
+s off
+f 8/1/1 10/2/1 9/3/1 7/4/1
+f 10/2/2 14/5/2 13/6/2 9/7/2
+f 12/8/3 8/1/3 7/9/3 11/10/3
+f 12/8/4 14/5/4 10/2/4 8/1/4
+f 22/11/5 21/12/5 25/13/5 26/14/5
+f 15/15/6 19/16/6 20/17/6 16/18/6
+f 16/19/2 20/20/2 21/21/2 17/22/2
+f 17/23/7 21/12/7 22/11/7 18/24/7
+f 19/25/3 15/26/3 18/27/3 22/28/3
+f 26/29/3 23/30/3 19/25/3 22/28/3
+f 19/16/1 23/31/1 24/32/1 20/17/1
+f 21/21/2 20/20/2 24/33/2 25/34/2
+f 26/14/8 25/13/8 27/35/8 28/36/8
+f 24/32/9 23/31/9 29/37/9 30/38/9
+f 28/36/5 27/35/5 31/39/5 32/40/5
+f 30/38/1 29/37/1 33/41/1 34/42/1
+f 31/39/4 34/42/4 33/41/4 32/40/4
+f 23/30/3 26/29/3 28/43/3 32/40/3 33/41/3 29/44/3
+f 24/33/2 30/45/2 34/42/2 31/39/2 27/46/2 25/34/2
+f 39/47/4 42/48/4 41/49/4 40/50/4
+f 35/51/3 39/47/3 40/50/3 36/52/3
+f 36/53/1 40/50/1 41/49/1 37/54/1
+f 37/55/2 41/49/2 42/48/2 38/56/2
+f 39/47/5 35/57/5 38/58/5 42/48/5
+f 43/59/1 45/60/1 46/61/1 44/62/1
+f 47/63/5 49/64/5 50/65/5 48/66/5
+f 43/67/10 44/68/10 47/63/10 48/66/10
+f 45/60/4 50/65/4 49/64/4 46/61/4
+f 58/69/1 57/70/1 61/71/1 62/72/1
+f 51/73/7 55/74/7 56/75/7 52/76/7
+f 52/77/3 56/78/3 57/79/3 53/80/3
+f 53/81/6 57/70/6 58/69/6 54/82/6
+f 55/83/2 51/84/2 54/85/2 58/86/2
+f 62/87/2 59/88/2 55/83/2 58/86/2
+f 55/74/5 59/89/5 60/90/5 56/75/5
+f 57/79/3 56/78/3 60/91/3 61/92/3
+f 62/72/9 61/71/9 63/93/9 64/94/9
+f 60/90/8 59/89/8 65/95/8 66/96/8
+f 64/94/1 63/93/1 67/97/1 68/98/1
+f 66/96/5 65/95/5 69/99/5 70/100/5
+f 67/97/4 70/100/4 69/99/4 68/98/4
+f 59/88/2 62/87/2 64/101/2 68/98/2 69/99/2 65/102/2
+f 60/91/3 66/103/3 70/100/3 67/97/3 63/104/3 61/92/3
+f 75/105/4 78/106/4 77/107/4 76/108/4
+f 71/109/2 75/105/2 76/108/2 72/110/2
+f 72/111/5 76/108/5 77/107/5 73/112/5
+f 73/113/3 77/107/3 78/106/3 74/114/3
+f 75/105/1 71/115/1 74/116/1 78/106/1
+f 83/117/4 86/118/4 85/119/4 84/120/4
+f 79/121/3 83/117/3 84/120/3 80/122/3
+f 80/123/1 84/120/1 85/119/1 81/124/1
+f 81/125/2 85/119/2 86/118/2 82/126/2
+f 83/117/5 79/127/5 82/128/5 86/118/5
+f 91/129/4 94/130/4 93/131/4 92/132/4
+f 87/133/2 91/129/2 92/132/2 88/134/2
+f 88/135/5 92/132/5 93/131/5 89/136/5
+f 89/137/3 93/131/3 94/130/3 90/138/3
+f 91/129/1 87/139/1 90/140/1 94/130/1
+f 96/141/5 95/142/5 97/143/5 98/144/5
+f 98/144/2 97/145/2 101/146/2 102/147/2
+f 100/148/3 99/149/3 95/150/3 96/141/3
+f 100/148/4 96/141/4 98/144/4 102/147/4
+g dtrack_vst32_Cube.028_SlopeGravelMaterial
+f 3/151/3 6/152/3 5/153/3 2/154/3
+f 4/155/2 1/156/2 104/157/2 106/158/2
+f 1/159/5 3/151/5 2/160/5
+f 6/152/1 4/161/1 5/162/1
+f 4/161/4 6/152/4 3/151/4 1/159/4
+f 104/163/11 103/164/11 105/165/11 106/166/11
+f 5/167/1 4/168/1 106/169/1 105/170/1
+f 2/171/3 5/172/3 105/173/3 103/174/3
+f 1/175/5 2/176/5 103/177/5 104/178/5
diff --git a/advtrains/advtrains/models/advtrains_dtrack_vst33.obj b/advtrains/advtrains/models/advtrains_dtrack_vst33.obj
new file mode 100644
index 0000000..8cb5f04
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_dtrack_vst33.obj
@@ -0,0 +1,388 @@
+# Blender v2.78 (sub 0) OBJ File: 'rail_redo.blend'
+# www.blender.org
+o dtrack_vst33_Cube.030
+v 0.753760 0.166667 -0.500000
+v 0.753760 0.166667 0.500000
+v 0.753760 0.500000 0.500000
+v -0.753760 0.166667 -0.500000
+v -0.753760 0.166667 0.500000
+v -0.753760 0.500000 0.500000
+v 0.329165 0.358626 0.171599
+v 0.329165 0.522686 0.171599
+v 0.329165 0.244227 -0.171599
+v 0.329165 0.408287 -0.171599
+v 0.462280 0.358626 0.171599
+v 0.462280 0.522686 0.171599
+v 0.462280 0.244227 -0.171599
+v 0.462280 0.408287 -0.171599
+v 0.412289 0.540000 0.500000
+v 0.412289 0.206667 -0.500000
+v 0.560528 0.206667 -0.500000
+v 0.560528 0.540000 0.500000
+v 0.474055 0.560000 0.500000
+v 0.474055 0.226667 -0.500000
+v 0.498762 0.226667 -0.500000
+v 0.498762 0.560000 0.500000
+v 0.474055 0.610000 0.500000
+v 0.474055 0.276667 -0.500000
+v 0.498762 0.276667 -0.500000
+v 0.498762 0.610000 0.500000
+v 0.529645 0.281667 -0.500000
+v 0.529645 0.615000 0.500000
+v 0.443172 0.615000 0.500000
+v 0.443172 0.281667 -0.500000
+v 0.529645 0.306667 -0.500000
+v 0.529645 0.640000 0.500000
+v 0.443172 0.640000 0.500000
+v 0.443172 0.306667 -0.500000
+v 0.741194 0.468333 0.435000
+v -0.741194 0.468333 0.435000
+v -0.741194 0.428333 0.315000
+v 0.741194 0.428333 0.315000
+v 0.741193 0.518333 0.435000
+v -0.741194 0.518333 0.435000
+v -0.741194 0.478333 0.315000
+v 0.741194 0.478333 0.315000
+v -0.011733 3.379186 0.500000
+v -0.011732 3.045852 -0.500001
+v -0.011733 3.400814 0.500000
+v -0.011732 3.067481 -0.500000
+v 0.011732 3.045853 -0.500000
+v 0.011732 3.379186 0.500000
+v 0.011732 3.067481 -0.500000
+v 0.011732 3.400814 0.500000
+v -0.412289 0.206667 -0.500000
+v -0.412289 0.540000 0.500000
+v -0.560528 0.540000 0.500000
+v -0.560528 0.206667 -0.500000
+v -0.474055 0.226667 -0.500000
+v -0.474055 0.560000 0.500000
+v -0.498762 0.560000 0.500000
+v -0.498762 0.226667 -0.500000
+v -0.474055 0.276667 -0.500000
+v -0.474055 0.610000 0.500000
+v -0.498762 0.610000 0.500000
+v -0.498762 0.276667 -0.500000
+v -0.529645 0.615000 0.500000
+v -0.529645 0.281667 -0.500000
+v -0.443172 0.281667 -0.500000
+v -0.443172 0.615000 0.500000
+v -0.529645 0.640000 0.500000
+v -0.529645 0.306667 -0.500000
+v -0.443172 0.306667 -0.500000
+v -0.443172 0.640000 0.500000
+v -0.741194 0.178333 -0.435000
+v 0.741194 0.178333 -0.435000
+v 0.741194 0.218333 -0.315000
+v -0.741194 0.218333 -0.315000
+v -0.741193 0.228333 -0.435000
+v 0.741194 0.228333 -0.435000
+v 0.741194 0.268333 -0.315000
+v -0.741194 0.268333 -0.315000
+v 0.741194 0.385954 0.187862
+v -0.741194 0.385954 0.187862
+v -0.741194 0.345954 0.067862
+v 0.741194 0.345954 0.067862
+v 0.741193 0.435954 0.187862
+v -0.741194 0.435954 0.187862
+v -0.741194 0.395954 0.067862
+v 0.741194 0.395954 0.067862
+v -0.741194 0.260713 -0.187862
+v 0.741194 0.260713 -0.187862
+v 0.741194 0.300713 -0.067862
+v -0.741194 0.300713 -0.067862
+v -0.741193 0.310713 -0.187862
+v 0.741194 0.310713 -0.187862
+v 0.741194 0.350713 -0.067862
+v -0.741194 0.350713 -0.067862
+v -0.329165 0.358626 0.171599
+v -0.329165 0.522687 0.171599
+v -0.329165 0.244227 -0.171599
+v -0.329165 0.408287 -0.171599
+v -0.462280 0.358626 0.171599
+v -0.462280 0.522686 0.171599
+v -0.462280 0.244227 -0.171599
+v -0.462280 0.408287 -0.171599
+v 0.753760 -0.166667 0.500000
+v 0.753760 -0.166667 -0.500000
+v -0.753760 -0.166667 0.500000
+v -0.753760 -0.166667 -0.500000
+v 0.753760 -0.500000 0.500000
+v 0.753760 -0.500000 -0.500000
+v -0.753760 -0.500000 0.500000
+v -0.753760 -0.500000 -0.500000
+vt 0.7427 0.1169
+vt 0.7427 0.3317
+vt 0.6400 0.3317
+vt 0.6400 0.1169
+vt 0.8260 0.3317
+vt 0.8260 0.4343
+vt 0.7427 0.4343
+vt 0.8260 0.1169
+vt 0.7427 0.0142
+vt 0.8260 0.0142
+vt 0.5691 0.2971
+vt 0.5691 0.9229
+vt 0.5378 0.9229
+vt 0.5378 0.2971
+vt 0.3413 0.2971
+vt 0.3819 0.2971
+vt 0.3819 0.9229
+vt 0.3413 0.9229
+vt 0.4291 0.9855
+vt 0.4678 0.9730
+vt 0.4833 0.9730
+vt 0.5219 0.9855
+vt 0.6097 0.9229
+vt 0.6097 0.2971
+vt 0.4678 0.2470
+vt 0.4291 0.2345
+vt 0.5219 0.2345
+vt 0.4833 0.2470
+vt 0.4833 0.2783
+vt 0.4678 0.2783
+vt 0.4132 0.2971
+vt 0.4132 0.9229
+vt 0.4678 0.9417
+vt 0.4833 0.9417
+vt 0.5182 0.9229
+vt 0.5182 0.2971
+vt 0.4328 0.2971
+vt 0.4328 0.9229
+vt 0.5026 0.9229
+vt 0.5026 0.2971
+vt 0.4485 0.2971
+vt 0.4485 0.9229
+vt 0.5026 0.2814
+vt 0.4485 0.2814
+vt 0.4485 0.9386
+vt 0.5026 0.9386
+vt 0.9588 0.9625
+vt 0.8837 0.9625
+vt 0.8837 0.0348
+vt 0.9588 0.0348
+vt 0.9901 0.9625
+vt 0.9901 0.0348
+vt 0.9588 0.0035
+vt 0.8837 0.0035
+vt 0.8524 0.0348
+vt 0.8524 0.9625
+vt 0.9588 0.9938
+vt 0.8837 0.9938
+vt 0.6554 0.3627
+vt 0.6690 0.3627
+vt 0.6690 0.9885
+vt 0.6554 0.9885
+vt 0.6972 0.9885
+vt 0.6837 0.9885
+vt 0.6837 0.3627
+vt 0.6972 0.3627
+vt 0.7119 0.3627
+vt 0.7119 0.9885
+vt 0.5691 0.2971
+vt 0.5691 0.9229
+vt 0.5378 0.9229
+vt 0.5378 0.2971
+vt 0.3413 0.2971
+vt 0.3819 0.2971
+vt 0.3819 0.9229
+vt 0.3413 0.9229
+vt 0.4291 0.9855
+vt 0.4678 0.9730
+vt 0.4833 0.9730
+vt 0.5219 0.9855
+vt 0.6097 0.9229
+vt 0.6097 0.2971
+vt 0.4678 0.2470
+vt 0.4291 0.2345
+vt 0.5219 0.2345
+vt 0.4833 0.2470
+vt 0.4833 0.2783
+vt 0.4678 0.2783
+vt 0.4132 0.2971
+vt 0.4132 0.9229
+vt 0.4678 0.9417
+vt 0.4833 0.9417
+vt 0.5182 0.9229
+vt 0.5182 0.2971
+vt 0.4328 0.2971
+vt 0.4328 0.9229
+vt 0.5026 0.9229
+vt 0.5026 0.2971
+vt 0.4485 0.2971
+vt 0.4485 0.9229
+vt 0.5026 0.2814
+vt 0.4485 0.2814
+vt 0.4485 0.9386
+vt 0.5026 0.9386
+vt 0.9588 0.9625
+vt 0.8837 0.9625
+vt 0.8837 0.0348
+vt 0.9588 0.0348
+vt 0.9901 0.9625
+vt 0.9901 0.0348
+vt 0.9588 0.0035
+vt 0.8837 0.0035
+vt 0.8524 0.0348
+vt 0.8524 0.9625
+vt 0.9588 0.9938
+vt 0.8837 0.9938
+vt 0.9588 0.9625
+vt 0.8837 0.9625
+vt 0.8837 0.0348
+vt 0.9588 0.0348
+vt 0.9901 0.9625
+vt 0.9901 0.0348
+vt 0.9588 0.0035
+vt 0.8837 0.0035
+vt 0.8524 0.0348
+vt 0.8524 0.9625
+vt 0.9588 0.9938
+vt 0.8837 0.9938
+vt 0.9588 0.9625
+vt 0.8837 0.9625
+vt 0.8837 0.0348
+vt 0.9588 0.0348
+vt 0.9901 0.9625
+vt 0.9901 0.0348
+vt 0.9588 0.0035
+vt 0.8837 0.0035
+vt 0.8524 0.0348
+vt 0.8524 0.9625
+vt 0.9588 0.9938
+vt 0.8837 0.9938
+vt 0.7427 0.1169
+vt 0.6400 0.1169
+vt 0.6400 0.3317
+vt 0.7427 0.3317
+vt 0.7427 0.4343
+vt 0.8260 0.4343
+vt 0.8260 0.3317
+vt 0.8260 0.1169
+vt 0.8260 0.0142
+vt 0.7427 0.0142
+vt 1.2190 -0.0648
+vt -0.3252 -0.0648
+vt -0.3252 -0.4063
+vt 1.2190 -0.4063
+vt 1.2222 1.0112
+vt -0.3220 1.0112
+vt -0.3220 0.6697
+vt 1.2222 0.6697
+vt 1.2190 1.0149
+vt 1.5430 0.0432
+vt -0.3252 1.0149
+vt -0.6491 0.0432
+vt -0.3220 0.3283
+vt 1.2222 0.3283
+vt -0.3240 0.3223
+vt 0.7003 0.3223
+vt 0.7003 0.6637
+vt -0.3240 0.6637
+vt 1.2202 1.0043
+vt -0.3240 1.0043
+vt -0.3240 0.6629
+vt 1.2202 0.6629
+vt 0.6998 1.0039
+vt -0.3245 1.0039
+vt -0.3245 0.6625
+vt 0.6998 0.6625
+vt -0.3246 1.0127
+vt -0.3246 -0.0117
+vt 1.2196 -0.0117
+vt 1.2196 1.0127
+vt 0.7003 1.0051
+vt -0.3240 1.0051
+vt -0.3240 0.3214
+vt 1.2202 0.3214
+vt -0.3245 0.3210
+vt 0.6998 0.3210
+vn -1.0000 0.0000 -0.0000
+vn 0.0000 0.0000 -1.0000
+vn -0.0000 0.0000 1.0000
+vn 0.0000 0.9487 -0.3162
+vn 1.0000 0.0000 0.0000
+vn -0.2936 0.9069 -0.3023
+vn 0.2936 0.9069 -0.3023
+vn 0.1518 -0.9377 0.3126
+vn -0.1518 -0.9377 0.3126
+vn 0.0000 -0.9487 0.3162
+vn 0.0000 -1.0000 0.0000
+g dtrack_vst33_Cube.030_SlopeRailMaterial
+s off
+f 8/1/1 10/2/1 9/3/1 7/4/1
+f 10/2/2 14/5/2 13/6/2 9/7/2
+f 12/8/3 8/1/3 7/9/3 11/10/3
+f 12/8/4 14/5/4 10/2/4 8/1/4
+f 22/11/5 21/12/5 25/13/5 26/14/5
+f 15/15/6 19/16/6 20/17/6 16/18/6
+f 16/19/2 20/20/2 21/21/2 17/22/2
+f 17/23/7 21/12/7 22/11/7 18/24/7
+f 19/25/3 15/26/3 18/27/3 22/28/3
+f 26/29/3 23/30/3 19/25/3 22/28/3
+f 19/16/1 23/31/1 24/32/1 20/17/1
+f 21/21/2 20/20/2 24/33/2 25/34/2
+f 26/14/8 25/13/8 27/35/8 28/36/8
+f 24/32/9 23/31/9 29/37/9 30/38/9
+f 28/36/5 27/35/5 31/39/5 32/40/5
+f 30/38/1 29/37/1 33/41/1 34/42/1
+f 31/39/4 34/42/4 33/41/4 32/40/4
+f 23/30/3 26/29/3 28/43/3 32/40/3 33/41/3 29/44/3
+f 24/33/2 30/45/2 34/42/2 31/39/2 27/46/2 25/34/2
+f 39/47/4 42/48/4 41/49/4 40/50/4
+f 35/51/3 39/47/3 40/50/3 36/52/3
+f 36/53/1 40/50/1 41/49/1 37/54/1
+f 37/55/2 41/49/2 42/48/2 38/56/2
+f 39/47/5 35/57/5 38/58/5 42/48/5
+f 43/59/1 45/60/1 46/61/1 44/62/1
+f 47/63/5 49/64/5 50/65/5 48/66/5
+f 43/67/10 44/68/10 47/63/10 48/66/10
+f 45/60/4 50/65/4 49/64/4 46/61/4
+f 58/69/1 57/70/1 61/71/1 62/72/1
+f 51/73/7 55/74/7 56/75/7 52/76/7
+f 52/77/3 56/78/3 57/79/3 53/80/3
+f 53/81/6 57/70/6 58/69/6 54/82/6
+f 55/83/2 51/84/2 54/85/2 58/86/2
+f 62/87/2 59/88/2 55/83/2 58/86/2
+f 55/74/5 59/89/5 60/90/5 56/75/5
+f 57/79/3 56/78/3 60/91/3 61/92/3
+f 62/72/9 61/71/9 63/93/9 64/94/9
+f 60/90/8 59/89/8 65/95/8 66/96/8
+f 64/94/1 63/93/1 67/97/1 68/98/1
+f 66/96/5 65/95/5 69/99/5 70/100/5
+f 67/97/4 70/100/4 69/99/4 68/98/4
+f 59/88/2 62/87/2 64/101/2 68/98/2 69/99/2 65/102/2
+f 60/91/3 66/103/3 70/100/3 67/97/3 63/104/3 61/92/3
+f 75/105/4 78/106/4 77/107/4 76/108/4
+f 71/109/2 75/105/2 76/108/2 72/110/2
+f 72/111/5 76/108/5 77/107/5 73/112/5
+f 73/113/3 77/107/3 78/106/3 74/114/3
+f 75/105/1 71/115/1 74/116/1 78/106/1
+f 83/117/4 86/118/4 85/119/4 84/120/4
+f 79/121/3 83/117/3 84/120/3 80/122/3
+f 80/123/1 84/120/1 85/119/1 81/124/1
+f 81/125/2 85/119/2 86/118/2 82/126/2
+f 83/117/5 79/127/5 82/128/5 86/118/5
+f 91/129/4 94/130/4 93/131/4 92/132/4
+f 87/133/2 91/129/2 92/132/2 88/134/2
+f 88/135/5 92/132/5 93/131/5 89/136/5
+f 89/137/3 93/131/3 94/130/3 90/138/3
+f 91/129/1 87/139/1 90/140/1 94/130/1
+f 96/141/5 95/142/5 97/143/5 98/144/5
+f 98/144/2 97/145/2 101/146/2 102/147/2
+f 100/148/3 99/149/3 95/150/3 96/141/3
+f 100/148/4 96/141/4 98/144/4 102/147/4
+g dtrack_vst33_Cube.030_SlopeGravelMaterial
+f 3/151/3 6/152/3 5/153/3 2/154/3
+f 4/155/2 1/156/2 104/157/2 106/158/2
+f 1/159/5 3/151/5 2/160/5
+f 6/152/1 4/161/1 5/162/1
+f 4/161/4 6/152/4 3/151/4 1/159/4
+f 106/158/2 104/157/2 108/163/2 110/164/2
+f 5/165/1 4/166/1 106/167/1 105/168/1
+f 2/169/3 5/170/3 105/171/3 103/172/3
+f 1/173/5 2/174/5 103/175/5 104/176/5
+f 108/177/11 107/178/11 109/179/11 110/180/11
+f 105/168/1 106/167/1 110/181/1 109/182/1
+f 103/172/3 105/171/3 109/183/3 107/184/3
+f 104/176/5 103/175/5 107/185/5 108/186/5
diff --git a/advtrains/advtrains/models/advtrains_modernwagon.b3d b/advtrains/advtrains/models/advtrains_modernwagon.b3d
new file mode 100644
index 0000000..aacddca
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_modernwagon.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_platform_diag.b3d b/advtrains/advtrains/models/advtrains_platform_diag.b3d
new file mode 100644
index 0000000..9464e63
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_platform_diag.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_platform_diag_low.b3d b/advtrains/advtrains/models/advtrains_platform_diag_low.b3d
new file mode 100644
index 0000000..5a8054b
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_platform_diag_low.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_retrosignal_off.b3d b/advtrains/advtrains/models/advtrains_retrosignal_off.b3d
new file mode 100644
index 0000000..3d231dd
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_retrosignal_off.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_retrosignal_off_30.b3d b/advtrains/advtrains/models/advtrains_retrosignal_off_30.b3d
new file mode 100644
index 0000000..da258e1
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_retrosignal_off_30.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_retrosignal_off_45.b3d b/advtrains/advtrains/models/advtrains_retrosignal_off_45.b3d
new file mode 100644
index 0000000..338224a
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_retrosignal_off_45.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_retrosignal_off_60.b3d b/advtrains/advtrains/models/advtrains_retrosignal_off_60.b3d
new file mode 100644
index 0000000..c560ca1
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_retrosignal_off_60.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_retrosignal_on.b3d b/advtrains/advtrains/models/advtrains_retrosignal_on.b3d
new file mode 100644
index 0000000..3d19439
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_retrosignal_on.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_retrosignal_on_30.b3d b/advtrains/advtrains/models/advtrains_retrosignal_on_30.b3d
new file mode 100644
index 0000000..98f8a92
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_retrosignal_on_30.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_retrosignal_on_45.b3d b/advtrains/advtrains/models/advtrains_retrosignal_on_45.b3d
new file mode 100644
index 0000000..414e121
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_retrosignal_on_45.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_retrosignal_on_60.b3d b/advtrains/advtrains/models/advtrains_retrosignal_on_60.b3d
new file mode 100644
index 0000000..a51529a
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_retrosignal_on_60.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_signal.b3d b/advtrains/advtrains/models/advtrains_signal.b3d
new file mode 100644
index 0000000..7f69560
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_signal.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_signal_30.b3d b/advtrains/advtrains/models/advtrains_signal_30.b3d
new file mode 100644
index 0000000..0b949a7
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_signal_30.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_signal_45.b3d b/advtrains/advtrains/models/advtrains_signal_45.b3d
new file mode 100644
index 0000000..ccaebf4
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_signal_45.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_signal_60.b3d b/advtrains/advtrains/models/advtrains_signal_60.b3d
new file mode 100644
index 0000000..cf41e6d
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_signal_60.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_signal_wall_l.b3d b/advtrains/advtrains/models/advtrains_signal_wall_l.b3d
new file mode 100644
index 0000000..b1bcbcf
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_signal_wall_l.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_signal_wall_r.b3d b/advtrains/advtrains/models/advtrains_signal_wall_r.b3d
new file mode 100644
index 0000000..cf26389
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_signal_wall_r.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_signal_wall_t.b3d b/advtrains/advtrains/models/advtrains_signal_wall_t.b3d
new file mode 100644
index 0000000..30e77f6
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_signal_wall_t.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_track_cr.b3d b/advtrains/advtrains/models/advtrains_track_cr.b3d
new file mode 100644
index 0000000..b0f5e4b
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_track_cr.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_track_st.b3d b/advtrains/advtrains/models/advtrains_track_st.b3d
new file mode 100644
index 0000000..10b5d90
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_track_st.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_track_st_45.b3d b/advtrains/advtrains/models/advtrains_track_st_45.b3d
new file mode 100644
index 0000000..32505a1
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_track_st_45.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/trackplane.b3d b/advtrains/advtrains/models/trackplane.b3d
new file mode 100644
index 0000000..b4728c3
--- /dev/null
+++ b/advtrains/advtrains/models/trackplane.b3d
Binary files differ
diff --git a/advtrains/advtrains/nodedb.lua b/advtrains/advtrains/nodedb.lua
new file mode 100644
index 0000000..03a5a2d
--- /dev/null
+++ b/advtrains/advtrains/nodedb.lua
@@ -0,0 +1,343 @@
+--nodedb.lua
+--database of all nodes that have 'save_in_at_nodedb' field set to true in node definition
+
+
+--serialization format:
+--(2byte z) (2byte y) (2byte x) (2byte contentid)
+--contentid := (14bit nodeid, 2bit param2)
+
+local function int_to_bytes(i)
+ local x=i+32768--clip to positive integers
+ local cH = math.floor(x / 256) % 256;
+ local cL = math.floor(x ) % 256;
+ return(string.char(cH, cL));
+end
+local function bytes_to_int(bytes)
+ local t={string.byte(bytes,1,-1)}
+ local n =
+ t[1] * 256 +
+ t[2]
+ return n-32768
+end
+local function l2b(x)
+ return x%4
+end
+local function u14b(x)
+ return math.floor(x/4)
+end
+local ndb={}
+
+--local variables for performance
+local ndb_nodeids={}
+local ndb_nodes={}
+local ndb_ver
+
+local function ndbget(x,y,z)
+ local ny=ndb_nodes[y]
+ if ny then
+ local nx=ny[x]
+ if nx then
+ return nx[z]
+ end
+ end
+ return nil
+end
+local function ndbset(x,y,z,v)
+ if not ndb_nodes[y] then
+ ndb_nodes[y]={}
+ end
+ if not ndb_nodes[y][x] then
+ ndb_nodes[y][x]={}
+ end
+ ndb_nodes[y][x][z]=v
+end
+
+
+local path=minetest.get_worldpath()..DIR_DELIM.."advtrains_ndb2"
+--load
+--nodeids get loaded by advtrains init.lua and passed here
+function ndb.load_data(data)
+ ndb_nodeids = data and data.nodeids or {}
+ ndb_ver = data and data.ver or 0
+ if ndb_ver < 1 then
+ for k,v in pairs(ndb_nodeids) do
+ if v == "advtrains:dtrack_xing4590_st" then
+ cidDepr = k
+ elseif v == "advtrains:dtrack_xing90plusx_45l" then
+ cidNew = k
+ end
+ end
+ end
+ local file, err = io.open(path, "rb")
+ if not file then
+ atwarn("Couldn't load the node database: ", err or "Unknown Error")
+ else
+ local cnt=0
+ local hst_z=file:read(2)
+ local hst_y=file:read(2)
+ local hst_x=file:read(2)
+ local cid=file:read(2)
+ while hst_z and hst_y and hst_x and cid and #hst_z==2 and #hst_y==2 and #hst_x==2 and #cid==2 do
+ if (ndb_ver < 1 and cid == cidDepr) then
+ cid = cidNew
+ end
+ ndbset(bytes_to_int(hst_x), bytes_to_int(hst_y), bytes_to_int(hst_z), bytes_to_int(cid))
+ cnt=cnt+1
+ hst_z=file:read(2)
+ hst_y=file:read(2)
+ hst_x=file:read(2)
+ cid=file:read(2)
+ end
+ atlog("nodedb: read", cnt, "nodes.")
+ file:close()
+ end
+ ndb_ver = 1
+end
+
+local windows_compat = false
+--save
+function ndb.save_data()
+ local tmppath = path.."~"
+ local file, err
+ if windows_compat then
+ -- open ndb file directly
+ file, err = io.open(path, "wb")
+ else
+ -- open another file next to it, then replace atomically
+ file, err = io.open(tmppath, "wb")
+ end
+
+ if not file then
+ atwarn("Couldn't save the node database: ", err or "Unknown Error")
+ else
+ for y, ny in pairs(ndb_nodes) do
+ for x, nx in pairs(ny) do
+ for z, cid in pairs(nx) do
+ file:write(int_to_bytes(z))
+ file:write(int_to_bytes(y))
+ file:write(int_to_bytes(x))
+ file:write(int_to_bytes(cid))
+ end
+ end
+ end
+ file:close()
+ end
+
+ if not windows_compat then
+ local success, msg = os.rename(tmppath, path)
+ --local success, msg = nil, "test"
+ -- for windows, this fails if the file already exists. Enable windows compatibility and directly write to path.
+ if not success then
+ atlog("Replacing the nodedb file atomically failed:",msg)
+ atlog("Switching to Windows mode (will directly overwrite the nodedb file from now on)")
+ windows_compat = true
+ os.remove(tmppath)
+ -- try again
+ ndb.save_data()
+ end
+ end
+
+ return {nodeids = ndb_nodeids, ver = ndb_ver}
+end
+
+--function to get node. track database is not helpful here.
+function ndb.get_node_or_nil(pos)
+ -- FIX for bug found on linuxworks server:
+ -- a loaded node might get read before the LBM has updated its state, resulting in wrongly set signals and switches
+ -- -> Using the saved node prioritarily.
+ local node = ndb.get_node_raw(pos)
+ if node then
+ return node
+ else
+ --try reading the node from the map
+ return minetest.get_node_or_nil(pos)
+ end
+end
+function ndb.get_node(pos)
+ local n=ndb.get_node_or_nil(pos)
+ if not n then
+ return {name="ignore", param2=0}
+ end
+ return n
+end
+function ndb.get_node_raw(pos)
+ local cid=ndbget(pos.x, pos.y, pos.z)
+ if cid then
+ local nodeid = ndb_nodeids[u14b(cid)]
+ if nodeid then
+ return {name=nodeid, param2 = l2b(cid)}
+ end
+ end
+ return nil
+end
+
+
+function ndb.swap_node(pos, node, no_inval)
+ if minetest.get_node_or_nil(pos) then
+ minetest.swap_node(pos, node)
+ end
+ ndb.update(pos, node)
+end
+
+function ndb.update(pos, pnode)
+ local node = pnode or minetest.get_node_or_nil(pos)
+ if not node or node.name=="ignore" then return end
+ if minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].groups.save_in_at_nodedb then
+ local nid
+ for tnid, nname in pairs(ndb_nodeids) do
+ if nname==node.name then
+ nid=tnid
+ end
+ end
+ if not nid then
+ nid=#ndb_nodeids+1
+ ndb_nodeids[nid]=node.name
+ end
+ local resid = (nid * 4) + (l2b(node.param2 or 0))
+ ndbset(pos.x, pos.y, pos.z, resid )
+ --atdebug("nodedb: updating node", pos, "stored nid",nid,"assigned",ndb_nodeids[nid],"resulting cid",resid)
+ minetest.after(0, advtrains.invalidate_all_paths, pos)
+ else
+ --at this position there is no longer a node that needs to be tracked.
+ --atdebug("nodedb: updating node", pos, "cleared")
+ ndbset(pos.x, pos.y, pos.z, nil)
+ end
+end
+
+function ndb.clear(pos)
+ ndbset(pos.x, pos.y, pos.z, nil)
+end
+
+
+--get_node with pseudoload. now we only need track data, so we can use the trackdb as second fallback
+--nothing new will be saved inside the trackdb.
+--returns:
+--true, conn1, conn2, rely1, rely2, railheight in case everything's right.
+--false if it's not a rail or the train does not drive on this rail, but it is loaded or
+--nil if the node is neither loaded nor in trackdb
+--the distraction between false and nil will be needed only in special cases.(train initpos)
+function advtrains.get_rail_info_at(pos, drives_on)
+ local rdp=advtrains.round_vector_floor_y(pos)
+
+ local node=ndb.get_node_or_nil(rdp)
+ if not node then return end
+
+ local nodename=node.name
+ if(not advtrains.is_track_and_drives_on(nodename, drives_on)) then
+ return false
+ end
+ local conns, railheight, tracktype=advtrains.get_track_connections(node.name, node.param2)
+
+ return true, conns, railheight
+end
+
+ndb.run_lbm = function(pos, node)
+ return advtrains.pcall(function()
+ local cid=ndbget(pos.x, pos.y, pos.z)
+ if cid then
+ --if in database, detect changes and apply.
+ local nodeid = ndb_nodeids[u14b(cid)]
+ local param2 = l2b(cid)
+ if not nodeid then
+ --something went wrong
+ atwarn("Node Database corruption, couldn't determine node to set at", pos)
+ ndb.update(pos, node)
+ else
+ if (nodeid~=node.name or param2~=node.param2) then
+ atprint("nodedb: lbm replaced", pos, "with nodeid", nodeid, "param2", param2, "cid is", cid)
+ minetest.swap_node(pos, {name=nodeid, param2 = param2})
+ local ndef=minetest.registered_nodes[nodeid]
+ if ndef and ndef.on_updated_from_nodedb then
+ ndef.on_updated_from_nodedb(pos, node)
+ end
+ return true
+ end
+ end
+ else
+ --if not in database, take it.
+ --atlog("Node Database:", pos, "was not found in the database, have you used worldedit?")
+ ndb.update(pos, node)
+ end
+ return false
+ end)
+end
+
+
+minetest.register_lbm({
+ name = "advtrains:nodedb_on_load_update",
+ nodenames = {"group:save_in_at_nodedb"},
+ run_at_every_load = true,
+ run_on_every_load = true,
+ action = ndb.run_lbm,
+ interval=30,
+ chance=1,
+ })
+
+--used when restoring stuff after a crash
+ndb.restore_all = function()
+ --atlog("Updating the map from the nodedb, this may take a while")
+ local cnt=0
+ local dcnt=0
+ for y, ny in pairs(ndb_nodes) do
+ for x, nx in pairs(ny) do
+ for z, _ in pairs(nx) do
+ local pos={x=x, y=y, z=z}
+ local node=minetest.get_node_or_nil(pos)
+ if node then
+ local ori_ndef=minetest.registered_nodes[node.name]
+ local ndbnode=ndb.get_node_raw(pos)
+ if ori_ndef and ori_ndef.groups.save_in_at_nodedb then --check if this node has been worldedited, and don't replace then
+ if (ndbnode.name~=node.name or ndbnode.param2~=node.param2) then
+ minetest.swap_node(pos, ndbnode)
+ --atlog("Replaced",node.name,"@",pos,"with",ndbnode.name)
+ cnt=cnt+1
+ end
+ else
+ ndb.clear(pos)
+ dcnt=dcnt+1
+ --atlog("Found ghost node (former",ndbnode and ndbnode.name,") @",pos,"deleting")
+ end
+ end
+ end
+ end
+ end
+ local text="Restore node database: Replaced "..cnt.." nodes, removed "..dcnt.." ghost nodes."
+ atlog(text)
+ return text
+end
+
+minetest.register_on_dignode(function(pos, oldnode, digger)
+ return advtrains.pcall(function()
+ ndb.clear(pos)
+ end)
+end)
+
+function ndb.get_nodes()
+ return ndb_nodes
+end
+function ndb.get_nodeids()
+ return ndb_nodeids
+end
+
+
+advtrains.ndb=ndb
+
+local ptime=0
+
+minetest.register_chatcommand("at_sync_ndb",
+ {
+ params = "", -- Short parameter description
+ description = "Write node db back to map and find ghost nodes", -- Full description
+ privs = {train_operator=true},
+ func = function(name, param)
+ return advtrains.pcall(function()
+ if os.time() < ptime+30 then
+ return false, "Please wait at least 30s from the previous execution of /at_restore_ndb!"
+ end
+ local text = ndb.restore_all()
+ ptime=os.time()
+ return true, text
+ end)
+ end,
+ })
+
diff --git a/advtrains/advtrains/occupation.lua b/advtrains/advtrains/occupation.lua
new file mode 100644
index 0000000..da60278
--- /dev/null
+++ b/advtrains/advtrains/occupation.lua
@@ -0,0 +1,207 @@
+-- occupation.lua
+--[[
+Collects and manages positions where trains occupy and/or reserve/require space
+
+It turned out that, especially for the TSS, some more, even overlapping zones are required.
+Packing those into a data structure would just become a huge mess!
+Instead, this occupation system will store the path indices of positions in the corresponding.
+train's paths.
+So, the occupation is a reverse lookup of paths.
+Then, a callback system will handle changes in those indices, as follows:
+
+Whenever the train generates new path items (path_get/path_create), their counterpart indices will be filled in here.
+Whenever a path gets invalidated or path items are deleted, their index counterpart is erased from here.
+
+When a train needs to know whether a position is blocked by another train, it will (and is permitted to)
+query the train.index and train.end_index and compare them to the blocked position's index.
+
+Callback system for 3rd-party path checkers:
+advtrains.te_register_on_new_path(func(id, train))
+-- Called when a train's path is re-initalized, either when it was invalidated
+-- or the saves were just loaded
+-- It can be assumed that everything is in the state of when the last run
+-- of on_update was made, but all indices are shifted by an unknown amount.
+
+advtrains.te_register_on_update(func(id, train))
+-- Called each step and after a train moved, its length changed or some other event occured
+-- The path is unmodified, and train.index and train.end_index can be reliably
+-- queried for the new position and length of the train.
+-- note that this function might be called multiple times per step, and this
+-- function being called does not necessarily mean that something has changed.
+-- It is ensured that on_new_path callbacks are executed prior to these callbacks whenever
+-- an invalidation or a reload occured.
+
+advtrains.te_register_on_create(func(id, train))
+-- Called right after a train is created, right after the initial new_path callback
+advtrains.te_register_on_remove(func(id, train))
+-- Called right before a train is deleted
+
+
+All callbacks are allowed to save certain values inside the train table, but they must ensure that
+those are reinitialized in the on_new_path callback. The on_new_path callback must explicitly
+set ALL OF those values to nil or to a new updated value, and must not rely on their existence.
+
+]]--
+local o = {}
+
+local occ = {}
+local occ_chg = {}
+
+
+local function occget(p)
+ local t = occ[p.y]
+ if not t then
+ occ[p.y] = {}
+ t = occ[p.y]
+ end
+ local s = t
+ t = t[p.x]
+ if not t then
+ s[p.x] = {}
+ t = s[p.x]
+ end
+ return t[p.z]
+end
+local function occgetcreate(p)
+ local t = occ[p.y]
+ if not t then
+ occ[p.y] = {}
+ t = occ[p.y]
+ end
+ local s = t
+ t = t[p.x]
+ if not t then
+ s[p.x] = {}
+ t = s[p.x]
+ end
+ s = t
+ t = t[p.z]
+ if not t then
+ s[p.z] = {}
+ t = s[p.z]
+ end
+ return t
+end
+
+
+function o.set_item(train_id, pos, idx)
+ local t = occgetcreate(pos)
+ local i = 1
+ while t[i] do
+ if t[i]==train_id then
+ break
+ end
+ i = i + 2
+ end
+ t[i] = train_id
+ t[i+1] = idx
+end
+
+
+function o.clear_item(train_id, pos)
+ local t = occget(pos)
+ if not t then return end
+ local i = 1
+ local moving = false
+ while t[i] do
+ if t[i]==train_id then
+ if moving then
+ -- if, for some occasion, there should be a duplicate entry, erase this one too
+ atwarn("Duplicate occupation entry at",pos,"for train",train_id,":",t)
+ i = i - 2
+ end
+ moving = true
+ end
+ if moving then
+ t[i] = t[i+2]
+ t[i+1] = t[i+3]
+ end
+ i = i + 2
+ end
+end
+
+-- Checks whether some other train (apart from train_id) has it's 0 zone here
+function o.check_collision(pos, train_id)
+ local npos = advtrains.round_vector_floor_y(pos)
+ local t = occget(npos)
+ if not t then return end
+ local i = 1
+ while t[i] do
+ local ti = t[i]
+ if ti~=train_id then
+ local idx = t[i+1]
+ local train = advtrains.trains[ti]
+
+ --atdebug("checking train",t[i],"index",idx,"<>",train.index,train.end_index)
+ if train and idx >= train.end_index and idx <= train.index then
+ --atdebug("collides.")
+ return train -- return train it collided with so we can couple when shunting is enabled
+ end
+ end
+ i = i + 2
+ end
+ return false
+end
+
+-- Gets a mapping of train id's to indexes of trains that share this path item with this train
+-- The train itself will not be included.
+-- If the requested index position is off-track, returns {}.
+-- returns (table with train_id->index), position
+function o.get_occupations(train, index)
+ local ppos, ontrack = advtrains.path_get(train, index)
+ if not ontrack then
+ atlog("Train",train.id,"get_occupations requested off-track",index)
+ return {}, ppos
+ end
+ local pos = advtrains.round_vector_floor_y(ppos)
+ local t = occget(pos)
+ if not t then return {} end
+ local r = {}
+ local i = 1
+ local train_id = train.id
+ while t[i] do
+ if t[i]~=train_id then
+ r[t[i]] = t[i+1]
+ end
+ i = i + 2
+ end
+ return r, pos
+end
+-- Gets a mapping of train id's to indexes of trains that stand or drive over
+-- returns (table with train_id->index)
+function o.get_trains_at(ppos)
+ local pos = advtrains.round_vector_floor_y(ppos)
+ local t = occget(pos)
+ if not t then return {} end
+ local r = {}
+ local i = 1
+ while t[i] do
+ local train = advtrains.trains[t[i]]
+ local idx = t[i+1]
+ if train.end_index - 0.5 <= idx and idx <= train.index + 0.5 then
+ r[t[i]] = idx
+ end
+ i = i + 2
+ end
+ return r
+end
+
+-- Gets a mapping of train id's to indexes of trains that have a path
+-- generated over this node
+-- returns (table with train_id->index)
+function o.get_trains_over(ppos)
+ local pos = advtrains.round_vector_floor_y(ppos)
+ local t = occget(pos)
+ if not t then return {} end
+ local r = {}
+ local i = 1
+ while t[i] do
+ local train = advtrains.trains[t[i]]
+ local idx = t[i+1]
+ r[t[i]] = idx
+ i = i + 2
+ end
+ return r
+end
+
+advtrains.occ = o
diff --git a/advtrains/advtrains/p_mesecon_iface.lua b/advtrains/advtrains/p_mesecon_iface.lua
new file mode 100644
index 0000000..87e1c6d
--- /dev/null
+++ b/advtrains/advtrains/p_mesecon_iface.lua
@@ -0,0 +1,54 @@
+-- p_mesecon_iface.lua
+-- Mesecons interface by overriding the switch
+
+if not mesecon then return end
+
+minetest.override_item("mesecons_switch:mesecon_switch_off", {
+ groups = {
+ dig_immediate=2,
+ save_in_nodedb=1,
+ },
+ on_rightclick = function (pos, node)
+ advtrains.ndb.swap_node(pos, {name="mesecons_switch:mesecon_switch_on", param2=node.param2})
+ mesecon.receptor_on(pos)
+ minetest.sound_play("mesecons_switch", {pos=pos})
+ end,
+ on_updated_from_nodedb = function(pos, node)
+ mesecon.receptor_off(pos)
+ end,
+ advtrains = {
+ getstate = "off",
+ setstate = function(pos, node, newstate)
+ if newstate=="on" then
+ advtrains.ndb.swap_node(pos, {name="mesecons_switch:mesecon_switch_on", param2=node.param2})
+ mesecon.receptor_on(pos)
+ end
+ end,
+ },
+})
+
+minetest.override_item("mesecons_switch:mesecon_switch_on", {
+ groups = {
+ dig_immediate=2,
+ save_in_nodedb=1,
+ not_in_creative_inventory=1,
+ },
+ on_rightclick = function (pos, node)
+ advtrains.ndb.swap_node(pos, {name="mesecons_switch:mesecon_switch_off", param2=node.param2})
+ mesecon.receptor_off(pos)
+ minetest.sound_play("mesecons_switch", {pos=pos})
+ end,
+ on_updated_from_nodedb = function(pos, node)
+ mesecon.receptor_on(pos)
+ end,
+ advtrains = {
+ getstate = "on",
+ setstate = function(pos, node, newstate)
+ if newstate=="off" then
+ advtrains.ndb.swap_node(pos, {name="mesecons_switch:mesecon_switch_off", param2=node.param2})
+ mesecon.receptor_off(pos)
+ end
+ end,
+ fallback_state = "off",
+ },
+})
diff --git a/advtrains/advtrains/passive.lua b/advtrains/advtrains/passive.lua
new file mode 100644
index 0000000..fe4790c
--- /dev/null
+++ b/advtrains/advtrains/passive.lua
@@ -0,0 +1,121 @@
+-- passive.lua
+-- API to passive components, as described in passive_api.txt of advtrains_luaautomation
+-- This has been moved to the advtrains core in turn with the interlocking system,
+-- to prevent a dependency on luaautomation.
+
+local deprecation_warned = {}
+
+function advtrains.getstate(parpos, pnode)
+ local pos
+ if atlatc then
+ pos = atlatc.pcnaming.resolve_pos(parpos)
+ else
+ pos = advtrains.round_vector_floor_y(parpos)
+ end
+ if type(pos)~="table" or (not pos.x or not pos.y or not pos.z) then
+ debug.sethook()
+ error("Invalid position supplied to getstate")
+ end
+ local node=pnode or advtrains.ndb.get_node(pos)
+ local ndef=minetest.registered_nodes[node.name]
+ local st
+ if ndef and ndef.advtrains and ndef.advtrains.getstate then
+ st=ndef.advtrains.getstate
+ elseif ndef and ndef.luaautomation and ndef.luaautomation.getstate then
+ if not deprecation_warned[node.name] then
+ minetest.log("warning", node.name.." uses deprecated definition of ATLATC functions in the 'luaautomation' field. Please move them to the 'advtrains' field!")
+ end
+ st=ndef.luaautomation.getstate
+ else
+ return nil
+ end
+ if type(st)=="function" then
+ return st(pos, node)
+ else
+ return st
+ end
+end
+
+function advtrains.setstate(parpos, newstate, pnode)
+ local pos
+ if atlatc then
+ pos = atlatc.pcnaming.resolve_pos(parpos)
+ else
+ pos = advtrains.round_vector_floor_y(parpos)
+ end
+ if type(pos)~="table" or (not pos.x or not pos.y or not pos.z) then
+ debug.sethook()
+ error("Invalid position supplied to getstate")
+ end
+ local node=pnode or advtrains.ndb.get_node(pos)
+ local ndef=minetest.registered_nodes[node.name]
+ local st
+ if ndef and ndef.advtrains and ndef.advtrains.setstate then
+ st=ndef.advtrains.setstate
+ elseif ndef and ndef.luaautomation and ndef.luaautomation.setstate then
+ if not deprecation_warned[node.name] then
+ minetest.log("warning", node.name.." uses deprecated definition of ATLATC functions in the 'luaautomation' field. Please move them to the 'advtrains' field!")
+ end
+ st=ndef.luaautomation.setstate
+ else
+ return nil
+ end
+
+ if advtrains.get_train_at_pos(pos) then
+ return false
+ end
+
+ if advtrains.interlocking and advtrains.interlocking.route.has_route_lock(minetest.pos_to_string(pos)) then
+ return false
+ end
+
+ st(pos, node, newstate)
+ return true
+end
+
+function advtrains.is_passive(parpos, pnode)
+ local pos
+ if atlatc then
+ pos = atlatc.pcnaming.resolve_pos(parpos)
+ else
+ pos = advtrains.round_vector_floor_y(parpos)
+ end
+ if type(pos)~="table" or (not pos.x or not pos.y or not pos.z) then
+ debug.sethook()
+ error("Invalid position supplied to getstate")
+ end
+ local node=pnode or advtrains.ndb.get_node(pos)
+ local ndef=minetest.registered_nodes[node.name]
+ if ndef and ndef.advtrains and ndef.advtrains.getstate then
+ return true
+ elseif ndef and ndef.luaautomation and ndef.luaautomation.getstate then
+ if not deprecation_warned[node.name] then
+ minetest.log("warning", node.name.." uses deprecated definition of ATLATC functions in the 'luaautomation' field. Please move them to the 'advtrains' field!")
+ end
+ return true
+ else
+ return false
+ end
+end
+
+-- switches a node back to fallback state, if defined. Doesn't support pcnaming.
+function advtrains.set_fallback_state(pos, pnode)
+ local node=pnode or advtrains.ndb.get_node(pos)
+ local ndef=minetest.registered_nodes[node.name]
+ local st
+ if ndef and ndef.advtrains and ndef.advtrains.setstate
+ and ndef.advtrains.fallback_state then
+ if advtrains.get_train_at_pos(pos) then
+ return false
+ end
+
+ if advtrains.interlocking and advtrains.interlocking.route.has_route_lock(minetest.pos_to_string(pos)) then
+ return false
+ end
+
+ ndef.advtrains.setstate(pos, node, ndef.advtrains.fallback_state)
+ return true
+ end
+
+
+end
diff --git a/advtrains/advtrains/path.lua b/advtrains/advtrains/path.lua
new file mode 100644
index 0000000..ee82c06
--- /dev/null
+++ b/advtrains/advtrains/path.lua
@@ -0,0 +1,377 @@
+-- path.lua
+-- Functions for pathpredicting, put in a separate file.
+
+-- Naming conventions:
+-- 'index' - An index of the train.path table.
+-- 'offset' - A value in meters that determines how far on the path to walk relative to a certain index
+-- 'n' - Referring or pointing towards the 'next' path item, the one with index+1
+-- 'p' - Referring or pointing towards the 'prev' path item, the one with index-1
+-- 'f' - Referring to the positive end of the path (the end with the higher index)
+-- 'b' - Referring to the negative end of the path (the end with the lower index)
+
+-- New path structure of trains:
+--Tables:
+-- path - path positions. 'indices' are relative to this. At the moment, at.round_vector_floor_y(path[i])
+-- is the node this item corresponds to, however, this will change in the future.
+-- path_node - (reserved)
+-- path_cn - Connid of the current node that points towards path[i+1]
+-- path_cp - Connid of the current node that points towards path[i-1]
+-- When the day comes on that path!=node, these will only be set if this index represents a transition between rail nodes
+-- path_dist - The total distance of this path element from path element 0
+-- path_dir - The direction of this path item's transition to the next path item, which is the angle of conns[path_cn[i]].c
+--Variables:
+-- path_ext_f/b - how far path[i] is set
+-- path_trk_f/b - how far the path extends along a track. beyond those values, paths are generated in a straight line.
+-- path_req_f/b - how far path items were requested in the last step
+--
+--Distance and index:
+-- There is an important difference between the path index and the actual distance on the track: The distance between two path items can be larger than 1,
+-- but the corresponding index increment is still 1.
+-- Indexes in advtrains can be fractional values. If they are, it means that the actual position is interpolated between the 2 adjacent path items.
+-- If you need to proceed along the path by a specific actual distance, it does NOT work to simply add it to the index. You should use the path_get_index_by_offset() function.
+
+-- creates the path data structure, reconstructing the train from a position and a connid
+-- Important! train.drives_on must exist while calling this method
+-- returns: true - successful
+-- nil - node not yet available/unloaded, please wait
+-- false - node definitely gone, remove train
+function advtrains.path_create(train, pos, connid, rel_index)
+ local posr = advtrains.round_vector_floor_y(pos)
+ local node_ok, conns, rhe = advtrains.get_rail_info_at(pos, train.drives_on)
+ if not node_ok then
+ return node_ok
+ end
+ local mconnid = advtrains.get_matching_conn(connid, #conns)
+ train.index = rel_index
+ train.path = { [0] = { x=posr.x, y=posr.y+rhe, z=posr.z } }
+ train.path_cn = { [0] = connid }
+ train.path_cp = { [0] = mconnid }
+ train.path_dist = { [0] = 0 }
+
+ train.path_dir = {
+ [0] = advtrains.conn_angle_median(conns[mconnid].c, conns[connid].c)
+ }
+
+ train.path_ext_f=0
+ train.path_ext_b=0
+ train.path_trk_f=0
+ train.path_trk_b=0
+ train.path_req_f=0
+ train.path_req_b=0
+
+ advtrains.occ.set_item(train.id, posr, 0)
+ return true
+end
+
+-- Sets position and connid to properly restore after a crash, e.g. in order
+-- to save the train or to invalidate its path
+-- Assumes that the train is in clean state
+-- if invert ist true, setrestore will use the end index
+function advtrains.path_setrestore(train, invert)
+ local idx = train.index
+ if invert then
+ idx = train.end_index
+ end
+
+ local pos, connid, frac = advtrains.path_getrestore(train, idx, invert, true)
+
+ train.last_pos = pos
+ train.last_connid = connid
+ train.last_frac = frac
+end
+-- Get restore position, connid and frac (in this order) for a train that will originate at the passed index
+-- If invert is set, it will return path_cp and multiply frac by -1, in order to reverse the train there.
+function advtrains.path_getrestore(train, index, invert)
+ local idx = index
+ local cns = train.path_cn
+
+ if invert then
+ cns = train.path_cp
+ end
+
+ local fli = atfloor(index)
+ advtrains.path_get(train, fli)
+ if fli > train.path_trk_f then
+ fli = train.path_trk_f
+ end
+ if fli < train.path_trk_b then
+ fli = train.path_trk_b
+ end
+ return advtrains.path_get(train, fli),
+ cns[fli],
+ (idx - fli) * (invert and -1 or 1)
+end
+
+-- Invalidates a path
+-- this is supposed to clear stuff from the occupation tables
+-- This function throws a warning whenever any code calls it while the train steps are run, since that must not happen.
+-- The ignore_lock parameter can be used to ignore this, however, it should then be accompanied by a call to train_ensure_init
+-- before returning from the calling function.
+function advtrains.path_invalidate(train, ignore_lock)
+ if advtrains.lock_path_inval and not ignore_lock then
+ atwarn("Train ",train.train_id,": Illegal path invalidation has occured during train step:")
+ atwarn(debug.traceback())
+ end
+
+ if train.path then
+ for i,p in pairs(train.path) do
+ advtrains.occ.clear_item(train.id, advtrains.round_vector_floor_y(p))
+ end
+ end
+ train.path = nil
+ train.path_dist = nil
+ train.path_cp = nil
+ train.path_cn = nil
+ train.path_dir = nil
+ train.path_ext_f=0
+ train.path_ext_b=0
+ train.path_trk_f=0
+ train.path_trk_b=0
+ train.path_req_f=0
+ train.path_req_b=0
+
+ train.dirty = true
+end
+
+-- Prints a path using the passed print function
+-- This function should be 'atprint', 'atlog', 'atwarn' or 'atdebug', because it needs to use print_concat_table
+function advtrains.path_print(train, printf)
+ printf("path_print: tid =",train.id," index =",train.index," end_index =",train.end_index," vel =",train.velocity)
+ if not train.path then
+ printf("path_print: Path is invalidated/inexistant.")
+ return
+ end
+ printf("i: CP Position Dir CN Dist")
+ for i = train.path_ext_b, train.path_ext_f do
+ if i==train.path_trk_b then
+ printf("--Back on-track border here--")
+ end
+ printf(i,": ",train.path_cp[i]," ",train.path[i]," ",train.path_dir[i]," ",train.path_cn[i]," ",train.path_dist[i],"")
+ if i==train.path_trk_f then
+ printf("--Front on-track border here--")
+ end
+ end
+end
+
+-- Function to get path entry at a position. This function will automatically calculate more of the path when required.
+-- returns: pos, on_track
+function advtrains.path_get(train, index)
+ if not train.path then
+ error("For train "..train.id..": path_get called but there's no path set yet!")
+ end
+ if index ~= atfloor(index) then
+ error("For train "..train.id..": Called path_get() but index="..index.." is not a round number")
+ end
+
+ local pef = train.path_ext_f
+ -- generate forward (front of train, positive)
+ while index > pef do
+ local pos = train.path[pef]
+ local connid = train.path_cn[pef]
+ local node_ok, this_conns, adj_pos, adj_connid, conn_idx, nextrail_y, next_conns
+ if pef == train.path_trk_f then
+ node_ok, this_conns = advtrains.get_rail_info_at(pos)
+ if not node_ok then error("For train "..train.id..": Path item "..pef.." on-track but not a valid node!") end
+ adj_pos, adj_connid, conn_idx, nextrail_y, next_conns = advtrains.get_adjacent_rail(pos, this_conns, connid, train.drives_on)
+ end
+ pef = pef + 1
+ if adj_pos then
+ advtrains.occ.set_item(train.id, adj_pos, pef)
+
+ -- If we have split points, notify accordingly
+ local mconnid = advtrains.get_matching_conn(adj_connid, #next_conns)
+ if #next_conns==3 and adj_connid==1 and train.points_split and train.points_split[advtrains.encode_pos(adj_pos)] then
+ --atdebug(id,"has split points restored at",adj_pos)
+ mconnid = 3
+ end
+
+ adj_pos.y = adj_pos.y + nextrail_y
+ train.path_cp[pef] = adj_connid
+ train.path_cn[pef] = mconnid
+ train.path_dir[pef] = advtrains.conn_angle_median(next_conns[adj_connid].c, next_conns[mconnid].c)
+ train.path_trk_f = pef
+ else
+ -- off-track fallback behavior
+ adj_pos = advtrains.pos_add_angle(pos, train.path_dir[pef-1])
+ --atdebug("Offtrack overgenerating(front) at",adj_pos,"index",peb,"trkf",train.path_trk_f)
+ train.path_dir[pef] = train.path_dir[pef-1]
+ end
+ train.path[pef] = adj_pos
+ train.path_dist[pef] = train.path_dist[pef-1] + vector.distance(pos, adj_pos)
+ end
+ train.path_ext_f = pef
+
+
+ local peb = train.path_ext_b
+ -- generate backward (back of train, negative)
+ while index < peb do
+ local pos = train.path[peb]
+ local connid = train.path_cp[peb]
+ local node_ok, this_conns, adj_pos, adj_connid, conn_idx, nextrail_y, next_conns
+ if peb == train.path_trk_b then
+ node_ok, this_conns = advtrains.get_rail_info_at(pos)
+ if not node_ok then error("For train "..train.id..": Path item "..peb.." on-track but not a valid node!") end
+ adj_pos, adj_connid, conn_idx, nextrail_y, next_conns = advtrains.get_adjacent_rail(pos, this_conns, connid, train.drives_on)
+ end
+ peb = peb - 1
+ if adj_pos then
+ advtrains.occ.set_item(train.id, adj_pos, peb)
+
+ -- If we have split points, notify accordingly
+ local mconnid = advtrains.get_matching_conn(adj_connid, #next_conns)
+ if #next_conns==3 and adj_connid==1 and train.points_split and train.points_split[advtrains.encode_pos(adj_pos)] then
+ -- atdebug(id,"has split points restored at",adj_pos)
+ mconnid = 3
+ end
+
+ adj_pos.y = adj_pos.y + nextrail_y
+ train.path_cn[peb] = adj_connid
+ train.path_cp[peb] = mconnid
+ train.path_dir[peb] = advtrains.conn_angle_median(next_conns[mconnid].c, next_conns[adj_connid].c)
+ train.path_trk_b = peb
+ else
+ -- off-track fallback behavior
+ adj_pos = advtrains.pos_add_angle(pos, train.path_dir[peb+1] + math.pi)
+ --atdebug("Offtrack overgenerating(back) at",adj_pos,"index",peb,"trkb",train.path_trk_b)
+ train.path_dir[peb] = train.path_dir[peb+1]
+ end
+ train.path[peb] = adj_pos
+ train.path_dist[peb] = train.path_dist[peb+1] - vector.distance(pos, adj_pos)
+ end
+ train.path_ext_b = peb
+
+ if index < train.path_req_b then
+ train.path_req_b = index
+ end
+ if index > train.path_req_f then
+ train.path_req_f = index
+ end
+
+ return train.path[index], (index<=train.path_trk_f and index>=train.path_trk_b)
+
+end
+
+-- interpolated position to fractional index given, and angle based on path_dir
+-- returns: pos, angle(yaw), p_floor, p_ceil
+function advtrains.path_get_interpolated(train, index)
+ local i_floor = atfloor(index)
+ local i_ceil = i_floor + 1
+ local frac = index - i_floor
+ local p_floor = advtrains.path_get(train, i_floor)
+ local p_ceil = advtrains.path_get(train, i_ceil)
+ -- Note: minimal code duplication to path_get_adjacent, for performance
+
+ local a_floor = train.path_dir[i_floor]
+ local a_ceil = train.path_dir[i_ceil]
+
+ local ang = advtrains.minAngleDiffRad(a_floor, a_ceil)
+
+ return vector.add(p_floor, vector.multiply(vector.subtract(p_ceil, p_floor), frac)), (a_floor + frac * ang)%(2*math.pi), p_floor, p_ceil
+end
+-- returns the 2 path positions directly adjacent to index and the fraction on how to interpolate between them
+-- returns: pos_floor, pos_ceil, fraction
+function advtrains.path_get_adjacent(train, index)
+ local i_floor = atfloor(index)
+ local i_ceil = i_floor + 1
+ local frac = index - i_floor
+ local p_floor = advtrains.path_get(train, i_floor)
+ local p_ceil = advtrains.path_get(train, i_ceil)
+ return p_floor, p_ceil, frac
+end
+
+local function n_interpolate(s, e, f)
+ return s + (e-s)*f
+end
+
+-- This function determines the index resulting from moving along the path by 'offset' meters
+-- starting from 'index'. See also the comment on the top of the file.
+function advtrains.path_get_index_by_offset(train, index, offset)
+ local advtrains_path_get = advtrains.path_get
+
+ -- Step 1: determine my current absolute pos on the path
+ local start_index_f = atfloor(index)
+ local end_index_f = start_index_f + 1
+ local c_idx = atfloor(index + offset)
+ local c_idx_f = c_idx + 1
+
+ local frac = index - start_index_f
+
+ advtrains_path_get(train, math.min(start_index_f, end_index_f, c_idx, c_idx_f))
+ advtrains_path_get(train, math.max(start_index_f, end_index_f, c_idx, c_idx_f))
+
+ local dist1, dist2 = train.path_dist[start_index_f], train.path_dist[start_index_f+1]
+ local start_dist = dist1 + (dist2-dist1)*frac
+
+ -- Step 2: determine the total end distance and estimate the index we'd come out
+ local end_dist = start_dist + offset
+
+ local c_idx = atfloor(index + offset)
+
+ -- Step 3: move forward/backward to find real index
+ -- We assume here that the distance between 2 path items is never smaller than 1.
+ -- Our estimated index is therefore either exact or too far over, and we're going to go back
+ -- towards the origin. It is therefore sufficient to query path_get a single time
+
+ -- How we'll adjust c_idx
+ -- Desired position: -------#------
+ -- Path items : --|--|--|--|--
+ -- c_idx : ^
+
+ while train.path_dist[c_idx] < end_dist do
+ c_idx = c_idx + 1
+ end
+
+ while train.path_dist[c_idx] > end_dist do
+ c_idx = c_idx - 1
+ end
+
+ -- Step 4: now c_idx points to the place shown above. Find out the fractional part.
+
+ dist1, dist2 = train.path_dist[c_idx], train.path_dist[c_idx+1]
+
+ frac = (end_dist - dist1) / (dist2 - dist1)
+
+ assert(frac>=0 and frac<1, frac)
+
+ return c_idx + frac
+end
+
+local PATH_CLEAR_KEEP = 4
+
+function advtrains.path_clear_unused(train)
+ local i
+ for i = train.path_ext_b, train.path_req_b - PATH_CLEAR_KEEP do
+ advtrains.occ.clear_item(train.id, advtrains.round_vector_floor_y(train.path[i]))
+ train.path[i] = nil
+ train.path_dist[i-1] = nil
+ train.path_cp[i] = nil
+ train.path_cn[i] = nil
+ train.path_dir[i] = nil
+ train.path_ext_b = i + 1
+ end
+
+ for i = train.path_ext_f,train.path_req_f + PATH_CLEAR_KEEP,-1 do
+ advtrains.occ.clear_item(train.id, advtrains.round_vector_floor_y(train.path[i]))
+ train.path[i] = nil
+ train.path_dist[i] = nil
+ train.path_cp[i] = nil
+ train.path_cn[i] = nil
+ train.path_dir[i+1] = nil
+ train.path_ext_f = i - 1
+ end
+ train.path_trk_b = math.max(train.path_trk_b, train.path_ext_b)
+ train.path_trk_f = math.min(train.path_trk_f, train.path_ext_f)
+
+ train.path_req_f = math.ceil(train.index)
+ train.path_req_b = math.floor(train.end_index or train.index)
+end
+
+function advtrains.path_lookup(train, pos)
+ local cp = advtrains.round_vector_floor_y(pos)
+ for i = train.path_ext_b, train.path_ext_f do
+ if vector.equals(advtrains.round_vector_floor_y(train.path[i]), cp) then
+ return i
+ end
+ end
+ return nil
+end
diff --git a/advtrains/advtrains/protection.lua b/advtrains/advtrains/protection.lua
new file mode 100644
index 0000000..7474977
--- /dev/null
+++ b/advtrains/advtrains/protection.lua
@@ -0,0 +1,197 @@
+-- advtrains
+-- protection.lua: privileges and rail protection, and some helpers
+
+
+-- Privileges to control TRAIN DRIVING/COUPLING
+minetest.register_privilege("train_operator", {
+ description = "Without this privilege, a player can't do anything about trains, neither place or remove them nor drive or couple them (but he can build tracks if he has track_builder)",
+ give_to_singleplayer= true,
+});
+
+minetest.register_privilege("train_admin", {
+ description = "Player may drive, place or remove any trains from/to anywhere, regardless of owner, whitelist or protection",
+ give_to_singleplayer= true,
+});
+
+-- Privileges to control TRACK BUILDING
+minetest.register_privilege("track_builder", {
+ description = "Player can place and/or dig rails not protected from him. If he also has protection_bypass, he can place/dig any rails",
+ give_to_singleplayer= true,
+});
+
+-- Privileges to control OPERATING TURNOUTS/SIGNALS
+minetest.register_privilege("railway_operator", {
+ description = "Player can operate turnouts and signals not protected from him. If he also has protection_bypass, he can operate any turnouts/signals",
+ give_to_singleplayer= true,
+});
+
+-- there is a configuration option "allow_build_only_owner". If this is active, a player having track_builder can only build rails and operate signals/turnouts in an area explicitly belonging to him
+-- (checked using a dummy player called "*dummy*" (which is not an allowed player name))
+
+
+-- Protection ranges
+local npr_r = tonumber(minetest.settings:get("advtrains_prot_range_side")) or 1
+local npr_vr = tonumber(minetest.settings:get("advtrains_prot_range_up")) or 3
+local npr_vrd = tonumber(minetest.settings:get("advtrains_prot_range_down")) or 1
+
+local boo = minetest.settings:get_bool("advtrains_allow_build_to_owner")
+
+--[[
+Protection/privilege concept:
+Tracks:
+ Protected 1 node all around a rail and 4 nodes upward (maybe make this dynamically determined by the rail...)
+ if track_builder privilege:
+ if not protected from* player:
+ if allow_build_only_owner:
+ if unprotected:
+ deny
+ else:
+ allow
+ deny
+Wagons in general:
+ Players can only place/destroy wagons if they have train_operator
+Wagon driving controls:
+ The former seat_access tables are unnecessary, instead there is a whitelist for the driving stands
+ on player trying to access a driver stand:
+ if is owner or is on whitelist:
+ allow
+ else:
+ deny
+Wagon coupling:
+ Derived from the privileges for driving stands. The whitelist is shared (and also settable on non-driverstand wagons)
+ for each of the two bordering wagons:
+ if is owner or is on whitelist:
+ allow
+
+*"protected from" means the player is not allowed to do things, while "protected by" means that the player is (one of) the owner(s) of this area
+
+]]--
+
+-- temporarily prevent scanning for neighboring rail nodes recursively
+local nocheck
+
+local old_is_protected = minetest.is_protected
+
+-- Check if the node we are about to check is in the range of a track that is protected from a player
+minetest.is_protected = function(pos, pname)
+
+ -- old_is_protected:
+ -- If an earlier callback decided that pos is protected, we wouldn't have been called
+ -- if a later callback decides it, get that here.
+ -- this effectively puts this function into a final-choice position
+ local oprot = old_is_protected(pos, pname)
+ if oprot then
+ return true
+ end
+
+ if nocheck or pname=="" then
+ return false
+ end
+
+ -- Special exception: to allow seamless rail connections between 2 separately protected
+ -- networks, rails itself are not affected by the radius setting. So, if the node here is
+ -- a rail, we skip the check and just use check_track_protection on same pos.
+ local node = minetest.get_node(pos)
+ if minetest.get_item_group(node.name, "advtrains_track") > 0 then
+ -- by here, we know that no other protection callback has this protected, we can safely pass "false".
+ -- hope this doesn't lead to bugs!
+ return not advtrains.check_track_protection(pos, pname, nil, false)
+ end
+
+ local nodes = minetest.find_nodes_in_area(
+ {x = pos.x - npr_r, y = pos.y - npr_vr, z = pos.z - npr_r},
+ {x = pos.x + npr_r, y = pos.y + npr_vrd, z = pos.z + npr_r},
+ {"group:advtrains_track"})
+ for _,npos in ipairs(nodes) do
+ if not advtrains.check_track_protection(npos, pname, pos) then
+ return true
+ end
+ end
+ nocheck=false
+ return false
+end
+
+-- Check whether the player is permitted to modify this track
+-- Shall be called only for nodes that are or are about to become tracks.
+-- The range check from is_track_near_protected is disabled here.
+-- this splits in 1. track_builder privilege and 2. is_protected
+-- also respects the allow_build_to_owner property.
+--WARN: true means here that the action is allowed!
+function advtrains.check_track_protection(pos, pname, near, prot_p)
+ -- Parameter "near" is an optional position, the original node that the player
+ -- was about to affect, while "pos" represents the checked rail node
+ -- if "near" is not set, pos is the same node.
+ local nears = near and "near " or ""
+ local apos = near or pos
+
+ -- note that having protection_bypass implicitly implies having track_builder, because else it would be possible to dig rails
+ -- (only checked by is_protected, which is not respected) but not place them.
+ -- We won't impose restrictions on protection_bypass owners.
+ if minetest.check_player_privs(pname, {protection_bypass = true}) then
+ return true
+ end
+
+ nocheck = true
+ local priv = minetest.check_player_privs(pname, {track_builder = true})
+
+ -- note: is_protected above already checks the is_protected value against the current player, so checking it again is useless.
+ local prot = prot_p
+ if prot==nil then
+ prot = advtrains.is_protected(pos, pname)
+ end
+ local dprot = minetest.is_protected(pos, "*dummy*")
+ nocheck = false
+
+ --atdebug("CTP: ",pos,pname,near,prot_p,"priv=",priv,"prot=",prot,"dprot=",dprot)
+
+ if not priv and (not boo or prot or not dprot) then
+ minetest.chat_send_player(pname, "You are not allowed to build "..nears.."tracks without track_builder privilege")
+ minetest.log("action", pname.." tried to modify terrain "..nears.."track at "..minetest.pos_to_string(apos).." but is not permitted to (no privilege)")
+ return false
+ end
+ if prot then
+ minetest.chat_send_player(pname, "You are not allowed to build "..nears.."tracks at protected position!")
+ minetest.record_protection_violation(pos, pname)
+ minetest.log("action", pname.." tried to modify "..nears.."track at "..minetest.pos_to_string(apos).." but position is protected!")
+ return false
+ end
+ return true
+end
+
+--WARN: true means here that the action is allowed!
+function advtrains.check_driving_couple_protection(pname, owner, whitelist)
+ if minetest.check_player_privs(pname, {train_admin = true}) then
+ return true
+ end
+ if not minetest.check_player_privs(pname, {train_operator = true}) then
+ return false
+ end
+ if not owner or owner == pname then
+ return true
+ end
+ if whitelist and string.find(" "..whitelist.." ", " "..pname.." ", nil, true) then
+ return true
+ end
+ return false
+end
+function advtrains.check_turnout_signal_protection(pos, pname)
+ nocheck=true
+ if not minetest.check_player_privs(pname, {railway_operator = true}) then
+ if boo and not advtrains.is_protected(pos, pname) and minetest.is_protected(pos, "*dummy*") then
+ nocheck=false
+ return true
+ else
+ minetest.chat_send_player(pname, "You are not allowed to operate turnouts and signals (missing railway_operator privilege)")
+ minetest.log("action", pname.." tried to operate turnout/signal at "..minetest.pos_to_string(pos).." but does not have railway_operator")
+ nocheck=false
+ return false
+ end
+ end
+ if advtrains.is_protected(pos, pname) then
+ minetest.record_protection_violation(pos, pname)
+ nocheck=false
+ return false
+ end
+ nocheck=false
+ return true
+end
diff --git a/advtrains/advtrains/settingtypes.txt b/advtrains/advtrains/settingtypes.txt
new file mode 100644
index 0000000..d8eb44a
--- /dev/null
+++ b/advtrains/advtrains/settingtypes.txt
@@ -0,0 +1,47 @@
+# Display train and wagon ID in the infotext of trains.
+# Useful when working with LuaATC or while debugging.
+advtrains_show_ids (Show ID's in infotext) bool false
+
+# Enable the debug ring buffer
+# This has no effect on the user experience, except decreased performance. Debug outputs are saved in a ring buffer to be printed when an error occurs.
+# You probably want to leave this setting set to false.
+advtrains_enable_debugging (Enable debugging) bool false
+
+# Enable the logging of certain events related to advtrains
+# Logs are saved in the world directory as advtrains.log
+# This setting is useful for multiplayer servers
+advtrains_enable_logging (Enable logging) bool false
+
+# If this is active, any player can do the following things inside (and only inside) an area that is explicitly protected by him
+# (checked using a dummy player called "*dummy*" (which is not an allowed player name)):
+# - build tracks and near tracks without the track_builder privilege
+# - operate turnouts and signals without the railway_operator privilege
+advtrains_allow_build_to_owner (Allow building/operating to privilegeless area owner) bool false
+
+# Track protection range (horizontal)
+# Players without the 'track_builder' privilege can not build within a box around any tracks determined by these range settings
+# This setting is to be read as "r-0.5", so a value of 1 means a diameter of 3, a value of 2 a diameter of 5 a.s.o.
+# The spanned area is a square. Fractional values are not supported.
+advtrains_prot_range_side (Track protection range [horizontal]) int 1 0 10
+
+# Track protection range (up)
+# Players without the 'track_builder' privilege can not build within a box around any tracks determined by these range settings
+# This setting determines the upper y bound of the box, a value of 3 means that the rail and 3 nodes above it are protected
+advtrains_prot_range_up (Track protection range [up]) int 3 0 10
+
+# Track protection range (down)
+# Players without the 'track_builder' privilege can not build within a box around any tracks determined by these range settings
+# This setting determines the lower y bound of the box, a value of 1 means that the rail and 1 node below it are protected
+advtrains_prot_range_down (Track protection range [down]) int 1 0 10
+
+# Determine what effect "being overrun by a train" has.
+# none: No damage is dealt at all.
+# drop: Player is killed, all items are dropped as items on the tracks.
+# normal: Player is killed, game-defined behavior is applied as if the player died by other means.
+advtrains_overrun_mode (Overrun mode) enum drop none,drop,normal
+
+# Wagon entity loading/unloading range, in nodes
+# When a wagon is within this range to a player, it is loaded
+# When a wagon leaves this range + 32 nodes, it is unloaded
+# If unset, defaults to active_block_range*16
+advtrains_wagon_load_range (Wagon Entity Load/Unload Range) int 96 32 512
diff --git a/advtrains/advtrains/signals.lua b/advtrains/advtrains/signals.lua
new file mode 100644
index 0000000..e144aa6
--- /dev/null
+++ b/advtrains/advtrains/signals.lua
@@ -0,0 +1,328 @@
+--advtrains by orwell96
+--signals.lua
+
+local mrules_wallsignal = advtrains.meseconrules
+
+local function can_dig_func(pos)
+ if advtrains.interlocking then
+ return advtrains.interlocking.signal_can_dig(pos)
+ end
+ return true
+end
+
+local function aspect(b)
+return {
+ main = {
+ free = b,
+ speed = -1,
+ },
+ shunt = {
+ free = false,
+ proceed_as_main = true
+ },
+ dst = {
+ free = true,
+ speed = -1,
+ },
+ info = {}
+}
+end
+
+for r,f in pairs({on={as="off", ls="green", als="red"}, off={as="on", ls="red", als="green"}}) do
+
+ advtrains.trackplacer.register_tracktype("advtrains:retrosignal", "")
+ advtrains.trackplacer.register_tracktype("advtrains:signal", "")
+
+ for rotid, rotation in ipairs({"", "_30", "_45", "_60"}) do
+ local crea=1
+ if rotid==1 and r=="off" then crea=0 end
+
+ minetest.register_node("advtrains:retrosignal_"..r..rotation, {
+ drawtype = "mesh",
+ paramtype="light",
+ paramtype2="facedir",
+ walkable = false,
+ selection_box = {
+ type = "fixed",
+ fixed = {-1/4, -1/2, -1/4, 1/4, 2, 1/4},
+ },
+ mesh = "advtrains_retrosignal_"..r..rotation..".b3d",
+ tiles = {"advtrains_retrosignal.png"},
+ inventory_image="advtrains_retrosignal_inv.png",
+ drop="advtrains:retrosignal_off",
+ description=attrans("Lampless Signal (@1)", attrans(r..rotation)),
+ sunlight_propagates=true,
+ groups = {
+ cracky=3,
+ not_blocking_trains=1,
+ not_in_creative_inventory=crea,
+ save_in_at_nodedb=1,
+ advtrains_signal = 2,
+ },
+ mesecons = {effector = {
+ rules=advtrains.meseconrules,
+ ["action_"..f.as] = function (pos, node)
+ advtrains.ndb.swap_node(pos, {name = "advtrains:retrosignal_"..f.as..rotation, param2 = node.param2}, true)
+ end
+ }},
+ on_rightclick=function(pos, node, player)
+ local pname = player:get_player_name()
+ local sigd = advtrains.interlocking and advtrains.interlocking.db.get_sigd_for_signal(pos)
+ if sigd then
+ advtrains.interlocking.show_signalling_form(sigd, pname)
+ elseif advtrains.interlocking and player:get_player_control().aux1 then
+ advtrains.interlocking.show_ip_form(pos, pname)
+ elseif advtrains.check_turnout_signal_protection(pos, player:get_player_name()) then
+ advtrains.ndb.swap_node(pos, {name = "advtrains:retrosignal_"..f.as..rotation, param2 = node.param2}, true)
+ end
+ end,
+ -- new signal API
+ advtrains = {
+ set_aspect = function(pos, node, asp)
+ if asp.main.free then
+ advtrains.ndb.swap_node(pos, {name = "advtrains:retrosignal_on"..rotation, param2 = node.param2}, true)
+ else
+ advtrains.ndb.swap_node(pos, {name = "advtrains:retrosignal_off"..rotation, param2 = node.param2}, true)
+ end
+ end,
+ get_aspect = function(pos, node)
+ return aspect(r=="on")
+ end
+ },
+ can_dig = can_dig_func,
+ })
+ advtrains.trackplacer.add_worked("advtrains:retrosignal", r, rotation, nil)
+
+ minetest.register_node("advtrains:signal_"..r..rotation, {
+ drawtype = "mesh",
+ paramtype="light",
+ paramtype2="facedir",
+ walkable = false,
+ selection_box = {
+ type = "fixed",
+ fixed = {-1/4, -1/2, -1/4, 1/4, 2, 1/4},
+ },
+ mesh = "advtrains_signal"..rotation..".b3d",
+ tiles = {"advtrains_signal_"..r..".png"},
+ inventory_image="advtrains_signal_inv.png",
+ drop="advtrains:signal_off",
+ description=attrans("Signal (@1)", attrans(r..rotation)),
+ groups = {
+ cracky=3,
+ not_blocking_trains=1,
+ not_in_creative_inventory=crea,
+ save_in_at_nodedb=1,
+ advtrains_signal = 2,
+ },
+ light_source = 1,
+ sunlight_propagates=true,
+ mesecons = {effector = {
+ rules=advtrains.meseconrules,
+ ["action_"..f.as] = function (pos, node)
+ advtrains.setstate(pos, f.als, node)
+ end
+ }},
+ on_rightclick=function(pos, node, player)
+ local pname = player:get_player_name()
+ local sigd = advtrains.interlocking and advtrains.interlocking.db.get_sigd_for_signal(pos)
+ if sigd then
+ advtrains.interlocking.show_signalling_form(sigd, pname)
+ elseif advtrains.interlocking and player:get_player_control().aux1 then
+ advtrains.interlocking.show_ip_form(pos, pname)
+ elseif advtrains.check_turnout_signal_protection(pos, player:get_player_name()) then
+ advtrains.setstate(pos, f.als, node)
+ end
+ end,
+ -- new signal API
+ advtrains = {
+ set_aspect = function(pos, node, asp)
+ if asp.main.free then
+ advtrains.ndb.swap_node(pos, {name = "advtrains:signal_on"..rotation, param2 = node.param2}, true)
+ else
+ advtrains.ndb.swap_node(pos, {name = "advtrains:signal_off"..rotation, param2 = node.param2}, true)
+ end
+ end,
+ get_aspect = function(pos, node)
+ return aspect(r=="on")
+ end,
+ getstate = f.ls,
+ setstate = function(pos, node, newstate)
+ if newstate == f.als then
+ advtrains.ndb.swap_node(pos, {name = "advtrains:signal_"..f.as..rotation, param2 = node.param2}, true)
+ end
+ end,
+ },
+ can_dig = can_dig_func,
+ })
+ advtrains.trackplacer.add_worked("advtrains:signal", r, rotation, nil)
+ end
+
+ local crea=1
+ if r=="off" then crea=0 end
+
+ --tunnel signals. no rotations.
+ for loc, sbox in pairs({l={-1/2, -1/2, -1/4, 0, 1/2, 1/4}, r={0, -1/2, -1/4, 1/2, 1/2, 1/4}, t={-1/2, 0, -1/4, 1/2, 1/2, 1/4}}) do
+ minetest.register_node("advtrains:signal_wall_"..loc.."_"..r, {
+ drawtype = "mesh",
+ paramtype="light",
+ paramtype2="facedir",
+ walkable = false,
+ selection_box = {
+ type = "fixed",
+ fixed = sbox,
+ },
+ mesh = "advtrains_signal_wall_"..loc..".b3d",
+ tiles = {"advtrains_signal_wall_"..r..".png"},
+ drop="advtrains:signal_wall_"..loc.."_off",
+ description=attrans("Wallmounted Signal ("..loc..")"),
+ groups = {
+ cracky=3,
+ not_blocking_trains=1,
+ not_in_creative_inventory=crea,
+ save_in_at_nodedb=1,
+ advtrains_signal = 2,
+ },
+ light_source = 1,
+ sunlight_propagates=true,
+ mesecons = {effector = {
+ rules = mrules_wallsignal,
+ ["action_"..f.as] = function (pos, node)
+ advtrains.setstate(pos, f.als, node)
+ end
+ }},
+ on_rightclick=function(pos, node, player)
+ local pname = player:get_player_name()
+ local sigd = advtrains.interlocking and advtrains.interlocking.db.get_sigd_for_signal(pos)
+ if sigd then
+ advtrains.interlocking.show_signalling_form(sigd, pname)
+ elseif advtrains.interlocking and player:get_player_control().aux1 then
+ advtrains.interlocking.show_ip_form(pos, pname)
+ elseif advtrains.check_turnout_signal_protection(pos, player:get_player_name()) then
+ advtrains.setstate(pos, f.als, node)
+ end
+ end,
+ -- new signal API
+ advtrains = {
+ set_aspect = function(pos, node, asp)
+ if asp.main.free then
+ advtrains.ndb.swap_node(pos, {name = "advtrains:signal_wall_"..loc.."_on", param2 = node.param2}, true)
+ else
+ advtrains.ndb.swap_node(pos, {name = "advtrains:signal_wall_"..loc.."_off", param2 = node.param2}, true)
+ end
+ end,
+ get_aspect = function(pos, node)
+ return aspect(r=="on")
+ end,
+ getstate = f.ls,
+ setstate = function(pos, node, newstate)
+ if newstate == f.als then
+ advtrains.ndb.swap_node(pos, {name = "advtrains:signal_wall_"..loc.."_"..f.as, param2 = node.param2}, true)
+ end
+ end,
+ },
+ can_dig = can_dig_func,
+ })
+ end
+end
+
+-- level crossing
+-- german version (Andrew's Cross)
+minetest.register_node("advtrains:across_off", {
+ drawtype = "mesh",
+ paramtype="light",
+ paramtype2="facedir",
+ walkable = false,
+ selection_box = {
+ type = "fixed",
+ fixed = {-1/4, -1/2, -1/2, 1/4, 1.5, 0},
+ },
+ mesh = "advtrains_across.obj",
+ tiles = {"advtrains_across.png"},
+ drop="advtrains:across_off",
+ description=attrans("Andrew's Cross"),
+ groups = {
+ cracky=3,
+ not_blocking_trains=1,
+ save_in_at_nodedb=1,
+ not_in_creative_inventory=nil,
+ },
+ light_source = 1,
+ sunlight_propagates=true,
+ mesecons = {effector = {
+ rules = advtrains.meseconrules,
+ action_on = function (pos, node)
+ advtrains.ndb.swap_node(pos, {name = "advtrains:across_on", param2 = node.param2}, true)
+ end
+ }},
+ advtrains = {
+ getstate = "off",
+ setstate = function(pos, node, newstate)
+ if newstate == "on" then
+ advtrains.ndb.swap_node(pos, {name = "advtrains:across_on", param2 = node.param2}, true)
+ end
+ end,
+ },
+ on_rightclick=function(pos, node, player)
+ if advtrains.check_turnout_signal_protection(pos, player:get_player_name()) then
+ advtrains.ndb.swap_node(pos, {name = "advtrains:across_on", param2 = node.param2}, true)
+ end
+ end,
+})
+minetest.register_node("advtrains:across_on", {
+ drawtype = "mesh",
+ paramtype="light",
+ paramtype2="facedir",
+ walkable = false,
+ selection_box = {
+ type = "fixed",
+ fixed = {-1/4, -1/2, -1/2, 1/4, 1.5, 0},
+ },
+ mesh = "advtrains_across.obj",
+ tiles = {{name="advtrains_across_anim.png", animation={type="vertical_frames", aspect_w=64, aspect_h=64, length=1.0}}},
+ drop="advtrains:across_off",
+ description=attrans("Andrew's Cross (on) (you hacker you)"),
+ groups = {
+ cracky=3,
+ not_blocking_trains=1,
+ save_in_at_nodedb=1,
+ not_in_creative_inventory=1,
+ },
+ light_source = 1,
+ sunlight_propagates=true,
+ mesecons = {effector = {
+ rules = advtrains.meseconrules,
+ action_off = function (pos, node)
+ advtrains.ndb.swap_node(pos, {name = "advtrains:across_off", param2 = node.param2}, true)
+ end
+ }},
+ advtrains = {
+ getstate = "on",
+ setstate = function(pos, node, newstate)
+ if newstate == "off" then
+ advtrains.ndb.swap_node(pos, {name = "advtrains:across_off", param2 = node.param2}, true)
+ end
+ end,
+ fallback_state = "off",
+ },
+ on_rightclick=function(pos, node, player)
+ if advtrains.check_turnout_signal_protection(pos, player:get_player_name()) then
+ advtrains.ndb.swap_node(pos, {name = "advtrains:across_off", param2 = node.param2}, true)
+ end
+ end,
+})
+
+minetest.register_abm(
+ {
+ label = "Sound for Level Crossing",
+ nodenames = {"advtrains:across_on"},
+ interval = 3,
+ chance = 1,
+ action = function(pos, node, active_object_count, active_object_count_wider)
+ minetest.sound_play("advtrains_crossing_bell", {
+ pos = pos,
+ gain = 1.0, -- default
+ max_hear_distance = 16, -- default, uses an euclidean metric
+ })
+ end,
+ }
+)
diff --git a/advtrains/advtrains/sounds/advtrains_crossing_bell.ogg b/advtrains/advtrains/sounds/advtrains_crossing_bell.ogg
new file mode 100644
index 0000000..74df669
--- /dev/null
+++ b/advtrains/advtrains/sounds/advtrains_crossing_bell.ogg
Binary files differ
diff --git a/advtrains/advtrains/textures/advtrains_across.png b/advtrains/advtrains/textures/advtrains_across.png
new file mode 100755
index 0000000..da65a61
--- /dev/null
+++ b/advtrains/advtrains/textures/advtrains_across.png
Binary files differ
diff --git a/advtrains/advtrains/textures/advtrains_across_anim.png b/advtrains/advtrains/textures/advtrains_across_anim.png
new file mode 100755
index 0000000..584d023
--- /dev/null
+++ b/advtrains/advtrains/textures/advtrains_across_anim.png
Binary files differ
diff --git a/advtrains/advtrains/textures/advtrains_boiler.png b/advtrains/advtrains/textures/advtrains_boiler.png
new file mode 100755
index 0000000..8c7ff0d
--- /dev/null
+++ b/advtrains/advtrains/textures/advtrains_boiler.png
Binary files differ
diff --git a/advtrains/advtrains/textures/advtrains_chimney.png b/advtrains/advtrains/textures/advtrains_chimney.png
new file mode 100755
index 0000000..285a1a6
--- /dev/null
+++ b/advtrains/advtrains/textures/advtrains_chimney.png
Binary files differ
diff --git a/advtrains/advtrains/textures/advtrains_copytool.png b/advtrains/advtrains/textures/advtrains_copytool.png
new file mode 100644
index 0000000..a8ea557
--- /dev/null
+++ b/advtrains/advtrains/textures/advtrains_copytool.png
Binary files differ
diff --git a/advtrains/advtrains/textures/advtrains_couple.png b/advtrains/advtrains/textures/advtrains_couple.png
new file mode 100755
index 0000000..eda3704
--- /dev/null
+++ b/advtrains/advtrains/textures/advtrains_couple.png
Binary files differ
diff --git a/advtrains/advtrains/textures/advtrains_cpl_lock.png b/advtrains/advtrains/textures/advtrains_cpl_lock.png
new file mode 100644
index 0000000..a25aaf4
--- /dev/null
+++ b/advtrains/advtrains/textures/advtrains_cpl_lock.png
Binary files differ
diff --git a/advtrains/advtrains/textures/advtrains_cpl_unlock.png b/advtrains/advtrains/textures/advtrains_cpl_unlock.png
new file mode 100644
index 0000000..f58d00a
--- /dev/null
+++ b/advtrains/advtrains/textures/advtrains_cpl_unlock.png
Binary files differ
diff --git a/advtrains/advtrains/textures/advtrains_discouple.png b/advtrains/advtrains/textures/advtrains_discouple.png
new file mode 100755
index 0000000..5c064c3
--- /dev/null
+++ b/advtrains/advtrains/textures/advtrains_discouple.png
Binary files differ
diff --git a/advtrains/advtrains/textures/advtrains_driver_cab.png b/advtrains/advtrains/textures/advtrains_driver_cab.png
new file mode 100755
index 0000000..331bcc9
--- /dev/null
+++ b/advtrains/advtrains/textures/advtrains_driver_cab.png
Binary files differ
diff --git a/advtrains/advtrains/textures/advtrains_dtrack_atc_placer.png b/advtrains/advtrains/textures/advtrains_dtrack_atc_placer.png
new file mode 100755
index 0000000..31c2b30
--- /dev/null
+++ b/advtrains/advtrains/textures/advtrains_dtrack_atc_placer.png
Binary files differ
diff --git a/advtrains/advtrains/textures/advtrains_dtrack_bumper_placer.png b/advtrains/advtrains/textures/advtrains_dtrack_bumper_placer.png
new file mode 100755
index 0000000..27191fe
--- /dev/null
+++ b/advtrains/advtrains/textures/advtrains_dtrack_bumper_placer.png
Binary files differ
diff --git a/advtrains/advtrains/textures/advtrains_dtrack_detector_placer.png b/advtrains/advtrains/textures/advtrains_dtrack_detector_placer.png
new file mode 100755
index 0000000..e6c6ad6
--- /dev/null
+++ b/advtrains/advtrains/textures/advtrains_dtrack_detector_placer.png
Binary files differ
diff --git a/advtrains/advtrains/textures/advtrains_dtrack_load_placer.png b/advtrains/advtrains/textures/advtrains_dtrack_load_placer.png
new file mode 100755
index 0000000..427c011
--- /dev/null
+++ b/advtrains/advtrains/textures/advtrains_dtrack_load_placer.png
Binary files differ
diff --git a/advtrains/advtrains/textures/advtrains_dtrack_placer.png b/advtrains/advtrains/textures/advtrains_dtrack_placer.png
new file mode 100755
index 0000000..7bef8a9
--- /dev/null
+++ b/advtrains/advtrains/textures/advtrains_dtrack_placer.png
Binary files differ
diff --git a/advtrains/advtrains/textures/advtrains_dtrack_rail.png b/advtrains/advtrains/textures/advtrains_dtrack_rail.png
new file mode 100755
index 0000000..bd0c217
--- /dev/null
+++ b/advtrains/advtrains/textures/advtrains_dtrack_rail.png
Binary files differ
diff --git a/advtrains/advtrains/textures/advtrains_dtrack_shared.png b/advtrains/advtrains/textures/advtrains_dtrack_shared.png
new file mode 100755
index 0000000..736c7db
--- /dev/null
+++ b/advtrains/advtrains/textures/advtrains_dtrack_shared.png
Binary files differ
diff --git a/advtrains/advtrains/textures/advtrains_dtrack_shared_atc.png b/advtrains/advtrains/textures/advtrains_dtrack_shared_atc.png
new file mode 100755
index 0000000..1f83c37
--- /dev/null
+++ b/advtrains/advtrains/textures/advtrains_dtrack_shared_atc.png
Binary files differ
diff --git a/advtrains/advtrains/textures/advtrains_dtrack_shared_detector_off.png b/advtrains/advtrains/textures/advtrains_dtrack_shared_detector_off.png
new file mode 100755
index 0000000..724d907
--- /dev/null
+++ b/advtrains/advtrains/textures/advtrains_dtrack_shared_detector_off.png
Binary files differ
diff --git a/advtrains/advtrains/textures/advtrains_dtrack_shared_detector_on.png b/advtrains/advtrains/textures/advtrains_dtrack_shared_detector_on.png
new file mode 100755
index 0000000..7bb29d6
--- /dev/null
+++ b/advtrains/advtrains/textures/advtrains_dtrack_shared_detector_on.png
Binary files differ
diff --git a/advtrains/advtrains/textures/advtrains_dtrack_shared_load.png b/advtrains/advtrains/textures/advtrains_dtrack_shared_load.png
new file mode 100755
index 0000000..5fd0d7a
--- /dev/null
+++ b/advtrains/advtrains/textures/advtrains_dtrack_shared_load.png
Binary files differ
diff --git a/advtrains/advtrains/textures/advtrains_dtrack_shared_unload.png b/advtrains/advtrains/textures/advtrains_dtrack_shared_unload.png
new file mode 100755
index 0000000..e9fc5bd
--- /dev/null
+++ b/advtrains/advtrains/textures/advtrains_dtrack_shared_unload.png
Binary files differ
diff --git a/advtrains/advtrains/textures/advtrains_dtrack_slopeplacer.png b/advtrains/advtrains/textures/advtrains_dtrack_slopeplacer.png
new file mode 100755
index 0000000..1d456b0
--- /dev/null
+++ b/advtrains/advtrains/textures/advtrains_dtrack_slopeplacer.png
Binary files differ
diff --git a/advtrains/advtrains/textures/advtrains_dtrack_unload_placer.png b/advtrains/advtrains/textures/advtrains_dtrack_unload_placer.png
new file mode 100755
index 0000000..486861e
--- /dev/null
+++ b/advtrains/advtrains/textures/advtrains_dtrack_unload_placer.png
Binary files differ
diff --git a/advtrains/advtrains/textures/advtrains_platform.png b/advtrains/advtrains/textures/advtrains_platform.png
new file mode 100755
index 0000000..5ba9663
--- /dev/null
+++ b/advtrains/advtrains/textures/advtrains_platform.png
Binary files differ
diff --git a/advtrains/advtrains/textures/advtrains_platform_diag.png b/advtrains/advtrains/textures/advtrains_platform_diag.png
new file mode 100644
index 0000000..6e262e2
--- /dev/null
+++ b/advtrains/advtrains/textures/advtrains_platform_diag.png
Binary files differ
diff --git a/advtrains/advtrains/textures/advtrains_retrosignal.png b/advtrains/advtrains/textures/advtrains_retrosignal.png
new file mode 100755
index 0000000..141198d
--- /dev/null
+++ b/advtrains/advtrains/textures/advtrains_retrosignal.png
Binary files differ
diff --git a/advtrains/advtrains/textures/advtrains_retrosignal_inv.png b/advtrains/advtrains/textures/advtrains_retrosignal_inv.png
new file mode 100755
index 0000000..1036594
--- /dev/null
+++ b/advtrains/advtrains/textures/advtrains_retrosignal_inv.png
Binary files differ
diff --git a/advtrains/advtrains/textures/advtrains_signal_inv.png b/advtrains/advtrains/textures/advtrains_signal_inv.png
new file mode 100755
index 0000000..ed64ed9
--- /dev/null
+++ b/advtrains/advtrains/textures/advtrains_signal_inv.png
Binary files differ
diff --git a/advtrains/advtrains/textures/advtrains_signal_off.png b/advtrains/advtrains/textures/advtrains_signal_off.png
new file mode 100755
index 0000000..8046e52
--- /dev/null
+++ b/advtrains/advtrains/textures/advtrains_signal_off.png
Binary files differ
diff --git a/advtrains/advtrains/textures/advtrains_signal_on.png b/advtrains/advtrains/textures/advtrains_signal_on.png
new file mode 100755
index 0000000..5228bb3
--- /dev/null
+++ b/advtrains/advtrains/textures/advtrains_signal_on.png
Binary files differ
diff --git a/advtrains/advtrains/textures/advtrains_signal_wall_off.png b/advtrains/advtrains/textures/advtrains_signal_wall_off.png
new file mode 100755
index 0000000..3e7b1e1
--- /dev/null
+++ b/advtrains/advtrains/textures/advtrains_signal_wall_off.png
Binary files differ
diff --git a/advtrains/advtrains/textures/advtrains_signal_wall_on.png b/advtrains/advtrains/textures/advtrains_signal_wall_on.png
new file mode 100755
index 0000000..b628c7e
--- /dev/null
+++ b/advtrains/advtrains/textures/advtrains_signal_wall_on.png
Binary files differ
diff --git a/advtrains/advtrains/textures/advtrains_track_cr.png b/advtrains/advtrains/textures/advtrains_track_cr.png
new file mode 100755
index 0000000..40f0cc5
--- /dev/null
+++ b/advtrains/advtrains/textures/advtrains_track_cr.png
Binary files differ
diff --git a/advtrains/advtrains/textures/advtrains_track_cr_45.png b/advtrains/advtrains/textures/advtrains_track_cr_45.png
new file mode 100755
index 0000000..54966b3
--- /dev/null
+++ b/advtrains/advtrains/textures/advtrains_track_cr_45.png
Binary files differ
diff --git a/advtrains/advtrains/textures/advtrains_track_placer.png b/advtrains/advtrains/textures/advtrains_track_placer.png
new file mode 100755
index 0000000..03e17ed
--- /dev/null
+++ b/advtrains/advtrains/textures/advtrains_track_placer.png
Binary files differ
diff --git a/advtrains/advtrains/textures/advtrains_track_st.png b/advtrains/advtrains/textures/advtrains_track_st.png
new file mode 100755
index 0000000..5ad7e4f
--- /dev/null
+++ b/advtrains/advtrains/textures/advtrains_track_st.png
Binary files differ
diff --git a/advtrains/advtrains/textures/advtrains_track_st_45.png b/advtrains/advtrains/textures/advtrains_track_st_45.png
new file mode 100755
index 0000000..63b4c96
--- /dev/null
+++ b/advtrains/advtrains/textures/advtrains_track_st_45.png
Binary files differ
diff --git a/advtrains/advtrains/textures/advtrains_track_swlcr.png b/advtrains/advtrains/textures/advtrains_track_swlcr.png
new file mode 100755
index 0000000..d9b5c0b
--- /dev/null
+++ b/advtrains/advtrains/textures/advtrains_track_swlcr.png
Binary files differ
diff --git a/advtrains/advtrains/textures/advtrains_track_swlcr_45.png b/advtrains/advtrains/textures/advtrains_track_swlcr_45.png
new file mode 100755
index 0000000..f098fc9
--- /dev/null
+++ b/advtrains/advtrains/textures/advtrains_track_swlcr_45.png
Binary files differ
diff --git a/advtrains/advtrains/textures/advtrains_track_swlst.png b/advtrains/advtrains/textures/advtrains_track_swlst.png
new file mode 100755
index 0000000..314bd2d
--- /dev/null
+++ b/advtrains/advtrains/textures/advtrains_track_swlst.png
Binary files differ
diff --git a/advtrains/advtrains/textures/advtrains_track_swlst_45.png b/advtrains/advtrains/textures/advtrains_track_swlst_45.png
new file mode 100755
index 0000000..765d0ec
--- /dev/null
+++ b/advtrains/advtrains/textures/advtrains_track_swlst_45.png
Binary files differ
diff --git a/advtrains/advtrains/textures/advtrains_track_swrcr.png b/advtrains/advtrains/textures/advtrains_track_swrcr.png
new file mode 100755
index 0000000..f74e1bc
--- /dev/null
+++ b/advtrains/advtrains/textures/advtrains_track_swrcr.png
Binary files differ
diff --git a/advtrains/advtrains/textures/advtrains_track_swrcr_45.png b/advtrains/advtrains/textures/advtrains_track_swrcr_45.png
new file mode 100755
index 0000000..fa432aa
--- /dev/null
+++ b/advtrains/advtrains/textures/advtrains_track_swrcr_45.png
Binary files differ
diff --git a/advtrains/advtrains/textures/advtrains_track_swrst.png b/advtrains/advtrains/textures/advtrains_track_swrst.png
new file mode 100755
index 0000000..06ea29e
--- /dev/null
+++ b/advtrains/advtrains/textures/advtrains_track_swrst.png
Binary files differ
diff --git a/advtrains/advtrains/textures/advtrains_track_swrst_45.png b/advtrains/advtrains/textures/advtrains_track_swrst_45.png
new file mode 100755
index 0000000..be477b7
--- /dev/null
+++ b/advtrains/advtrains/textures/advtrains_track_swrst_45.png
Binary files differ
diff --git a/advtrains/advtrains/textures/advtrains_trackworker.png b/advtrains/advtrains/textures/advtrains_trackworker.png
new file mode 100755
index 0000000..b50bcae
--- /dev/null
+++ b/advtrains/advtrains/textures/advtrains_trackworker.png
Binary files differ
diff --git a/advtrains/advtrains/textures/advtrains_wagon_placeholder.png b/advtrains/advtrains/textures/advtrains_wagon_placeholder.png
new file mode 100644
index 0000000..383c181
--- /dev/null
+++ b/advtrains/advtrains/textures/advtrains_wagon_placeholder.png
Binary files differ
diff --git a/advtrains/advtrains/textures/advtrains_wheel.png b/advtrains/advtrains/textures/advtrains_wheel.png
new file mode 100755
index 0000000..fb72879
--- /dev/null
+++ b/advtrains/advtrains/textures/advtrains_wheel.png
Binary files differ
diff --git a/advtrains/advtrains/textures/drwho_screwdriver.png b/advtrains/advtrains/textures/drwho_screwdriver.png
new file mode 100755
index 0000000..b50bcae
--- /dev/null
+++ b/advtrains/advtrains/textures/drwho_screwdriver.png
Binary files differ
diff --git a/advtrains/advtrains/trackdb_legacy.lua b/advtrains/advtrains/trackdb_legacy.lua
new file mode 100644
index 0000000..99349e8
--- /dev/null
+++ b/advtrains/advtrains/trackdb_legacy.lua
@@ -0,0 +1,27 @@
+--trackdb_legacy.lua
+--loads the (old) track database. the only use for this is to provide data for rails that haven't been written into the ndb database.
+--nothing will be saved.
+--if the user thinks that he has loaded every track in his world at least once, he can delete the track database.
+
+--trackdb[[y][x][z]={conn1, conn2, rely1, rely2, railheight}
+
+
+--trackdb keeps its own save file.
+advtrains.fpath_tdb=minetest.get_worldpath().."/advtrains_trackdb2"
+local file, err = io.open(advtrains.fpath_tdb, "r")
+if not file then
+ atprint("Not loading a trackdb file.")
+else
+ local tbl = minetest.deserialize(file:read("*a"))
+ if type(tbl) == "table" then
+ advtrains.trackdb=tbl
+ atprint("Loaded trackdb file.")
+ end
+ file:close()
+end
+
+
+
+
+
+
diff --git a/advtrains/advtrains/trackplacer.lua b/advtrains/advtrains/trackplacer.lua
new file mode 100644
index 0000000..904d851
--- /dev/null
+++ b/advtrains/advtrains/trackplacer.lua
@@ -0,0 +1,438 @@
+--trackplacer.lua
+--holds code for the track-placing system. the default 'track' item will be a craftitem that places rails as needed. this will neither place or change switches nor place vertical rails.
+
+--all new trackplacer code
+local tp={
+ tracks={}
+}
+
+function tp.register_tracktype(nnprefix, n_suffix)
+ if tp.tracks[nnprefix] then return end--due to the separate registration of slopes and flats for the same nnpref, definition would be overridden here. just don't.
+ tp.tracks[nnprefix]={
+ default=n_suffix,
+ single_conn={},
+ single_conn_1={},
+ single_conn_2={},
+ double_conn={},
+ double_conn_1={},
+ double_conn_2={},
+ --keys:conn1_conn2 (example:1_4)
+ --values:{name=x, param2=x}
+ twcycle={},
+ twrotate={},--indexed by suffix, list, tells order of rotations
+ modify={},
+ }
+end
+function tp.add_double_conn(nnprefix, suffix, rotation, conns)
+ local nodename=nnprefix.."_"..suffix..rotation
+ for i=0,3 do
+ tp.tracks[nnprefix].double_conn[((conns.conn1+4*i)%16).."_"..((conns.conn2+4*i)%16)]={name=nodename, param2=i}
+ tp.tracks[nnprefix].double_conn[((conns.conn2+4*i)%16).."_"..((conns.conn1+4*i)%16)]={name=nodename, param2=i}
+ tp.tracks[nnprefix].double_conn_1[((conns.conn1+4*i)%16).."_"..((conns.conn2+4*i)%16)]={name=nodename, param2=i}
+ tp.tracks[nnprefix].double_conn_2[((conns.conn2+4*i)%16).."_"..((conns.conn1+4*i)%16)]={name=nodename, param2=i}
+ end
+ tp.tracks[nnprefix].modify[nodename]=true
+end
+function tp.add_single_conn(nnprefix, suffix, rotation, conns)
+ local nodename=nnprefix.."_"..suffix..rotation
+ for i=0,3 do
+ tp.tracks[nnprefix].single_conn[((conns.conn1+4*i)%16)]={name=nodename, param2=i}
+ tp.tracks[nnprefix].single_conn[((conns.conn2+4*i)%16)]={name=nodename, param2=i}
+ tp.tracks[nnprefix].single_conn_1[((conns.conn1+4*i)%16)]={name=nodename, param2=i}
+ tp.tracks[nnprefix].single_conn_2[((conns.conn2+4*i)%16)]={name=nodename, param2=i}
+ end
+ tp.tracks[nnprefix].modify[nodename]=true
+end
+
+
+function tp.add_worked(nnprefix, suffix, rotation, cycle_follows)
+ tp.tracks[nnprefix].twcycle[suffix]=cycle_follows
+ if not tp.tracks[nnprefix].twrotate[suffix] then tp.tracks[nnprefix].twrotate[suffix]={} end
+ table.insert(tp.tracks[nnprefix].twrotate[suffix], rotation)
+end
+
+
+--[[
+ rewrite algorithm.
+ selection criteria: these will never be changed or even selected:
+ - tracks being already connected on both sides
+ - tracks that are already connected on one side but are not bendable to the desired position
+ the following situations can occur:
+ 1. there are two more than two rails around
+ 1.1 there is one or more subset(s) that can be directly connected
+ -> choose the first possibility
+ 2.2 not
+ -> choose the first one and orient straight
+ 2. there's exactly 1 rail around
+ -> choose and orient straight
+ 3. there's no rail around
+ -> set straight
+]]
+
+local function istrackandbc(pos_p, conn)
+ local tpos = pos_p
+ local cnode=minetest.get_node(advtrains.dirCoordSet(tpos, conn.c))
+ if advtrains.is_track_and_drives_on(cnode.name, advtrains.all_tracktypes) then
+ local cconns=advtrains.get_track_connections(cnode.name, cnode.param2)
+ return advtrains.conn_matches_to(conn, cconns)
+ end
+ --try the same 1 node below
+ tpos = {x=tpos.x, y=tpos.y-1, z=tpos.z}
+ cnode=minetest.get_node(advtrains.dirCoordSet(tpos, conn.c))
+ if advtrains.is_track_and_drives_on(cnode.name, advtrains.all_tracktypes) then
+ local cconns=advtrains.get_track_connections(cnode.name, cnode.param2)
+ return advtrains.conn_matches_to(conn, cconns)
+ end
+ return false
+end
+
+function tp.find_already_connected(pos)
+ local dnode=minetest.get_node(pos)
+ local dconns=advtrains.get_track_connections(dnode.name, dnode.param2)
+ local found_conn
+ for connid, conn in ipairs(dconns) do
+ if istrackandbc(pos, conn) then
+ if found_conn then --we found one in previous iteration
+ return true, true --signal that it's connected
+ else
+ found_conn = conn.c
+ end
+ end
+ end
+ return found_conn
+end
+function tp.rail_and_can_be_bent(originpos, conn)
+ local pos=advtrains.dirCoordSet(originpos, conn)
+ local newdir=(conn+8)%16
+ local node=minetest.get_node(pos)
+ if not advtrains.is_track_and_drives_on(node.name, advtrains.all_tracktypes) then
+ return false
+ end
+ local ndef=minetest.registered_nodes[node.name]
+ local nnpref = ndef and ndef.at_nnpref
+ if not nnpref then return false end
+ local tr=tp.tracks[nnpref]
+ if not tr then return false end
+ if not tr.modify[node.name] then
+ --we actually can use this rail, but only if it already points to the desired direction.
+ if advtrains.is_track_and_drives_on(node.name, advtrains.all_tracktypes) then
+ local cconns=advtrains.get_track_connections(node.name, node.param2)
+ return advtrains.conn_matches_to(conn, cconns)
+ end
+ end
+ -- If the rail is not allowed to be modified, also only use if already in desired direction
+ if not advtrains.can_dig_or_modify_track(pos) then
+ local cconns=advtrains.get_track_connections(node.name, node.param2)
+ return advtrains.conn_matches_to(conn, cconns)
+ end
+ --rail at other end?
+ local adj1, adj2=tp.find_already_connected(pos)
+ if adj1 and adj2 then
+ return false--dont destroy existing track
+ elseif adj1 and not adj2 then
+ if tr.double_conn[adj1.."_"..newdir] then
+ return true--if exists, connect new rail and old end
+ end
+ return false
+ else
+ if tr.single_conn[newdir] then--just rotate old rail to right orientation
+ return true
+ end
+ return false
+ end
+end
+function tp.bend_rail(originpos, conn)
+ local pos=advtrains.dirCoordSet(originpos, conn)
+ local newdir=advtrains.oppd(conn)
+ local node=minetest.get_node(pos)
+ local ndef=minetest.registered_nodes[node.name]
+ local nnpref = ndef and ndef.at_nnpref
+ if not nnpref then return false end
+ local tr=tp.tracks[nnpref]
+ if not tr then return false end
+ --is rail already connected? no need to bend.
+ local conns=advtrains.get_track_connections(node.name, node.param2)
+ if advtrains.conn_matches_to(conn, conns) then
+ return
+ end
+ --rail at other end?
+ local adj1, adj2=tp.find_already_connected(pos)
+ if adj1 and adj2 then
+ return false--dont destroy existing track
+ elseif adj1 and not adj2 then
+ if tr.double_conn[adj1.."_"..newdir] then
+ advtrains.ndb.swap_node(pos, tr.double_conn[adj1.."_"..newdir])
+ return true--if exists, connect new rail and old end
+ end
+ return false
+ else
+ if tr.single_conn[newdir] then--just rotate old rail to right orientation
+ advtrains.ndb.swap_node(pos, tr.single_conn[newdir])
+ return true
+ end
+ return false
+ end
+end
+function tp.placetrack(pos, nnpref, placer, itemstack, pointed_thing, yaw)
+ --1. find all rails that are likely to be connected
+ local tr=tp.tracks[nnpref]
+ local p_rails={}
+ local p_railpos={}
+ for i=0,15 do
+ if tp.rail_and_can_be_bent(pos, i, nnpref) then
+ p_rails[#p_rails+1]=i
+ p_railpos[i] = pos
+ else
+ local upos = {x=pos.x, y=pos.y-1, z=pos.z}
+ if tp.rail_and_can_be_bent(upos, i, nnpref) then
+ p_rails[#p_rails+1]=i
+ p_railpos[i] = upos
+ end
+ end
+ end
+
+ -- try double_conn
+ if #p_rails > 1 then
+ --iterate subsets
+ for k1, conn1 in ipairs(p_rails) do
+ for k2, conn2 in ipairs(p_rails) do
+ if k1~=k2 then
+ local dconn1 = tr.double_conn_1
+ local dconn2 = tr.double_conn_2
+ if not (advtrains.yawToDirection(yaw, conn1, conn2) == conn1) then
+ dconn1 = tr.double_conn_2
+ dconn2 = tr.double_conn_1
+ end
+ -- Checks are made this way round so that dconn1 has priority (this will make arrows of atc rails
+ -- point in the right direction)
+ local using
+ if (dconn2[conn1.."_"..conn2]) then
+ using = dconn2[conn1.."_"..conn2]
+ end
+ if (dconn1[conn1.."_"..conn2]) then
+ using = dconn1[conn1.."_"..conn2]
+ end
+ if using then
+ -- has found a fitting rail in either direction
+ -- if not, continue loop
+ tp.bend_rail(p_railpos[conn1], conn1, nnpref)
+ tp.bend_rail(p_railpos[conn2], conn2, nnpref)
+ advtrains.ndb.swap_node(pos, using)
+ local nname=using.name
+ if minetest.registered_nodes[nname] and minetest.registered_nodes[nname].after_place_node then
+ minetest.registered_nodes[nname].after_place_node(pos, placer, itemstack, pointed_thing)
+ end
+ return
+ end
+ end
+ end
+ end
+ end
+ -- try single_conn
+ if #p_rails > 0 then
+ for ix, p_rail in ipairs(p_rails) do
+ local sconn1 = tr.single_conn_1
+ local sconn2 = tr.single_conn_2
+ if not (advtrains.yawToDirection(yaw, p_rail, (p_rail+8)%16) == p_rail) then
+ sconn1 = tr.single_conn_2
+ sconn2 = tr.single_conn_1
+ end
+ if sconn1[p_rail] then
+ local using = sconn1[p_rail]
+ tp.bend_rail(p_railpos[p_rail], p_rail, nnpref)
+ advtrains.ndb.swap_node(pos, using)
+ local nname=using.name
+ if minetest.registered_nodes[nname] and minetest.registered_nodes[nname].after_place_node then
+ minetest.registered_nodes[nname].after_place_node(pos, placer, itemstack, pointed_thing)
+ end
+ return
+ end
+ if sconn2[p_rail] then
+ local using = sconn2[p_rail]
+ tp.bend_rail(p_railpos[p_rail], p_rail, nnpref)
+ advtrains.ndb.swap_node(pos, using)
+ local nname=using.name
+ if minetest.registered_nodes[nname] and minetest.registered_nodes[nname].after_place_node then
+ minetest.registered_nodes[nname].after_place_node(pos, placer, itemstack, pointed_thing)
+ end
+ return
+ end
+ end
+ end
+ --use default
+ minetest.set_node(pos, {name=nnpref.."_"..tr.default})
+ if minetest.registered_nodes[nnpref.."_"..tr.default] and minetest.registered_nodes[nnpref.."_"..tr.default].after_place_node then
+ minetest.registered_nodes[nnpref.."_"..tr.default].after_place_node(pos, placer, itemstack, pointed_thing)
+ end
+end
+
+
+function tp.register_track_placer(nnprefix, imgprefix, dispname, def)
+ minetest.register_craftitem(":"..nnprefix.."_placer",{
+ description = dispname,
+ inventory_image = imgprefix.."_placer.png",
+ wield_image = imgprefix.."_placer.png",
+ groups={advtrains_trackplacer=1, digtron_on_place=1},
+ liquids_pointable = def.liquids_pointable,
+ on_place = function(itemstack, placer, pointed_thing)
+ return advtrains.pcall(function()
+ local name = placer:get_player_name()
+ if not name then
+ return itemstack, false
+ end
+ if pointed_thing.type=="node" then
+ local pos=pointed_thing.above
+ local upos=vector.subtract(pointed_thing.above, {x=0, y=1, z=0})
+ if not advtrains.check_track_protection(pos, name) then
+ return itemstack, false
+ end
+ if minetest.registered_nodes[minetest.get_node(pos).name] and minetest.registered_nodes[minetest.get_node(pos).name].buildable_to then
+ if def.suitable_substrate then
+ s = def.suitable_substrate(upos)
+ else
+ s = minetest.registered_nodes[minetest.get_node(upos).name] and minetest.registered_nodes[minetest.get_node(upos).name].walkable
+ end
+ if s then
+-- minetest.chat_send_all(nnprefix)
+ local yaw = placer:get_look_horizontal()
+ tp.placetrack(pos, nnprefix, placer, itemstack, pointed_thing, yaw)
+ if not advtrains.is_creative(name) then
+ itemstack:take_item()
+ end
+ end
+ end
+ end
+ return itemstack, true
+ end)
+ end,
+ })
+end
+
+
+
+minetest.register_craftitem("advtrains:trackworker",{
+ description = attrans("Track Worker Tool\n\nLeft-click: change rail type (straight/curve/switch)\nRight-click: rotate rail/bumper/signal/etc."),
+ groups = {cracky=1}, -- key=name, value=rating; rating=1..3.
+ inventory_image = "advtrains_trackworker.png",
+ wield_image = "advtrains_trackworker.png",
+ stack_max = 1,
+ on_place = function(itemstack, placer, pointed_thing)
+ return advtrains.pcall(function()
+ local name = placer:get_player_name()
+ if not name then
+ return
+ end
+ local has_aux1_down = placer:get_player_control().aux1
+ if pointed_thing.type=="node" then
+ local pos=pointed_thing.under
+ if not advtrains.check_track_protection(pos, name) then
+ return
+ end
+ local node=minetest.get_node(pos)
+
+ --if not advtrains.is_track_and_drives_on(minetest.get_node(pos).name, advtrains.all_tracktypes) then return end
+
+ local nnprefix, suffix, rotation=string.match(node.name, "^(.+)_([^_]+)(_[^_]+)$")
+ --atdebug(node.name.."\npattern recognizes:"..nnprefix.." / "..suffix.." / "..rotation)
+ --atdebug("nntab: ",tp.tracks[nnprefix])
+ if not tp.tracks[nnprefix] or not tp.tracks[nnprefix].twrotate[suffix] then
+ nnprefix, suffix=string.match(node.name, "^(.+)_([^_]+)$")
+ rotation = ""
+ if not tp.tracks[nnprefix] or not tp.tracks[nnprefix].twrotate[suffix] then
+ minetest.chat_send_player(placer:get_player_name(), attrans("This node can't be rotated using the trackworker!"))
+ return
+ end
+ end
+
+ -- check if the node is modify-protected
+ if advtrains.is_track_and_drives_on(minetest.get_node(pos).name, advtrains.all_tracktypes) then
+ -- is a track, we can query
+ local can_modify, reason = advtrains.can_dig_or_modify_track(pos)
+ if not can_modify then
+ local str = attrans("This track can not be rotated!")
+ if reason then
+ str = str .. " " .. reason
+ end
+ minetest.chat_send_player(placer:get_player_name(), str)
+ return
+ end
+ end
+
+ if has_aux1_down then
+ --feature: flip the node by 180°
+ --i've always wanted this!
+ advtrains.ndb.swap_node(pos, {name=node.name, param2=(node.param2+2)%4})
+ return
+ end
+
+ local modext=tp.tracks[nnprefix].twrotate[suffix]
+
+ if rotation==modext[#modext] then --increase param2
+ advtrains.ndb.swap_node(pos, {name=nnprefix.."_"..suffix..modext[1], param2=(node.param2+1)%4})
+ return
+ else
+ local modpos
+ for k,v in pairs(modext) do
+ if v==rotation then modpos=k end
+ end
+ if not modpos then
+ minetest.chat_send_player(placer:get_player_name(), attrans("This node can't be rotated using the trackworker!"))
+ return
+ end
+ advtrains.ndb.swap_node(pos, {name=nnprefix.."_"..suffix..modext[modpos+1], param2=node.param2})
+ end
+ end
+ end)
+ end,
+ on_use=function(itemstack, user, pointed_thing)
+ return advtrains.pcall(function()
+ local name = user:get_player_name()
+ if not name then
+ return
+ end
+ if pointed_thing.type=="node" then
+ local pos=pointed_thing.under
+ local node=minetest.get_node(pos)
+ if not advtrains.check_track_protection(pos, name) then
+ return
+ end
+
+ --if not advtrains.is_track_and_drives_on(minetest.get_node(pos).name, advtrains.all_tracktypes) then return end
+ if advtrains.get_train_at_pos(pos) then return end
+ local nnprefix, suffix, rotation=string.match(node.name, "^(.+)_([^_]+)(_[^_]+)$")
+ --atdebug(node.name.."\npattern recognizes:"..nodeprefix.." / "..railtype.." / "..rotation)
+ if not tp.tracks[nnprefix] or not tp.tracks[nnprefix].twcycle[suffix] then
+ nnprefix, suffix=string.match(node.name, "^(.+)_([^_]+)$")
+ rotation = ""
+ if not tp.tracks[nnprefix] or not tp.tracks[nnprefix].twcycle[suffix] then
+ minetest.chat_send_player(user:get_player_name(), attrans("This node can't be changed using the trackworker!"))
+ return
+ end
+ end
+
+ -- check if the node is modify-protected
+ if advtrains.is_track_and_drives_on(minetest.get_node(pos).name, advtrains.all_tracktypes) then
+ -- is a track, we can query
+ local can_modify, reason = advtrains.can_dig_or_modify_track(pos)
+ if not can_modify then
+ local str = attrans("This track can not be changed!")
+ if reason then
+ str = str .. " " .. reason
+ end
+ minetest.chat_send_player(user:get_player_name(), str)
+ return
+ end
+ end
+
+ local nextsuffix=tp.tracks[nnprefix].twcycle[suffix]
+ advtrains.ndb.swap_node(pos, {name=nnprefix.."_"..nextsuffix..rotation, param2=node.param2})
+
+ else
+ atprint(name, dump(tp.tracks))
+ end
+ end)
+ end,
+})
+
+--putting into right place
+advtrains.trackplacer=tp
diff --git a/advtrains/advtrains/tracks.lua b/advtrains/advtrains/tracks.lua
new file mode 100644
index 0000000..6799c40
--- /dev/null
+++ b/advtrains/advtrains/tracks.lua
@@ -0,0 +1,742 @@
+--advtrains by orwell96, see readme.txt
+
+--dev-time settings:
+--EDIT HERE
+--If the old non-model rails on straight tracks should be replaced by the new...
+--false: no
+--true: yes
+advtrains.register_replacement_lbms=false
+
+--[[TracksDefinition
+nodename_prefix
+texture_prefix
+description
+common={}
+straight={}
+straight45={}
+curve={}
+curve45={}
+lswitchst={}
+lswitchst45={}
+rswitchst={}
+rswitchst45={}
+lswitchcr={}
+lswitchcr45={}
+rswitchcr={}
+rswitchcr45={}
+vert1={
+ --you'll probably want to override mesh here
+}
+vert2={
+ --you'll probably want to override mesh here
+}
+]]--
+advtrains.all_tracktypes={}
+
+--definition preparation
+local function conns(c1, c2, r1, r2) return {{c=c1, y=r1}, {c=c2, y=r2}} end
+local function conns3(c1, c2, c3, r1, r2, r3) return {{c=c1, y=r1}, {c=c2, y=r2}, {c=c3, y=r3}} end
+
+advtrains.ap={}
+advtrains.ap.t_30deg_flat={
+ regstep=1,
+ variant={
+ st={
+ conns = conns(0,8),
+ desc = "straight",
+ tpdouble = true,
+ tpsingle = true,
+ trackworker = "cr",
+ },
+ cr={
+ conns = conns(0,7),
+ desc = "curve",
+ tpdouble = true,
+ trackworker = "swlst",
+ },
+ swlst={
+ conns = conns3(0,8,7),
+ desc = "left switch (straight)",
+ trackworker = "swrst",
+ switchalt = "cr",
+ switchmc = "on",
+ switchst = "st",
+ switchprefix = "swl",
+ },
+ swlcr={
+ conns = conns3(0,7,8),
+ desc = "left switch (curve)",
+ trackworker = "swrcr",
+ switchalt = "st",
+ switchmc = "off",
+ switchst = "cr",
+ switchprefix = "swl",
+ },
+ swrst={
+ conns = conns3(0,8,9),
+ desc = "right switch (straight)",
+ trackworker = "st",
+ switchalt = "cr",
+ switchmc = "on",
+ switchst = "st",
+ switchprefix = "swr",
+ },
+ swrcr={
+ conns = conns3(0,9,8),
+ desc = "right switch (curve)",
+ trackworker = "st",
+ switchalt = "st",
+ switchmc = "off",
+ switchst = "cr",
+ switchprefix = "swr",
+ },
+ },
+ regtp=true,
+ tpdefault="st",
+ trackworker={
+ ["swrcr"]="st",
+ ["swrst"]="st",
+ ["cr"]="swlst",
+ ["swlcr"]="swrcr",
+ ["swlst"]="swrst",
+ },
+ rotation={"", "_30", "_45", "_60"},
+}
+advtrains.ap.t_yturnout={
+ regstep=1,
+ variant={
+ l={
+ conns = conns3(0,7,9),
+ desc = "Y-turnout (left)",
+ switchalt = "r",
+ switchmc = "off",
+ switchst = "l",
+ switchprefix = "",
+ },
+ r={
+ conns = conns3(0,9,7),
+ desc = "Y-turnout (right)",
+ switchalt = "l",
+ switchmc = "on",
+ switchst = "r",
+ switchprefix = "",
+ }
+ },
+ regtp=true,
+ tpdefault="l",
+ rotation={"", "_30", "_45", "_60"},
+}
+advtrains.ap.t_s3way={
+ regstep=1,
+ variant={
+ l={
+ conns = { {c=0}, {c=7}, {c=8}, {c=9}, {["3"]=0} },
+ desc = "3-way turnout (left)",
+ switchalt = "s",
+ switchst="l",
+ switchprefix = "",
+ },
+ s={
+ conns = { {c=0}, {c=8}, {c=7}, {c=9}, {["3"]=0} },
+ desc = "3-way turnout (straight)",
+ switchalt ="r",
+ switchst = "s",
+ switchprefix = "",
+ },
+ r={
+ conns = { {c=0}, {c=9}, {c=8}, {c=7}, {["3"]=0} },
+ desc = "3-way turnout (right)",
+ switchalt = "l",
+ switchst="r",
+ switchprefix = "",
+ }
+ },
+ regtp=true,
+ tpdefault="l",
+ rotation={"", "_30", "_45", "_60"},
+}
+advtrains.ap.t_30deg_slope={
+ regstep=1,
+ variant={
+ vst1={conns = conns(8,0,0,0.5), rail_y = 0.25, desc = "steep uphill 1/2", slope=true},
+ vst2={conns = conns(8,0,0.5,1), rail_y = 0.75, desc = "steep uphill 2/2", slope=true},
+ vst31={conns = conns(8,0,0,0.33), rail_y = 0.16, desc = "uphill 1/3", slope=true},
+ vst32={conns = conns(8,0,0.33,0.66), rail_y = 0.5, desc = "uphill 2/3", slope=true},
+ vst33={conns = conns(8,0,0.66,1), rail_y = 0.83, desc = "uphill 3/3", slope=true},
+ },
+ regsp=true,
+ slopeplacer={
+ [2]={"vst1", "vst2"},
+ [3]={"vst31", "vst32", "vst33"},
+ max=3,--highest entry
+ },
+ slopeplacer_45={
+ [2]={"vst1_45", "vst2_45"},
+ max=2,
+ },
+ rotation={"", "_30", "_45", "_60"},
+ trackworker={},
+ increativeinv={},
+}
+advtrains.ap.t_30deg_straightonly={
+ regstep=1,
+ variant={
+ st={
+ conns = conns(0,8),
+ desc = "straight",
+ tpdouble = true,
+ tpsingle = true,
+ trackworker = "st",
+ },
+ },
+ regtp=true,
+ tpdefault="st",
+ rotation={"", "_30", "_45", "_60"},
+}
+advtrains.ap.t_30deg_straightonly_noplacer={
+ regstep=1,
+ variant={
+ st={
+ conns = conns(0,8),
+ desc = "straight",
+ tpdouble = true,
+ tpsingle = true,
+ trackworker = "st",
+ },
+ },
+ tpdefault="st",
+ rotation={"", "_30", "_45", "_60"},
+}
+advtrains.ap.t_45deg={
+ regstep=2,
+ variant={
+ st={
+ conns = conns(0,8),
+ desc = "straight",
+ tpdouble = true,
+ tpsingle = true,
+ trackworker = "cr",
+ },
+ cr={
+ conns = conns(0,6),
+ desc = "curve",
+ tpdouble = true,
+ trackworker = "swlst",
+ },
+ swlst={
+ conns = conns3(0,8,6),
+ desc = "left switch (straight)",
+ trackworker = "swrst",
+ switchalt = "cr",
+ switchmc = "on",
+ switchst = "st",
+ },
+ swlcr={
+ conns = conns3(0,6,8),
+ desc = "left switch (curve)",
+ trackworker = "swrcr",
+ switchalt = "st",
+ switchmc = "off",
+ switchst = "cr",
+ },
+ swrst={
+ conns = conns3(0,8,10),
+ desc = "right switch (straight)",
+ trackworker = "st",
+ switchalt = "cr",
+ switchmc = "on",
+ switchst = "st",
+ },
+ swrcr={
+ conns = conns3(0,10,8),
+ desc = "right switch (curve)",
+ trackworker = "st",
+ switchalt = "st",
+ switchmc = "off",
+ switchst = "cr",
+ },
+ },
+ regtp=true,
+ tpdefault="st",
+ trackworker={
+ ["swrcr"]="st",
+ ["swrst"]="st",
+ ["cr"]="swlst",
+ ["swlcr"]="swrcr",
+ ["swlst"]="swrst",
+ },
+ rotation={"", "_30", "_45", "_60"},
+}
+advtrains.ap.t_perpcrossing={
+ regstep = 1,
+ variant={
+ st={
+ conns = { {c=0}, {c=8}, {c=4}, {c=12} },
+ desc = "perpendicular crossing",
+ tpdouble = true,
+ tpsingle = true,
+ trackworker = "st",
+ },
+ },
+ regtp=true,
+ tpdefault="st",
+ rotation={"", "_30", "_45", "_60"},
+}
+advtrains.ap.t_90plusx_crossing={
+ regstep = 1,
+ variant={
+ ["30l"]={
+ conns = { {c=0}, {c=8}, {c=1}, {c=9} },
+ desc = "30/90 degree crossing (left)",
+ tpdouble = true,
+ tpsingle = true,
+ trackworker = "45l"
+ },
+ ["45l"]={
+ conns = { {c=0}, {c=8}, {c=2}, {c=10} },
+ desc = "45/90 degree crossing (left)",
+ tpdouble = true,
+ tpsingle = true,
+ trackworker = "60l",
+ },
+ ["60l"]={
+ conns = { {c=0}, {c=8}, {c=3}, {c=11}},
+ desc = "60/90 degree crossing (left)",
+ tpdouble = true,
+ tpsingle = true,
+ trackworker = "60r",
+ },
+ ["60r"]={
+ conns = { {c=0}, {c=8}, {c=7}, {c=15} },
+ desc = "60/90 degree crossing (right)",
+ tpdouble = true,
+ tpsingle = true,
+ trackworker = "45r"
+ },
+ ["45r"]={
+ conns = { {c=0}, {c=8}, {c=6}, {c=14} },
+ desc = "45/90 degree crossing (right)",
+ tpdouble = true,
+ tpsingle = true,
+ trackworker = "30r",
+ },
+ ["30r"]={
+ conns = { {c=0}, {c=8}, {c=7}, {c=15}},
+ desc = "30/90 degree crossing (right)",
+ tpdouble = true,
+ tpsingle = true,
+ trackworker = "30l",
+ },
+ },
+ regtp=true,
+ tpdefault="30l",
+ rotation={""},
+ trackworker = {
+ ["30l"] = "45l",
+ ["45l"] = "60l",
+ ["60l"] = "60r",
+ ["60r"] = "45r",
+ ["45r"] = "30r",
+ ["30r"] = "30l",
+ }
+}
+
+advtrains.ap.t_diagonalcrossing = {
+ regstep=1,
+ variant={
+ ["30l45r"]={
+ conns = {{c=1}, {c=9}, {c=6}, {c=14}},
+ desc = "30left-45right diagonal crossing",
+ tpdouble=true,
+ tpsingle=true,
+ trackworker="60l30l",
+ },
+ ["60l30l"]={
+ conns = {{c=3}, {c=11}, {c=1}, {c=9}},
+ desc = "30left-60right diagonal crossing",
+ tpdouble=true,
+ tpsingle=true,
+ trackworker="60l45r"
+ },
+ ["60l45r"]={
+ conns = {{c=3}, {c=11}, {c=6}, {c=14}},
+ desc = "60left-45right diagonal crossing",
+ tpdouble=true,
+ tpsingle=true,
+ trackworker="60l60r"
+ },
+ ["60l60r"]={
+ conns = {{c=3}, {c=11}, {c=5}, {c=13}},
+ desc = "60left-60right diagonal crossing",
+ tpdouble=true,
+ tpsingle=true,
+ trackworker="60r45l",
+ },
+ --If 60l60r had a mirror image, it would be here, but it's symmetric.
+ -- 60l60r is also equivalent to 30l30r but rotated 90 degrees.
+ ["60r45l"]={
+ conns = {{c=5}, {c=13}, {c=2}, {c=10}},
+ desc = "60right-45left diagonal crossing",
+ tpdouble=true,
+ tpsingle=true,
+ trackworker="60r30r",
+ },
+ ["60r30r"]={
+ conns = {{c=5}, {c=13}, {c=7}, {c=15}},
+ desc = "60right-30right diagonal crossing",
+ tpdouble=true,
+ tpsingle=true,
+ trackworker="30r45l",
+ },
+ ["30r45l"]={
+ conns = {{c=7}, {c=15}, {c=2}, {c=10}},
+ desc = "30right-45left diagonal crossing",
+ tpdouble=true,
+ tpsingle=true,
+ trackworker="30l45r",
+ },
+
+ },
+ regtp=true,
+ tpdefault="30l45r",
+ rotation={""},
+ trackworker = {
+ ["30l45r"] = "60l30l",
+ ["60l30l"] = "60l45r",
+ ["60l45r"] = "60l60r",
+ ["60l60r"] = "60r45l",
+ ["60r45l"] = "60r30r",
+ ["60r30r"] = "30r45l",
+ ["30r45l"] = "30l45r",
+ }
+}
+
+advtrains.trackpresets = advtrains.ap
+
+--definition format: ([] optional)
+--[[{
+ nodename_prefix
+ texture_prefix
+ [shared_texture]
+ models_prefix
+ models_suffix (with dot)
+ [shared_model]
+ formats={
+ st,cr,swlst,swlcr,swrst,swrcr,vst1,vst2
+ (each a table with indices 0-3, for if to register a rail with this 'rotation' table entry. nil is assumed as 'all', set {} to not register at all)
+ }
+ common={} change something on common rail appearance
+}
+[18.12.17] Note on new connection system:
+In order to support real rail crossing nodes and finally make the trackplacer respect switches, I changed the connection system.
+There can be a variable number of connections available. These are specified as tuples {c=<connection>, y=<rely>}
+The table "at_conns" consists of {<conn1>, <conn2>...}
+the "at_rail_y" property holds the value that was previously called "railheight"
+Depending on the number of connections:
+2 conns: regular rail
+3 conns: switch:
+ - when train passes in at conn1, will move out of conn2
+ - when train passes in at conn2 or conn3, will move out of conn1
+4 conns: cross (or cross switch, depending on arrangement of conns):
+ - conn1 <> conn2
+ - conn3 <> conn4
+]]
+
+function advtrains.register_tracks(tracktype, def, preset)
+ advtrains.trackplacer.register_tracktype(def.nodename_prefix, preset.tpdefault)
+ if preset.regtp then
+ advtrains.trackplacer.register_track_placer(def.nodename_prefix, def.texture_prefix, def.description, def)
+ end
+ if preset.regsp then
+ advtrains.slope.register_placer(def, preset)
+ end
+ for suffix, var in pairs(preset.variant) do
+ for rotid, rotation in ipairs(preset.rotation) do
+ if not def.formats[suffix] or def.formats[suffix][rotid] then
+ local img_suffix = suffix..rotation
+ local ndef = advtrains.merge_tables({
+ description=def.description.."("..(var.desc or "any")..rotation..")",
+ drawtype = "mesh",
+ paramtype="light",
+ paramtype2="facedir",
+ walkable = false,
+ selection_box = {
+ type = "fixed",
+ fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2},
+ },
+
+ mesh = def.shared_model or (def.models_prefix.."_"..img_suffix..def.models_suffix),
+ tiles = {def.shared_texture or (def.texture_prefix.."_"..img_suffix..".png"), def.second_texture},
+
+ groups = {
+ attached_node=1,
+ advtrains_track=1,
+ ["advtrains_track_"..tracktype]=1,
+ save_in_at_nodedb=1,
+ dig_immediate=2,
+ not_in_creative_inventory=1,
+ not_blocking_trains=1,
+ },
+
+ can_dig = advtrains.can_dig_or_modify_track,
+ after_dig_node=function(pos)
+ advtrains.ndb.update(pos)
+ end,
+ after_place_node=function(pos)
+ advtrains.ndb.update(pos)
+ end,
+ at_nnpref = def.nodename_prefix,
+ at_suffix = suffix,
+ at_rotation = rotation,
+ at_rail_y = var.rail_y
+ }, def.common or {})
+
+ if preset.regtp then
+ ndef.drop = def.nodename_prefix.."_placer"
+ end
+ if preset.regsp and var.slope then
+ ndef.drop = def.nodename_prefix.."_slopeplacer"
+ end
+
+ --connections
+ ndef.at_conns = advtrains.rotate_conn_by(var.conns, (rotid-1)*preset.regstep)
+
+ local ndef_avt_table
+
+ if var.switchalt and var.switchst then
+ local switchfunc=function(pos, node, newstate)
+ newstate = newstate or var.switchalt -- support for 3 (or more) state switches
+ -- this code is only called from the internal setstate function, which
+ -- ensures that it is safe to switch the turnout
+ if newstate~=var.switchst then
+ advtrains.ndb.swap_node(pos, {name=def.nodename_prefix.."_"..(var.switchprefix or "")..newstate..rotation, param2=node.param2})
+ advtrains.invalidate_all_paths(pos)
+ end
+ end
+ ndef.on_rightclick = function(pos, node, player)
+ if advtrains.check_turnout_signal_protection(pos, player:get_player_name()) then
+ advtrains.setstate(pos, newstate, node)
+ advtrains.log("Switch", player:get_player_name(), pos)
+ end
+ end
+ if var.switchmc then
+ ndef.mesecons = {effector = {
+ ["action_"..var.switchmc] = function(pos, node)
+ advtrains.setstate(pos, nil, node)
+ end,
+ rules=advtrains.meseconrules
+ }}
+ end
+ ndef_avt_table = {
+ getstate = var.switchst,
+ setstate = switchfunc,
+ }
+ end
+
+ local adef={}
+ if def.get_additional_definiton then
+ adef=def.get_additional_definiton(def, preset, suffix, rotation)
+ end
+ ndef = advtrains.merge_tables(ndef, adef)
+
+ -- insert getstate/setstate functions after merging the additional definitions
+ if ndef_avt_table then
+ ndef.advtrains = advtrains.merge_tables(ndef.advtrains or {}, ndef_avt_table)
+ end
+
+ minetest.register_node(":"..def.nodename_prefix.."_"..suffix..rotation, ndef)
+ --trackplacer
+ if preset.regtp then
+ local tpconns = {conn1=ndef.at_conns[1].c, conn2=ndef.at_conns[2].c}
+ if var.tpdouble then
+ advtrains.trackplacer.add_double_conn(def.nodename_prefix, suffix, rotation, tpconns)
+ end
+ if var.tpsingle then
+ advtrains.trackplacer.add_single_conn(def.nodename_prefix, suffix, rotation, tpconns)
+ end
+ end
+ advtrains.trackplacer.add_worked(def.nodename_prefix, suffix, rotation, var.trackworker)
+ end
+ end
+ end
+ advtrains.all_tracktypes[tracktype]=true
+end
+
+function advtrains.is_track_and_drives_on(nodename, drives_on_p)
+ local drives_on = drives_on_p
+ if not drives_on then drives_on = advtrains.all_tracktypes end
+ local hasentry = false
+ for _,_ in pairs(drives_on) do
+ hasentry=true
+ end
+ if not hasentry then drives_on = advtrains.all_tracktypes end
+
+ if not minetest.registered_nodes[nodename] then
+ return false
+ end
+ local nodedef=minetest.registered_nodes[nodename]
+ for k,v in pairs(drives_on) do
+ if nodedef.groups["advtrains_track_"..k] then
+ return true
+ end
+ end
+ return false
+end
+
+function advtrains.get_track_connections(name, param2)
+ local nodedef=minetest.registered_nodes[name]
+ if not nodedef then atprint(" get_track_connections couldn't find nodedef for nodename "..(name or "nil")) return nil end
+ local noderot=param2
+ if not param2 then noderot=0 end
+ if noderot > 3 then atprint(" get_track_connections: rail has invaild param2 of "..noderot) noderot=0 end
+
+ local tracktype
+ for k,_ in pairs(nodedef.groups) do
+ local tt=string.match(k, "^advtrains_track_(.+)$")
+ if tt then
+ tracktype=tt
+ end
+ end
+ return advtrains.rotate_conn_by(nodedef.at_conns, noderot*AT_CMAX/4), (nodedef.at_rail_y or 0), tracktype
+end
+
+-- Function called when a track is about to be dug or modified by the trackworker
+-- Returns either true (ok) or false,"translated string describing reason why it isn't allowed"
+function advtrains.can_dig_or_modify_track(pos)
+ if advtrains.get_train_at_pos(pos) then
+ return false, attrans("Position is occupied by a train.")
+ end
+ -- interlocking: tcb, signal IP a.s.o.
+ if advtrains.interlocking then
+ -- TCB?
+ if advtrains.interlocking.db.get_tcb(pos) then
+ return false, attrans("There's a Track Circuit Break here.")
+ end
+ -- signal ip?
+ if advtrains.interlocking.db.is_ip_at(pos) then
+ return false, attrans("There's a Signal Influence Point here.")
+ end
+ end
+ return true
+end
+
+-- slope placer. Defined in register_tracks.
+--crafted with rail and gravel
+local sl={}
+function sl.register_placer(def, preset)
+ minetest.register_craftitem(":"..def.nodename_prefix.."_slopeplacer",{
+ description = attrans("@1 Slope", def.description),
+ inventory_image = def.texture_prefix.."_slopeplacer.png",
+ wield_image = def.texture_prefix.."_slopeplacer.png",
+ groups={},
+ on_place = sl.create_slopeplacer_on_place(def, preset)
+ })
+end
+--(itemstack, placer, pointed_thing)
+function sl.create_slopeplacer_on_place(def, preset)
+ return function(istack, player, pt)
+ if not pt.type=="node" then
+ minetest.chat_send_player(player:get_player_name(), attrans("Can't place: not pointing at node"))
+ return istack
+ end
+ local pos=pt.above
+ if not pos then
+ minetest.chat_send_player(player:get_player_name(), attrans("Can't place: not pointing at node"))
+ return istack
+ end
+ local node=minetest.get_node(pos)
+ if not minetest.registered_nodes[node.name] or not minetest.registered_nodes[node.name].buildable_to then
+ minetest.chat_send_player(player:get_player_name(), attrans("Can't place: space occupied!"))
+ return istack
+ end
+ if not advtrains.check_track_protection(pos, player:get_player_name()) then
+ minetest.record_protection_violation(pos, player:get_player_name())
+ return istack
+ end
+ --determine player orientation (only horizontal component)
+ --get_look_horizontal may not be available
+ local yaw=player.get_look_horizontal and player:get_look_horizontal() or (player:get_look_yaw() - math.pi/2)
+
+ --rounding unit vectors is a nice way for selecting 1 of 8 directions since sin(30°) is 0.5.
+ dirvec={x=math.floor(math.sin(-yaw)+0.5), y=0, z=math.floor(math.cos(-yaw)+0.5)}
+ --translate to direction to look up inside the preset table
+ local param2, rot45=({
+ [-1]={
+ [-1]=2,
+ [0]=3,
+ [1]=3,
+ },
+ [0]={
+ [-1]=2,
+ [1]=0,
+ },
+ [1]={
+ [-1]=1,
+ [0]=1,
+ [1]=0,
+ },
+ })[dirvec.x][dirvec.z], dirvec.x~=0 and dirvec.z~=0
+ local lookup=preset.slopeplacer
+ if rot45 then lookup=preset.slopeplacer_45 end
+
+ --go unitvector forward and look how far the next node is
+ local step=1
+ while step<=lookup.max do
+ local node=minetest.get_node(vector.add(pos, dirvec))
+ --next node solid?
+ if not minetest.registered_nodes[node.name] or not minetest.registered_nodes[node.name].buildable_to or advtrains.is_protected(pos, player:get_player_name()) then
+ --do slopes of this distance exist?
+ if lookup[step] then
+ if minetest.settings:get_bool("creative_mode") or istack:get_count()>=step then
+ --start placing
+ local placenodes=lookup[step]
+ while step>0 do
+ minetest.set_node(pos, {name=def.nodename_prefix.."_"..placenodes[step], param2=param2})
+ if not minetest.settings:get_bool("creative_mode") then
+ istack:take_item()
+ end
+ step=step-1
+ pos=vector.subtract(pos, dirvec)
+ end
+ else
+ minetest.chat_send_player(player:get_player_name(), attrans("Can't place: Not enough slope items left (@1 required)", step))
+ end
+ else
+ minetest.chat_send_player(player:get_player_name(), attrans("Can't place: There's no slope of length @1",step))
+ end
+ return istack
+ end
+ step=step+1
+ pos=vector.add(pos, dirvec)
+ end
+ minetest.chat_send_player(player:get_player_name(), attrans("Can't place: no supporting node at upper end."))
+ return itemstack
+ end
+end
+
+advtrains.slope=sl
+
+--END code, BEGIN definition
+--definition format: ([] optional)
+--[[{
+ nodename_prefix
+ texture_prefix
+ [shared_texture]
+ models_prefix
+ models_suffix (with dot)
+ [shared_model]
+ formats={
+ st,cr,swlst,swlcr,swrst,swrcr,vst1,vst2
+ (each a table with indices 0-3, for if to register a rail with this 'rotation' table entry. nil is assumed as 'all', set {} to not register at all)
+ }
+ common={} change something on common rail appearance
+}]]
+
+
+
+
+
+
+
+
+
diff --git a/advtrains/advtrains/trainhud.lua b/advtrains/advtrains/trainhud.lua
new file mode 100644
index 0000000..c90a406
--- /dev/null
+++ b/advtrains/advtrains/trainhud.lua
@@ -0,0 +1,226 @@
+--trainhud.lua: holds all the code for train controlling
+
+advtrains.hud = {}
+advtrains.hhud = {}
+
+minetest.register_on_leaveplayer(function(player)
+advtrains.hud[player:get_player_name()] = nil
+advtrains.hhud[player:get_player_name()] = nil
+end)
+
+local mletter={[1]="F", [-1]="R", [0]="N"}
+local doorstr={[-1]="|<>| >|<", [0]=">|< >|<", [1]=">|< |<>|"}
+
+function advtrains.on_control_change(pc, train, flip)
+ local maxspeed = train.max_speed or 10
+ if pc.sneak then
+ if pc.up then
+ train.tarvelocity = maxspeed
+ end
+ if pc.down then
+ train.tarvelocity = 0
+ end
+ if pc.left then
+ train.tarvelocity = 4
+ end
+ if pc.right then
+ train.tarvelocity = 8
+ end
+ --[[if pc.jump then
+ train.brake = true
+ --0: released, 1: brake and pressed, 2: released and brake, 3: pressed and brake
+ if not train.brake_hold_state or train.brake_hold_state==0 then
+ train.brake_hold_state = 1
+ elseif train.brake_hold_state==2 then
+ train.brake_hold_state = 3
+ end
+ elseif train.brake_hold_state==1 then
+ train.brake_hold_state = 2
+ elseif train.brake_hold_state==3 then
+ train.brake = false
+ train.brake_hold_state = 0
+ end]]
+ --shift+use:see wagons.lua
+ else
+ local act=false
+ if pc.jump then
+ train.ctrl.user = 1
+ act=true
+ end
+ -- If atc command set, only "Jump" key can clear command. To prevent accidental control.
+ if train.tarvelocity or train.atc_command then
+ return
+ end
+ if pc.up then
+ train.ctrl.user=4
+ act=true
+ end
+ if pc.down then
+ if train.velocity>0 then
+ if pc.jump then
+ train.ctrl.user = 0
+ else
+ train.ctrl.user = 2
+ end
+ act=true
+ else
+ advtrains.invert_train(train.id)
+ advtrains.atc.train_reset_command(train)
+ end
+ end
+ if pc.left then
+ if train.door_open ~= 0 then
+ train.door_open = 0
+ else
+ train.door_open = -1
+ end
+ end
+ if pc.right then
+ if train.door_open ~= 0 then
+ train.door_open = 0
+ else
+ train.door_open = 1
+ end
+ end
+ if not act then
+ train.ctrl.user = nil
+ end
+ end
+end
+function advtrains.update_driver_hud(pname, train, flip)
+ local inside=train.text_inside or ""
+ advtrains.set_trainhud(pname, inside.."\n"..advtrains.hud_train_format(train, flip))
+end
+function advtrains.clear_driver_hud(pname)
+ advtrains.set_trainhud(pname, "")
+end
+
+function advtrains.set_trainhud(name, text)
+ local hud = advtrains.hud[name]
+ local player=minetest.get_player_by_name(name)
+ if not player then
+ return
+ end
+ if not hud then
+ hud = {}
+ advtrains.hud[name] = hud
+ hud.id = player:hud_add({
+ hud_elem_type = "text",
+ name = "ADVTRAINS",
+ number = 0xFFFFFF,
+ position = {x=0.5, y=0.7},
+ offset = {x=0, y=0},
+ text = text,
+ scale = {x=200, y=60},
+ alignment = {x=0, y=0},
+ })
+ hud.oldText=text
+ return
+ elseif hud.oldText ~= text then
+ player:hud_change(hud.id, "text", text)
+ hud.oldText=text
+ end
+end
+function advtrains.set_help_hud(name, text)
+ local hud = advtrains.hhud[name]
+ local player=minetest.get_player_by_name(name)
+ if not player then
+ return
+ end
+ if not hud then
+ hud = {}
+ advtrains.hhud[name] = hud
+ hud.id = player:hud_add({
+ hud_elem_type = "text",
+ name = "ADVTRAINS_HELP",
+ number = 0xFFFFFF,
+ position = {x=1, y=0.3},
+ offset = {x=0, y=0},
+ text = text,
+ scale = {x=200, y=60},
+ alignment = {x=1, y=0},
+ })
+ hud.oldText=text
+ return
+ elseif hud.oldText ~= text then
+ player:hud_change(hud.id, "text", text)
+ hud.oldText=text
+ end
+end
+
+--train.lever:
+--Speed control lever in train, for new train control system.
+--[[
+Value Disp Control Meaning
+0 BB S+Space Emergency Brake
+1 B Space Normal Brake
+2 - S Roll
+3 o <none> Stay at speed
+4 + W Accelerate
+]]
+
+function advtrains.hud_train_format(train, flip)
+ local fct=flip and -1 or 1
+ if not train then return "" end
+
+ local max = train.max_speed or 10
+ local res = train.speed_restriction or max
+ local vel = advtrains.abs_ceil(train.velocity)
+ local vel_kmh=advtrains.abs_ceil(advtrains.ms_to_kmh(train.velocity))
+
+ local levers = "B - o +"
+ local tlev=train.lever
+ if train.velocity==0 and not train.active_control then tlev=1 end
+ if tlev == 0 then levers = ">BB< - o +" end
+ if tlev == 1 then levers = ">B< - o +" end
+ if tlev == 2 then levers = "B >-< o +" end
+ if tlev == 3 then levers = "B - >o< +" end
+ if tlev == 4 then levers = "B - o >+<" end
+
+ local topLine, firstLine
+
+ local secondLine
+ if train.tarvelocity or train.atc_command then
+ local b=" "
+ local tvels=""
+ if train.tarvelocity then
+ local tvel = advtrains.abs_ceil(train.tarvelocity)
+ tvels = "|"..string.rep("+", tvel)..string.rep("_", max-tvel)
+ end
+ if train.atc_brake_target then
+ b="-B-"
+ end
+ local ad = ""
+ if train.atc_delay then
+ ad = " "..advtrains.abs_ceil(train.atc_delay).."s "
+ end
+ secondLine="ATC"..b..": "..tvels..ad..(train.atc_command or "")
+ else
+ secondLine = "Manual operation"
+ if train.ctrl.lzb then
+ secondLine = "-!- Safety override -!-"
+ end
+ end
+ local shtind = train.is_shunt and "S" or ">"
+
+ topLine=" ["..mletter[fct].."] {"..levers.."} "..doorstr[(train.door_open or 0)].." "..(train.line and "L: "..train.line or "")
+ firstLine=attrans("Speed:").." |"..string.rep("+", vel)..string.rep("_", res-vel).."|"..string.rep("_", max-res)..shtind.." "..vel_kmh.." km/h"
+ if train.speed_restriction == 0 then
+ firstLine = "OVERRUN RED SIGNAL! Examine situation and reverse train to move again."
+ end
+
+ local lzb = train.lzb
+
+ local i = 1
+ while i<=#lzb.oncoming do
+ local k = lzb.oncoming[i]
+ secondLine = secondLine .. "\n".."LZB: speed limit ["..(k.spd or "E")..("] in %.1f m"):format(k.idx-train.index)
+ if k.spd == 0 then
+ break
+ end
+ i=i+1
+ end
+
+
+ return (train.debug or "").."\n"..topLine.."\n"..firstLine.."\n"..secondLine
+end
diff --git a/advtrains/advtrains/trainlogic.lua b/advtrains/advtrains/trainlogic.lua
new file mode 100644
index 0000000..cc34b4f
--- /dev/null
+++ b/advtrains/advtrains/trainlogic.lua
@@ -0,0 +1,1255 @@
+--trainlogic.lua
+--controls train entities stuff about connecting/disconnecting/colliding trains and other things
+
+local setting_overrun_mode = minetest.settings:get("advtrains_overrun_mode")
+
+local benchmark=false
+local bm={}
+local bmlt=0
+local bmsteps=0
+local bmstepint=200
+atprintbm=function(action, ta)
+ if not benchmark then return end
+ local t=(os.clock()-ta)*1000
+ if not bm[action] then
+ bm[action]=t
+ else
+ bm[action]=bm[action]+t
+ end
+ bmlt=bmlt+t
+end
+function endstep()
+ if not benchmark then return end
+ bmsteps=bmsteps-1
+ if bmsteps<=0 then
+ bmsteps=bmstepint
+ for key, value in pairs(bm) do
+ minetest.chat_send_all(key.." "..(value/bmstepint).." ms avg.")
+ end
+ minetest.chat_send_all("Total time consumed by all advtrains actions per step: "..(bmlt/bmstepint).." ms avg.")
+ bm={}
+ bmlt=0
+ end
+end
+
+--acceleration for lever modes (trainhud.lua), per wagon
+local t_accel_all={
+ [0] = -10,
+ [1] = -3,
+ [2] = -0.5,
+ [4] = 0.5,
+}
+--acceleration per engine
+local t_accel_eng={
+ [0] = 0,
+ [1] = 0,
+ [2] = 0,
+ [4] = 1.5,
+}
+
+tp_player_tmr = 0
+
+advtrains.mainloop_trainlogic=function(dtime)
+ --build a table of all players indexed by pts. used by damage and door system.
+ advtrains.playersbypts={}
+ for _, player in pairs(minetest.get_connected_players()) do
+ if not advtrains.player_to_train_mapping[player:get_player_name()] then
+ --players in train are not subject to damage
+ local ptspos=minetest.pos_to_string(vector.round(player:getpos()))
+ advtrains.playersbypts[ptspos]=player
+ end
+ end
+
+ if tp_player_tmr<=0 then
+ -- teleport players to their train every 2 seconds
+ for _, player in pairs(minetest.get_connected_players()) do
+ advtrains.tp_player_to_train(player)
+ end
+ tp_player_tmr = 2
+ else
+ tp_player_tmr = tp_player_tmr - dtime
+ end
+ --regular train step
+ --[[ structure:
+ 1. make trains calculate their occupation windows when needed (a)
+ 2. when occupation tells us so, restore the occupation tables (a)
+ 4. make trains move and update their new occupation windows and write changes
+ to occupation tables (b)
+ 5. make trains do other stuff (c)
+ ]]--
+ local t=os.clock()
+
+ for k,v in pairs(advtrains.trains) do
+ advtrains.atprint_context_tid=k
+ advtrains.train_ensure_init(k, v)
+ end
+
+ advtrains.lock_path_inval = true
+
+ for k,v in pairs(advtrains.trains) do
+ advtrains.atprint_context_tid=k
+ advtrains.train_step_b(k, v, dtime)
+ end
+
+ for k,v in pairs(advtrains.trains) do
+ advtrains.atprint_context_tid=k
+ advtrains.train_step_c(k, v, dtime)
+ end
+
+ advtrains.lock_path_inval = false
+
+ advtrains.atprint_context_tid=nil
+
+ atprintbm("trainsteps", t)
+ endstep()
+end
+
+function advtrains.tp_player_to_train(player)
+ local pname = player:get_player_name()
+ local id=advtrains.player_to_train_mapping[pname]
+ if id then
+ local train=advtrains.trains[id]
+ if not train then advtrains.player_to_train_mapping[pname]=nil return end
+ --set the player to the train position.
+ --minetest will emerge the area and load the objects, which then will call reattach_all().
+ --because player is in mapping, it will not be subject to dying.
+ player:setpos(train.last_pos)
+ end
+end
+minetest.register_on_joinplayer(function(player)
+ return advtrains.pcall(function()
+ advtrains.hud[player:get_player_name()] = nil
+ advtrains.hhud[player:get_player_name()] = nil
+ --independent of this, cause all wagons of the train which are loaded to reattach their players
+ --needed because already loaded wagons won't call reattach_all()
+ for _,wagon in pairs(minetest.luaentities) do
+ if wagon.is_wagon and wagon.initialized and wagon.train_id==id then
+ wagon:reattach_all()
+ end
+ end
+ end)
+end)
+
+
+minetest.register_on_dieplayer(function(player)
+ return advtrains.pcall(function()
+ local pname=player:get_player_name()
+ local id=advtrains.player_to_train_mapping[pname]
+ if id then
+ local train=advtrains.trains[id]
+ if not train then advtrains.player_to_train_mapping[pname]=nil return end
+ for _,wagon in pairs(minetest.luaentities) do
+ if wagon.is_wagon and wagon.initialized and wagon.train_id==id then
+ --when player dies, detach him from the train
+ --call get_off_plr on every wagon since we don't know which one he's on.
+ wagon:get_off_plr(pname)
+ end
+ end
+ end
+ end)
+end)
+
+--[[
+
+Zone diagram of a train (copy from occupation.lua!):
+ |___| |___| --> Direction of travel
+ oo oo+oo oo
+=|=======|===|===========|===|=======|===================|========|===
+ |SafetyB|CpB| Train |CpF|SafetyF| Brake |Aware |
+[1] [2] [3] [4] [5] [6] [7] [8]
+This mapping from indices in occwindows to zone ids is contained in WINDOW_ZONE_IDS
+
+
+The occupation system has been abandoned. The constants will still be used
+to determine the couple distance
+(because of the reverse lookup, the couple system simplifies a lot...)
+
+]]--
+-- unless otherwise stated, in meters.
+local SAFETY_ZONE = 10
+local COUPLE_ZONE = 2 --value in index positions!
+local BRAKE_SPACE = 10
+local AWARE_ZONE = 10
+local WINDOW_ZONE_IDS = {
+ 2, -- 1 - SafetyB
+ 4, -- 2 - CpB
+ 1, -- 3 - Train
+ 5, -- 4 - CpF
+ 3, -- 5 - SafetyF
+ 6, -- 6 - Brake
+ 7, -- 7 - Aware
+}
+
+
+-- If a variable does not exist in the table, it is assigned the default value
+local function assertdef(tbl, var, def)
+ if not tbl[var] then
+ tbl[var] = def
+ end
+end
+
+function advtrains.get_acceleration(train, lever)
+ local acc_all = t_accel_all[lever]
+ local acc_eng = t_accel_eng[lever]
+ local nwagons = #train.trainparts
+ if nwagons == 0 then
+ -- empty train! avoid division through zero
+ return -1
+ end
+ local acc = acc_all + (acc_eng*train.locomotives_in_train)/nwagons
+ return acc
+end
+
+-- Small local util function to recalculate train's end index
+local function recalc_end_index(train)
+ train.end_index = advtrains.path_get_index_by_offset(train, train.index, -train.trainlen)
+end
+
+-- Occupation Callback system
+-- see occupation.lua
+-- signature is advtrains.te_register_on_<?>(function(id, train) ... end)
+
+local function mkcallback(name)
+ local callt = {}
+ advtrains["te_register_on_"..name] = function(func)
+ assertt(func, "function")
+ table.insert(callt, func)
+ end
+ return callt, function(id, train)
+ for _,f in ipairs(callt) do
+ f(id, train)
+ end
+ end
+end
+
+local callbacks_new_path, run_callbacks_new_path = mkcallback("new_path")
+local callbacks_update, run_callbacks_update = mkcallback("update")
+local callbacks_create, run_callbacks_create = mkcallback("create")
+local callbacks_remove, run_callbacks_remove = mkcallback("remove")
+
+
+-- train_ensure_init: responsible for creating a state that we can work on, after one of the following events has happened:
+-- - the train's path got cleared
+-- - save files were loaded
+-- Additionally, this gets called outside the step cycle to initialize and/or remove a train, then occ_write_mode is set.
+function advtrains.train_ensure_init(id, train)
+ if not train then
+ atwarn("train_ensure_init: Called with id =",id,"but a nil train!")
+ atwarn(debug.traceback())
+ return nil
+ end
+
+ train.dirty = true
+ if train.no_step then return nil end
+
+ assertdef(train, "velocity", 0)
+ --assertdef(train, "tarvelocity", 0)
+ assertdef(train, "acceleration", 0)
+ assertdef(train, "id", id)
+ assertdef(train, "ctrl", {})
+
+
+ if not train.drives_on or not train.max_speed then
+ advtrains.update_trainpart_properties(id)
+ end
+
+ --restore path
+ if not train.path then
+ if not train.last_pos then
+ atlog("Train",id,": Restoring path failed, no last_pos set! Train will be disabled. You can try to fix the issue in the save file.")
+ train.no_step = true
+ return nil
+ end
+ if not train.last_connid then
+ atwarn("Train",id,": Restoring path: no last_connid set! Will assume 1")
+ train.last_connid = 1
+ --[[
+ Why this fix was necessary:
+ Issue: Migration problems on Grand Theft Auto Minetest
+ 1. Run of this code, warning printed.
+ 2. path_create failed with result==nil (there was an unloaded node, wait_for_path set)
+ 3. in consequence, the supposed call to path_setrestore does not happen
+ 4. train.last_connid is still unset
+ 5. next step, warning is printed again
+ Result: log flood.
+ ]]
+ end
+
+ local result = advtrains.path_create(train, train.last_pos, train.last_connid or 1, train.last_frac or 0)
+
+ if result==false then
+ atlog("Train",id,": Restoring path failed, node at",train.last_pos,"is gone! Train will be disabled. You can try to place a rail at this position and restart the server.")
+ train.no_step = true
+ return nil
+ elseif result==nil then
+ if not train.wait_for_path then
+ atlog("Train",id,": Can't initialize: Waiting for the (yet unloaded) node at",train.last_pos," to be loaded.")
+ end
+ train.wait_for_path = true
+ return false
+ end
+ -- by now, we should have a working initial path
+ train.wait_for_path = false
+
+ advtrains.update_trainpart_properties(id)
+ recalc_end_index(train)
+
+ --atdebug("Train",id,": Successfully restored path at",train.last_pos," connid",train.last_connid," frac",train.last_frac)
+
+ -- run on_new_path callbacks
+ run_callbacks_new_path(id, train)
+ end
+
+ train.dirty = false -- TODO einbauen!
+ return true
+end
+
+function advtrains.train_step_b(id, train, dtime)
+ if train.no_step or train.wait_for_path or not train.path then return end
+
+ -- in this code, we check variables such as path_trk_? and path_dist. We need to ensure that the path is known for the whole 'Train' zone
+ advtrains.path_get(train, atfloor(train.index + 2))
+ advtrains.path_get(train, atfloor(train.end_index - 1))
+
+ --- 3. handle velocity influences ---
+ local train_moves=(train.velocity~=0)
+ local tarvel_cap = train.speed_restriction
+
+ if train.recently_collided_with_env then
+ tarvel_cap=0
+ if not train_moves then
+ train.recently_collided_with_env=nil--reset status when stopped
+ end
+ end
+ if train.locomotives_in_train==0 then
+ tarvel_cap=0
+ end
+
+ --- 3a. this can be useful for debugs/warnings and is used for check_trainpartload ---
+ local t_info, train_pos=sid(id), advtrains.path_get(train, atfloor(train.index))
+ if train_pos then
+ t_info=t_info.." @"..minetest.pos_to_string(train_pos)
+ --atprint("train_pos:",train_pos)
+ end
+
+ --apply off-track handling:
+ local front_off_track = train.index>train.path_trk_f
+ local back_off_track=train.end_index<train.path_trk_b
+ train.off_track = front_off_track or back_off_track
+
+ if front_off_track then
+ tarvel_cap=0
+ end
+ if back_off_track then -- eventually overrides front_off_track restriction
+ tarvel_cap=1
+ end
+
+ -- Driving control rework:
+ --[[
+ Items are only defined when something is controlling them.
+ In order of precedence.
+ train.ctrl = {
+ lzb = restrictive override from LZB
+ user = User input from driverstand
+ atc = ATC command override (determined here)
+ }
+ The code here determines the precedence and writes the final control into train.lever
+ ]]
+
+ --interpret ATC command and apply auto-lever control when not actively controlled
+ local trainvelocity = train.velocity
+
+ if train.ctrl.user then
+ advtrains.atc.train_reset_command(train)
+ else
+ local braketar = train.atc_brake_target
+ local emerg = false -- atc_brake_target==-1 means emergency brake (BB command)
+ if braketar == -1 then
+ braketar = 0
+ emerg = true
+ end
+ if braketar and braketar>=trainvelocity then
+ train.atc_brake_target=nil
+ braketar = nil
+ end
+ --if train.tarvelocity and train.velocity==train.tarvelocity then
+ -- train.tarvelocity = nil
+ --end
+ if train.atc_wait_finish then
+ if not train.atc_brake_target and (not train.tarvelocity or train.velocity==train.tarvelocity) then
+ train.atc_wait_finish=nil
+ end
+ end
+ if train.atc_command then
+ if (not train.atc_delay or train.atc_delay<=0) and not train.atc_wait_finish then
+ advtrains.atc.execute_atc_command(id, train)
+ else
+ train.atc_delay=train.atc_delay-dtime
+ end
+ elseif train.atc_delay then
+ train.atc_delay = nil
+ end
+
+ train.ctrl.atc = nil
+ if train.tarvelocity and train.tarvelocity>trainvelocity then
+ train.ctrl.atc=4
+ end
+ if train.tarvelocity and train.tarvelocity<trainvelocity then
+ if (braketar and braketar<trainvelocity) then
+ if emerg then
+ train.ctrl.atc = 0
+ else
+ train.ctrl.atc=1
+ end
+ else
+ train.ctrl.atc=2
+ end
+ end
+ end
+
+ --if tarvel_cap and train.tarvelocity and tarvel_cap<train.tarvelocity then
+ -- train.tarvelocity=tarvel_cap
+ --end
+
+ local tmp_lever
+
+ for _, lev in pairs(train.ctrl) do
+ -- use the most restrictive of all control overrides
+ tmp_lever = math.min(tmp_lever or 4, lev)
+ end
+
+ if not tmp_lever then
+ -- if there was no control at all, default to 3
+ tmp_lever = 3
+ end
+
+ if tarvel_cap and trainvelocity>tarvel_cap then
+ tmp_lever = 0
+ end
+
+ train.lever = tmp_lever
+
+ --- 3a. actually calculate new velocity ---
+ if tmp_lever~=3 then
+ local accel = advtrains.get_acceleration(train, tmp_lever)
+ local vdiff = accel*dtime
+
+ -- This should only be executed when we are accelerating
+ -- I suspect that this causes the braking bugs
+ if tmp_lever == 4 then
+
+ -- ATC control exception: don't cross tarvelocity if
+ -- atc provided a target_vel
+ if train.tarvelocity then
+ local tvdiff = train.tarvelocity - trainvelocity
+ if tvdiff~=0 and math.abs(vdiff) > math.abs(tvdiff) then
+ --applying this change would cross tarvelocity
+ --atdebug("In Tvdiff condition, clipping",vdiff,"to",tvdiff)
+ --atdebug("vel=",trainvelocity,"tvel=",train.tarvelocity)
+ vdiff=tvdiff
+ end
+ end
+ if tarvel_cap and trainvelocity<=tarvel_cap and trainvelocity+vdiff>tarvel_cap then
+ vdiff = tarvel_cap - train.velocity
+ end
+ local mspeed = (train.max_speed or 10)
+ if trainvelocity+vdiff > mspeed then
+ vdiff = mspeed - trainvelocity
+ end
+ end
+
+ if trainvelocity+vdiff < 0 then
+ vdiff = - trainvelocity
+ end
+
+
+ train.acceleration=vdiff
+ train.velocity=train.velocity+vdiff
+ --if train.ctrl.user then
+ -- train.tarvelocity = train.velocity
+ --end
+ else
+ train.acceleration = 0
+ end
+
+ --- 4. move train ---
+
+ local idx_floor = math.floor(train.index)
+ local pdist = (train.path_dist[idx_floor+1] - train.path_dist[idx_floor])
+ local distance = (train.velocity*dtime) / pdist
+
+ --debugging code
+ --train.debug = atdump(train.ctrl).."step_dist: "..math.floor(distance*1000)
+
+ train.index=train.index+distance
+
+ recalc_end_index(train)
+
+end
+
+function advtrains.train_step_c(id, train, dtime)
+ if train.no_step or train.wait_for_path or not train.path then return end
+
+ -- all location/extent-critical actions have been done.
+ -- calculate the new occupation window
+ run_callbacks_update(id, train)
+
+ -- Return if something(TM) damaged the path
+ if train.no_step or train.wait_for_path or not train.path then return end
+
+ advtrains.path_clear_unused(train)
+
+ advtrains.path_setrestore(train)
+
+ -- less important stuff
+
+ train.check_trainpartload=(train.check_trainpartload or 0)-dtime
+ if train.check_trainpartload<=0 then
+ advtrains.spawn_wagons(id)
+ train.check_trainpartload=2
+ end
+
+ --- 8. check for collisions with other trains and damage players ---
+
+ local train_moves=(train.velocity~=0)
+
+ --- Check whether this train can be coupled to another, and set couple entities accordingly
+ if not train.was_standing and not train_moves then
+ advtrains.train_check_couples(train)
+ end
+ train.was_standing = not train_moves
+
+ if train_moves then
+
+ local collided = false
+ local coll_grace=1
+ local collindex = advtrains.path_get_index_by_offset(train, train.index, -coll_grace)
+ local collpos = advtrains.path_get(train, atround(collindex))
+ if collpos then
+ local rcollpos=advtrains.round_vector_floor_y(collpos)
+ local is_loaded_area = minetest.get_node_or_nil(rcollpos) ~= nil
+ for x=-train.extent_h,train.extent_h do
+ for z=-train.extent_h,train.extent_h do
+ local testpos=vector.add(rcollpos, {x=x, y=0, z=z})
+ --- 8a Check collision ---
+ if not collided then
+
+ local col_tr = advtrains.occ.check_collision(testpos, id)
+ if col_tr then
+ advtrains.train_check_couples(train)
+ train.velocity = 0
+ advtrains.atc.train_reset_command(train)
+ collided = true
+ end
+
+ --- 8b damage players ---
+ if is_loaded_area and train.velocity > 3 and (setting_overrun_mode=="drop" or setting_overrun_mode=="normal") then
+ local testpts = minetest.pos_to_string(testpos)
+ local player=advtrains.playersbypts[testpts]
+ if player and player:get_hp()>0 and advtrains.is_damage_enabled(player:get_player_name()) then
+ --atdebug("damage found",player:get_player_name())
+ if setting_overrun_mode=="drop" then
+ --instantly kill player
+ --drop inventory contents first, to not to spawn bones
+ local player_inv=player:get_inventory()
+ for i=1,player_inv:get_size("main") do
+ minetest.add_item(testpos, player_inv:get_stack("main", i))
+ end
+ for i=1,player_inv:get_size("craft") do
+ minetest.add_item(testpos, player_inv:get_stack("craft", i))
+ end
+ -- empty lists main and craft
+ player_inv:set_list("main", {})
+ player_inv:set_list("craft", {})
+ end
+ player:set_hp(0)
+ end
+ end
+ end
+ end
+ end
+ --- 8c damage other objects ---
+ if is_loaded_area then
+ local objs = minetest.get_objects_inside_radius(rcollpos, 2)
+ for _,obj in ipairs(objs) do
+ if not obj:is_player() and obj:get_armor_groups().fleshy and obj:get_armor_groups().fleshy > 0
+ and obj:get_luaentity() and obj:get_luaentity().name~="signs:text" then
+ obj:punch(obj, 1, { full_punch_interval = 1.0, damage_groups = {fleshy = 1000}, }, nil)
+ end
+ end
+ end
+ end
+ end
+end
+
+-- Default occupation callbacks for node callbacks
+-- (remember, train.end_index is set separately because callbacks are
+-- asserted to rely on this)
+
+local function mknodecallback(name)
+ local callt = {}
+ advtrains["tnc_register_on_"..name] = function(func, prio)
+ assertt(func, "function")
+ if prio then
+ table.insert(callt, 1, func)
+ else
+ table.insert(callt, func)
+ end
+ end
+ return callt, function(pos, id, train, index, paramx1, paramx2, paramx3)
+ for _,f in ipairs(callt) do
+ f(pos, id, train, index, paramx1, paramx2, paramx3)
+ end
+ end
+end
+
+-- enter/leave-node callbacks
+-- signature is advtrains.tnc_register_on_enter/leave(function(pos, id, train, index) ... end)
+local callbacks_enter_node, run_callbacks_enter_node = mknodecallback("enter")
+local callbacks_leave_node, run_callbacks_leave_node = mknodecallback("leave")
+
+-- Node callback for approaching
+-- Might be called multiple times, whenever path is recalculated
+-- signature is function(pos, id, train, index, lzbdata)
+-- lzbdata: arbitrary data (shared between all callbacks), deleted when LZB is restarted.
+-- These callbacks are called in order of distance as train progresses along tracks, so lzbdata can be used to
+-- keep track of a train's state once it passes this point
+local callbacks_approach_node, run_callbacks_approach_node = mknodecallback("approach")
+
+
+local function tnc_call_enter_callback(pos, train_id, train, index)
+ --atdebug("tnc enter",pos,train_id)
+ local node = advtrains.ndb.get_node(pos) --this spares the check if node is nil, it has a name in any case
+ local mregnode=minetest.registered_nodes[node.name]
+ if mregnode and mregnode.advtrains and mregnode.advtrains.on_train_enter then
+ mregnode.advtrains.on_train_enter(pos, train_id, train, index)
+ end
+
+ -- call other registered callbacks
+ run_callbacks_enter_node(pos, train_id, train, index)
+
+ -- check for split points
+ if mregnode and mregnode.at_conns and #mregnode.at_conns == 3 and train.path_cp[index] == 3 then
+ -- train came from connection 3 of a switch, so it split points.
+ if not train.points_split then
+ train.points_split = {}
+ end
+ train.points_split[advtrains.encode_pos(pos)] = true
+ --atdebug(train_id,"split points at",pos)
+ end
+end
+local function tnc_call_leave_callback(pos, train_id, train, index)
+ --atdebug("tnc leave",pos,train_id)
+ local node = advtrains.ndb.get_node(pos) --this spares the check if node is nil, it has a name in any case
+ local mregnode=minetest.registered_nodes[node.name]
+ if mregnode and mregnode.advtrains and mregnode.advtrains.on_train_leave then
+ mregnode.advtrains.on_train_leave(pos, train_id, train, index)
+ end
+
+ -- call other registered callbacks
+ run_callbacks_leave_node(pos, train_id, train, index)
+
+ -- split points do not matter anymore. clear them
+ if train.points_split then
+ if train.points_split[advtrains.encode_pos(pos)] then
+ train.points_split[advtrains.encode_pos(pos)] = nil
+ --atdebug(train_id,"has passed split points at",pos)
+ end
+ -- any entries left?
+ for _,_ in pairs(train.points_split) do
+ return
+ end
+ train.points_split = nil
+ end
+ -- WARNING possibly unreachable place!
+end
+
+function advtrains.tnc_call_approach_callback(pos, train_id, train, index, lzbdata)
+ --atdebug("tnc approach",pos,train_id, lzbdata)
+ local node = advtrains.ndb.get_node(pos) --this spares the check if node is nil, it has a name in any case
+ local mregnode=minetest.registered_nodes[node.name]
+ if mregnode and mregnode.advtrains and mregnode.advtrains.on_train_approach then
+ mregnode.advtrains.on_train_approach(pos, train_id, train, index, lzbdata)
+ end
+
+ -- call other registered callbacks
+ run_callbacks_approach_node(pos, train_id, train, index, lzbdata)
+end
+
+
+advtrains.te_register_on_new_path(function(id, train)
+ train.tnc = {
+ old_index = atround(train.index),
+ old_end_index = atround(train.end_index),
+ }
+ --atdebug(id,"tnc init",train.index,train.end_index)
+end)
+
+advtrains.te_register_on_update(function(id, train)
+ local new_index = atround(train.index)
+ local new_end_index = atround(train.end_index)
+ local old_index = train.tnc.old_index
+ local old_end_index = train.tnc.old_end_index
+ while old_index < new_index do
+ old_index = old_index + 1
+ local pos = advtrains.round_vector_floor_y(advtrains.path_get(train,old_index))
+ tnc_call_enter_callback(pos, id, train, old_index)
+ end
+ while old_end_index < new_end_index do
+ local pos = advtrains.round_vector_floor_y(advtrains.path_get(train,old_end_index))
+ tnc_call_leave_callback(pos, id, train, old_end_index)
+ old_end_index = old_end_index + 1
+ end
+ train.tnc.old_index = new_index
+ train.tnc.old_end_index = new_end_index
+end)
+
+advtrains.te_register_on_create(function(id, train)
+ local index = atround(train.index)
+ local end_index = atround(train.end_index)
+ while end_index <= index do
+ local pos = advtrains.round_vector_floor_y(advtrains.path_get(train,end_index))
+ tnc_call_enter_callback(pos, id, train, end_index)
+ end_index = end_index + 1
+ end
+ --atdebug(id,"tnc create",train.index,train.end_index)
+end)
+
+advtrains.te_register_on_remove(function(id, train)
+ local index = atround(train.index)
+ local end_index = atround(train.end_index)
+ while end_index <= index do
+ local pos = advtrains.round_vector_floor_y(advtrains.path_get(train,end_index))
+ tnc_call_leave_callback(pos, id, train, end_index)
+ end_index = end_index + 1
+ end
+ --atdebug(id,"tnc remove",train.index,train.end_index)
+end)
+
+--returns new id
+function advtrains.create_new_train_at(pos, connid, ioff, trainparts)
+ local new_id=advtrains.random_id()
+ while advtrains.trains[new_id] do new_id=advtrains.random_id() end--ensure uniqueness
+
+ local t={}
+ t.id = new_id
+
+ t.last_pos=pos
+ t.last_connid=connid
+ t.last_frac=ioff
+
+ --t.tarvelocity=0
+ t.velocity=0
+ t.trainparts=trainparts
+
+ advtrains.trains[new_id] = t
+ --atdebug("Created new train:",t)
+
+ if not advtrains.train_ensure_init(new_id, advtrains.trains[new_id]) then
+ atwarn("create_new_train_at",pos,connid,"failed! This might lead to temporary bugs.")
+ return
+ end
+
+ run_callbacks_create(new_id, advtrains.trains[new_id])
+
+ return new_id
+end
+
+function advtrains.remove_train(id)
+ local train = advtrains.trains[id]
+
+ if not advtrains.train_ensure_init(id, train) then
+ atwarn("remove_train",id,"failed! This might lead to temporary bugs.")
+ return
+ end
+
+ run_callbacks_remove(id, train)
+
+ advtrains.path_invalidate(train)
+ advtrains.couple_invalidate(train)
+
+ local tp = train.trainparts
+ --atdebug("Removing train",id,"leftover trainparts:",tp)
+
+ advtrains.trains[id] = nil
+
+ return tp
+
+end
+
+
+function advtrains.add_wagon_to_train(wagon_id, train_id, index)
+ local train=advtrains.trains[train_id]
+
+ if not advtrains.train_ensure_init(train_id, train) then
+ atwarn("Train",train_id,"is not initialized! Operation aborted!")
+ return
+ end
+
+ if index then
+ table.insert(train.trainparts, index, wagon_id)
+ else
+ table.insert(train.trainparts, wagon_id)
+ end
+
+ advtrains.update_trainpart_properties(train_id)
+ recalc_end_index(train)
+ run_callbacks_update(train_id, train)
+end
+
+-- Note: safe_decouple_wagon() has been moved to wagons.lua
+
+-- this function sets wagon's pos_in_train(parts) properties and train's max_speed and drives_on (and more)
+function advtrains.update_trainpart_properties(train_id, invert_flipstate)
+ local train=advtrains.trains[train_id]
+ train.drives_on=advtrains.merge_tables(advtrains.all_tracktypes)
+ --FIX: deep-copy the table!!!
+ train.max_speed=20
+ train.extent_h = 0;
+
+ local rel_pos=0
+ local count_l=0
+ local shift_dcpl_lock=false
+ for i, w_id in ipairs(train.trainparts) do
+
+ local data = advtrains.wagons[w_id]
+
+ -- 1st: update wagon data (pos_in_train a.s.o)
+ if data then
+ local wagon = advtrains.wagon_prototypes[data.type or data.entity_name]
+ if not wagon then
+ atwarn("Wagon '",data.type,"' couldn't be found. Please check that all required modules are loaded!")
+ wagon = advtrains.wagon_prototypes["advtrains:wagon_placeholder"]
+
+ end
+ rel_pos=rel_pos+wagon.wagon_span
+ data.train_id=train_id
+ data.pos_in_train=rel_pos
+ data.pos_in_trainparts=i
+ if wagon.is_locomotive then
+ count_l=count_l+1
+ end
+ if invert_flipstate then
+ data.wagon_flipped = not data.wagon_flipped
+ shift_dcpl_lock, data.dcpl_lock = data.dcpl_lock, shift_dcpl_lock
+ end
+ rel_pos=rel_pos+wagon.wagon_span
+
+ if wagon.drives_on then
+ for k,_ in pairs(train.drives_on) do
+ if not wagon.drives_on[k] then
+ train.drives_on[k]=nil
+ end
+ end
+ end
+ train.max_speed=math.min(train.max_speed, wagon.max_speed)
+ train.extent_h = math.max(train.extent_h, wagon.extent_h or 1);
+ end
+ end
+ train.trainlen = rel_pos
+ train.locomotives_in_train = count_l
+end
+
+
+local ablkrng = advtrains.wagon_load_range
+-- This function checks whether entities need to be spawned for certain wagons, and spawns them.
+-- Called from train_step_*(), not required to check init.
+function advtrains.spawn_wagons(train_id)
+ local train = advtrains.trains[train_id]
+
+ for i = 1, #train.trainparts do
+ local w_id = train.trainparts[i]
+ local data = advtrains.wagons[w_id]
+ if data then
+ if data.train_id ~= train_id then
+ atwarn("Train",train_id,"Wagon #",i,": Saved train ID",data.train_id,"did not match!")
+ data.train_id = train_id
+ end
+ if not advtrains.wagon_objects[w_id] or not advtrains.wagon_objects[w_id]:getyaw() then
+ -- eventually need to spawn new object. check if position is loaded.
+ local index = advtrains.path_get_index_by_offset(train, train.index, -data.pos_in_train)
+ local pos = advtrains.path_get(train, atfloor(index))
+
+ local spawn = false
+ for _,p in pairs(minetest.get_connected_players()) do
+ if vector.distance(p:get_pos(),pos)<=ablkrng then
+ spawn = true
+ end
+ end
+
+ if spawn then
+ --atdebug("wagon",w_id,"spawning")
+ local wt = advtrains.get_wagon_prototype(data)
+ local wagon = minetest.add_entity(pos, wt):get_luaentity()
+ wagon:set_id(w_id)
+ end
+ end
+ else
+ atwarn("Train",train_id,"Wagon #",1,": A wagon with id",w_id,"does not exist! Wagon will be removed from train.")
+ table.remove(train.trainparts, i)
+ i = i - 1
+ end
+ end
+end
+
+function advtrains.split_train_at_fc(train, count_empty, length_limit)
+ -- splits train at first different current FC by convention,
+ -- locomotives have empty FC so are ignored
+ -- count_empty is used to split off locomotives
+ -- length_limit limits the length of the first train to length_limit wagons
+ local train_id = train.id
+ local fc = false
+ local ind = 0
+ for i = 1, #train.trainparts do
+ local w_id = train.trainparts[i]
+ local data = advtrains.wagons[w_id]
+ if length_limit and i > length_limit then
+ ind = i
+ break
+ end
+ if data then
+ local wfc = advtrains.get_cur_fc(data)
+ if wfc ~= "" or count_empty then
+ if fc then
+ if fc ~= wfc then
+ ind = i
+ break
+ end
+ else
+ fc = wfc
+ end
+ end
+ end
+ end
+ if ind > 0 then
+ return advtrains.split_train_at_index(train, ind), fc
+ end
+ if fc then
+ return nil, fc
+ end
+end
+
+function advtrains.train_step_fc(train)
+ for i=1,#train.trainparts do
+ local w_id = train.trainparts[i]
+ local data = advtrains.wagons[w_id]
+ if data then
+ advtrains.step_fc(data)
+ end
+ end
+end
+
+function advtrains.split_train_at_index(train, index)
+ -- this function splits a train at index, creating a new train from the back part of the train.
+
+ local train_id=train.id
+ if index > #train.trainparts then
+ -- index specified too long
+ return
+ end
+ local w_id = train.trainparts[index]
+ local data = advtrains.wagons[w_id]
+ local _, wagon = advtrains.get_wagon_prototype(data)
+ if not advtrains.train_ensure_init(train_id, train) then
+ atwarn("Train",train_id,"is not initialized! Operation aborted!")
+ return
+ end
+
+ local p_index=advtrains.path_get_index_by_offset(train, train.index, - data.pos_in_train + wagon.wagon_span)
+ local pos, connid, frac = advtrains.path_getrestore(train, p_index)
+ local tp = {}
+ for k,v in ipairs(train.trainparts) do
+ if k >= index then
+ table.insert(tp, v)
+ train.trainparts[k] = nil
+ end
+ end
+ advtrains.update_trainpart_properties(train_id)
+ recalc_end_index(train)
+ run_callbacks_update(train_id, train)
+
+ --create subtrain
+ local newtrain_id=advtrains.create_new_train_at(pos, connid, frac, tp)
+ local newtrain=advtrains.trains[newtrain_id]
+
+ newtrain.velocity=train.velocity
+ return newtrain_id -- return new train ID, so new train can be manipulated
+
+end
+
+function advtrains.split_train_at_wagon(wagon_id)
+ --get train
+ local data = advtrains.wagons[wagon_id]
+ advtrains.split_train_at_index(advtrains.trains[data.train_id], data.pos_in_trainparts)
+end
+
+-- coupling
+local CPL_CHK_DST = -1
+local CPL_ZONE = 2
+
+-- train.couple_* contain references to ObjectRefs of couple objects, which contain all relevant information
+-- These objectRefs will delete themselves once the couples no longer match
+local function createcouple(pos, train1, t1_is_front, train2, t2_is_front)
+ local id1 = train1.id
+ local id2 = train2.id
+ if train1.autocouple or train2.autocouple then
+ -- couple trains
+ train1.autocouple = nil
+ train2.autocouple = nil
+ minetest.after(0, advtrains.safe_couple_trains, id1, id2, t1_is_front, t2_is_front, false, false, train1.velocity, train2.velocity)
+ return
+ end
+
+ local obj=minetest.add_entity(pos, "advtrains:couple")
+ if not obj then error("Failed creating couple object!") return end
+ local le=obj:get_luaentity()
+ le.train_id_1=id1
+ le.train_id_2=id2
+ le.t1_is_front=t1_is_front
+ le.t2_is_front=t2_is_front
+ --atdebug("created couple between",train1.id,t1_is_front,train2.id,t2_is_front)
+ if t1_is_front then
+ train1.cpl_front = obj
+ else
+ train1.cpl_back = obj
+ end
+ if t2_is_front then
+ train2.cpl_front = obj
+ else
+ train2.cpl_back = obj
+ end
+
+end
+
+function advtrains.train_check_couples(train)
+ --atdebug("rechecking couples")
+ if train.cpl_front then
+ if not train.cpl_front:getyaw() then
+ -- objectref is no longer valid. reset.
+ train.cpl_front = nil
+ end
+ end
+ if not train.cpl_front then
+ -- recheck front couple
+ local front_trains, pos = advtrains.occ.get_occupations(train, atround(train.index) + CPL_CHK_DST)
+ if minetest.get_node_or_nil(pos) then -- if the position is loaded...
+ for tid, idx in pairs(front_trains) do
+ local other_train = advtrains.trains[tid]
+ if not advtrains.train_ensure_init(tid, other_train) then
+ atwarn("Train",tid,"is not initialized! Couldn't check couples!")
+ return
+ end
+ --atdebug(train.id,"front: ",idx,"on",tid,atround(other_train.index),atround(other_train.end_index))
+ if other_train.velocity == 0 then
+ if idx>=other_train.index and idx<=other_train.index + CPL_ZONE then
+ createcouple(pos, train, true, other_train, true)
+ break
+ end
+ if idx<=other_train.end_index and idx>=other_train.end_index - CPL_ZONE then
+ createcouple(pos, train, true, other_train, false)
+ break
+ end
+ end
+ end
+ end
+ end
+ if train.cpl_back then
+ if not train.cpl_back:getyaw() then
+ -- objectref is no longer valid. reset.
+ train.cpl_back = nil
+ end
+ end
+ if not train.cpl_back then
+ -- recheck back couple
+ local back_trains, pos = advtrains.occ.get_occupations(train, atround(train.end_index) - CPL_CHK_DST)
+ if minetest.get_node_or_nil(pos) then -- if the position is loaded...
+ for tid, idx in pairs(back_trains) do
+ local other_train = advtrains.trains[tid]
+ if not advtrains.train_ensure_init(tid, other_train) then
+ atwarn("Train",tid,"is not initialized! Couldn't check couples!")
+ return
+ end
+ if other_train.velocity == 0 then
+ if idx>=other_train.index and idx<=other_train.index + CPL_ZONE then
+ createcouple(pos, train, false, other_train, true)
+ break
+ end
+ if idx<=other_train.end_index and idx>=other_train.end_index - CPL_ZONE then
+ createcouple(pos, train, false, other_train, false)
+ break
+ end
+ end
+ end
+ end
+ end
+end
+
+function advtrains.couple_invalidate(train)
+ if train.cpl_back then
+ train.cpl_back:remove()
+ train.cpl_back = nil
+ end
+ if train.cpl_front then
+ train.cpl_front:remove()
+ train.cpl_front = nil
+ end
+ train.was_standing = nil
+end
+
+-- relevant code for this comment is in couple.lua
+
+--there are 4 cases:
+--1/2. F<->R F<->R regular, put second train behind first
+--->frontpos of first train will match backpos of second
+--3. F<->R R<->F flip one of these trains, take the other as new train
+--->backpos's will match
+--4. R<->F F<->R flip one of these trains and take it as new parent
+--->frontpos's will match
+
+
+function advtrains.do_connect_trains(first_id, second_id, vel)
+ local first, second=advtrains.trains[first_id], advtrains.trains[second_id]
+
+ if not advtrains.train_ensure_init(first_id, first) then
+ atwarn("Train",first_id,"is not initialized! Operation aborted!")
+ return
+ end
+ if not advtrains.train_ensure_init(second_id, second) then
+ atwarn("Train",second_id,"is not initialized! Operation aborted!")
+ return
+ end
+
+ local first_wagoncnt=#first.trainparts
+ local second_wagoncnt=#second.trainparts
+
+ for _,v in ipairs(second.trainparts) do
+ table.insert(first.trainparts, v)
+ end
+
+ advtrains.remove_train(second_id)
+ if vel < 0 then
+ advtrains.invert_train(first_id)
+ vel = -vel
+ end
+ first.velocity= vel or 0
+
+ advtrains.update_trainpart_properties(first_id)
+ advtrains.couple_invalidate(first)
+ return true
+end
+
+function advtrains.invert_train(train_id)
+ local train=advtrains.trains[train_id]
+
+ if not advtrains.train_ensure_init(train_id, train) then
+ atwarn("Train",train_id,"is not initialized! Operation aborted!")
+ return
+ end
+
+ advtrains.path_setrestore(train, true)
+
+ -- rotate some other stuff
+ if train.door_open then
+ train.door_open = - train.door_open
+ end
+ if train.atc_command then
+ train.atc_arrow = not train.atc_arrow
+ end
+
+ advtrains.path_invalidate(train, true)
+ advtrains.couple_invalidate(train)
+
+ local old_trainparts=train.trainparts
+ train.trainparts={}
+ for k,v in ipairs(old_trainparts) do
+ table.insert(train.trainparts, 1, v)--notice insertion at first place
+ end
+ advtrains.update_trainpart_properties(train_id, true)
+
+ -- recalculate path
+ advtrains.train_ensure_init(train_id, train)
+
+ -- If interlocking present, check whether this train is in a section and then set as shunt move after reversion
+ if advtrains.interlocking and train.il_sections and #train.il_sections > 0 then
+ train.is_shunt = true
+ train.speed_restriction = advtrains.SHUNT_SPEED_MAX
+ else
+ train.is_shunt = false
+ train.speed_restriction = nil
+ end
+end
+
+-- returns: train id, index of one of the trains that stand at this position.
+function advtrains.get_train_at_pos(pos)
+ local t = advtrains.occ.get_trains_at(pos)
+ for tid,idx in pairs(t) do
+ return tid, idx
+ end
+end
+
+
+-- ehm... I never adapted this function to the new path system ?!
+function advtrains.invalidate_all_paths(pos)
+ local tab
+ if pos then
+ -- if position given, check occupation system
+ tab = advtrains.occ.get_trains_over(pos)
+ else
+ tab = advtrains.trains
+ end
+
+ for id, _ in pairs(tab) do
+ advtrains.invalidate_path(id)
+ end
+end
+function advtrains.invalidate_path(id)
+ --atdebug("Path invalidate:",id)
+ local v=advtrains.trains[id]
+ if not v then return end
+ advtrains.path_invalidate(v)
+ advtrains.couple_invalidate(v)
+ v.dirty = true
+end
+
+--not blocking trains group
+function advtrains.train_collides(node)
+ if node and minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].walkable then
+ if not minetest.registered_nodes[node.name].groups.not_blocking_trains then
+ return true
+ end
+ end
+ return false
+end
+
+local nonblocknodes={
+ "default:fence_wood",
+ "default:fence_acacia_wood",
+ "default:fence_aspen_wood",
+ "default:fence_pine_wood",
+ "default:fence_junglewood",
+ "default:torch",
+ "bones:bones",
+
+ "default:sign_wall",
+ "signs:sign_wall",
+ "signs:sign_wall_blue",
+ "signs:sign_wall_brown",
+ "signs:sign_wall_orange",
+ "signs:sign_wall_green",
+ "signs:sign_yard",
+ "signs:sign_wall_white_black",
+ "signs:sign_wall_red",
+ "signs:sign_wall_white_red",
+ "signs:sign_wall_yellow",
+ "signs:sign_post",
+ "signs:sign_hanging",
+
+
+}
+minetest.after(0, function()
+ for _,name in ipairs(nonblocknodes) do
+ if minetest.registered_nodes[name] then
+ minetest.registered_nodes[name].groups.not_blocking_trains=1
+ end
+ end
+end)
diff --git a/advtrains/advtrains/wagons.lua b/advtrains/advtrains/wagons.lua
new file mode 100644
index 0000000..90615a5
--- /dev/null
+++ b/advtrains/advtrains/wagons.lua
@@ -0,0 +1,1437 @@
+-- wagon.lua
+-- Holds all logic related to wagons
+-- From now on, wagons are, just like trains, just entries in a table
+-- All data that is static is stored in the entity prototype (self).
+-- A copy of the entity prototype is always available inside wagon_prototypes
+-- All dynamic data is stored in the (new) wagons table
+-- An entity is ONLY spawned by update_trainpart_properties when it finds it useful.
+-- Only data that are only important to the entity itself are stored in the luaentity
+
+-- TP delay when getting off wagon
+local GETOFF_TP_DELAY = 0.5
+
+advtrains.wagons = {}
+advtrains.wagon_prototypes = {}
+advtrains.wagon_objects = {}
+
+local unload_wgn_range = advtrains.wagon_load_range + 32
+
+local setting_show_ids = minetest.settings:get_bool("advtrains_show_ids")
+
+--
+function advtrains.create_wagon(wtype, owner)
+ local new_id=advtrains.random_id()
+ while advtrains.wagons[new_id] do new_id=advtrains.random_id() end
+ local wgn = {}
+ wgn.type = wtype
+ wgn.seatp = {}
+ wgn.owner = owner
+ wgn.id = new_id
+ ---wgn.train_id = train_id --- will get this via update_trainpart_properties
+ advtrains.wagons[new_id] = wgn
+ --atdebug("Created new wagon:",wgn)
+ return new_id
+end
+
+local function make_inv_name(uid)
+ return "detached:advtrains_wgn_"..uid
+end
+
+
+local wagon={
+ collisionbox = {-0.5,-0.5,-0.5, 0.5,0.5,0.5},
+ --physical = true,
+ visual = "mesh",
+ mesh = "wagon.b3d",
+ visual_size = {x=1, y=1},
+ textures = {"black.png"},
+ is_wagon=true,
+ wagon_span=1,--how many index units of space does this wagon consume
+ wagon_width=3, -- Wagon width in meters
+ has_inventory=false,
+ static_save=false,
+}
+
+
+function wagon:train()
+ local data = advtrains.wagons[self.id]
+ return advtrains.trains[data.train_id]
+end
+
+
+function wagon:on_activate(sd_uid, dtime_s)
+ if sd_uid~="" then
+ --destroy when loaded from static block.
+ self.object:remove()
+ return
+ end
+ self.object:set_armor_groups({immortal=1})
+end
+
+local function invcallback(id, pname, rtallow, rtfail)
+ local data = advtrains.wagons[id]
+ if data and advtrains.check_driving_couple_protection(pname, data.owner, data.whitelist) then
+ return rtallow
+ end
+ return rtfail
+end
+
+function wagon:set_id(wid)
+ self.id = wid
+ self.initialized = true
+
+ local data = advtrains.wagons[self.id]
+ advtrains.wagon_objects[self.id] = self.object
+
+ --atdebug("Created wagon entity:",self.name," w_id",wid," t_id",data.train_id)
+
+ if self.has_inventory then
+ --to be used later
+ local inv=minetest.get_inventory({type="detached", name="advtrains_wgn_"..self.id})
+ -- create inventory, if not yet created
+ if not inv then
+ inv=minetest.create_detached_inventory("advtrains_wgn_"..self.id, {
+ allow_move = function(inv, from_list, from_index, to_list, to_index, count, player)
+ return invcallback(wid, player:get_player_name(), count, 0)
+ end,
+ allow_put = function(inv, listname, index, stack, player)
+ return invcallback(wid, player:get_player_name(), stack:get_count(), 0)
+ end,
+ allow_take = function(inv, listname, index, stack, player)
+ return invcallback(wid, player:get_player_name(), stack:get_count(), 0)
+ end
+ })
+ if data.ser_inv then
+ advtrains.deserialize_inventory(data.ser_inv, inv)
+ end
+ if self.inventory_list_sizes then
+ for lst, siz in pairs(self.inventory_list_sizes) do
+ inv:set_size(lst, siz)
+ end
+ end
+ end
+ end
+ self.door_anim_timer=0
+ self.door_state=0
+
+ minetest.after(0.2, function() self:reattach_all() end)
+
+
+
+ if self.set_textures then
+ self:set_textures(data)
+ end
+
+ if self.custom_on_activate then
+ self:custom_on_activate()
+ end
+end
+
+function wagon:get_staticdata()
+ return "STATIC"
+end
+
+function wagon:ensure_init()
+ -- Note: A wagon entity won't exist when there's no train, because the train is
+ -- the thing that actually creates the entity
+ -- Train not being set just means that this will happen as soon as the train calls update_trainpart_properties.
+ if self.initialized and self.id then
+ local data = advtrains.wagons[self.id]
+ if data and data.train_id and self:train() then
+ if self.noninitticks then self.noninitticks=nil end
+ return true
+ end
+ end
+ if not self.noninitticks then
+ atwarn("wagon",self.id,"uninitialized init=",self.initialized)
+ self.noninitticks=0
+ end
+ self.noninitticks=self.noninitticks+1
+ if self.noninitticks>20 then
+ atwarn("wagon",self.id,"uninitialized, removing")
+ self:destroy()
+ else
+ self.object:setvelocity({x=0,y=0,z=0})
+ end
+ return false
+end
+
+function wagon:train()
+ local data = advtrains.wagons[self.id]
+ return advtrains.trains[data.train_id]
+end
+
+-- Remove the wagon
+function wagon:on_punch(puncher, time_from_last_punch, tool_capabilities, direction)
+ return advtrains.pcall(function()
+ if not self:ensure_init() then return end
+
+ local data = advtrains.wagons[self.id]
+
+ if not puncher or not puncher:is_player() then
+ return
+ end
+ if data.owner and puncher:get_player_name()~=data.owner and (not minetest.check_player_privs(puncher, {train_admin = true })) then
+ minetest.chat_send_player(puncher:get_player_name(), attrans("This wagon is owned by @1, you can't destroy it.", data.owner));
+ return
+ end
+
+ if self.custom_may_destroy then
+ if not self.custom_may_destroy(self, puncher, time_from_last_punch, tool_capabilities, direction) then
+ return
+ end
+ end
+ local itemstack = puncher:get_wielded_item()
+ -- WARNING: This part of the API is guaranteed to change! DO NOT USE!
+ if self.set_livery and itemstack:get_name() == "bike:painter" then
+ self:set_livery(puncher, itemstack, data)
+ return
+ end
+ -- check whether wagon has an inventory. Is is empty?
+ if self.has_inventory then
+ local inv=minetest.get_inventory({type="detached", name="advtrains_wgn_"..self.id})
+ if not inv then -- inventory is not initialized when wagon was never loaded - should never happen
+ atwarn("Destroying wagon with inventory, but inventory is not found? Shouldn't happen!")
+ return
+ end
+ for listname, _ in pairs(inv:get_lists()) do
+ if not inv:is_empty(listname) then
+ minetest.chat_send_player(puncher:get_player_name(), attrans("The wagon's inventory is not empty!"));
+ return
+ end
+ end
+ end
+
+ if #(self:train().trainparts)>1 then
+ minetest.chat_send_player(puncher:get_player_name(), attrans("Wagon needs to be decoupled from other wagons in order to destroy it."));
+ return
+ end
+
+ local pc=puncher:get_player_control()
+ if not pc.sneak then
+ minetest.chat_send_player(puncher:get_player_name(), attrans("Warning: If you destroy this wagon, you only get some steel back! If you are sure, hold Sneak and left-click the wagon."))
+ return
+ end
+
+
+ if not self:destroy() then return end
+
+ local inv = puncher:get_inventory()
+ for _,item in ipairs(self.drops or {self.name}) do
+ inv:add_item("main", item)
+ end
+ end)
+end
+function wagon:destroy()
+ --some rules:
+ -- you get only some items back
+ -- single left-click shows warning
+ -- shift leftclick destroys
+ -- not when a driver is inside
+ if self.id then
+ local data = advtrains.wagons[self.id]
+ if not data then
+ atwarn("wagon:destroy(): data is not set!")
+ return
+ end
+
+ if self.custom_on_destroy then
+ self.custom_on_destroy(self)
+ end
+
+ for seat,_ in pairs(data.seatp) do
+ self:get_off(seat)
+ end
+
+ if data.train_id and self:train() then
+ advtrains.remove_train(data.train_id)
+ advtrains.wagons[self.id]=nil
+ if self.discouple then self.discouple.object:remove() end--will have no effect on unloaded objects
+ end
+ end
+ --atdebug("[wagon ", self.id, "]: destroying")
+
+ self.object:remove()
+ return true
+end
+
+function wagon:on_step(dtime)
+ return advtrains.pcall(function()
+ if not self:ensure_init() then return end
+
+ local t=os.clock()
+ local pos = self.object:getpos()
+ local data = advtrains.wagons[self.id]
+
+ if not pos then
+ --atdebug("["..self.id.."][fatal] missing position (object:getpos() returned nil)")
+ return
+ end
+
+ if not data.seatp then
+ data.seatp={}
+ end
+ if not self.seatpc then
+ self.seatpc={}
+ end
+
+ local train=self:train()
+
+ --custom on_step function
+ if self.custom_on_step then
+ self:custom_on_step(dtime, data, train)
+ end
+
+ --driver control
+ for seatno, seat in ipairs(self.seats) do
+ local pname=data.seatp[seatno]
+ local driver=pname and minetest.get_player_by_name(pname)
+ local has_driverstand = pname and advtrains.check_driving_couple_protection(pname, data.owner, data.whitelist)
+ if self.seat_groups then
+ has_driverstand = has_driverstand and (seat.driving_ctrl_access or self.seat_groups[seat.group].driving_ctrl_access)
+ else
+ has_driverstand = has_driverstand and (seat.driving_ctrl_access)
+ end
+ if has_driverstand and driver then
+ advtrains.update_driver_hud(driver:get_player_name(), self:train(), data.wagon_flipped)
+ elseif driver then
+ --only show the inside text
+ local inside=self:train().text_inside or ""
+ advtrains.set_trainhud(driver:get_player_name(), inside)
+ end
+ if driver and driver:get_player_control_bits()~=self.seatpc[seatno] then
+ local pc=driver:get_player_control()
+ self.seatpc[seatno]=driver:get_player_control_bits()
+
+ if has_driverstand then
+ --regular driver stand controls
+ advtrains.on_control_change(pc, self:train(), data.wagon_flipped)
+ --bordcom
+ if pc.sneak and pc.jump then
+ self:show_bordcom(data.seatp[seatno])
+ end
+ --sound horn when required
+ if self.horn_sound and pc.aux1 and not pc.sneak and not self.horn_handle then
+ self.horn_handle = minetest.sound_play(self.horn_sound, {
+ object = self.object,
+ gain = 1.0, -- default
+ max_hear_distance = 128, -- default, uses an euclidean metric
+ loop = true,
+ })
+ elseif not pc.aux1 and self.horn_handle then
+ minetest.sound_stop(self.horn_handle)
+ self.horn_handle = nil
+ end
+ else
+ -- If on a passenger seat and doors are open, get off when W or D pressed.
+ local pass = data.seatp[seatno] and minetest.get_player_by_name(data.seatp[seatno])
+ if pass and self:train().door_open~=0 then
+ local pc=pass:get_player_control()
+ if pc.up or pc.down then
+ self:get_off(seatno)
+ end
+ end
+ end
+ if pc.aux1 and pc.sneak then
+ self:get_off(seatno)
+ end
+ end
+ end
+
+ --check infotext
+ local outside=train.text_outside or ""
+ if setting_show_ids then
+ outside = outside .. "\nT:" .. data.train_id .. " W:" .. self.id .. " O:" .. data.owner
+ end
+
+
+ --show off-track information in outside text instead of notifying the whole server about this
+ if train.off_track then
+ outside = outside .."\n!!! Train off track !!!"
+ end
+
+ if self.infotext_cache~=outside then
+ self.object:set_properties({infotext=outside})
+ self.infotext_cache=outside
+ end
+
+ local fct=data.wagon_flipped and -1 or 1
+
+ --door animation
+ if self.doors then
+ if (self.door_anim_timer or 0)<=0 then
+ local dstate = (train.door_open or 0) * fct
+ if dstate ~= self.door_state then
+ local at
+ --meaning of the train.door_open field:
+ -- -1: left doors (rel. to train orientation)
+ -- 0: closed
+ -- 1: right doors
+ --this code produces the following behavior:
+ -- if changed from 0 to +-1, play open anim. if changed from +-1 to 0, play close.
+ -- if changed from +-1 to -+1, first close and set 0, then it will detect state change again and run open.
+ if self.door_state == 0 then
+ if self.doors.open.sound then minetest.sound_play(self.doors.open.sound, {object = self.object}) end
+ at=self.doors.open[dstate]
+ self.object:set_animation(at.frames, at.speed or 15, at.blend or 0, false)
+ self.door_state = dstate
+ else
+ if self.doors.close.sound then minetest.sound_play(self.doors.close.sound, {object = self.object}) end
+ at=self.doors.close[self.door_state or 1]--in case it has not been set yet
+ self.object:set_animation(at.frames, at.speed or 15, at.blend or 0, false)
+ self.door_state = 0
+ end
+ self.door_anim_timer = at.time
+ end
+ else
+ self.door_anim_timer = (self.door_anim_timer or 0) - dtime
+ end
+ end
+
+ --for path to be available. if not, skip step
+ if not train.path or train.no_step then
+ self.object:setvelocity({x=0, y=0, z=0})
+ self.object:setacceleration({x=0, y=0, z=0})
+ return
+ end
+ if not data.pos_in_train then
+ return
+ end
+
+ -- Calculate new position, yaw and direction vector
+ local index = advtrains.path_get_index_by_offset(train, train.index, -data.pos_in_train)
+ local pos, yaw, npos, npos2 = advtrains.path_get_interpolated(train, index)
+ local vdir = vector.normalize(vector.subtract(npos2, npos))
+
+ --automatic get_on
+ --needs to know index and path
+ if self.door_entry and train.door_open and train.door_open~=0 and train.velocity==0 then
+ --using the mapping created by the trainlogic globalstep
+ for i, ino in ipairs(self.door_entry) do
+ --fct is the flipstate flag from door animation above
+ local aci = advtrains.path_get_index_by_offset(train, index, ino*fct)
+ local ix1, ix2 = advtrains.path_get_adjacent(train, aci)
+ -- the two wanted positions are ix1 and ix2 + (2nd-1st rotated by 90deg)
+ -- (x z) rotated by 90deg is (-z x) (http://stackoverflow.com/a/4780141)
+ local add = { x = (ix2.z-ix1.z)*train.door_open, y = 0, z = (ix1.x-ix2.x)*train.door_open }
+ local pts1=vector.round(vector.add(ix1, add))
+ local pts2=vector.round(vector.add(ix2, add))
+ if minetest.get_item_group(minetest.get_node(pts1).name, "platform")>0 then
+ local ckpts={
+ pts1,
+ pts2,
+ vector.add(pts1, {x=0, y=1, z=0}),
+ vector.add(pts2, {x=0, y=1, z=0}),
+ }
+ for _,ckpos in ipairs(ckpts) do
+ local cpp=minetest.pos_to_string(ckpos)
+ if advtrains.playersbypts[cpp] then
+ self:on_rightclick(advtrains.playersbypts[cpp])
+ end
+ end
+ end
+ end
+ end
+
+ --checking for environment collisions(a 3x3 cube around the center)
+ if not train.recently_collided_with_env then
+ local collides=false
+ local exh = self.extent_h or 1
+ local exv = self.extent_v or 2
+ for x=-exh,exh do
+ for y=0,exv do
+ for z=-exh,exh do
+ local node=minetest.get_node_or_nil(vector.add(npos, {x=x, y=y, z=z}))
+ if (advtrains.train_collides(node)) then
+ collides=true
+ end
+ end
+ end
+ end
+ if collides then
+ -- screw collision mercy
+ train.recently_collided_with_env=true
+ train.velocity=0
+ advtrains.atc.train_reset_command(train)
+ end
+ end
+
+ --DisCouple
+ -- FIX: Need to do this after the yaw calculation
+ if data.pos_in_trainparts and data.pos_in_trainparts>1 then
+ if train.velocity==0 then
+ if not self.discouple or not self.discouple.object:getyaw() then
+ atprint(self.id,"trying to spawn discouple")
+ local dcpl_pos = vector.add(pos, {y=0, x=-math.sin(yaw)*self.wagon_span, z=math.cos(yaw)*self.wagon_span})
+ local object=minetest.add_entity(dcpl_pos, "advtrains:discouple")
+ if object then
+ local le=object:get_luaentity()
+ le.wagon=self
+ --box is hidden when attached, so unuseful.
+ --object:set_attach(self.object, "", {x=0, y=0, z=self.wagon_span*10}, {x=0, y=0, z=0})
+ self.discouple=le
+ end
+ end
+ else
+ if self.discouple and self.discouple.object:getyaw() then
+ self.discouple.object:remove()
+ atprint(self.id," removing discouple")
+ end
+ end
+ end
+
+ --FIX: use index of the wagon, not of the train.
+ local velocity = train.velocity
+ local acceleration = (train.acceleration or 0)
+ local velocityvec = vector.multiply(vdir, velocity)
+ local accelerationvec = vector.multiply(vdir, acceleration)
+
+ if data.wagon_flipped then
+ yaw=yaw+math.pi
+ end
+
+ -- this timer runs off every 2 seconds.
+ self.updatepct_timer=(self.updatepct_timer or 0)-dtime
+ local updatepct_timer_elapsed = self.updatepct_timer<=0
+
+ if updatepct_timer_elapsed then
+ --restart timer
+ self.updatepct_timer=2
+ -- perform checks that are not frequently needed
+
+ -- unload entity if out of range (because relevant pr won't be merged in engine)
+ -- This is a WORKAROUND!
+ local players_in = false
+ for sno,pname in pairs(data.seatp) do
+ if minetest.get_player_by_name(pname) then
+ -- Fix: If the RTT is too high, a wagon might be recognized out of range even if a player sits in it
+ -- (client updates position not fast enough)
+ players_in = true
+ break
+ end
+ end
+ if not players_in then
+ local outofrange = true
+ for _,p in pairs(minetest.get_connected_players()) do
+ if vector.distance(p:get_pos(),pos)<=unload_wgn_range then
+ outofrange = false
+ end
+ end
+ if outofrange then
+ --atdebug("wagon",self.id,"unloading (too far away)")
+ self.object:remove()
+ end
+ end
+ end
+
+ if not self.old_velocity_vector
+ or not vector.equals(velocityvec, self.old_velocity_vector)
+ or not self.old_acceleration_vector
+ or not vector.equals(accelerationvec, self.old_acceleration_vector)
+ or self.old_yaw~=yaw
+ or updatepct_timer_elapsed then--only send update packet if something changed
+
+ self.object:setpos(pos)
+ self.object:setvelocity(velocityvec)
+ self.object:setacceleration(accelerationvec)
+
+ if #self.seats > 0 and self.old_yaw ~= yaw then
+ if not self.player_yaw then
+ self.player_yaw = {}
+ end
+ if not self.old_yaw then
+ self.old_yaw=yaw
+ end
+ for _,name in pairs(data.seatp) do
+ local p = minetest.get_player_by_name(name)
+ if p then
+ if not self.turning then
+ -- save player looking direction offset
+ self.player_yaw[name] = p:get_look_horizontal()-self.old_yaw
+ end
+ -- set player looking direction using calculated offset
+ p:set_look_horizontal((self.player_yaw[name] or 0)+yaw)
+ end
+ end
+ self.turning = true
+ elseif self.old_yaw == yaw then
+ -- train is no longer turning
+ self.turning = false
+ end
+
+ if self.object.set_rotation then
+ local pitch = math.atan2(vdir.y, math.hypot(vdir.x, vdir.z))
+ if data.wagon_flipped then
+ pitch = -pitch
+ end
+ self.object:set_rotation({x=pitch, y=yaw, z=0})
+ else
+ self.object:setyaw(yaw)
+ end
+
+ if self.update_animation then
+ self:update_animation(train.velocity, self.old_velocity)
+ end
+ if self.custom_on_velocity_change then
+ self:custom_on_velocity_change(train.velocity, self.old_velocity or 0, dtime)
+ end
+ -- remove discouple object, because it will be in a wrong location
+ if not updatepct_timer_elapsed and self.discouple then
+ self.discouple.object:remove()
+ end
+ end
+
+
+ self.old_velocity_vector=velocityvec
+ self.old_velocity = train.velocity
+ self.old_acceleration_vector=accelerationvec
+ self.old_yaw=yaw
+ atprintbm("wagon step", t)
+ end)
+end
+
+function wagon:on_rightclick(clicker)
+ return advtrains.pcall(function()
+ if not self:ensure_init() then return end
+ if not clicker or not clicker:is_player() then
+ return
+ end
+
+ local data = advtrains.wagons[self.id]
+
+ local pname=clicker:get_player_name()
+ local no=self:get_seatno(pname)
+ if no then
+ if self.seat_groups then
+ local poss={}
+ local sgr=self.seats[no].group
+ for _,access in ipairs(self.seat_groups[sgr].access_to) do
+ if self:check_seat_group_access(pname, access) then
+ poss[#poss+1]={name=self.seat_groups[access].name, key="sgr_"..access}
+ end
+ end
+ if self.has_inventory and self.get_inventory_formspec and advtrains.check_driving_couple_protection(pname, data.owner, data.whitelist) then
+ poss[#poss+1]={name=attrans("Show Inventory"), key="inv"}
+ end
+ if self.seat_groups[sgr].driving_ctrl_access and advtrains.check_driving_couple_protection(pname, data.owner, data.whitelist) then
+ poss[#poss+1]={name=attrans("Onboard Computer"), key="bordcom"}
+ end
+ if data.owner==pname then
+ poss[#poss+1]={name=attrans("Wagon properties"), key="prop"}
+ end
+ if not self.seat_groups[sgr].require_doors_open or self:train().door_open~=0 then
+ poss[#poss+1]={name=attrans("Get off"), key="off"}
+ else
+ if clicker:get_player_control().sneak then
+ poss[#poss+1]={name=attrans("Get off (forced)"), key="off"}
+ else
+ poss[#poss+1]={name=attrans("(Doors closed)"), key="dcwarn"}
+ end
+ end
+ if #poss==0 then
+ --can't do anything.
+ elseif #poss==1 then
+ self:seating_from_key_helper(pname, {[poss[1].key]=true}, no)
+ else
+ local form = "size[5,"..1+(#poss).."]"
+ for pos,ent in ipairs(poss) do
+ form = form .. "button_exit[0.5,"..(pos-0.5)..";4,1;"..ent.key..";"..ent.name.."]"
+ end
+ minetest.show_formspec(pname, "advtrains_seating_"..self.id, form)
+ end
+ else
+ self:get_off(no)
+ end
+ else
+ --do not attach if already on a train
+ if advtrains.player_to_train_mapping[pname] then return end
+ if self.seat_groups then
+ if #self.seats==0 then
+ if self.has_inventory and self.get_inventory_formspec and advtrains.check_driving_couple_protection(pname, data.owner, data.whitelist) then
+ minetest.show_formspec(pname, "advtrains_inv_"..self.id, self:get_inventory_formspec(pname, make_inv_name(self.id)))
+ end
+ return
+ end
+
+ local doors_open = self:train().door_open~=0 or clicker:get_player_control().sneak
+ local allow, rsn=false, "Wagon has no seats!"
+ for _,sgr in ipairs(self.assign_to_seat_group) do
+ allow, rsn = self:check_seat_group_access(pname, sgr)
+ if allow then
+ for seatid, seatdef in ipairs(self.seats) do
+ if seatdef.group==sgr then
+ if (not self.seat_groups[sgr].require_doors_open or doors_open) then
+ if not data.seatp[seatid] then
+ self:get_on(clicker, seatid)
+ return
+ else
+ rsn="Wagon is full."
+ end
+ else
+ rsn="Doors are closed! (try holding sneak key!)"
+ end
+ end
+ end
+ end
+ end
+ minetest.chat_send_player(pname, attrans("Can't get on: "..rsn))
+ else
+ self:show_get_on_form(pname)
+ end
+ end
+ end)
+end
+
+function wagon:get_on(clicker, seatno)
+
+ local data = advtrains.wagons[self.id]
+
+ if not data.seatp then data.seatp={}end
+ if not self.seatpc then self.seatpc={}end--player controls in driver stands
+
+ if not self.seats[seatno] then return end
+ local oldno=self:get_seatno(clicker:get_player_name())
+ if oldno then
+ atprint("get_on: clearing oldno",seatno)
+ advtrains.player_to_train_mapping[clicker:get_player_name()]=nil
+ advtrains.clear_driver_hud(clicker:get_player_name())
+ data.seatp[oldno]=nil
+ end
+ if data.seatp[seatno] and data.seatp[seatno]~=clicker:get_player_name() then
+ atprint("get_on: throwing off",data.seatp[seatno],"from seat",seatno)
+ self:get_off(seatno)
+ end
+ atprint("get_on: attaching",clicker:get_player_name())
+ data.seatp[seatno] = clicker:get_player_name()
+ self.seatpc[seatno] = clicker:get_player_control_bits()
+ advtrains.player_to_train_mapping[clicker:get_player_name()]=data.train_id
+ clicker:set_attach(self.object, "", self.seats[seatno].attach_offset, {x=0,y=0,z=0})
+ clicker:set_eye_offset(self.seats[seatno].view_offset, self.seats[seatno].view_offset)
+end
+function wagon:get_off_plr(pname)
+ local no=self:get_seatno(pname)
+ if no then
+ self:get_off(no)
+ end
+end
+function wagon:get_seatno(pname)
+
+ local data = advtrains.wagons[self.id]
+
+ for no, cont in pairs(data.seatp) do
+ if cont==pname then
+ return no
+ end
+ end
+ return nil
+end
+function wagon:get_off(seatno)
+
+ local data = advtrains.wagons[self.id]
+
+ if not data.seatp[seatno] then return end
+ local pname = data.seatp[seatno]
+ local clicker = minetest.get_player_by_name(pname)
+ advtrains.player_to_train_mapping[pname]=nil
+ advtrains.clear_driver_hud(pname)
+ data.seatp[seatno]=nil
+ self.seatpc[seatno]=nil
+ if clicker then
+ atprint("get_off: detaching",clicker:get_player_name())
+ clicker:set_detach()
+ clicker:set_eye_offset({x=0,y=0,z=0}, {x=0,y=0,z=0})
+ local train=self:train()
+ --code as in step - automatic get on
+ if self.door_entry and train.door_open and train.door_open~=0 and train.velocity==0 and train.index and train.path then
+ local index = advtrains.path_get_index_by_offset(train, train.index, -data.pos_in_train)
+ for i, ino in ipairs(self.door_entry) do
+ --atdebug("using door-based",i,ino)
+ local fct=data.wagon_flipped and -1 or 1
+ local aci = advtrains.path_get_index_by_offset(train, index, ino*fct)
+ local ix1, ix2 = advtrains.path_get_adjacent(train, aci)
+ local d = train.door_open
+ if self.wagon_width then
+ d = d * math.floor(self.wagon_width/2)
+ end
+ -- the two wanted positions are ix1 and ix2 + (2nd-1st rotated by 90deg)
+ -- (x z) rotated by 90deg is (-z x) (http://stackoverflow.com/a/4780141)
+ local add = { x = (ix2.z-ix1.z)*d, y = 0, z = (ix1.x-ix2.x)*d }
+ local oadd = { x = (ix2.z-ix1.z)*(d+train.door_open), y = 1, z = (ix1.x-ix2.x)*(d+train.door_open)}
+ local platpos=vector.round(vector.add(ix1, add))
+ local offpos=vector.round(vector.add(ix1, oadd))
+
+ --atdebug("platpos:", platpos, "offpos:", offpos)
+ if minetest.get_item_group(minetest.get_node(platpos).name, "platform")>0 then
+ minetest.after(GETOFF_TP_DELAY, function() clicker:setpos(offpos) end)
+ --atdebug("tp",offpos)
+ return
+ end
+ --atdebug("nope")
+ end
+ end
+ --if not door_entry, or paths missing, fall back to old method
+ --atdebug("using fallback")
+ local objpos=advtrains.round_vector_floor_y(self.object:getpos())
+ local yaw=self.object:getyaw()
+ local isx=(yaw < math.pi/4) or (yaw > 3*math.pi/4 and yaw < 5*math.pi/4) or (yaw > 7*math.pi/4)
+ local offp
+ --abuse helper function
+ for _,r in ipairs({-1, 1}) do
+ --atdebug("offset",r)
+ local p=vector.add({x=isx and r or 0, y=0, z=not isx and r or 0}, objpos)
+ offp=vector.add({x=isx and r*2 or 0, y=1, z=not isx and r*2 or 0}, objpos)
+ --atdebug("platpos:", p, "offpos:", offp)
+ if minetest.get_item_group(minetest.get_node(p).name, "platform")>0 then
+ minetest.after(GETOFF_TP_DELAY, function() clicker:setpos(offp) end)
+ --atdebug("tp",offp)
+ return
+ end
+ end
+ --atdebug("nope")
+
+ end
+end
+function wagon:show_get_on_form(pname)
+ if not self.initialized then return end
+
+ local data = advtrains.wagons[self.id]
+ if #self.seats==0 then
+ if self.has_inventory and self.get_inventory_formspec and advtrains.check_driving_couple_protection(pname, data.owner, data.whitelist) then
+ minetest.show_formspec(pname, "advtrains_inv_"..self.id, self:get_inventory_formspec(pname, make_inv_name(self.id)))
+ end
+ return
+ end
+ local form, comma="size[5,8]label[0.5,0.5;"..attrans("Select seat:").."]textlist[0.5,1;4,6;seat;", ""
+ for seatno, seattbl in ipairs(self.seats) do
+ local addtext, colorcode="", ""
+ if data.seatp and data.seatp[seatno] then
+ colorcode="#FF0000"
+ addtext=" ("..data.seatp[seatno]..")"
+ end
+ form=form..comma..colorcode..seattbl.name..addtext
+ comma=","
+ end
+ form=form..";0,false]"
+ if self.has_inventory and self.get_inventory_formspec then
+ form=form.."button_exit[1,7;3,1;inv;"..attrans("Show Inventory").."]"
+ end
+ minetest.show_formspec(pname, "advtrains_geton_"..self.id, form)
+end
+function wagon:show_wagon_properties(pname)
+ --[[
+ fields:
+ field: driving/couple whitelist
+ button: save
+ ]]
+ local data = advtrains.wagons[self.id]
+ local form="size[5,5]"
+ form = form .. "field[0.5,1;4.5,1;whitelist;Allow these players to access your wagon:;"..minetest.formspec_escape(data.whitelist or "").."]"
+ form = form .. "field[0.5,2;4.5,1;roadnumber;Wagon road number:;"..minetest.formspec_escape(data.roadnumber or "").."]"
+ local fc = ""
+ if data.fc then
+ fc = table.concat(data.fc, "!")
+ end
+ form = form .. "field[0.5,3;4.5,1;fc;Freight Code:;"..fc.."]"
+ if data.fc then
+ if not data.fcind then data.fcind = 1 end
+ if data.fcind > 1 then
+ form=form.."button[0.5,3.5;1,1;fcp;prev FC]"
+ end
+ form=form.."label[1.5,3.5;Current FC:]"
+
+ local cur = data.fc[data.fcind] or ""
+ form=form.."label[1.5,3.75;"..minetest.formspec_escape(cur).."]"
+ form=form.."button[3.5,3.5;1,1;fcn;next FC]"
+ end
+ form=form.."button_exit[0.5,4.5;4,1;save;"..attrans("Save wagon properties").."]"
+ minetest.show_formspec(pname, "advtrains_prop_"..self.id, form)
+end
+
+--BordCom
+local function checkcouple(ent)
+ if not ent or not ent:getyaw() then
+ return nil
+ end
+ local le = ent:get_luaentity()
+ if not le or not le.is_couple then
+ return nil
+ end
+ return le
+end
+local function checklock(pname, own1, own2, wl1, wl2)
+ return advtrains.check_driving_couple_protection(pname, own1, wl1)
+ or advtrains.check_driving_couple_protection(pname, own2, wl2)
+end
+
+local function split(str, sep)
+ local fields = {}
+ local pattern = string.format("([^%s]+)", sep)
+ str:gsub(pattern, function(c) fields[#fields+1] = c end)
+ return fields
+end
+
+function wagon.set_fc(data, fcstr)
+ data.fc = split(fcstr, "!")
+ if not data.fcind then
+ data.fcind = 1
+ elseif data.fcind > #data.fc then
+ data.fcind = #data.fc
+ end
+end
+
+function wagon.prev_fc(data)
+ if data.fcind > 1 then
+ data.fcind = data.fcind -1
+ end
+ if data.fcind == 1 and data.fcrev then
+ data.fcrev = nil
+ end
+end
+
+function wagon.next_fc(data)
+ if not data.fc then return end
+ if data.fcrev then
+ wagon.prev_fc(data)
+ return
+ end
+ if data.fcind < #data.fc then
+ data.fcind = data.fcind + 1
+ else
+ data.fcind = 1
+ end
+ if data.fcind == #data.fc and data.fc[data.fcind] == "?" then
+ data.fcrev = true
+ wagon.prev_fc(data)
+ return
+ end
+end
+
+function advtrains.get_cur_fc(data)
+ if not ( data.fc and data.fcind ) then
+ return ""
+ end
+ return data.fc[data.fcind] or ""
+end
+
+function advtrains.step_fc(data)
+ wagon.next_fc(data)
+end
+
+
+
+
+
+function wagon:show_bordcom(pname)
+ if not self:train() then return end
+ local train = self:train()
+ local data = advtrains.wagons[self.id]
+
+ local form = "size[11,9]label[0.5,0;AdvTrains Boardcom v0.1]"
+ form=form.."textarea[0.5,1.5;7,1;text_outside;"..attrans("Text displayed outside on train")..";"..(minetest.formspec_escape(train.text_outside or "")).."]"
+ form=form.."textarea[0.5,3;7,1;text_inside;"..attrans("Text displayed inside train")..";"..(minetest.formspec_escape(train.text_inside or "")).."]"
+ form=form.."field[7.5,1.75;3,1;line;"..attrans("Line")..";"..(minetest.formspec_escape(train.line or "")).."]"
+ form=form.."field[7.5,3.25;3,1;routingcode;"..attrans("Routingcode")..";"..(minetest.formspec_escape(train.routingcode or "")).."]"
+ --row 5 : train overview and autocoupling
+ if train.velocity==0 then
+ form=form.."label[0.5,4;Train overview /coupling control:]"
+ linhei=5
+ local pre_own, pre_wl, owns_any = nil, nil, minetest.check_player_privs(pname, "train_admin")
+ for i, tpid in ipairs(train.trainparts) do
+ local ent = advtrains.wagons[tpid]
+ if ent then
+ local roadnumber = ent.roadnumber or ""
+ form = form .. string.format("button[%d,%d;%d,%d;%s;%s]", i, linhei, 1, 0.2, "wgprp"..i, roadnumber)
+ local ename = ent.type
+ form = form .. "item_image["..i..","..(linhei+0.5)..";1,1;"..ename.."]"
+ if i~=1 then
+ if checklock(pname, ent.owner, pre_own, ent.whitelist, pre_wl) then
+ form = form .. "image_button["..(i-0.5)..","..(linhei+1.5)..";1,1;advtrains_discouple.png;dcpl_"..i..";]"
+ end
+ end
+ if i == data.pos_in_trainparts then
+ form = form .. "box["..(i-0.1)..","..(linhei+0.4)..";1,1;green]"
+ end
+ pre_own = ent.owner
+ pre_wl = ent.whitelist
+ owns_any = owns_any or (not ent.owner or ent.owner==pname)
+ end
+ end
+
+ if train.movedir==1 then
+ form = form .. "label["..(#train.trainparts+1)..","..(linhei)..";-->]"
+ else
+ form = form .. "label[0.5,"..(linhei)..";<--]"
+ end
+ --check cpl_eid_front and _back of train
+ local couple_front = checkcouple(train.cpl_front)
+ local couple_back = checkcouple(train.cpl_back)
+ if couple_front then
+ form = form .. "image_button[0.5,"..(linhei+1)..";1,1;advtrains_couple.png;cpl_f;]"
+ end
+ if couple_back then
+ form = form .. "image_button["..(#train.trainparts+0.5)..","..(linhei+1)..";1,1;advtrains_couple.png;cpl_b;]"
+ end
+
+ else
+ form=form.."label[0.5,4.5;Train overview / coupling control is only shown when the train stands.]"
+ end
+ form = form .. "button[0.5,8;3,1;save;Save]"
+
+ -- Interlocking functionality: If the interlocking module is loaded, you can set the signal aspect
+ -- from inside the train
+ if advtrains.interlocking and train.lzb and #train.lzb.oncoming > 0 then
+ local i=1
+ while train.lzb.oncoming[i] do
+ local oci = train.lzb.oncoming[i]
+ if oci.udata and oci.udata.signal_pos then
+ if advtrains.interlocking.db.get_sigd_for_signal(oci.udata.signal_pos) then
+ form = form .. "button[4.5,8;5,1;ilrs;Remote Routesetting]"
+ break
+ end
+ end
+ i=i+1
+ end
+ end
+
+ minetest.show_formspec(pname, "advtrains_bordcom_"..self.id, form)
+end
+function wagon:handle_bordcom_fields(pname, formname, fields)
+ local data = advtrains.wagons[self.id]
+
+ local seatno=self:get_seatno(pname)
+ if not seatno or not self.seat_groups[self.seats[seatno].group].driving_ctrl_access or not advtrains.check_driving_couple_protection(pname, data.owner, data.whitelist) then
+ return
+ end
+ local train = self:train()
+ if not train then return end
+ if fields.text_outside then
+ if fields.text_outside~="" then
+ train.text_outside=fields.text_outside
+ else
+ train.text_outside=nil
+ end
+ end
+ if fields.text_inside then
+ if fields.text_inside~="" then
+ train.text_inside=fields.text_inside
+ else
+ train.text_inside=nil
+ end
+ end
+ if fields.line then
+ if fields.line~="" then
+ if fields.line ~= train.line then
+ train.line=fields.line
+ minetest.after(0, advtrains.invalidate_path, train.id)
+ end
+ else
+ train.line=nil
+ end
+ end
+ if fields.routingcode then
+ if fields.routingcode~="" then
+ if fields.routingcode ~= train.routingcode then
+ train.routingcode=fields.routingcode
+ minetest.after(0, advtrains.invalidate_path, train.id)
+ end
+ else
+ train.routingcode=nil
+ end
+ end
+ for i, tpid in ipairs(train.trainparts) do
+ if fields["dcpl_"..i] then
+ advtrains.safe_decouple_wagon(tpid, pname)
+ elseif fields["wgprp"..i] then
+ for _,wagon in pairs(minetest.luaentities) do
+ if wagon.is_wagon and wagon.initialized and wagon.id==tpid and data.owner==pname then
+ wagon:show_wagon_properties(pname)
+ return
+ end
+ end
+ end
+ end
+ --check cpl_eid_front and _back of train
+ local couple_front = checkcouple(train.cpl_front)
+ local couple_back = checkcouple(train.cpl_back)
+
+ if fields.cpl_f and couple_front then
+ couple_front:on_rightclick(pname)
+ end
+ if fields.cpl_b and couple_back then
+ couple_back:on_rightclick(pname)
+ end
+
+ -- Interlocking functionality: If the interlocking module is loaded, you can set the signal aspect
+ -- from inside the train
+ if fields.ilrs and advtrains.interlocking and train.lzb and #train.lzb.oncoming > 0 then
+ local i=1
+ while train.lzb.oncoming[i] do
+ local oci = train.lzb.oncoming[i]
+ if oci.udata and oci.udata.signal_pos then
+ local sigd = advtrains.interlocking.db.get_sigd_for_signal(oci.udata.signal_pos)
+ if sigd then
+ advtrains.interlocking.show_signalling_form(sigd, pname)
+ return
+ end
+ end
+ i=i+1
+ end
+ end
+
+
+ if not fields.quit then
+ self:show_bordcom(pname)
+ end
+end
+
+minetest.register_on_player_receive_fields(function(player, formname, fields)
+ return advtrains.pcall(function()
+ local uid=string.match(formname, "^advtrains_geton_(.+)$")
+ if uid then
+ for _,wagon in pairs(minetest.luaentities) do
+ if wagon.is_wagon and wagon.initialized and wagon.id==uid then
+ local data = advtrains.wagons[wagon.id]
+ if fields.inv then
+ if wagon.has_inventory and wagon.get_inventory_formspec then
+ minetest.show_formspec(player:get_player_name(), "advtrains_inv_"..uid, wagon:get_inventory_formspec(player:get_player_name(), make_inv_name(uid)))
+ end
+ elseif fields.seat then
+ local val=minetest.explode_textlist_event(fields.seat)
+ if val and val.type~="INV" and not data.seatp[player:get_player_name()] then
+ --get on
+ wagon:get_on(player, val.index)
+ --will work with the new close_formspec functionality. close exactly this formspec.
+ minetest.show_formspec(player:get_player_name(), formname, "")
+ end
+ end
+ end
+ end
+ end
+ uid=string.match(formname, "^advtrains_seating_(.+)$")
+ if uid then
+ for _,wagon in pairs(minetest.luaentities) do
+ if wagon.is_wagon and wagon.initialized and wagon.id==uid then
+ local pname=player:get_player_name()
+ local no=wagon:get_seatno(pname)
+ if no then
+ if wagon.seat_groups then
+ wagon:seating_from_key_helper(pname, fields, no)
+ end
+ end
+ end
+ end
+ end
+ uid=string.match(formname, "^advtrains_prop_(.+)$")
+ if uid then
+ local pname=player:get_player_name()
+ local data = advtrains.wagons[uid]
+ if pname~=data.owner and not minetest.check_player_privs(pname, {train_admin = true}) then
+ return true
+ end
+ if fields.save or not fields.quit then
+ if fields.whitelist then
+ data.whitelist = fields.whitelist
+ end
+ if fields.roadnumber then
+ data.roadnumber = fields.roadnumber
+ end
+ if fields.fc then
+ wagon.set_fc(data, fields.fc)
+ end
+ if fields.fcp then
+ wagon.prev_fc(data)
+ wagon.show_wagon_properties({id=uid}, pname)
+ end
+ if fields.fcn then
+ advtrains.step_fc(data)
+ wagon.show_wagon_properties({id=uid}, pname)
+ end
+ end
+ end
+ uid=string.match(formname, "^advtrains_bordcom_(.+)$")
+ if uid then
+ for _,wagon in pairs(minetest.luaentities) do
+ if wagon.is_wagon and wagon.initialized and wagon.id==uid then
+ wagon:handle_bordcom_fields(player:get_player_name(), formname, fields)
+ end
+ end
+ end
+ uid=string.match(formname, "^advtrains_inv_(.+)$")
+ if uid then
+ local pname=player:get_player_name()
+ local data = advtrains.wagons[uid]
+ if fields.prop and data.owner==pname then
+ for _,wagon in pairs(minetest.luaentities) do
+ if wagon.is_wagon and wagon.initialized and wagon.id==uid and data.owner==pname then
+ wagon:show_wagon_properties(pname)
+ --wagon:handle_bordcom_fields(player:get_player_name(), formname, fields)
+ end
+ end
+ end
+ end
+ end)
+end)
+function wagon:seating_from_key_helper(pname, fields, no)
+ local data = advtrains.wagons[self.id]
+ local sgr=self.seats[no].group
+ for _,access in ipairs(self.seat_groups[sgr].access_to) do
+ if fields["sgr_"..access] and self:check_seat_group_access(pname, access) then
+ for seatid, seatdef in ipairs(self.seats) do
+ if seatdef.group==access and not data.seatp[seatid] then
+ self:get_on(minetest.get_player_by_name(pname), seatid)
+ return
+ end
+ end
+ end
+ end
+ if fields.inv and self.has_inventory and self.get_inventory_formspec then
+ minetest.close_formspec(pname, "advtrains_seating_"..self.id)
+ minetest.show_formspec(pname, "advtrains_inv_"..self.id, self:get_inventory_formspec(pname, make_inv_name(self.id)))
+ end
+ if fields.prop and data.owner==pname then
+ minetest.close_formspec(pname, "advtrains_seating_"..self.id)
+ self:show_wagon_properties(pname)
+ end
+ if fields.bordcom and self.seat_groups[sgr].driving_ctrl_access and advtrains.check_driving_couple_protection(pname, data.owner, data.whitelist) then
+ minetest.close_formspec(pname, "advtrains_seating_"..self.id)
+ self:show_bordcom(pname)
+ end
+ if fields.dcwarn then
+ minetest.chat_send_player(pname, attrans("Doors are closed! Use Sneak+rightclick to ignore the closed doors and get off!"))
+ end
+ if fields.off then
+ self:get_off(no)
+ end
+end
+function wagon:check_seat_group_access(pname, sgr)
+ local data = advtrains.wagons[self.id]
+ if self.seat_groups[sgr].driving_ctrl_access and not (advtrains.check_driving_couple_protection(pname, data.owner, data.whitelist)) then
+ return false, "Not allowed to access a driver stand!"
+ end
+ if self.seat_groups[sgr].driving_ctrl_access then
+ advtrains.log("Drive", pname, self.object:getpos(), self:train().text_outside)
+ end
+ return true
+end
+function wagon:reattach_all()
+ local data = advtrains.wagons[self.id]
+ if not data.seatp then data.seatp={} end
+ for seatno, pname in pairs(data.seatp) do
+ local p=minetest.get_player_by_name(pname)
+ if p then
+ self:get_on(p ,seatno)
+ end
+ end
+end
+
+local function check_twagon_owner(train, b_first, pname)
+ local wtp = b_first and 1 or #train.trainparts
+ local wid = train.trainparts[wtp]
+ local wdata = advtrains.wagons[wid]
+ if wdata then
+ return advtrains.check_driving_couple_protection(pname, wdata.owner, wdata.whitelist)
+ end
+ return false
+end
+
+function advtrains.safe_couple_trains(id1, id2, t1f, t2f, pname, try_run,v1,v2)
+
+ if pname and not minetest.check_player_privs(pname, "train_operator") then
+ minetest.chat_send_player(pname, "Missing train_operator privilege")
+ return false
+ end
+
+ local train1=advtrains.trains[id1]
+ local train2=advtrains.trains[id2]
+
+ if not advtrains.train_ensure_init(id1, train1)
+ or not advtrains.train_ensure_init(id2, train2) then
+ return false
+ end
+ local wck_t1, wck_t2
+ if pname then
+ wck_t1 = check_twagon_owner(train1, t1f, pname)
+ wck_t2 = check_twagon_owner(train2, t2f, pname)
+ end
+ if (wck_t1 or wck_t2) or not pname then
+ if not v1 then
+ v1 = 0
+ end
+ if not v2 then
+ v2 = 0
+ end
+ if try_run then
+ return true
+ end
+ if t1f then
+ if t2f then
+ v1 = -v1
+ advtrains.invert_train(id1)
+ advtrains.do_connect_trains(id1, id2, v1+v2)
+ else
+ advtrains.do_connect_trains(id2, id1, v1+v2)
+ end
+ else
+ if t2f then
+ advtrains.do_connect_trains(id1, id2, v1+v2)
+ else
+ v2 = -v2
+ advtrains.invert_train(id2)
+ advtrains.do_connect_trains(id1, id2, v1+v2)
+ end
+ end
+ return true
+ else
+ minetest.chat_send_player(pname, "You must be authorized for at least one wagon.")
+ return false
+ end
+end
+
+
+function advtrains.safe_decouple_wagon(w_id, pname, try_run)
+ if not minetest.check_player_privs(pname, "train_operator") then
+ minetest.chat_send_player(pname, "Missing train_operator privilege")
+ return false
+ end
+ local data = advtrains.wagons[w_id]
+
+ local dpt = data.pos_in_trainparts
+ if not dpt or dpt <= 1 then
+ return false
+ end
+ local train = advtrains.trains[data.train_id]
+ local owid = train.trainparts[dpt-1]
+ local owdata = advtrains.wagons[owid]
+
+ if not owdata then
+ return
+ end
+
+ if not checklock(pname, data.owner, owdata.owner, data.whitelist, owdata.whitelist) then
+ minetest.chat_send_player(pname, "Not allowed to do this.")
+ return false
+ end
+
+ if try_run then
+ return true
+ end
+
+ advtrains.log("Discouple", pname, train.last_pos, train.text_outside)
+ advtrains.split_train_at_wagon(w_id)
+ return true
+end
+
+
+
+function advtrains.get_wagon_prototype(data)
+ local wt = data.type
+ if not wt then
+ -- LEGACY: Field was called "entity_name" in previous versions
+ wt = data.entity_name
+ data.type = data.entity_name
+ data.entity_name = nil
+ end
+ if not wt or not advtrains.wagon_prototypes[wt] then
+ atwarn("Unable to load wagon type",wt,", using placeholder")
+ wt="advtrains:wagon_placeholder"
+ end
+ return wt, advtrains.wagon_prototypes[wt]
+end
+
+function advtrains.standard_inventory_formspec(self, pname, invname)
+ --[[minetest.chat_send_player(pname, string.format("self=%s, pname=%s, invname=%s", self, pname, invname))
+ for k,v in pairs(self) do
+ minetest.chat_send_player(pname, string.format("%s=%s", k,v))
+ end
+ minetest.chat_send_player(pname, string.format("***%s***", self.object:get_pos()))--]]
+ local data = advtrains.wagons[self.id]
+ local r = "size[8,11]"..
+ "list["..invname..";box;0,0;8,3;]"
+ if data.owner==pname then
+ r = r .. "button_exit[0,9;4,1;prop;"..attrans("Wagon properties").."]"
+ end
+ r = r .. "list[current_player;main;0,5;8,4;]"..
+ "listring[]"
+ return r
+end
+
+function advtrains.register_wagon(sysname_p, prototype, desc, inv_img, nincreative)
+ local sysname = sysname_p
+ if not string.match(sysname, ":") then
+ sysname = "advtrains:"..sysname_p
+ end
+ setmetatable(prototype, {__index=wagon})
+ minetest.register_entity(":"..sysname,prototype)
+ advtrains.wagon_prototypes[sysname] = prototype
+
+ minetest.register_craftitem(":"..sysname, {
+ description = desc,
+ inventory_image = inv_img,
+ wield_image = inv_img,
+ stack_max = 1,
+
+ groups = { not_in_creative_inventory = nincreative and 1 or 0},
+
+ on_place = function(itemstack, placer, pointed_thing)
+ return advtrains.pcall(function()
+ if not pointed_thing.type == "node" then
+ return
+ end
+ local pname = placer:get_player_name()
+
+ local node=minetest.get_node_or_nil(pointed_thing.under)
+ if not node then atprint("[advtrains]Ignore at placer position") return itemstack end
+ local nodename=node.name
+ if(not advtrains.is_track_and_drives_on(nodename, prototype.drives_on)) then
+ atprint("no track here, not placing.")
+ return itemstack
+ end
+ if not minetest.check_player_privs(placer, {train_operator = true }) then
+ minetest.chat_send_player(pname, "You don't have the train_operator privilege.")
+ return itemstack
+ end
+ if not minetest.check_player_privs(placer, {train_admin = true }) and minetest.is_protected(pointed_thing.under, placer:get_player_name()) then
+ return itemstack
+ end
+ local tconns=advtrains.get_track_connections(node.name, node.param2)
+ local yaw = placer:get_look_horizontal()
+ local plconnid = advtrains.yawToClosestConn(yaw, tconns)
+
+ local prevpos = advtrains.get_adjacent_rail(pointed_thing.under, tconns, plconnid, prototype.drives_on)
+ if not prevpos then
+ minetest.chat_send_player(pname, "The track you are trying to place the wagon on is not long enough!")
+ return
+ end
+
+ local wid = advtrains.create_wagon(sysname, pname)
+
+ local id=advtrains.create_new_train_at(pointed_thing.under, plconnid, 0, {wid})
+
+ if not advtrains.is_creative(pname) then
+ itemstack:take_item()
+ end
+ return itemstack
+
+ end)
+ end,
+ })
+end
+
+-- Placeholder wagon. Will be spawned whenever a mod is missing
+advtrains.register_wagon("advtrains:wagon_placeholder", {
+ visual="sprite",
+ textures = {"advtrains_wagon_placeholder.png"},
+ collisionbox = {-0.3,-0.3,-0.3, 0.3,0.3,0.3},
+ visual_size = {x=0.7, y=0.7},
+ initial_sprite_basepos = {x=0, y=0},
+ drives_on = advtrains.all_tracktypes,
+ max_speed = 5,
+ seats = {
+ },
+ seat_groups = {
+ },
+ assign_to_seat_group = {},
+ wagon_span=1,
+ drops={},
+}, "Wagon placeholder", "advtrains_wagon_placeholder.png", true)
+
diff --git a/advtrains/advtrains_interlocking/approach.lua b/advtrains/advtrains_interlocking/approach.lua
new file mode 100644
index 0000000..8e90b5a
--- /dev/null
+++ b/advtrains/advtrains_interlocking/approach.lua
@@ -0,0 +1,113 @@
+-- Interlocking counterpart of LZB, which has been moved into the core...
+-- Registers LZB callback for signal management.
+
+--[[
+usage of lzbdata:
+{
+ travsht = boolean indicating whether the train will be a shunt move at "trav"
+ travspd = speed restriction at end of traverser
+ travwspd = warning speed res.t
+}
+]]
+
+local SHUNT_SPEED_MAX = advtrains.SHUNT_SPEED_MAX
+
+local il = advtrains.interlocking
+
+local function get_over_function(speed, shunt)
+ return function(pos, id, train, index, speed, lzbdata)
+ if speed == 0 and minetest.settings:get_bool("at_il_force_lzb_halt") then
+ atwarn(id,"overrun LZB 0 restriction (red signal) ",pos)
+ -- Set train 1 index backward. Hope this does not lead to bugs...
+ train.index = index - 0.5
+ train.velocity = 0
+ train.ctrl.lzb = 0
+ minetest.after(0, advtrains.invalidate_path, id)
+ else
+ train.speed_restriction = speed
+ train.is_shunt = shunt
+ end
+ end
+end
+
+advtrains.tnc_register_on_approach(function(pos, id, train, index, lzbdata)
+
+ --atdebug(id,"IL ApprC",pos,index,lzbdata)
+ --train.debug = advtrains.print_concat_table({train.is_shunt,"|",index,"|",lzbdata})
+
+ local pts = advtrains.roundfloorpts(pos)
+ local cn = train.path_cn[index]
+ local travsht = lzbdata.travsht
+
+ if travsht==nil then
+ travsht = train.is_shunt
+ end
+
+ local travspd = lzbdata.travspd
+ local travwspd = lzbdata.travwspd
+
+ -- check for signal
+ local asp, spos = il.db.get_ip_signal_asp(pts, cn)
+
+ -- do ARS if needed
+ if spos then
+ --atdebug(id,"IL Spos (ARS)",spos,asp)
+ local sigd = il.db.get_sigd_for_signal(spos)
+ if sigd then
+ il.ars_check(sigd, train)
+ end
+ end
+ --atdebug("trav: ",pos, cn, asp, spos, "travsht=", lzb.travsht)
+ local lspd
+ if asp then
+ --atdebug(id,"IL Signal",spos,asp)
+ local nspd = 0
+ --interpreting aspect and determining speed to proceed
+ if travsht then
+ --shunt move
+ if asp.shunt.free then
+ nspd = SHUNT_SPEED_MAX
+ elseif asp.shunt.proceed_as_main and asp.main.free then
+ nspd = asp.main.speed
+ travsht = false
+ end
+ else
+ --train move
+ if asp.main.free then
+ nspd = asp.main.speed
+ elseif asp.shunt.free then
+ nspd = SHUNT_SPEED_MAX
+ travsht = true
+ end
+ end
+ -- nspd can now be: 1. !=0: new speed restriction, 2. =0: stop here or 3. nil: keep travspd
+ if nspd then
+ if nspd == -1 then
+ travspd = nil
+ else
+ travspd = nspd
+ end
+ end
+
+ local nwspd = asp.info.w_speed
+ if nwspd then
+ if nwspd == -1 then
+ travwspd = nil
+ else
+ travwspd = nwspd
+ end
+ end
+ --atdebug("ns,wns,ts,wts", nspd, nwspd, travspd, travwspd)
+ lspd = travspd
+ if travwspd and (not lspd or lspd>travwspd) then
+ lspd = travwspd
+ end
+
+ local udata = {signal_pos = spos}
+ local callback = get_over_function(lspd, travsht)
+ advtrains.lzb_add_checkpoint(train, index, lspd, callback, udata)
+ end
+ lzbdata.travsht = travsht
+ lzbdata.travspd = travspd
+ lzbdata.travwspd = travwspd
+end)
diff --git a/advtrains/advtrains_interlocking/ars.lua b/advtrains/advtrains_interlocking/ars.lua
new file mode 100644
index 0000000..434ae2c
--- /dev/null
+++ b/advtrains/advtrains_interlocking/ars.lua
@@ -0,0 +1,155 @@
+-- ars.lua
+-- automatic routesetting
+
+--[[
+ The "ARS table" and its effects:
+ Every route has (or can have) an associated ARS table. This can either be
+ ars = { [n] = {ln="<line>"}/{rc="<routingcode>"}/{c="<a comment>"} }
+ a list of rules involving either line or routingcode matchers (or comments, those are ignored)
+ The first matching rule determines the route to set.
+ - or -
+ ars = {default = true}
+ this means that all trains that no other rule matches on should use this route
+
+ Compound ("and") conjunctions are not supported (--TODO should they?)
+
+ For editing, those tables are transformed into lines in a text area:
+ {ln=...} -> LN ...
+ {rc=...} -> RC ...
+ {c=...} -> #...
+ {default=true} -> *
+ See also route_ui.lua
+]]
+
+local il = advtrains.interlocking
+
+-- The ARS data are saved in a table format, but are entered in text format. Utility functions to transform between both.
+function il.ars_to_text(arstab)
+ if not arstab then
+ return ""
+ end
+
+ local txt = {}
+
+ for i, arsent in ipairs(arstab) do
+ local n = ""
+ if arsent.n then
+ n = "!"
+ end
+ if arsent.ln then
+ txt[#txt+1] = n.."LN "..arsent.ln
+ elseif arsent.rc then
+ txt[#txt+1] = n.."RC "..arsent.rc
+ elseif arsent.c then
+ txt[#txt+1] = "#"..arsent.c
+ end
+ end
+
+ if arstab.default then
+ return "*\n" .. table.concat(txt, "\n")
+ end
+ return table.concat(txt, "\n")
+end
+
+function il.text_to_ars(t)
+ if t=="" then
+ return nil
+ elseif t=="*" then
+ return {default=true}
+ end
+ local arstab = {}
+ for line in string.gmatch(t, "[^\r\n]+") do
+ if line=="*" then
+ arstab.default = true
+ else
+ local c, v = string.match(line, "^(...?)%s(.*)$")
+ if c and v then
+ local n = nil
+ if string.sub(c,1,1) == "!" then
+ n = true
+ c = string.sub(c,2)
+ end
+ local tt=string.upper(c)
+ if tt=="LN" then
+ arstab[#arstab+1] = {ln=v, n=n}
+ elseif tt=="RC" then
+ arstab[#arstab+1] = {rc=v, n=n}
+ end
+ else
+ local ct = string.match(line, "^#(.*)$")
+ if ct then arstab[#arstab+1] = {c = ct} end
+ end
+ end
+ end
+ return arstab
+end
+
+local function find_rtematch(routes, train)
+ local default
+ for rteid, route in ipairs(routes) do
+ if route.ars then
+ if route.ars.default then
+ default = rteid
+ else
+ if il.ars_check_rule_match(route.ars, train) then
+ return rteid
+ end
+ end
+ end
+ end
+ return default
+end
+
+-- Checks whether ARS rule explicitly matches. This does not take into account the "default" field, since a wider context is required for this.
+-- Returns the rule number that matched, or nil if nothing matched
+function il.ars_check_rule_match(ars, train)
+ if not ars then
+ return nil
+ end
+ local line = train.line
+ local routingcode = train.routingcode
+ for arskey, arsent in ipairs(ars) do
+ --atdebug(arsent, line, routingcode)
+ if arsent.n then
+ -- rule is inverse...
+ if arsent.ln and (not line or arsent.ln ~= line) then
+ return arskey
+ elseif arsent.rc and (not routingcode or not string.find(" "..routingcode.." ", " "..arsent.rc.." ", nil, true)) then
+ return arskey
+ end
+ return nil
+ end
+
+ if arsent.ln and line and arsent.ln == line then
+ return arskey
+ elseif arsent.rc and routingcode and string.find(" "..routingcode.." ", " "..arsent.rc.." ", nil, true) then
+ return arskey
+ end
+ end
+ return nil
+end
+
+function advtrains.interlocking.ars_check(sigd, train)
+ local tcbs = il.db.get_tcbs(sigd)
+ if not tcbs or not tcbs.routes then return end
+
+ if tcbs.ars_disabled then
+ -- No-ARS mode of signal.
+ -- ignore...
+ return
+ end
+
+ if tcbs.routeset then
+ -- ARS is not in effect when a route is already set
+ -- just "punch" routesetting, just in case callback got lost.
+ minetest.after(0, il.route.update_route, sigd, tcbs, nil, nil)
+ return
+ end
+
+ local rteid = find_rtematch(tcbs.routes, train)
+ if rteid then
+ --delay routesetting, it should not occur inside train step
+ -- using after here is OK because that gets called on every path recalculation
+ minetest.after(0, il.route.update_route, sigd, tcbs, rteid, nil)
+ end
+end
diff --git a/advtrains/advtrains_interlocking/database.lua b/advtrains/advtrains_interlocking/database.lua
new file mode 100644
index 0000000..e2c9edc
--- /dev/null
+++ b/advtrains/advtrains_interlocking/database.lua
@@ -0,0 +1,599 @@
+-- interlocking/database.lua
+-- saving the location of TCB's, their neighbors and their state
+--[[
+
+== THIS COMMENT IS PARTIALLY INCORRECT AND OUTDATED! ==
+
+The interlocking system is based on track circuits.
+Track circuit breaks must be manually set by the user. Signals must be assigned to track circuit breaks and to a direction(connid).
+To simplify the whole system, there is no overlap.
+== Trains ==
+Trains always occupy certain track circuits. These are shown red in the signalbox view (TRAIN occupation entry).
+== Database storage ==
+The things that are actually saved are the Track Circuit Breaks. Each TCB holds a list of the TCBs that are adjacent in each direction.
+TC occupation/state is then saved inside each (TCB,Direction) and held in sync across all TCBs adjacent to this one. If something should not be in sync,
+all entries are merged to perform the most restrictive setup.
+== Traverser function ==
+To determine and update the list of neighboring TCBs, we need a traverser function.
+It will start at one TCB in a specified direction (connid) and use get_adjacent_rail to crawl along the track. When encountering a turnout or a crossing,
+it needs to branch(call itself recursively) to find all required TCBs. Those found TCBs are then saved in a list as tuples (TCB,Dir)
+In the last step, they exchange their neighbors.
+== TC states ==
+A track circuit does not have a state as such, but has more or less a list of "reservations"
+type can be one of these:
+TRAIN See Trains obove
+ROUTE Route set from a signal, but no train has yet passed that signal.
+Not implemented (see note by reversible): OWNED - former ROUTE segments that a train has begun passing (train_id assigned)
+ - Space behind a train up to the next signal, when a TC is set as REVERSIBLE
+Certain TCs can be marked as "allow call-on".
+== Route setting: ==
+Routes are set from a signal (the entry signal) to another signal facing the same direction (the exit signal)
+Remember that signals are assigned to a TCB and a connid.
+Whenever this is done, the following track circuits are set "reserved" by the train by saving the entry signal's ID:
+- all TCs on the direct way of the route - set as ROUTE
+Route setting fails whenever any TC that we want to set ROUTE to is already set ROUTE or TRAIN from another signal (except call-on, see below)
+Apart from this, we need to set turnouts
+- Turnouts on the track are set held as ROUTE
+- Turnouts that purpose as flank protection are set held as FLANK (NOTE: left as an idea for later, because it's not clear how to do this properly without an engineer)
+Note: In SimSig, it is possible to set a route into an still occupied section on the victoria line sim. (at the depot exit at seven sisters), although
+ there are still segments set ahead of the first train passing, remaining from another route.
+ Because our system will be able to remember "requested routes" and set them automatically once ready, this is not necessary here.
+== Call-On/Multiple Trains ==
+It will be necessary to join and split trains using call-on routes. A call-on route may be set when:
+- there are no ROUTE reservations
+- there are TRAIN reservations only inside TCs that have "allow call-on" set
+== TC Properties ==
+Note: Reversible property will not be implemented, assuming everything as non-rev.
+This is sufficient to cover all use cases, and is done this way in reality.
+ REVERSIBLE - Whether trains are allowed to reverse while on track circuit
+ This property is supposed to be set for station tracks, where there is a signal at each end, and for sidings.
+ It should in no case be set for TCs covering turnouts, or for main running lines.
+ When a TC is not set as reversible, the OWNED status is cleared from the TC right after the train left it,
+ to allow other trains to pass it.
+ If it is set reversible, interlocking will keep the OWNED state behind the train up to the next signal, clearing it
+ as soon as the train passes another signal or enters a non-reversible section.
+CALL_ON_ALLOWED - Whether this TC being blocked (TRAIN or ROUTE) does not prevent shunt routes being set through this TC
+== More notes ==
+- It may not be possible to switch turnouts when their TC has any state entry
+
+== Route releasing (TORR) ==
+A train passing through a route happens as follows:
+Route set from entry to exit signal
+Train passes entry signal and enters first TC past the signal
+-> Route from signal cleared (TCs remain locked)
+-> ROUTE status of first TC past signal cleared
+Train continues along the route.
+Whenever train leaves a TC
+-> Clearing any routes set from this TC outward recursively - see "Reversing problem"
+Whenever train enters a TC
+-> Clear route status from the just entered TC
+Note that this prohibits by design that the train clears the route ahead of it.
+== Reversing Problem ==
+Encountered at the Royston simulation in SimSig. It is solved there by imposing a time limit on the set route. Call-on routes can somehow be set anyway.
+Imagine this setup: (T=Train, R=Route, >=in_dir TCB)
+ O-| Royston P2 |-O
+T->---|->RRR-|->RRR-|--
+Train T enters from the left, the route is set to the right signal. But train is supposed to reverse here and stops this way:
+ O-| Royston P2 |-O
+------|-TTTT-|->RRR-|--
+The "Route" on the right is still set. Imposing a timeout here is a thing only professional engineers can determine, not an algorithm.
+ O-| Royston P2 |-O
+<-T---|------|->RRR-|--
+The train has left again, while route on the right is still set.
+So, we have to clear the set route when the train has left the left TC.
+This does not conflict with call-on routes, because both station tracks are set as "allow call-on"
+Because none of the routes extends past any non-call-on sections, call-on route would be allowed here, even though the route
+is locked in opposite direction at the time of routesetting.
+Another case of this:
+--TTT/--|->RRR--
+The / here is a non-interlocked turnout (to a non-frequently used siding). For some reason, there is no exit node there,
+so the route is set to the signal at the right end. The train is taking the exit to the siding and frees the TC, without ever
+having touched the right TC.
+]]--
+
+local TRAVERSER_LIMIT = 1000
+
+
+local ildb = {}
+
+local track_circuit_breaks = {}
+local track_sections = {}
+
+-- Assignment of signals to TCBs
+local signal_assignments = {}
+
+-- track+direction -> signal position
+local influence_points = {}
+
+advtrains.interlocking.npr_rails = {}
+
+
+function ildb.load(data)
+ if not data then return end
+ if data.tcbs then
+ track_circuit_breaks = data.tcbs
+ end
+ if data.ts then
+ track_sections = data.ts
+ end
+ if data.signalass then
+ signal_assignments = data.signalass
+ end
+ if data.rs_locks then
+ advtrains.interlocking.route.rte_locks = data.rs_locks
+ end
+ if data.rs_callbacks then
+ advtrains.interlocking.route.rte_callbacks = data.rs_callbacks
+ end
+ if data.influence_points then
+ influence_points = data.influence_points
+ end
+ if data.npr_rails then
+ advtrains.interlocking.npr_rails = data.npr_rails
+ end
+end
+
+function ildb.save()
+ return {
+ tcbs = track_circuit_breaks,
+ ts=track_sections,
+ signalass = signal_assignments,
+ rs_locks = advtrains.interlocking.route.rte_locks,
+ rs_callbacks = advtrains.interlocking.route.rte_callbacks,
+ influence_points = influence_points,
+ npr_rails = advtrains.interlocking.npr_rails,
+ }
+end
+
+--
+--[[
+TCB data structure
+{
+[1] = { -- Variant: with adjacent TCs.
+ ts_id = <id> -- ID of the assigned track section
+ signal = <pos> -- optional: when set, routes can be set from this tcb/direction and signal
+ -- aspect will be set accordingly.
+ routeset = <index in routes> -- Route set from this signal. This is the entry that is cleared once
+ -- train has passed the signal. (which will set the aspect to "danger" again)
+ route_committed = <boolean> -- When setting/requesting a route, routetar will be set accordingly,
+ -- while the signal still displays danger and nothing is written to the TCs
+ -- As soon as the route can actually be set, all relevant TCs and turnouts are set and this field
+ -- is set true, clearing the signal
+ aspect = <asp> -- The aspect the signal should show. If this is nil, should show the most restrictive aspect (red)
+ signal_name = <string> -- The human-readable name of the signal, only for documenting purposes
+ routes = { <route definition> } -- a collection of routes from this signal
+ route_auto = <boolean> -- When set, we will automatically re-set the route (designated by routeset)
+},
+[2] = { -- Variant: end of track-circuited area (initial state of TC)
+ ts_id = nil, -- this is the indication for end_of_interlocking
+ section_free = <boolean>, --this can be set by an exit node via mesecons or atlatc,
+ -- or from the tc formspec.
+}
+}
+
+Track section
+[id] = {
+ name = "Some human-readable name"
+ tc_breaks = { <signal specifier>,... } -- Bounding TC's (signal specifiers)
+ -- Can be direct ends (auto-detected), conflicting routes or TCBs that are too far away from each other
+ route = {
+ origin = <signal>, -- route origin
+ entry = <sigd>, -- supposed train entry point
+ rsn = <string>,
+ first = <bool>
+ }
+ route_post = {
+ locks = {[n] = <pts>}
+ next = <sigd>
+ }
+ -- Set whenever a route has been set through this TC. It saves the origin tcb id and side
+ -- (=the origin signal). rsn is some description to be shown to the user
+ -- first says whether to clear the routesetting status from the origin signal.
+ -- locks contains the positions where locks are held by this ts.
+ -- 'route' is cleared when train enters the section, while 'route_post' cleared when train leaves section.
+ trains = {<id>, ...} -- Set whenever a train (or more) reside in this TC
+}
+
+
+Signal specifier (sigd) (a pair of TCB/Side):
+{p = <pos>, s = <1/2>}
+
+Signal Assignments: reverse lookup of signals assigned to TCBs
+signal_assignments = {
+[<signal pts>] = <sigd>
+}
+]]
+
+
+--
+function ildb.create_tcb(pos)
+ local new_tcb = {
+ [1] = {},
+ [2] = {},
+ }
+ local pts = advtrains.roundfloorpts(pos)
+ if not track_circuit_breaks[pts] then
+ track_circuit_breaks[pts] = new_tcb
+ return true
+ else
+ return false
+ end
+end
+
+function ildb.get_tcb(pos)
+ local pts = advtrains.roundfloorpts(pos)
+ return track_circuit_breaks[pts]
+end
+
+function ildb.get_tcbs(sigd)
+ local tcb = ildb.get_tcb(sigd.p)
+ if not tcb then return nil end
+ return tcb[sigd.s]
+end
+
+
+function ildb.create_ts(sigd)
+ local tcbs = ildb.get_tcbs(sigd)
+ local id = advtrains.random_id()
+
+ while track_sections[id] do
+ id = advtrains.random_id()
+ end
+
+ track_sections[id] = {
+ name = "Section "..id,
+ tc_breaks = { sigd }
+ }
+ tcbs.ts_id = id
+end
+
+function ildb.get_ts(id)
+ return track_sections[id]
+end
+
+
+
+-- various helper functions handling sigd's
+local sigd_equal = advtrains.interlocking.sigd_equal
+local function insert_sigd_nodouble(list, sigd)
+ for idx, cmp in pairs(list) do
+ if sigd_equal(sigd, cmp) then
+ return
+ end
+ end
+ table.insert(list, sigd)
+end
+
+
+-- This function will actually handle the node that is in connid direction from the node at pos
+-- so, this needs the conns of the node at pos, since these are already calculated
+local function traverser(found_tcbs, pos, conns, connid, count, brk_when_found_n)
+ local adj_pos, adj_connid, conn_idx, nextrail_y, next_conns = advtrains.get_adjacent_rail(pos, conns, connid, advtrains.all_tracktypes)
+ if not adj_pos then
+ --atdebug("Traverser found end-of-track at",pos, connid)
+ return
+ end
+ -- look whether there is a TCB here
+ if #next_conns == 2 then --if not, don't even try!
+ local tcb = ildb.get_tcb(adj_pos)
+ if tcb then
+ -- done with this branch
+ --atdebug("Traverser found tcb at",adj_pos, adj_connid)
+ insert_sigd_nodouble(found_tcbs, {p=adj_pos, s=adj_connid})
+ return
+ end
+ end
+ -- recursion abort condition
+ if count > TRAVERSER_LIMIT then
+ --atdebug("Traverser hit counter at",adj_pos, adj_connid)
+ return true
+ end
+ -- continue traversing
+ local counter_hit = false
+ for nconnid, nconn in ipairs(next_conns) do
+ if adj_connid ~= nconnid then
+ counter_hit = counter_hit or traverser(found_tcbs, adj_pos, next_conns, nconnid, count + 1, brk_when_found_n)
+ if brk_when_found_n and #found_tcbs>=brk_when_found_n then
+ break
+ end
+ end
+ end
+ return counter_hit
+end
+
+
+
+-- Merges the TS with merge_id into root_id and then deletes merge_id
+local function merge_ts(root_id, merge_id)
+ local rts = ildb.get_ts(root_id)
+ local mts = ildb.get_ts(merge_id)
+ if not mts then return end -- This may be the case when sync_tcb_neighbors
+ -- inserts the same id twice. do nothing.
+
+ if not ildb.may_modify_ts(rts) then return false end
+ if not ildb.may_modify_ts(mts) then return false end
+
+ -- cobble together the list of TCBs
+ for _, msigd in ipairs(mts.tc_breaks) do
+ local tcbs = ildb.get_tcbs(msigd)
+ if tcbs then
+ insert_sigd_nodouble(rts.tc_breaks, msigd)
+ tcbs.ts_id = root_id
+ end
+ advtrains.interlocking.show_tcb_marker(msigd.p)
+ end
+ -- done
+ track_sections[merge_id] = nil
+end
+
+local lntrans = { "A", "B" }
+local function sigd_to_string(sigd)
+ return minetest.pos_to_string(sigd.p).." / "..lntrans[sigd.s]
+end
+
+-- Check for near TCBs and connect to their TS if they have one, and syncs their data.
+function ildb.sync_tcb_neighbors(pos, connid)
+ local found_tcbs = { {p = pos, s = connid} }
+ local node_ok, conns, rhe = advtrains.get_rail_info_at(pos, advtrains.all_tracktypes)
+ if not node_ok then
+ atwarn("update_tcb_neighbors but node is NOK: "..minetest.pos_to_string(pos))
+ return
+ end
+
+ --atdebug("Traversing from ",pos, connid)
+ local counter_hit = traverser(found_tcbs, pos, conns, connid, 0)
+
+ local ts_id
+ local list_eoi = {}
+ local list_ok = {}
+ local list_mismatch = {}
+ local ts_to_merge = {}
+
+ for idx, sigd in pairs(found_tcbs) do
+ local tcbs = ildb.get_tcbs(sigd)
+ if not tcbs.ts_id then
+ --atdebug("Sync: put",sigd_to_string(sigd),"into list_eoi")
+ table.insert(list_eoi, sigd)
+ elseif not ts_id and tcbs.ts_id then
+ if not ildb.get_ts(tcbs.ts_id) then
+ atwarn("Track section database is inconsistent, there's no TS with ID=",tcbs.ts_id)
+ tcbs.ts_id = nil
+ table.insert(list_eoi, sigd)
+ else
+ --atdebug("Sync: put",sigd_to_string(sigd),"into list_ok")
+ ts_id = tcbs.ts_id
+ table.insert(list_ok, sigd)
+ end
+ elseif ts_id and tcbs.ts_id and tcbs.ts_id ~= ts_id then
+ atwarn("Track section database is inconsistent, sections share track!")
+ atwarn("Merging",tcbs.ts_id,"into",ts_id,".")
+ table.insert(list_mismatch, sigd)
+ table.insert(ts_to_merge, tcbs.ts_id)
+ end
+ end
+ if ts_id then
+ local ts = ildb.get_ts(ts_id)
+ for _, sigd in ipairs(list_eoi) do
+ local tcbs = ildb.get_tcbs(sigd)
+ tcbs.ts_id = ts_id
+ table.insert(ts.tc_breaks, sigd)
+ advtrains.interlocking.show_tcb_marker(sigd.p)
+ end
+ for _, mts in ipairs(ts_to_merge) do
+ merge_ts(ts_id, mts)
+ end
+ end
+end
+
+function ildb.link_track_sections(merge_id, root_id)
+ if merge_id == root_id then
+ return
+ end
+ merge_ts(root_id, merge_id)
+end
+
+function ildb.remove_from_interlocking(sigd)
+ local tcbs = ildb.get_tcbs(sigd)
+ if not ildb.may_modify_tcbs(tcbs) then return false end
+
+ if tcbs.ts_id then
+ local tsid = tcbs.ts_id
+ local ts = ildb.get_ts(tsid)
+ if not ts then
+ tcbs.ts_id = nil
+ return true
+ end
+
+ -- remove entry from the list
+ local idx = 1
+ while idx <= #ts.tc_breaks do
+ local cmp = ts.tc_breaks[idx]
+ if sigd_equal(sigd, cmp) then
+ table.remove(ts.tc_breaks, idx)
+ else
+ idx = idx + 1
+ end
+ end
+ tcbs.ts_id = nil
+
+ --ildb.sync_tcb_neighbors(sigd.p, sigd.s)
+
+ if #ts.tc_breaks == 0 then
+ track_sections[tsid] = nil
+ end
+ end
+ advtrains.interlocking.show_tcb_marker(sigd.p)
+ if tcbs.signal then
+ return false
+ end
+ return true
+end
+
+function ildb.remove_tcb(pos)
+ local pts = advtrains.roundfloorpts(pos)
+ if not track_circuit_breaks[pts] then return end
+ for connid=1,2 do
+ if not ildb.remove_from_interlocking({p=pos, s=connid}) then
+ return false
+ end
+ end
+ track_circuit_breaks[pts] = nil
+ return true
+end
+
+function ildb.dissolve_ts(ts_id)
+ local ts = ildb.get_ts(ts_id)
+ if not ildb.may_modify_ts(ts) then return false end
+ local tcbr = advtrains.merge_tables(ts.tc_breaks)
+ for _,sigd in ipairs(tcbr) do
+ ildb.remove_from_interlocking(sigd)
+ end
+ -- Note: ts gets removed in the moment of the removal of the last TCB.
+ return true
+end
+
+-- Returns true if it is allowed to modify any property of a track section, such as
+-- - removing TCBs
+-- - merging and dissolving sections
+-- As of now the action will be denied if a route is set or if a train is in the section.
+function ildb.may_modify_ts(ts)
+ if ts.route or ts.route_post or (ts.trains and #ts.trains>0) then
+ return false
+ end
+ return true
+end
+
+
+function ildb.may_modify_tcbs(tcbs)
+ if tcbs.ts_id then
+ local ts = ildb.get_ts(tcbs.ts_id)
+ if ts and not ildb.may_modify_ts(ts) then
+ return false
+ end
+ end
+ return true
+end
+
+-- Utilize the traverser to find the track section at the specified position
+-- Returns:
+-- ts_id, origin - the first found ts and the sigd of the found tcb
+-- nil - there were no TCBs in TRAVERSER_MAX range of the position
+-- false - the first found TCB stated End-Of-Interlocking, or track ends were reached
+function ildb.get_ts_at_pos(pos)
+ local node_ok, conns, rhe = advtrains.get_rail_info_at(pos, advtrains.all_tracktypes)
+ if not node_ok then
+ error("get_ts_at_pos but node is NOK: "..minetest.pos_to_string(pos))
+ end
+ local limit_hit = false
+ local found_tcbs = {}
+ for connid, conn in ipairs(conns) do -- Note: a breadth-first-search would be better for performance
+ limit_hit = limit_hit or traverser(found_tcbs, pos, conns, connid, 0, 1)
+ if #found_tcbs >= 1 then
+ local tcbs = ildb.get_tcbs(found_tcbs[1])
+ local ts
+ if tcbs.ts_id then
+ return tcbs.ts_id, found_tcbs[1]
+ else
+ return false
+ end
+ end
+ end
+ if limit_hit then
+ -- there was at least one limit hit
+ return nil
+ else
+ -- all traverser ends were track ends
+ return false
+ end
+end
+
+
+-- returns the sigd the signal at pos belongs to, if this is known
+function ildb.get_sigd_for_signal(pos)
+ local pts = advtrains.roundfloorpts(pos)
+ local sigd = signal_assignments[pts]
+ if sigd then
+ if not ildb.get_tcbs(sigd) then
+ signal_assignments[pts] = nil
+ return nil
+ end
+ return sigd
+ end
+ return nil
+end
+function ildb.set_sigd_for_signal(pos, sigd)
+ local pts = advtrains.roundfloorpts(pos)
+ signal_assignments[pts] = sigd
+end
+
+-- checks if there's any influence point set to this position
+function ildb.is_ip_at(pos)
+ local pts = advtrains.roundfloorpts(pos)
+ if influence_points[pts] then
+ return true
+ end
+ return false
+end
+
+-- checks if a signal is influencing here
+function ildb.get_ip_signal(pts, connid)
+ if influence_points[pts] then
+ return influence_points[pts][connid]
+ end
+end
+
+-- Tries to get aspect to obey here, if there
+-- is a signal ip at this location
+-- auto-clears invalid assignments
+function ildb.get_ip_signal_asp(pts, connid)
+ local p = ildb.get_ip_signal(pts, connid)
+ if p then
+ local asp = advtrains.interlocking.signal_get_aspect(p)
+ if not asp then
+ atlog("Clearing orphaned signal influence point", pts, "/", connid)
+ ildb.clear_ip_signal(pts, connid)
+ return nil
+ end
+ return asp, p
+ end
+ return nil
+end
+
+-- set signal assignment.
+function ildb.set_ip_signal(pts, connid, spos)
+ ildb.clear_ip_by_signalpos(spos)
+ if not influence_points[pts] then
+ influence_points[pts] = {}
+ end
+ influence_points[pts][connid] = spos
+end
+-- clear signal assignment.
+function ildb.clear_ip_signal(pts, connid)
+ influence_points[pts][connid] = nil
+ for _,_ in pairs(influence_points[pts]) do
+ return
+ end
+ influence_points[pts] = nil
+end
+
+function ildb.get_ip_by_signalpos(spos)
+ for pts,tab in pairs(influence_points) do
+ for connid,pos in pairs(tab) do
+ if vector.equals(pos, spos) then
+ return pts, connid
+ end
+ end
+ end
+end
+-- clear signal assignment given the signal position
+function ildb.clear_ip_by_signalpos(spos)
+ local pts, connid = ildb.get_ip_by_signalpos(spos)
+ if pts then ildb.clear_ip_signal(pts, connid) end
+end
+
+
+advtrains.interlocking.db = ildb
+
+
+
+
diff --git a/advtrains/advtrains_interlocking/demosignals.lua b/advtrains/advtrains_interlocking/demosignals.lua
new file mode 100644
index 0000000..ab7a8b6
--- /dev/null
+++ b/advtrains/advtrains_interlocking/demosignals.lua
@@ -0,0 +1,111 @@
+-- Demonstration signals
+-- Those can display the 3 main aspects of Ks signals
+
+-- Note that the group value of advtrains_signal is 2, which means "step 2 of signal capabilities"
+-- advtrains_signal=1 is meant for signals that do not implement set_aspect.
+
+
+local setaspect = function(pos, node, asp)
+ if not asp.main.free then
+ advtrains.ndb.swap_node(pos, {name="advtrains_interlocking:ds_danger"})
+ else
+ if asp.dst.free and asp.main.speed == -1 then
+ advtrains.ndb.swap_node(pos, {name="advtrains_interlocking:ds_free"})
+ else
+ advtrains.ndb.swap_node(pos, {name="advtrains_interlocking:ds_slow"})
+ end
+ end
+ local meta = minetest.get_meta(pos)
+ if meta then
+ meta:set_string("infotext", minetest.serialize(asp))
+ end
+end
+
+local suppasp = {
+ main = {
+ free = nil,
+ speed = {6, -1},
+ },
+ dst = {
+ free = nil,
+ speed = nil,
+ },
+ shunt = {
+ free = false,
+ proceed_as_main = true,
+ },
+ info = {
+ call_on = false,
+ dead_end = false,
+ w_speed = nil,
+ }
+}
+
+minetest.register_node("advtrains_interlocking:ds_danger", {
+ description = "Demo signal at Danger",
+ tiles = {"at_il_signal_asp_danger.png"},
+ groups = {
+ cracky = 3,
+ advtrains_signal = 2,
+ save_in_at_nodedb = 1,
+ },
+ sounds = default.node_sound_stone_defaults(),
+ advtrains = {
+ set_aspect = setaspect,
+ supported_aspects = suppasp,
+ get_aspect = function(pos, node)
+ return advtrains.interlocking.DANGER
+ end,
+ },
+ on_rightclick = advtrains.interlocking.signal_rc_handler,
+ can_dig = advtrains.interlocking.signal_can_dig,
+})
+minetest.register_node("advtrains_interlocking:ds_free", {
+ description = "Demo signal at Free",
+ tiles = {"at_il_signal_asp_free.png"},
+ groups = {
+ cracky = 3,
+ advtrains_signal = 2,
+ save_in_at_nodedb = 1,
+ },
+ sounds = default.node_sound_stone_defaults(),
+ advtrains = {
+ set_aspect = setaspect,
+ supported_aspects = suppasp,
+ get_aspect = function(pos, node)
+ return {
+ main = {
+ free = true,
+ speed = -1,
+ }
+ }
+ end,
+ },
+ on_rightclick = advtrains.interlocking.signal_rc_handler,
+ can_dig = advtrains.interlocking.signal_can_dig,
+})
+minetest.register_node("advtrains_interlocking:ds_slow", {
+ description = "Demo signal at Slow",
+ tiles = {"at_il_signal_asp_slow.png"},
+ groups = {
+ cracky = 3,
+ advtrains_signal = 2,
+ save_in_at_nodedb = 1,
+ },
+ sounds = default.node_sound_stone_defaults(),
+ advtrains = {
+ set_aspect = setaspect,
+ supported_aspects = suppasp,
+ get_aspect = function(pos, node)
+ return {
+ main = {
+ free = true,
+ speed = 6,
+ }
+ }
+ end,
+ },
+ on_rightclick = advtrains.interlocking.signal_rc_handler,
+ can_dig = advtrains.interlocking.signal_can_dig,
+})
+
diff --git a/advtrains/advtrains_interlocking/depends.txt b/advtrains/advtrains_interlocking/depends.txt
new file mode 100644
index 0000000..fdf6b17
--- /dev/null
+++ b/advtrains/advtrains_interlocking/depends.txt
@@ -0,0 +1,2 @@
+advtrains
+advtrains_train_track? \ No newline at end of file
diff --git a/advtrains/advtrains_interlocking/init.lua b/advtrains/advtrains_interlocking/init.lua
new file mode 100644
index 0000000..a2f5882
--- /dev/null
+++ b/advtrains/advtrains_interlocking/init.lua
@@ -0,0 +1,30 @@
+-- Advtrains interlocking system
+-- See database.lua for a detailed explanation
+
+advtrains.interlocking = {}
+
+advtrains.SHUNT_SPEED_MAX = 6
+
+function advtrains.interlocking.sigd_equal(sigd, cmp)
+ return vector.equals(sigd.p, cmp.p) and sigd.s==cmp.s
+end
+
+
+local modpath = minetest.get_modpath(minetest.get_current_modname()) .. DIR_DELIM
+
+dofile(modpath.."database.lua")
+dofile(modpath.."signal_api.lua")
+dofile(modpath.."demosignals.lua")
+dofile(modpath.."train_sections.lua")
+dofile(modpath.."route_prog.lua")
+dofile(modpath.."routesetting.lua")
+dofile(modpath.."tcb_ts_ui.lua")
+dofile(modpath.."route_ui.lua")
+dofile(modpath.."tool.lua")
+
+dofile(modpath.."approach.lua")
+dofile(modpath.."ars.lua")
+dofile(modpath.."tsr_rail.lua")
+
+
+minetest.register_privilege("interlocking", {description = "Can set up track sections, routes and signals.", give_to_singleplayer = true})
diff --git a/advtrains/advtrains_interlocking/models/at_il_tcb_node.obj b/advtrains/advtrains_interlocking/models/at_il_tcb_node.obj
new file mode 100644
index 0000000..bb6aab5
--- /dev/null
+++ b/advtrains/advtrains_interlocking/models/at_il_tcb_node.obj
@@ -0,0 +1,248 @@
+# Blender v2.76 (sub 0) OBJ File: ''
+# www.blender.org
+mtllib at_il_tcb_node.mtl
+o Cube
+v 0.038370 -0.500000 -0.038370
+v 0.038370 -0.500000 0.038370
+v -0.038370 -0.500000 0.038370
+v -0.038370 -0.500000 -0.038370
+v 0.038370 0.098086 -0.038370
+v 0.038370 0.098086 0.038370
+v -0.038370 0.098086 0.038370
+v -0.038370 0.098086 -0.038370
+v -0.182395 0.065479 0.099357
+v -0.182395 0.182395 0.099357
+v -0.182395 0.065479 -0.171034
+v -0.182395 0.182395 -0.171034
+v 0.182395 0.065479 0.099357
+v 0.182395 0.182395 0.099357
+v 0.182395 0.065479 -0.171034
+v 0.182395 0.182395 -0.171034
+v -0.112374 0.070035 -0.139406
+v -0.112374 -0.500000 -0.139406
+v 0.112189 -0.500000 -0.139406
+v 0.112189 0.070035 -0.139406
+v 0.122883 -0.500000 -0.137278
+v 0.122883 0.070035 -0.137278
+v 0.131950 -0.500000 -0.131220
+v 0.131950 0.070035 -0.131220
+v 0.138008 -0.500000 -0.122154
+v 0.138008 0.070035 -0.122154
+v 0.140135 -0.500000 -0.111459
+v 0.140135 0.070035 -0.111459
+v 0.138008 -0.500000 -0.100765
+v 0.138008 0.070035 -0.100765
+v 0.131950 -0.500000 -0.091698
+v 0.131950 0.070035 -0.091698
+v 0.122883 -0.500000 -0.085640
+v 0.122883 0.070035 -0.085640
+v 0.112189 -0.500000 -0.083513
+v 0.112189 0.070035 -0.083513
+v 0.101494 -0.500000 -0.085640
+v 0.101494 0.070035 -0.085640
+v 0.092428 -0.500000 -0.091698
+v 0.092428 0.070035 -0.091698
+v 0.086370 -0.500000 -0.100765
+v 0.086370 0.070035 -0.100765
+v 0.084242 -0.500000 -0.111459
+v 0.084242 0.070035 -0.111459
+v 0.086370 -0.500000 -0.122154
+v 0.086370 0.070035 -0.122154
+v 0.092428 -0.500000 -0.131220
+v 0.092428 0.070035 -0.131220
+v 0.101494 -0.500000 -0.137278
+v 0.101494 0.070035 -0.137278
+v -0.101679 -0.500000 -0.137278
+v -0.101679 0.070035 -0.137278
+v -0.092613 -0.500000 -0.131220
+v -0.092613 0.070035 -0.131220
+v -0.086555 -0.500000 -0.122154
+v -0.086555 0.070035 -0.122154
+v -0.084428 -0.500000 -0.111459
+v -0.084428 0.070035 -0.111459
+v -0.086555 -0.500000 -0.100765
+v -0.086555 0.070035 -0.100765
+v -0.092613 -0.500000 -0.091698
+v -0.092613 0.070035 -0.091698
+v -0.101679 -0.500000 -0.085640
+v -0.101679 0.070035 -0.085640
+v -0.112374 -0.500000 -0.083513
+v -0.112374 0.070035 -0.083513
+v -0.123069 -0.500000 -0.085640
+v -0.123069 0.070035 -0.085640
+v -0.132135 -0.500000 -0.091698
+v -0.132135 0.070035 -0.091698
+v -0.138193 -0.500000 -0.100765
+v -0.138193 0.070035 -0.100765
+v -0.140320 -0.500000 -0.111459
+v -0.140320 0.070035 -0.111459
+v -0.138193 -0.500000 -0.122154
+v -0.138193 0.070035 -0.122154
+v -0.132135 -0.500000 -0.131220
+v -0.132135 0.070035 -0.131220
+v -0.123069 -0.500000 -0.137278
+v -0.123069 0.070035 -0.137278
+vt 0.876073 0.266665
+vt 0.876073 0.977812
+vt 0.784827 0.977812
+vt 0.784827 0.266665
+vt 0.693582 0.977812
+vt 0.693582 0.266665
+vt 0.602336 0.977812
+vt 0.602336 0.266665
+vt 0.967319 0.266665
+vt 0.967319 0.977812
+vt 0.147929 0.032040
+vt 0.469434 0.032040
+vt 0.469434 0.171057
+vt 0.147929 0.171057
+vt 0.903184 0.032040
+vt 0.903184 0.171057
+vt 0.147929 0.032751
+vt 0.469434 0.032751
+vt 0.469434 0.171768
+vt 0.147929 0.171768
+vt 0.903184 0.032751
+vt 0.903183 0.171768
+vt 0.263807 0.270252
+vt 0.585312 0.270252
+vt 0.585312 0.704001
+vt 0.263807 0.704001
+vt 0.584297 0.703059
+vt 0.262792 0.703059
+vt 0.262793 0.269309
+vt 0.584297 0.269309
+vt 0.108472 0.980897
+vt 0.108473 0.303114
+vt 0.121438 0.303114
+vt 0.121438 0.980897
+vt 0.081877 0.980125
+vt 0.081879 0.302342
+vt 0.094844 0.302342
+vt 0.094843 0.980125
+vt 0.095507 0.980897
+vt 0.095508 0.303114
+vt 0.107809 0.302342
+vt 0.107808 0.980125
+vt 0.082541 0.980897
+vt 0.082543 0.303114
+vt 0.120774 0.302342
+vt 0.120774 0.980125
+vt 0.069575 0.980897
+vt 0.069577 0.303114
+vt 0.133739 0.302342
+vt 0.133740 0.980125
+vt 0.056609 0.980897
+vt 0.056612 0.303114
+vt 0.146705 0.302342
+vt 0.146706 0.980125
+vt 0.043643 0.980897
+vt 0.043647 0.303114
+vt 0.159670 0.302342
+vt 0.159672 0.980125
+vt 0.030677 0.980897
+vt 0.030682 0.303113
+vt 0.172635 0.302342
+vt 0.172638 0.980125
+vt 0.017711 0.980897
+vt 0.017717 0.303113
+vt 0.185600 0.302342
+vt 0.185604 0.980125
+vt 0.212200 0.980896
+vt 0.212195 0.303113
+vt 0.225160 0.303113
+vt 0.225166 0.980896
+vt 0.198565 0.302342
+vt 0.198570 0.980125
+vt 0.199234 0.980897
+vt 0.199230 0.303114
+vt 0.211531 0.302342
+vt 0.211536 0.980125
+vt 0.186268 0.980897
+vt 0.186264 0.303114
+vt 0.224496 0.302342
+vt 0.224502 0.980125
+vt 0.173302 0.980897
+vt 0.173299 0.303114
+vt 0.017047 0.980125
+vt 0.017052 0.302342
+vt 0.030018 0.302342
+vt 0.030013 0.980125
+vt 0.134403 0.303114
+vt 0.134404 0.980897
+vt 0.160336 0.980897
+vt 0.160334 0.303114
+vt 0.042983 0.302342
+vt 0.042979 0.980125
+vt 0.147369 0.303114
+vt 0.147370 0.980897
+vt 0.055948 0.302342
+vt 0.055945 0.980125
+vt 0.068911 0.980125
+vt 0.068913 0.302342
+vn 1.000000 0.000000 0.000000
+vn -0.000000 -0.000000 1.000000
+vn -1.000000 -0.000000 -0.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn -0.831500 0.000000 -0.555600
+vn 0.195100 0.000000 -0.980800
+vn -0.980800 0.000000 -0.195100
+vn 0.555600 0.000000 -0.831500
+vn -0.980800 0.000000 0.195100
+vn 0.831500 0.000000 -0.555600
+vn -0.831500 0.000000 0.555600
+vn 0.980800 0.000000 -0.195100
+vn -0.555600 0.000000 0.831500
+vn 0.980800 0.000000 0.195100
+vn -0.195100 0.000000 0.980800
+vn 0.831500 0.000000 0.555600
+vn 0.195100 0.000000 0.980800
+vn 0.555600 0.000000 0.831500
+vn -0.555600 0.000000 -0.831500
+vn -0.195100 0.000000 -0.980800
+usemtl Material
+s off
+f 1/1/1 5/2/1 6/3/1 2/4/1
+f 2/4/2 6/3/2 7/5/2 3/6/2
+f 3/6/3 7/5/3 8/7/3 4/8/3
+f 5/2/4 1/1/4 4/9/4 8/10/4
+f 10/11/3 12/12/3 11/13/3 9/14/3
+f 12/12/4 16/15/4 15/16/4 11/13/4
+f 16/17/1 14/18/1 13/19/1 15/20/1
+f 14/18/2 10/21/2 9/22/2 13/19/2
+f 9/23/5 11/24/5 15/25/5 13/26/5
+f 14/27/6 16/28/6 12/29/6 10/30/6
+f 75/31/7 76/32/7 78/33/7 77/34/7
+f 19/35/8 20/36/8 22/37/8 21/38/8
+f 73/39/9 74/40/9 76/32/9 75/31/9
+f 21/38/10 22/37/10 24/41/10 23/42/10
+f 71/43/11 72/44/11 74/40/11 73/39/11
+f 23/42/12 24/41/12 26/45/12 25/46/12
+f 69/47/13 70/48/13 72/44/13 71/43/13
+f 25/46/14 26/45/14 28/49/14 27/50/14
+f 67/51/15 68/52/15 70/48/15 69/47/15
+f 27/50/16 28/49/16 30/53/16 29/54/16
+f 65/55/17 66/56/17 68/52/17 67/51/17
+f 29/54/18 30/53/18 32/57/18 31/58/18
+f 63/59/19 64/60/19 66/56/19 65/55/19
+f 31/58/20 32/57/20 34/61/20 33/62/20
+f 61/63/20 62/64/20 64/60/20 63/59/20
+f 33/62/19 34/61/19 36/65/19 35/66/19
+f 59/67/18 60/68/18 62/69/18 61/70/18
+f 35/66/17 36/65/17 38/71/17 37/72/17
+f 57/73/16 58/74/16 60/68/16 59/67/16
+f 37/72/15 38/71/15 40/75/15 39/76/15
+f 55/77/14 56/78/14 58/74/14 57/73/14
+f 39/76/13 40/75/13 42/79/13 41/80/13
+f 53/81/12 54/82/12 56/78/12 55/77/12
+f 41/83/11 42/84/11 44/85/11 43/86/11
+f 77/34/21 78/33/21 80/87/21 79/88/21
+f 51/89/10 52/90/10 54/82/10 53/81/10
+f 43/86/9 44/85/9 46/91/9 45/92/9
+f 79/88/22 80/87/22 17/93/22 18/94/22
+f 18/94/8 17/93/8 52/90/8 51/89/8
+f 45/92/7 46/91/7 48/95/7 47/96/7
+f 49/97/22 50/98/22 20/36/22 19/35/22
+f 47/96/21 48/95/21 50/98/21 49/97/21
diff --git a/advtrains/advtrains_interlocking/route_prog.lua b/advtrains/advtrains_interlocking/route_prog.lua
new file mode 100644
index 0000000..eadfd93
--- /dev/null
+++ b/advtrains/advtrains_interlocking/route_prog.lua
@@ -0,0 +1,548 @@
+-- Route programming system
+
+--[[
+Progamming routes:
+1. Select "program new route" in the signalling dialog
+-> route_start marker will appear to designate route-program mode
+2. Do those actions in any order:
+A. punch a TCB marker node to proceed route along this TCB. This will only work if
+ this is actually a TCB bordering the current TS, and will place a
+ route_set marker and shift to the next TS
+B. right-click a turnout to switch it (no impact to route programming
+C. punch a turnout (or some other passive component) to fix its state (toggle)
+ for the route. A sprite telling "Route Fix" will show that fact.
+3. To complete route setting, use the chat command '/at_program_route <route name>'.
+ The last punched TCB will get a 'route end' marker
+ The end of a route should be at another signal facing the same direction as the entrance signal,
+ however this is not enforced and left up to the signal engineer (the programmer)
+
+The route visualization will also be used to visualize routes after they have been programmed.
+]]--
+
+
+-- table with objectRefs
+local markerent = {}
+
+minetest.register_entity("advtrains_interlocking:routemarker", {
+ visual = "mesh",
+ mesh = "trackplane.b3d",
+ textures = {"at_il_route_set.png"},
+ collisionbox = {-1,-0.5,-1, 1,-0.4,1},
+ visual_size = {x=10, y=10},
+ on_punch = function(self)
+ self.object:remove()
+ end,
+ get_staticdata = function() return "STATIC" end,
+ on_activate = function(self, sdata) if sdata=="STATIC" then self.object:remove() end end,
+ static_save = false,
+})
+
+
+-- Spawn or update a route marker entity
+-- pos: position where this is going to be
+-- key: something unique to determine which entity to remove if this was set before
+-- img: texture
+local function routemarker(context, pos, key, img, yaw, itex)
+ if not markerent[context] then
+ markerent[context] = {}
+ end
+ if markerent[context][key] then
+ markerent[context][key]:remove()
+ end
+
+ local obj = minetest.add_entity(vector.add(pos, {x=0, y=0.3, z=0}), "advtrains_interlocking:routemarker")
+ if not obj then return end
+ obj:set_yaw(yaw)
+ obj:set_properties({
+ infotext = itex,
+ textures = {img},
+ })
+
+ markerent[context][key] = obj
+end
+
+minetest.register_entity("advtrains_interlocking:routesprite", {
+ visual = "sprite",
+ textures = {"at_il_turnout_free.png"},
+ collisionbox = {-0.2,-0.2,-0.2, 0.2,0.2,0.2},
+ visual_size = {x=1, y=1},
+ on_punch = function(self)
+ if self.callback then
+ self.callback()
+ end
+ self.object:remove()
+ end,
+ get_staticdata = function() return "STATIC" end,
+ on_activate = function(self, sdata) if sdata=="STATIC" then self.object:remove() end end,
+ static_save = false,
+})
+
+
+-- Spawn or update a route sprite entity
+-- pos: position where this is going to be
+-- key: something unique to determine which entity to remove if this was set before
+-- img: texture
+local function routesprite(context, pos, key, img, itex, callback)
+ if not markerent[context] then
+ markerent[context] = {}
+ end
+ if markerent[context][key] then
+ markerent[context][key]:remove()
+ end
+
+ local obj = minetest.add_entity(vector.add(pos, {x=0, y=0, z=0}), "advtrains_interlocking:routesprite")
+ if not obj then return end
+ obj:set_properties({
+ infotext = itex,
+ textures = {img},
+ })
+
+ if callback then
+ obj:get_luaentity().callback = callback
+ end
+
+ markerent[context][key] = obj
+end
+
+--[[
+Route definition:
+route = {
+ name = <string>
+ [n] = {
+ next = <sigd>, -- of the next (note: next) TCB on the route
+ locks = {<pts> = "state"} -- route locks of this route segment
+ }
+ terminal =
+}
+The first item in the TCB path (namely i=0) is always the start signal of this route,
+so this is left out.
+All subsequent entries, starting from 1, contain:
+- all route locks of the segment on TS between the (i-1). and the i. TCB
+- the next TCB signal describer in proceeding direction of the route.
+'Terminal' once again repeats the "next" entry of the last route segment.
+It is needed for distant signal aspect determination. If it is not set,
+the distant signal aspect is determined as DANGER.
+]]--
+
+local function chat(pname, message)
+ minetest.chat_send_player(pname, "[Route programming] "..message)
+end
+local function clear_lock(locks, pname, pts)
+ locks[pts] = nil
+ chat(pname, pts.." is no longer affected when this route is set.")
+end
+
+local function otherside(s)
+ if s==1 then return 2 else return 1 end
+end
+
+function advtrains.interlocking.clear_visu_context(context)
+ if not markerent[context] then return end
+ for key, obj in pairs(markerent[context]) do
+ obj:remove()
+ end
+ markerent[context] = nil
+end
+
+-- visualize route. 'context' is a string that identifies the context of this visualization
+-- e.g. prog_<player> or vis_<pts> for later visualizations
+-- last 2 parameters are only to be used in the context of route programming!
+function advtrains.interlocking.visualize_route(origin, route, context, tmp_lcks, pname)
+ advtrains.interlocking.clear_visu_context(context)
+
+ local oyaw = 0
+ local onode_ok, oconns, orhe = advtrains.get_rail_info_at(origin.p, advtrains.all_tracktypes)
+ if onode_ok then
+ oyaw = advtrains.dir_to_angle(oconns[origin.s].c)
+ end
+ routemarker(context, origin.p, "rte_origin", "at_il_route_start.png", oyaw, route.name)
+
+ local c_sigd = origin
+ for k,v in ipairs(route) do
+ c_sigd = v.next
+ -- display route path
+ -- Final "next" marker can be EOI, thus undefined. This is legitimate.
+ if c_sigd then
+ local yaw = 0
+ local node_ok, conns, rhe = advtrains.get_rail_info_at(c_sigd.p, advtrains.all_tracktypes)
+ if node_ok then
+ yaw = advtrains.dir_to_angle(conns[c_sigd.s].c)
+ end
+ local img = "at_il_route_set.png"
+ if k==#route and not tmp_lcks then
+ img = "at_il_route_end.png"
+ end
+ routemarker(context, c_sigd.p, "rte"..k, img, yaw, route.name.." #"..k)
+ end
+ -- display locks
+ for pts, state in pairs(v.locks) do
+ local pos = minetest.string_to_pos(pts)
+ routesprite(context, pos, "fix"..k..pts, "at_il_route_lock.png", "Fixed in state '"..state.."' by route "..route.name.." until segment #"..k.." is freed.")
+ end
+ end
+
+ -- The presence of tmp_lcks tells us that we are displaying during route programming.
+ if tmp_lcks then
+ -- display route end markers at appropriate places (check next TS, if it exists)
+ local terminal = c_sigd
+ if terminal then
+ local term_tcbs = advtrains.interlocking.db.get_tcbs(terminal)
+ if term_tcbs.ts_id then
+ local over_ts = advtrains.interlocking.db.get_ts(term_tcbs.ts_id)
+ for i, sigd in ipairs(over_ts.tc_breaks) do
+ if not vector.equals(sigd.p, terminal.p) then
+ local yaw = 0
+ local node_ok, conns, rhe = advtrains.get_rail_info_at(sigd.p, advtrains.all_tracktypes)
+ if node_ok then
+ yaw = advtrains.dir_to_angle(conns[otherside(sigd.s)].c)
+ end
+ routemarker(context, sigd.p, "rteterm"..i, "at_il_route_end.png", yaw, route.name.." Terminal "..i)
+ end
+ end
+ end
+ end
+ -- display locks set by player
+ for pts, state in pairs(tmp_lcks) do
+ local pos = minetest.string_to_pos(pts)
+ routesprite(context, pos, "fixp"..pts, "at_il_route_lock_edit.png", "Fixed in state '"..state.."' by route "..route.name.." (punch to unfix)",
+ function() clear_lock(tmp_lcks, pname, pts) end)
+ end
+ end
+end
+
+
+local player_rte_prog = {}
+
+function advtrains.interlocking.init_route_prog(pname, sigd)
+ if not minetest.check_player_privs(pname, "interlocking") then
+ minetest.chat_send_player(pname, "Insufficient privileges to use this!")
+ return
+ end
+ player_rte_prog[pname] = {
+ origin = sigd,
+ route = {
+ name = "PROG["..pname.."]",
+ },
+ tmp_lcks = {},
+ }
+ advtrains.interlocking.visualize_route(sigd, player_rte_prog[pname].route, "prog_"..pname, player_rte_prog[pname].tmp_lcks, pname)
+ minetest.chat_send_player(pname, "Route programming mode active. Punch TCBs to add route segments, punch turnouts to lock them.")
+end
+
+local function get_last_route_item(origin, route)
+ if #route == 0 then
+ return origin
+ end
+ return route[#route].next
+end
+
+local function do_advance_route(pname, rp, sigd, tsname)
+ table.insert(rp.route, {next = sigd, locks = rp.tmp_lcks})
+ rp.tmp_lcks = {}
+ chat(pname, "Added track section '"..tsname.."' to the route.")
+end
+
+local function finishrpform(pname)
+ local rp = player_rte_prog[pname]
+ if not rp then return end
+
+ local form = "size[7,6]label[0.5,0.5;Finish programming route]"
+ local terminal = get_last_route_item(rp.origin, rp.route)
+ if terminal then
+ local term_tcbs = advtrains.interlocking.db.get_tcbs(terminal)
+
+ if term_tcbs.signal then
+ form = form .. "label[0.5,1.5;Route ends at signal:]"
+ form = form .. "label[0.5,2 ;"..term_tcbs.signal_name.."]"
+ else
+ form = form .. "label[0.5,1.5;WARNING: Route does not end at a signal.]"
+ form = form .. "label[0.5,2 ;Routes should in most cases end at signals.]"
+ form = form .. "label[0.5,2.5;Cancel if you are unsure!]"
+ end
+ else
+ form = form .. "label[0.5,1.5;Route leads into]"
+ form = form .. "label[0.5,2 ;non-interlocked area]"
+ end
+ form = form.."field[0.8,3.5;5.2,1;name;Enter Route Name;]"
+ form = form.."button_exit[0.5,4.5; 5,1;save;Save Route]"
+
+
+ minetest.show_formspec(pname, "at_il_routepf", form)
+end
+
+
+local function check_advance_valid(tcbpos, rp)
+ -- track circuit break, try to advance route over it
+ local lri = get_last_route_item(rp.origin, rp.route)
+ if not lri then
+ return false, false
+ end
+
+ local is_endpoint = false
+
+ local this_sigd, this_ts, adv_side
+
+ if vector.equals(lri.p, tcbpos) then
+ -- If the player just punched the last TCB again, it's of course possible to
+ -- finish the route here (although it can't be advanced by here.
+ -- Fun fact: you can now program routes that end exactly where they begin :)
+ is_endpoint = true
+ this_sigd = lri
+ else
+ -- else, we need to check whether this TS actually borders
+ local start_tcbs = advtrains.interlocking.db.get_tcbs(lri)
+ if not start_tcbs.ts_id then
+ return false, false
+ end
+
+ this_ts = advtrains.interlocking.db.get_ts(start_tcbs.ts_id)
+ for _,sigd in ipairs(this_ts.tc_breaks) do
+ if vector.equals(sigd.p, tcbpos) then
+ adv_side = otherside(sigd.s)
+ end
+ end
+ if not adv_side then
+ -- this TCB is not bordering to the section
+ return false, false
+ end
+ this_sigd = {p=tcbpos, s=adv_side}
+ end
+
+ -- check whether the ts at the other end is capable of "end over"
+ local adv_tcbs = advtrains.interlocking.db.get_tcbs(this_sigd)
+ local next_tsid = adv_tcbs.ts_id
+ local can_over, over_ts, next_tc_bs = false, nil, nil
+ local cannotover_rsn = "Next section is diverging (>2 TCBs)"
+ if next_tsid then
+ -- you may not advance over EOI. While this is technically possible,
+ -- in practise this just enters an unnecessary extra empty route item.
+ over_ts = advtrains.interlocking.db.get_ts(adv_tcbs.ts_id)
+ next_tc_bs = over_ts.tc_breaks
+ can_over = #next_tc_bs <= 2
+ else
+ cannotover_rsn = "End of interlocking"
+ end
+
+ local over_sigd = nil
+ if can_over then
+ if next_tc_bs and #next_tc_bs == 2 then
+ local sdt
+ if vector.equals(next_tc_bs[1].p, tcbpos) then
+ sdt = next_tc_bs[2]
+ end
+ if vector.equals(next_tc_bs[2].p, tcbpos) then
+ sdt = next_tc_bs[1]
+ end
+ if not sdt then
+ error("Inconsistency: "..dump(next_ts))
+ end
+ -- swap TCB direction
+ over_sigd = {p = sdt.p, s = otherside(sdt.s) }
+ end
+ end
+
+ return is_endpoint, true, this_sigd, this_ts, can_over, over_ts, over_sigd, cannotover_rsn
+end
+
+local function show_routing_form(pname, tcbpos, message)
+
+ local rp = player_rte_prog[pname]
+
+ if not rp then return end
+
+ local is_endpoint, advance_valid, this_sigd, this_ts, can_over, over_ts, over_sigd, cannotover_rsn = check_advance_valid(tcbpos, rp)
+
+ -- at this place, advance_valid shows whether the current route can be advanced
+ -- over this TCB.
+ -- If it can:
+ -- Advance over (continue programming)
+ -- End here
+ -- Advance and end (only <=2 TCBs, terminal signal needs to be known)
+ -- if not:
+ -- show nothing at all
+ -- In all cases, Discard and Backtrack buttons needed.
+
+ local form = "size[7,9.5]label[0.5,0.5;Advance/Complete Route]"
+ if message then
+ form = form .. "label[0.5,1;"..message.."]"
+ end
+
+ if advance_valid and not is_endpoint then
+ form = form.. "label[0.5,1.8;Advance to next route section]"
+ form = form.."image_button[0.5,2.2; 5,1;at_il_routep_advance.png;advance;]"
+
+ form = form.. "label[0.5,3.5;-------------------------]"
+ else
+ form = form.. "label[0.5,2.3;This TCB is not suitable as]"
+ form = form.. "label[0.5,2.8;route continuation.]"
+ end
+ if advance_valid or is_endpoint then
+ form = form.. "label[0.5,3.8;Finish route HERE]"
+ form = form.."image_button[0.5, 4.2; 5,1;at_il_routep_end_here.png;endhere;]"
+ if can_over then
+ form = form.. "label[0.5,5.3;Finish route at end of NEXT section]"
+ form = form.."image_button[0.5,5.7; 5,1;at_il_routep_end_over.png;endover;]"
+ else
+ form = form.. "label[0.5,5.3;Advancing over next section is]"
+ form = form.. "label[0.5,5.8;impossible at this place.]"
+ if cannotover_rsn then
+ form = form.. "label[0.5,6.3;"..cannotover_rsn.."]"
+ end
+ end
+ end
+
+ form = form.. "label[0.5,7;-------------------------]"
+ if #rp.route > 0 then
+ form = form.."button[0.5,7.4; 5,1;retract;Step back one section]"
+ end
+ form = form.."button[0.5,8.4; 5,1;cancel;Cancel route programming]"
+
+ minetest.show_formspec(pname, "at_il_rprog_"..minetest.pos_to_string(tcbpos), form)
+end
+
+minetest.register_on_player_receive_fields(function(player, formname, fields)
+ local pname = player:get_player_name()
+
+ local tcbpts = string.match(formname, "^at_il_rprog_([^_]+)$")
+ local tcbpos
+ if tcbpts then
+ tcbpos = minetest.string_to_pos(tcbpts)
+ end
+ if tcbpos then
+ -- RPROG form
+ local rp = player_rte_prog[pname]
+ if not rp then
+ minetest.close_formspec(pname, formname)
+ return
+ end
+
+ local is_endpoint, advance_valid, this_sigd, this_ts, can_over, over_ts, over_sigd = check_advance_valid(tcbpos, rp)
+
+ if advance_valid then
+ if fields.advance then
+ -- advance route
+ if not is_endpoint then
+ do_advance_route(pname, rp, this_sigd, this_ts.name)
+ end
+ end
+ if fields.endhere then
+ if not is_endpoint then
+ do_advance_route(pname, rp, this_sigd, this_ts.name)
+ end
+ finishrpform(pname)
+ end
+ if can_over and fields.endover then
+ if not is_endpoint then
+ do_advance_route(pname, rp, this_sigd, this_ts.name)
+ end
+ do_advance_route(pname, rp, over_sigd, over_ts and over_ts.name or "--EOI--")
+ finishrpform(pname)
+ end
+ end
+ if fields.retract then
+ if #rp.route <= 0 then
+ minetest.close_formspec(pname, formname)
+ return
+ end
+ rp.tmp_locks = rp.route[#rp.route].locks
+ rp.route[#rp.route] = nil
+ chat(pname, "Route section "..(#rp.route+1).." removed.")
+ end
+ if fields.cancel then
+ player_rte_prog[pname] = nil
+ advtrains.interlocking.clear_visu_context("prog_"..pname)
+ chat(pname, "Route discarded.")
+ minetest.close_formspec(pname, formname)
+ return
+ end
+
+ advtrains.interlocking.visualize_route(rp.origin, rp.route, "prog_"..pname, rp.tmp_lcks, pname)
+ minetest.close_formspec(pname, formname)
+ return
+ end
+
+ if formname == "at_il_routepf" then
+ if not fields.save or not fields.name then return end
+ if fields.name == "" then
+ -- show form again
+ finishrpform(pname)
+ return
+ end
+
+ local rp = player_rte_prog[pname]
+ if rp then
+ if #rp.route <= 0 then
+ chat(pname, "Cannot program route without a target")
+ return
+ end
+
+ local tcbs = advtrains.interlocking.db.get_tcbs(rp.origin)
+ if not tcbs then
+ chat(pname, "The origin TCB has become unknown during programming. Try again.")
+ return
+ end
+
+ local terminal = get_last_route_item(rp.origin, rp.route)
+ rp.route.terminal = terminal
+ rp.route.name = fields.name
+
+ table.insert(tcbs.routes, rp.route)
+
+ advtrains.interlocking.clear_visu_context("prog_"..pname)
+ player_rte_prog[pname] = nil
+ chat(pname, "Successfully programmed route.")
+
+ advtrains.interlocking.show_route_edit_form(pname, rp.origin, #tcbs.routes)
+ return
+ end
+ end
+end)
+
+
+-- Central route programming punch callback
+minetest.register_on_punchnode(function(pos, node, player, pointed_thing)
+ local pname = player:get_player_name()
+ if not minetest.check_player_privs(pname, "interlocking") then
+ return
+ end
+ local rp = player_rte_prog[pname]
+ if rp then
+ -- determine what the punched node is
+ if minetest.get_item_group(node.name, "at_il_track_circuit_break") >= 1 then
+ -- get position of the assigned tcb
+ local meta = minetest.get_meta(pos)
+ local tcbpts = meta:get_string("tcb_pos")
+ if tcbpts == "" then
+ chat(pname, "This TCB is unconfigured, you first need to assign it to a rail")
+ return
+ end
+ local tcbpos = minetest.string_to_pos(tcbpts)
+
+ -- show formspec
+
+ show_routing_form(pname, tcbpos)
+
+ advtrains.interlocking.visualize_route(rp.origin, rp.route, "prog_"..pname, rp.tmp_lcks, pname)
+
+ return
+ end
+ if advtrains.is_passive(pos) then
+ local pts = advtrains.roundfloorpts(pos)
+ if rp.tmp_lcks[pts] then
+ clear_lock(rp.tmp_lcks, pname, pts)
+ else
+ local state = advtrains.getstate(pos)
+ rp.tmp_lcks[pts] = state
+ chat(pname, pts.." is held in "..state.." position when this route is set and freed ")
+ end
+ advtrains.interlocking.visualize_route(rp.origin, rp.route, "prog_"..pname, rp.tmp_lcks, pname)
+ return
+ end
+
+ end
+end)
+
+
+--TODO on route setting
+-- routes should end at signals. complete route setting by punching a signal, and command as exceptional route completion
+-- Create simpler way to advance a route to the next tcb/signal on simple sections without turnouts
diff --git a/advtrains/advtrains_interlocking/route_ui.lua b/advtrains/advtrains_interlocking/route_ui.lua
new file mode 100644
index 0000000..71fed09
--- /dev/null
+++ b/advtrains/advtrains_interlocking/route_ui.lua
@@ -0,0 +1,152 @@
+-- route_ui.lua
+-- User interface for showing and editing routes
+
+local atil = advtrains.interlocking
+local ildb = atil.db
+
+-- TODO duplicate
+local lntrans = { "A", "B" }
+local function sigd_to_string(sigd)
+ return minetest.pos_to_string(sigd.p).." / "..lntrans[sigd.s]
+end
+
+
+
+function atil.show_route_edit_form(pname, sigd, routeid)
+
+ if not minetest.check_player_privs(pname, {train_operator=true, interlocking=true}) then
+ minetest.chat_send_player(pname, "Insufficient privileges to use this!")
+ return
+ end
+
+ local tcbs = atil.db.get_tcbs(sigd)
+ if not tcbs then return end
+ local route = tcbs.routes[routeid]
+ if not route then return end
+
+ local form = "size[9,10]label[0.5,0.2;Route overview]"
+ form = form.."field[0.8,1.2;5.2,1;name;Route name;"..minetest.formspec_escape(route.name).."]"
+ form = form.."button[5.5,0.9;1,1;setname;Set]"
+
+ -- construct textlist for route information
+ local tab = {}
+ local function itab(t)
+ tab[#tab+1] = minetest.formspec_escape(string.gsub(t, ",", " "))
+ end
+ itab("TCB "..sigd_to_string(sigd).." ("..tcbs.signal_name..") Route #"..routeid)
+
+ -- this code is partially copy-pasted from routesetting.lua
+ -- we start at the tc designated by signal
+ local c_sigd = sigd
+ local i = 1
+ local c_tcbs, c_ts_id, c_ts, c_rseg, c_lckp
+ while c_sigd and i<=#route do
+ c_tcbs = ildb.get_tcbs(c_sigd)
+ if not c_tcbs then
+ itab("-!- No TCBS at "..sigd_to_string(c_sigd)..". Please reconfigure route!")
+ break
+ end
+ c_ts_id = c_tcbs.ts_id
+ if not c_ts_id then
+ itab("-!- No track section adjacent to "..sigd_to_string(c_sigd)..". Please reconfigure route!")
+ break
+ end
+ c_ts = ildb.get_ts(c_ts_id)
+
+ c_rseg = route[i]
+ c_lckp = {}
+
+ itab(""..i.." Entry "..sigd_to_string(c_sigd).." -> Sec. "..(c_ts and c_ts.name or "-").." -> Exit "..(c_rseg.next and sigd_to_string(c_rseg.next) or "END"))
+
+ if c_rseg.locks then
+ for pts, state in pairs(c_rseg.locks) do
+
+ local pos = minetest.string_to_pos(pts)
+ itab(" Lock: "..pts.." -> "..state)
+ if not advtrains.is_passive(pos) then
+ itab("-!- No passive component at "..pts..". Please reconfigure route!")
+ break
+ end
+ end
+ end
+ -- advance
+ c_sigd = c_rseg.next
+ i = i + 1
+ end
+ if c_sigd then
+ local e_tcbs = ildb.get_tcbs(c_sigd)
+ itab("Route end: "..sigd_to_string(c_sigd).." ("..(e_tcbs and e_tcbs.signal_name or "-")..")")
+ else
+ itab("Route ends on dead-end")
+ end
+
+ form = form.."textlist[0.5,2;7,4;rtelog;"..table.concat(tab, ",").."]"
+
+ form = form.."button[0.5,6;2,1;back;<<< Back to signal]"
+ form = form.."button[3.5,6;2,1;aspect;Signal Aspect]"
+ form = form.."button[5.5,6;2,1;delete;Delete Route]"
+
+ --atdebug(route.ars)
+ form = form.."textarea[1,7.3;5.2,3;ars;ARS Rule List;"..atil.ars_to_text(route.ars).."]"
+ form = form.."button[6,7.7;1,1;savears;Save]"
+
+ minetest.show_formspec(pname, "at_il_routeedit_"..minetest.pos_to_string(sigd.p).."_"..sigd.s.."_"..routeid, form)
+
+end
+
+
+minetest.register_on_player_receive_fields(function(player, formname, fields)
+ local pname = player:get_player_name()
+ if not minetest.check_player_privs(pname, {train_operator=true, interlocking=true}) then
+ return
+ end
+
+ local pts, connids, routeids = string.match(formname, "^at_il_routeedit_([^_]+)_(%d)_(%d+)$")
+ local pos, connid, routeid
+ if pts then
+ pos = minetest.string_to_pos(pts)
+ connid = tonumber(connids)
+ routeid = tonumber(routeids)
+ if not connid or connid<1 or connid>2 then return end
+ if not routeid then return end
+ end
+ if pos and connid and routeid and not fields.quit then
+ local sigd = {p=pos, s=connid}
+ local tcbs = ildb.get_tcbs(sigd)
+ if not tcbs then return end
+ local route = tcbs.routes[routeid]
+ if not route then return end
+
+ if fields.setname and fields.name then
+ route.name = fields.name
+ end
+
+ if fields.aspect then
+ local suppasp = advtrains.interlocking.signal_get_supported_aspects(tcbs.signal)
+
+ local callback = function(pname, asp)
+ route.aspect = asp
+ advtrains.interlocking.show_route_edit_form(pname, sigd, routeid)
+ end
+
+ advtrains.interlocking.show_signal_aspect_selector(pname, suppasp, route.name, callback, route.aspect)
+ return
+ end
+ if fields.delete then
+ -- if something set the route in the meantime, make sure this doesn't break.
+ atil.route.update_route(sigd, tcbs, nil, true)
+ table.remove(tcbs.routes, routeid)
+ advtrains.interlocking.show_signalling_form(sigd, pname)
+ end
+
+ if fields.ars and fields.savears then
+ route.ars = atil.text_to_ars(fields.ars)
+ --atdebug(route.ars)
+ end
+
+ if fields.back then
+ advtrains.interlocking.show_signalling_form(sigd, pname)
+ end
+
+ end
+end)
diff --git a/advtrains/advtrains_interlocking/routesetting.lua b/advtrains/advtrains_interlocking/routesetting.lua
new file mode 100644
index 0000000..575b053
--- /dev/null
+++ b/advtrains/advtrains_interlocking/routesetting.lua
@@ -0,0 +1,357 @@
+-- Setting and clearing routes
+
+-- TODO duplicate
+local lntrans = { "A", "B" }
+local function sigd_to_string(sigd)
+ return minetest.pos_to_string(sigd.p).." / "..lntrans[sigd.s]
+end
+
+local asp_generic_free = {
+ main = {
+ free = true,
+ speed = -1,
+ },
+ shunt = {
+ free = false,
+ },
+ dst = {
+ free = true,
+ speed = -1,
+ },
+ info = {}
+}
+
+local ildb = advtrains.interlocking.db
+local ilrs = {}
+
+local sigd_equal = advtrains.interlocking.sigd_equal
+
+-- table containing locked points
+-- also manual locks (maintenance a.s.o.) are recorded here
+-- [pts] = {
+-- [n] = { [by = <ts_id>], rsn = <human-readable text>, [origin = <sigd>] }
+-- }
+ilrs.rte_locks = {}
+ilrs.rte_callbacks = {
+ ts = {},
+ lck = {}
+}
+
+
+-- main route setting. First checks if everything can be set as designated,
+-- then (if "try" is not set) actually sets it
+-- returns:
+-- true - route can be/was successfully set
+-- false, message, cbts, cblk - something went wrong, what is contained in the message.
+-- cbts: the ts id of the conflicting ts, cblk: the pts of the conflicting component
+function ilrs.set_route(signal, route, try)
+ if not try then
+ local tsuc, trsn, cbts, cblk = ilrs.set_route(signal, route, true)
+ if not tsuc then
+ return false, trsn, cbts, cblk
+ end
+ end
+
+
+ -- we start at the tc designated by signal
+ local c_sigd = signal
+ local first = true
+ local i = 1
+ local rtename = route.name
+ local signalname = ildb.get_tcbs(signal).signal_name
+ local c_tcbs, c_ts_id, c_ts, c_rseg, c_lckp
+ while c_sigd and i<=#route do
+ c_tcbs = ildb.get_tcbs(c_sigd)
+ if not c_tcbs then
+ if not try then atwarn("Did not find TCBS",c_sigd,"while setting route",rtename,"of",signal) end
+ return false, "No TCB found at "..sigd_to_string(c_sigd)..". Please reconfigure route!"
+ end
+ c_ts_id = c_tcbs.ts_id
+ if not c_ts_id then
+ if not try then atwarn("Encountered End-Of-Interlocking while setting route",rtename,"of",signal) end
+ return false, "No track section adjacent to "..sigd_to_string(c_sigd)..". Please reconfigure route!"
+ end
+ c_ts = ildb.get_ts(c_ts_id)
+ c_rseg = route[i]
+ c_lckp = {}
+
+ if c_ts.route then
+ if not try then atwarn("Encountered ts lock during a real run of routesetting routine, at ts=",c_ts_id,"while setting route",rtename,"of",signal) end
+ return false, "Section '"..c_ts.name.."' already has route set from "..sigd_to_string(c_ts.route.origin)..":\n"..c_ts.route.rsn, c_ts_id, nil
+ end
+ if c_ts.trains and #c_ts.trains>0 then
+ if not try then atwarn("Encountered ts occupied during a real run of routesetting routine, at ts=",c_ts_id,"while setting route",rtename,"of",signal) end
+ return false, "Section '"..c_ts.name.."' is occupied!", c_ts_id, nil
+ end
+
+ for pts, state in pairs(c_rseg.locks) do
+ local confl = ilrs.has_route_lock(pts, state)
+
+ local pos = minetest.string_to_pos(pts)
+ if advtrains.is_passive(pos) then
+ local cstate = advtrains.getstate(pos)
+ if cstate ~= state then
+ local confl = ilrs.has_route_lock(pts)
+ if confl then
+ if not try then atwarn("Encountered route lock while a real run of routesetting routine, at position",pts,"while setting route",rtename,"of",signal) end
+ return false, "Lock conflict at "..pts..", Held locked by:\n"..confl, nil, pts
+ elseif not try then
+ advtrains.setstate(pos, state)
+ end
+ end
+ if not try then
+ ilrs.add_route_lock(pts, c_ts_id, "Route '"..rtename.."' from signal '"..signalname.."'", signal)
+ c_lckp[#c_lckp+1] = pts
+ end
+ else
+ if not try then atwarn("Encountered route lock misconfiguration (no passive component) while a real run of routesetting routine, at position",pts,"while setting route",rtename,"of",signal) end
+ return false, "No passive component at "..pts..". Please reconfigure route!"
+ end
+ end
+ -- reserve ts and write locks
+ if not try then
+ local nvar = c_rseg.next
+ if not route[i+1] then
+ -- We shouldn't use the "next" value of the final route segment, because this can lead to accidental route-cancelling of already set routes from another signal.
+ nvar = nil
+ end
+ c_ts.route = {
+ origin = signal,
+ entry = c_sigd,
+ rsn = "Route '"..rtename.."' from signal '"..signalname.."', segment #"..i,
+ first = first,
+ }
+ c_ts.route_post = {
+ locks = c_lckp,
+ next = nvar,
+ }
+ if c_tcbs.signal then
+ c_tcbs.route_committed = true
+ c_tcbs.aspect = route.aspect or asp_generic_free
+ c_tcbs.route_origin = signal
+ advtrains.interlocking.update_signal_aspect(c_tcbs)
+ end
+ end
+ -- advance
+ first = nil
+ c_sigd = c_rseg.next
+ i = i + 1
+ end
+
+ return true
+end
+
+-- Checks whether there is a route lock that prohibits setting the component
+-- to the wanted state. returns string with reasons on conflict
+function ilrs.has_route_lock(pts)
+ -- look this up
+ local e = ilrs.rte_locks[pts]
+ if not e then return nil
+ elseif #e==0 then
+ ilrs.rte_locks[pts] = nil
+ return nil
+ end
+ local txts = {}
+ for _, ent in ipairs(e) do
+ txts[#txts+1] = ent.rsn
+ end
+ return table.concat(txts, "\n")
+end
+
+-- adds route lock for position
+function ilrs.add_route_lock(pts, ts, rsn, origin)
+ ilrs.free_route_locks_indiv(pts, ts, true)
+ local elm = {by=ts, rsn=rsn, origin=origin}
+ if not ilrs.rte_locks[pts] then
+ ilrs.rte_locks[pts] = { elm }
+ else
+ table.insert(ilrs.rte_locks[pts], elm)
+ end
+end
+
+-- adds route lock for position
+function ilrs.add_manual_route_lock(pts, rsn)
+ local elm = {rsn=rsn}
+ if not ilrs.rte_locks[pts] then
+ ilrs.rte_locks[pts] = { elm }
+ else
+ table.insert(ilrs.rte_locks[pts], elm)
+ end
+end
+
+-- frees route locking for all points (components) that were set by this ts
+function ilrs.free_route_locks(ts, lcks, nocallbacks)
+ for _,pts in pairs(lcks) do
+ ilrs.free_route_locks_indiv(pts, ts, nocallbacks)
+ end
+end
+
+function ilrs.free_route_locks_indiv(pts, ts, nocallbacks)
+ local e = ilrs.rte_locks[pts]
+ if not e then return nil
+ elseif #e==0 then
+ ilrs.rte_locks[pts] = nil
+ return nil
+ end
+ local i = 1
+ while i <= #e do
+ if e[i].by == ts then
+ --atdebug("free_route_locks_indiv",pts,"clearing entry",e[i].by,e[i].rsn)
+ table.remove(e,i)
+ else
+ i = i + 1
+ end
+ end
+ -- This must be delayed, because this code is executed in-between a train step
+ -- TODO use luaautomation timers?
+ if not nocallbacks then
+ minetest.after(0, ilrs.update_waiting, "lck", pts)
+ minetest.after(0.5, advtrains.set_fallback_state, minetest.string_to_pos(pts))
+ end
+end
+-- frees all route locks, even manual ones set with the tool, at a specific position
+function ilrs.remove_route_locks(pts, nocallbacks)
+ ilrs.rte_locks[pts] = nil
+ -- This must be delayed, because this code is executed in-between a train step
+ -- TODO use luaautomation timers?
+ if not nocallbacks then
+ minetest.after(0, ilrs.update_waiting, "lck", pts)
+ end
+end
+
+
+-- starting from the designated sigd, clears all subsequent route and route_post
+-- information from the track sections.
+-- note that this does not clear the routesetting status from the entry signal,
+-- only from the ts's
+function ilrs.cancel_route_from(sigd)
+ -- we start at the tc designated by signal
+ local c_sigd = sigd
+ local c_tcbs, c_ts_id, c_ts, c_rseg, c_lckp
+ while c_sigd do
+ --atdebug("cancel_route_from: at sigd",c_sigd)
+ c_tcbs = ildb.get_tcbs(c_sigd)
+ if not c_tcbs then
+ atwarn("Failed to cancel route, no TCBS at",c_sigd)
+ return false
+ end
+
+ --atdebug("cancelling",c_ts.route.rsn)
+ -- clear signal aspect and routesetting state
+ c_tcbs.route_committed = nil
+ c_tcbs.aspect = nil
+ c_tcbs.routeset = nil
+ c_tcbs.route_auto = nil
+ c_tcbs.route_origin = nil
+
+ advtrains.interlocking.update_signal_aspect(c_tcbs)
+
+ c_ts_id = c_tcbs.ts_id
+ if not c_tcbs then
+ atwarn("Failed to cancel route, end of interlocking at",c_sigd)
+ return false
+ end
+ c_ts = ildb.get_ts(c_ts_id)
+
+ if not c_ts
+ or not c_ts.route
+ or not sigd_equal(c_ts.route.entry, c_sigd) then
+ --atdebug("cancel_route_from: abort (eoi/no route):")
+ return false
+ end
+
+ c_ts.route = nil
+
+ if c_ts.route_post then
+ advtrains.interlocking.route.free_route_locks(c_ts_id, c_ts.route_post.locks)
+ c_sigd = c_ts.route_post.next
+ else
+ c_sigd = nil
+ end
+ c_ts.route_post = nil
+ minetest.after(0, advtrains.interlocking.route.update_waiting, "ts", c_ts_id)
+ end
+ --atdebug("cancel_route_from: done (no final sigd)")
+ return true
+end
+
+-- TCBS Routesetting helper: generic update function for
+-- route setting
+-- Call this function to set and cancel routes!
+-- sigd, tcbs: self-explanatory
+-- newrte: If a new route should be set, the route index of it (in tcbs.routes). nil otherwise
+-- cancel: true in combination with newrte=nil causes cancellation of the current route.
+function ilrs.update_route(sigd, tcbs, newrte, cancel)
+ --atdebug("Update_Route for",sigd,tcbs.signal_name)
+ local has_changed_aspect = false
+ if tcbs.route_origin and not sigd_equal(tcbs.route_origin, sigd) then
+ --atdebug("Signal not in control, held by",tcbs.signal_name)
+ return
+ end
+ if (newrte and tcbs.routeset and tcbs.routeset ~= newrte) or cancel then
+ if tcbs.route_committed then
+ --atdebug("Cancelling:",tcbs.routeset)
+ advtrains.interlocking.route.cancel_route_from(sigd)
+ end
+ tcbs.route_committed = nil
+ tcbs.aspect = nil
+ has_changed_aspect = true
+ tcbs.routeset = nil
+ tcbs.route_auto = nil
+ tcbs.route_rsn = nil
+ end
+ if newrte or tcbs.routeset then
+ if tcbs.route_committed then
+ return
+ end
+ if newrte then tcbs.routeset = newrte end
+ --atdebug("Setting:",tcbs.routeset)
+ local succ, rsn, cbts, cblk = ilrs.set_route(sigd, tcbs.routes[tcbs.routeset])
+ if not succ then
+ tcbs.route_rsn = rsn
+ --atdebug("Routesetting failed:",rsn)
+ -- add cbts or cblk to callback table
+ if cbts then
+ --atdebug("cbts =",cbts)
+ if not ilrs.rte_callbacks.ts[cbts] then ilrs.rte_callbacks.ts[cbts]={} end
+ advtrains.insert_once(ilrs.rte_callbacks.ts[cbts], sigd, sigd_equal)
+ end
+ if cblk then
+ --atdebug("cblk =",cblk)
+ if not ilrs.rte_callbacks.lck[cblk] then ilrs.rte_callbacks.lck[cblk]={} end
+ advtrains.insert_once(ilrs.rte_callbacks.lck[cblk], sigd, sigd_equal)
+ end
+ else
+ --atdebug("Committed Route:",tcbs.routeset)
+ has_changed_aspect = true
+ end
+ end
+ if has_changed_aspect then
+ -- FIX: prevent an minetest.after() loop caused by update_signal_aspect dispatching path invalidation, which in turn calls ARS again
+ advtrains.interlocking.update_signal_aspect(tcbs)
+ end
+ advtrains.interlocking.update_player_forms(sigd)
+end
+
+-- Try to re-set routes that conflicted with this point
+-- sys can be one of "ts" and "lck"
+-- key is then ts_id or pts respectively
+function ilrs.update_waiting(sys, key)
+ --atdebug("update_waiting:",sys,".",key)
+ local t = ilrs.rte_callbacks[sys][key]
+ ilrs.rte_callbacks[sys][key] = nil
+ if t then
+ for _,sigd in ipairs(t) do
+ --atdebug("Updating", sigd)
+ -- While these are run, the table we cleared before may be populated again, which is in our interest.
+ -- (that's the reason we needed to copy it)
+ local tcbs = ildb.get_tcbs(sigd)
+ if tcbs then
+ ilrs.update_route(sigd, tcbs)
+ end
+ end
+ end
+end
+
+advtrains.interlocking.route = ilrs
+
diff --git a/advtrains/advtrains_interlocking/settingtypes.txt b/advtrains/advtrains_interlocking/settingtypes.txt
new file mode 100644
index 0000000..f1c22b0
--- /dev/null
+++ b/advtrains/advtrains_interlocking/settingtypes.txt
@@ -0,0 +1,4 @@
+# Stop trains forcibly in front of signal when about to run over an LZB 0 restriction, instead of setting emergency halt for manual resolving
+# This prevents the need to manually restart trains that overran red signals, but is unrealistic.
+# This is a workaround to circumvent system breakages due to bugs in LZB braking curves
+at_il_force_lzb_halt (Force LZB Halt) bool true
diff --git a/advtrains/advtrains_interlocking/signal_api.lua b/advtrains/advtrains_interlocking/signal_api.lua
new file mode 100644
index 0000000..9729195
--- /dev/null
+++ b/advtrains/advtrains_interlocking/signal_api.lua
@@ -0,0 +1,546 @@
+-- Signal API implementation
+
+
+--[[
+Signal aspect table:
+asp = {
+ main = {
+ free = <boolean>,
+ speed = <int km/h>,
+ },
+ shunt = {
+ free = <boolean>,
+ -- Whether train may proceed as shunt move, on sight
+ -- main aspect takes precedence over this
+ proceed_as_main = <boolean>,
+ -- If an approaching train is a shunt move and "main.free" is set,
+ -- the train may proceed as a train move under the "main" aspect
+ -- If this is not set, shunt moves are NOT allowed to switch to
+ -- a train move, and must stop even if "main.free" is set.
+ -- This is intended to be used for "Halt for shunt moves" signs.
+ }
+ dst = {
+ free = <boolean>,
+ speed = <int km/h>,
+ }
+ info = {
+ call_on = <boolean>, -- Call-on route, expect train in track ahead (not implemented yet)
+ dead_end = <boolean>, -- Route ends on a dead end (e.g. bumper) (not implemented yet)
+ w_speed = <integer>,
+ -- "Warning speed restriction". Supposed for short-term speed
+ -- restrictions which always override any other restrictions
+ -- imposed by "speed" fields, until lifted by a value of -1
+ -- (Example: german Langsamfahrstellen-Signale)
+ }
+}
+-- For "speed" and "w_speed" fields, a value of -1 means that the
+-- restriction is lifted. If they are omitted, the value imposed at
+-- the last aspect received remains valid.
+-- The "dst" subtable can be completely omitted when no explicit dst
+-- aspect should be signalled to the train. In this case, the last
+-- signalled dst aspect remains valid.
+
+== How signals actually work in here ==
+Each signal (in the advtrains universe) is some node that has at least the
+following things:
+- An "influence point" that is set somewhere on a rail
+- An aspect which trains that pass the "influence point" have to obey
+
+There can be static and dynamic signals. Static signals are, roughly
+spoken, signs, while dynamic signals are "real" signals which can display
+different things.
+
+The node definition of a signal node should contain those fields:
+groups = {
+ advtrains_signal = 2,
+ save_in_at_nodedb = 1,
+}
+advtrains = {
+ set_aspect = function(pos, node, asp)
+ -- This function gets called whenever the signal should display
+ -- a new or changed signal aspect. It is not required that
+ -- the signal actually displays the exact same aspect, since
+ -- some signals can not do this by design.
+ -- Example: pure shunt signals can not display a "main" aspect
+ -- and have no effect on train moves, so they will only ever
+ -- honor the shunt.free field for their aspect.
+ -- In turn, it is not guaranteed that the aspect will fulfill the
+ -- criteria put down in supported_aspects.
+ -- If set_aspect is present, supported_aspects should also be declared.
+
+ -- The aspect passed in here can always be queried using the
+ -- advtrains.interlocking.signal_get_supposed_aspect(pos) function.
+ -- It is always DANGER when the signal is not used as route signal.
+
+ -- For static signals, this function should be completely omitted
+ -- If this function is omitted, it won't be possible to use
+ -- route setting on this signal.
+ end,
+ supported_aspects = {
+ -- A table which tells which different types of aspects this signal
+ -- is able to display. It is used to construct the "aspect editing"
+ -- formspec for route programming (and others) It should always be
+ -- present alongside with set_aspect. If this is not specified but
+ -- set_aspect is, the user will be allowed to select any aspect.
+ -- Any of the fields marked with <boolean/nil> support 3 types of values:
+ nil: if this signal can switch between free/blocked
+ false: always shows "blocked", unchangable
+ true: always shows "free", unchangable
+ -- Any of the "speed" fields should contain a list of possible values
+ -- to be set as restriction. If omitted, this signal should never
+ -- set the corresponding "speed" field in the aspect, which means
+ -- that the previous speed limit stays valid
+ -- If your signal can only display a single speed (may it be -1),
+ -- always enclose that single value into a list. (such as {-1})
+ main = {
+ free = <boolean/nil>,
+ speed = {<speed1>, ..., <speedn>} or nil,
+ },
+ dst = {
+ free = <boolean/nil>,
+ speed = {<speed1>, ..., <speedn>} or nil,
+ },
+ shunt = {
+ free = <boolean/nil>,
+ },
+ info = {
+ call_on = <boolean/nil>,
+ dead_end = <boolean/nil>,
+ w_speed = {<speed1>, ..., <speedn>} or nil,
+ }
+
+ },
+ get_aspect = function(pos, node)
+ -- This function gets called by the train safety system. It
+ should return the aspect that this signal actually displays,
+ not preferably the input of set_aspect.
+ -- For regular, full-featured light signals, they will probably
+ honor all entries in the original aspect, however, e.g.
+ simple shunt signals always return main.free=true regardless of
+ the set_aspect input because they can not signal "Halt" to
+ train moves.
+ -- advtrains.interlocking.DANGER contains a default "all-danger" aspect.
+ -- If your signal does not cover certain sub-tables of the aspect,
+ the following reasonable defaults are automatically assumed:
+ main = {
+ free = true,
+ }
+ dst = {
+ free = true,
+ }
+ shunt = {
+ free = false,
+ proceed_as_main = false,
+ }
+ end,
+}
+on_rightclick = advtrains.interlocking.signal_rc_handler
+can_dig = advtrains.interlocking.signal_can_dig
+after_dig_node = advtrains.interlocking.signal_after_dig
+
+(If you need to specify custom can_dig or after_dig_node callbacks,
+please call those functions anyway!)
+
+Important note: If your signal should support external ways to set its
+aspect (e.g. via mesecons), there are some things that need to be considered:
+- advtrains.interlocking.signal_get_supposed_aspect(pos) won't respect this
+- Whenever you change the signal aspect, and that aspect change
+did not happen through a call to
+advtrains.interlocking.signal_set_aspect(pos, asp), you are
+*required* to call this function:
+advtrains.interlocking.signal_on_aspect_changed(pos)
+in order to notify trains about the aspect change.
+This function will query get_aspect to retrieve the new aspect.
+
+]]--
+
+local DANGER = {
+ main = {
+ free = false,
+ speed = 0,
+ },
+ shunt = {
+ free = false,
+ },
+ dst = {
+ free = false,
+ speed = 0,
+ },
+ info = {}
+}
+advtrains.interlocking.DANGER = DANGER
+
+local function fillout_aspect(asp)
+ if not asp.main then
+ asp.main = {
+ free = true,
+ }
+ elseif type(asp.main) ~= "table" then
+ asp.main = {
+ free = asp.main~=0,
+ speed = asp.main,
+ }
+ end
+ if not asp.dst then
+ asp.dst = {
+ free = true,
+ }
+ end
+ if not asp.shunt then
+ asp.shunt = {
+ free = false,
+ proceed_as_main = false,
+ }
+ elseif type(asp.shunt) ~= "table" then
+ asp.shunt = {
+ free = asp.shunt,
+ proceed_as_main = asp.proceed_as_main,
+ }
+ end
+ if not asp.info then
+ asp.info = {}
+ end
+end
+
+function advtrains.interlocking.update_signal_aspect(tcbs)
+ if tcbs.signal then
+ local asp = tcbs.aspect or DANGER
+ advtrains.interlocking.signal_set_aspect(tcbs.signal, asp)
+ end
+end
+
+function advtrains.interlocking.signal_can_dig(pos)
+ return not advtrains.interlocking.db.get_sigd_for_signal(pos)
+end
+
+function advtrains.interlocking.signal_after_dig(pos)
+ -- clear influence point
+ advtrains.interlocking.db.clear_ip_by_signalpos(pos)
+end
+
+function advtrains.interlocking.signal_set_aspect(pos, asp)
+ fillout_aspect(asp)
+ local node=advtrains.ndb.get_node(pos)
+ local ndef=minetest.registered_nodes[node.name]
+ if ndef and ndef.advtrains and ndef.advtrains.set_aspect then
+ ndef.advtrains.set_aspect(pos, node, asp)
+ advtrains.interlocking.signal_on_aspect_changed(pos)
+ end
+end
+
+-- should be called when aspect has changed on this signal.
+function advtrains.interlocking.signal_on_aspect_changed(pos)
+ local ipts, iconn = advtrains.interlocking.db.get_ip_by_signalpos(pos)
+ if not ipts then return end
+ local ipos = minetest.string_to_pos(ipts)
+
+ local tns = advtrains.occ.get_trains_over(ipos)
+ for id, sidx in pairs(tns) do
+-- local train = advtrains.trains[id]
+ --if train.index <= sidx then
+ minetest.after(0, advtrains.invalidate_path, id)
+ --end
+ end
+end
+
+function advtrains.interlocking.signal_rc_handler(pos, node, player, itemstack, pointed_thing)
+ local pname = player:get_player_name()
+ local sigd = advtrains.interlocking.db.get_sigd_for_signal(pos)
+ if sigd then
+ advtrains.interlocking.show_signalling_form(sigd, pname)
+ else
+ local ndef = minetest.registered_nodes[node.name]
+ if ndef.advtrains and ndef.advtrains.set_aspect then
+ -- permit to set aspect manually
+ minetest.show_formspec(pname, "at_il_sigasp_"..minetest.pos_to_string(pos), "field[aspect;Set Aspect ('A' to assign IP);D0D0D]")
+ else
+ --static signal - only IP
+ advtrains.interlocking.show_ip_form(pos, pname)
+ end
+ end
+end
+
+minetest.register_on_player_receive_fields(function(player, formname, fields)
+ local pname = player:get_player_name()
+ local pts = string.match(formname, "^at_il_sigasp_(.+)$")
+ local pos
+ if pts then pos = minetest.string_to_pos(pts) end
+ if pos and fields.aspect then
+ if fields.aspect == "A" then
+ advtrains.interlocking.show_ip_form(pos, pname)
+ return
+ end
+ local mfs, msps, dfs, dsps, shs = string.match(fields.aspect, "^([FD])([-0-9]+)([FD])([-0-9]+)([FD])$")
+ local asp = {
+ main = {
+ free = mfs=="F",
+ speed = tonumber(msps),
+ },
+ shunt = {
+ free = shs=="F",
+ },
+ dst = {
+ free = dfs=="F",
+ speed = tonumber(dsps),
+ },
+ info = {
+ call_on = false, -- Call-on route, expect train in track ahead
+ dead_end = false, -- Route ends on a dead end (e.g. bumper)
+ }
+ }
+ advtrains.interlocking.signal_set_aspect(pos, asp)
+ end
+end)
+
+-- Returns the aspect the signal at pos is supposed to show
+function advtrains.interlocking.signal_get_supposed_aspect(pos)
+ local sigd = advtrains.interlocking.db.get_sigd_for_signal(pos)
+ if sigd then
+ local tcbs = advtrains.interlocking.db.get_tcbs(sigd)
+ if tcbs.aspect then
+ return tcbs.aspect
+ end
+ end
+ return DANGER;
+end
+
+-- Returns the actual aspect of the signal at position, as returned by the nodedef.
+-- returns nil when there's no signal at the position
+function advtrains.interlocking.signal_get_aspect(pos)
+ local node=advtrains.ndb.get_node(pos)
+ local ndef=minetest.registered_nodes[node.name]
+ if ndef and ndef.advtrains and ndef.advtrains.get_aspect then
+ local asp = ndef.advtrains.get_aspect(pos, node)
+ if not asp then asp = DANGER end
+ fillout_aspect(asp)
+ return asp
+ end
+ return nil
+end
+
+-- Returns the "supported_aspects" of the signal at position, as returned by the nodedef.
+-- returns nil when there's no signal at the position
+function advtrains.interlocking.signal_get_supported_aspects(pos)
+ local node=advtrains.ndb.get_node(pos)
+ local ndef=minetest.registered_nodes[node.name]
+ if ndef and ndef.advtrains and ndef.advtrains.supported_aspects then
+ local asp = ndef.advtrains.supported_aspects
+ return asp
+ end
+ return nil
+end
+
+local players_assign_ip = {}
+
+local function ipmarker(ipos, connid)
+ local node_ok, conns, rhe = advtrains.get_rail_info_at(ipos, advtrains.all_tracktypes)
+ if not node_ok then return end
+ local yaw = advtrains.dir_to_angle(conns[connid].c)
+
+ -- using tcbmarker here
+ local obj = minetest.add_entity(vector.add(ipos, {x=0, y=0.2, z=0}), "advtrains_interlocking:tcbmarker")
+ if not obj then return end
+ obj:set_yaw(yaw)
+ obj:set_properties({
+ textures = { "at_il_signal_ip.png" },
+ })
+end
+
+-- shows small info form for signal IP state/assignment
+-- only_notset: show only if it is not set yet (used by signal tcb assignment)
+function advtrains.interlocking.show_ip_form(pos, pname, only_notset)
+ if not minetest.check_player_privs(pname, "interlocking") then
+ return
+ end
+ local form = "size[7,5]label[0.5,0.5;Signal at "..minetest.pos_to_string(pos).."]"
+ local pts, connid = advtrains.interlocking.db.get_ip_by_signalpos(pos)
+ if pts then
+ form = form.."label[0.5,1.5;Influence point is set at "..pts.."/"..connid.."]"
+ form = form.."button_exit[0.5,2.5; 5,1;set;Move]"
+ form = form.."button_exit[0.5,3.5; 5,1;clear;Clear]"
+ local ipos = minetest.string_to_pos(pts)
+ ipmarker(ipos, connid)
+ else
+ form = form.."label[0.5,1.5;Influence point is not set.]"
+ form = form.."label[0.5,2.0;It is recommended to set an influence point.]"
+ form = form.."label[0.5,2.5;This is the point where trains will obey the signal.]"
+
+ form = form.."button_exit[0.5,3.5; 5,1;set;Set]"
+ end
+ if not only_notset or not pts then
+ minetest.show_formspec(pname, "at_il_ipassign_"..minetest.pos_to_string(pos), form)
+ end
+end
+
+minetest.register_on_player_receive_fields(function(player, formname, fields)
+ local pname = player:get_player_name()
+ if not minetest.check_player_privs(pname, {train_operator=true, interlocking=true}) then
+ return
+ end
+ local pts = string.match(formname, "^at_il_ipassign_([^_]+)$")
+ local pos
+ if pts then
+ pos = minetest.string_to_pos(pts)
+ end
+ if pos then
+ if fields.set then
+ advtrains.interlocking.signal_init_ip_assign(pos, pname)
+ elseif fields.clear then
+ advtrains.interlocking.db.clear_ip_by_signalpos(pos)
+ end
+ end
+end)
+
+-- inits the signal IP assignment process
+function advtrains.interlocking.signal_init_ip_assign(pos, pname)
+ if not minetest.check_player_privs(pname, "interlocking") then
+ minetest.chat_send_player(pname, "Insufficient privileges to use this!")
+ return
+ end
+ --remove old IP
+ --advtrains.interlocking.db.clear_ip_by_signalpos(pos)
+ minetest.chat_send_player(pname, "Configuring Signal: Please look in train's driving direction and punch rail to set influence point.")
+
+ players_assign_ip[pname] = pos
+end
+
+minetest.register_on_punchnode(function(pos, node, player, pointed_thing)
+ local pname = player:get_player_name()
+ if not minetest.check_player_privs(pname, "interlocking") then
+ return
+ end
+ -- IP assignment
+ local signalpos = players_assign_ip[pname]
+ if signalpos then
+ if vector.distance(pos, signalpos)<=50 then
+ local node_ok, conns, rhe = advtrains.get_rail_info_at(pos, advtrains.all_tracktypes)
+ if node_ok and #conns == 2 then
+
+ local yaw = player:get_look_horizontal()
+ local plconnid = advtrains.yawToClosestConn(yaw, conns)
+
+ -- add assignment if not already present.
+ local pts = advtrains.roundfloorpts(pos)
+ if not advtrains.interlocking.db.get_ip_signal_asp(pts, plconnid) then
+ advtrains.interlocking.db.set_ip_signal(pts, plconnid, signalpos)
+ ipmarker(pos, plconnid)
+ minetest.chat_send_player(pname, "Configuring Signal: Successfully set influence point")
+ else
+ minetest.chat_send_player(pname, "Configuring Signal: Influence point of another signal is already present!")
+ end
+ else
+ minetest.chat_send_player(pname, "Configuring Signal: This is not a normal two-connection rail! Aborted.")
+ end
+ else
+ minetest.chat_send_player(pname, "Configuring Signal: Node is too far away. Aborted.")
+ end
+ players_assign_ip[pname] = nil
+ end
+end)
+
+
+--== aspect selector ==--
+
+local players_aspsel = {}
+
+--[[
+suppasp: "supported_aspects" table
+purpose: form title string
+callback: func(pname, aspect) called on form submit
+]]
+function advtrains.interlocking.show_signal_aspect_selector(pname, p_suppasp, p_purpose, callback, p_isasp)
+ local suppasp = p_suppasp or {
+ main = {}, dst = {}, shunt = {}, info = {},
+ }
+ local purpose = p_purpose or ""
+ local isasp = p_isasp and fillout_aspect(p_isasp)
+
+ local form = "size[7,5]label[0.5,0.5;Select Signal Aspect:]"
+ form = form.."label[0.5,1;"..purpose.."]"
+
+ form = form.."label[0.5,1.5;== Main Signal ==]"
+ if suppasp.main.free == nil then
+ local st = 2
+ if isasp and not isasp.main.free then st=1 end
+ form = form.."dropdown[0.5,2;2;main_free;danger,free;"..st.."]"
+ end
+ if suppasp.main.speed then
+ local selid = 1
+ if isasp and isasp.main.speed then
+ for idx, spv in ipairs(suppasp.main.speed) do
+ if spv == isasp.main.speed then
+ selid = idx
+ break
+ end
+ end
+ end
+ form = form.."label[2.3,1;Speed:]"
+ form = form.."dropdown[3,2;2;main_speed;"..table.concat(suppasp.main.speed, ",")..";"..selid.."]"
+ end
+
+ form = form.."label[0.5,3;== Shunting ==]"
+ if suppasp.shunt.free == nil then
+ local st = 1
+ if isasp and isasp.shunt.free then st=2 end
+ form = form.."dropdown[0.5,3.5;2;shunt_free;---,allowed;"..st.."]"
+ end
+
+ form = form.."button_exit[0.5,4.5; 5,1;save;OK]"
+
+ local token = advtrains.random_id()
+
+ minetest.show_formspec(pname, "at_il_sigaspdia_"..token, form)
+
+ minetest.after(1, function()
+ players_aspsel[pname] = {
+ suppasp = suppasp,
+ callback = callback,
+ token = token,
+ }
+ end)
+end
+
+local function usebool(sup, val, free)
+ if sup == nil then
+ return val==free
+ else
+ return sup
+ end
+end
+local function usespeed(sup, val)
+ if sup then
+ return tonumber(val)
+ else
+ return nil
+ end
+end
+
+-- TODO use non-hacky way to parse outputs
+
+minetest.register_on_player_receive_fields(function(player, formname, fields)
+ local pname = player:get_player_name()
+ local psl = players_aspsel[pname]
+ if psl then
+ if formname == "at_il_sigaspdia_"..psl.token then
+ if fields.save then
+ local asp = {
+ main = {
+ free = usebool(psl.suppasp.main.free, fields.main_free, "free"),
+ speed = usespeed(psl.suppasp.main.speed, fields.main_speed),
+ },
+ dst = {
+ free = true, speed = -1,
+ },
+ shunt = {
+ free = usebool(psl.suppasp.shunt.free, fields.shunt_free, "allowed"),
+ },
+ info = {}
+ }
+ psl.callback(pname, asp)
+ end
+ else
+ players_aspsel[pname] = nil
+ end
+ end
+
+end)
diff --git a/advtrains/advtrains_interlocking/tcb_ts_ui.lua b/advtrains/advtrains_interlocking/tcb_ts_ui.lua
new file mode 100644
index 0000000..da318a7
--- /dev/null
+++ b/advtrains/advtrains_interlocking/tcb_ts_ui.lua
@@ -0,0 +1,789 @@
+-- Track Circuit Breaks and Track Sections - Player interaction
+
+local players_assign_tcb = {}
+local players_assign_signal = {}
+local players_link_ts = {}
+
+local ildb = advtrains.interlocking.db
+local ilrs = advtrains.interlocking.route
+
+local sigd_equal = advtrains.interlocking.sigd_equal
+
+local lntrans = { "A", "B" }
+
+local function sigd_to_string(sigd)
+ return minetest.pos_to_string(sigd.p).." / "..lntrans[sigd.s]
+end
+
+minetest.register_node("advtrains_interlocking:tcb_node", {
+ drawtype = "mesh",
+ paramtype="light",
+ paramtype2="facedir",
+ walkable = false,
+ selection_box = {
+ type = "fixed",
+ fixed = {-1/6, -1/2, -1/6, 1/6, 1/4, 1/6},
+ },
+ mesh = "at_il_tcb_node.obj",
+ tiles = {"at_il_tcb_node.png"},
+ description="Track Circuit Break",
+ sunlight_propagates=true,
+ groups = {
+ cracky=3,
+ not_blocking_trains=1,
+ --save_in_at_nodedb=2,
+ at_il_track_circuit_break = 1,
+ },
+ after_place_node = function(pos, node, player)
+ local meta = minetest.get_meta(pos)
+ meta:set_string("infotext", "Unconfigured Track Circuit Break, right-click to assign.")
+ end,
+ on_rightclick = function(pos, node, player)
+ local pname = player:get_player_name()
+ if not minetest.check_player_privs(pname, "interlocking") then
+ minetest.chat_send_player(pname, "Insufficient privileges to use this!")
+ return
+ end
+
+ local meta = minetest.get_meta(pos)
+ local tcbpts = meta:get_string("tcb_pos")
+ if tcbpts ~= "" then
+ local tcbpos = minetest.string_to_pos(tcbpts)
+ local tcb = ildb.get_tcb(tcbpos)
+ if tcb then
+ advtrains.interlocking.show_tcb_form(tcbpos, pname)
+ else
+ minetest.chat_send_player(pname, "This TCB has been removed. Please dig marker.")
+ end
+ else
+ --unconfigured
+ minetest.chat_send_player(pname, "Configuring TCB: Please punch the rail you want to assign this TCB to.")
+
+ players_assign_tcb[pname] = pos
+ end
+ end,
+ --on_punch = function(pos, node, player)
+ -- local meta = minetest.get_meta(pos)
+ -- local tcbpts = meta:get_string("tcb_pos")
+ -- if tcbpts ~= "" then
+ -- local tcbpos = minetest.string_to_pos(tcbpts)
+ -- advtrains.interlocking.show_tcb_marker(tcbpos)
+ -- end
+ --end,
+ can_dig = function(pos, player)
+ if player == nil then return false end
+
+ local pname = player:get_player_name()
+
+ -- Those markers can only be dug when all adjacent TS's are set
+ -- as EOI.
+ local meta = minetest.get_meta(pos)
+ local tcbpts = meta:get_string("tcb_pos")
+ if tcbpts ~= "" then
+ if not minetest.check_player_privs(pname, "interlocking") then
+ minetest.chat_send_player(pname, "Insufficient privileges to use this!")
+ return
+ end
+ local tcbpos = minetest.string_to_pos(tcbpts)
+ local tcb = ildb.get_tcb(tcbpos)
+ if not tcb then return true end
+ for connid=1,2 do
+ if tcb[connid].ts_id or tcb[connid].signal then
+ minetest.chat_send_player(pname, "Can't remove TCB: Both sides must have no track section and no signal assigned!")
+ return false
+ end
+ if not ildb.may_modify_tcbs(tcb[connid]) then
+ minetest.chat_send_player(pname, "Can't remove TCB: Side "..connid.." forbids modification (shouldn't happen).")
+ return false
+ end
+ end
+ end
+ return true
+ end,
+ after_dig_node = function(pos, oldnode, oldmetadata, player)
+ if not oldmetadata or not oldmetadata.fields then return end
+ local tcbpts = oldmetadata.fields.tcb_pos
+ if tcbpts and tcbpts ~= "" then
+ local tcbpos = minetest.string_to_pos(tcbpts)
+ local success = ildb.remove_tcb(tcbpos)
+ if success and player then
+ minetest.chat_send_player(player:get_player_name(), "TCB has been removed.")
+ else
+ minetest.chat_send_player(player:get_player_name(), "Failed to remove TCB!")
+ minetest.set_node(pos, oldnode)
+ local meta = minetest.get_meta(pos)
+ meta:set_string("tcb_pos", minetest.pos_to_string(tcbpos))
+ end
+ end
+ end,
+})
+
+minetest.register_on_punchnode(function(pos, node, player, pointed_thing)
+ local pname = player:get_player_name()
+ if not minetest.check_player_privs(pname, "interlocking") then
+ return
+ end
+ -- TCB assignment
+ local tcbnpos = players_assign_tcb[pname]
+ if tcbnpos then
+ if vector.distance(pos, tcbnpos)<=20 then
+ local node_ok, conns, rhe = advtrains.get_rail_info_at(pos, advtrains.all_tracktypes)
+ if node_ok and #conns == 2 then
+ local ok = ildb.create_tcb(pos)
+
+ if not ok then
+ minetest.chat_send_player(pname, "Configuring TCB: TCB already exists at this position! It has now been re-assigned.")
+ end
+
+ ildb.sync_tcb_neighbors(pos, 1)
+ ildb.sync_tcb_neighbors(pos, 2)
+
+ local meta = minetest.get_meta(tcbnpos)
+ meta:set_string("tcb_pos", minetest.pos_to_string(pos))
+ meta:set_string("infotext", "TCB assigned to "..minetest.pos_to_string(pos))
+ minetest.chat_send_player(pname, "Configuring TCB: Successfully configured TCB")
+ else
+ minetest.chat_send_player(pname, "Configuring TCB: This is not a normal two-connection rail! Aborted.")
+ end
+ else
+ minetest.chat_send_player(pname, "Configuring TCB: Node is too far away. Aborted.")
+ end
+ players_assign_tcb[pname] = nil
+ end
+
+ -- Signal assignment
+ local sigd = players_assign_signal[pname]
+ if sigd then
+ if vector.distance(pos, sigd.p)<=50 then
+ local is_signal = minetest.get_item_group(node.name, "advtrains_signal") >= 2
+ if is_signal then
+ local ndef = minetest.registered_nodes[node.name]
+ if ndef and ndef.advtrains and ndef.advtrains.set_aspect then
+ local tcbs = ildb.get_tcbs(sigd)
+ if tcbs then
+ tcbs.signal = pos
+ if not tcbs.signal_name then
+ tcbs.signal_name = "Signal at "..minetest.pos_to_string(sigd.p)
+ end
+ if not tcbs.routes then
+ tcbs.routes = {}
+ end
+ ildb.set_sigd_for_signal(pos, sigd)
+ minetest.chat_send_player(pname, "Configuring TCB: Successfully assigned signal.")
+ advtrains.interlocking.show_ip_form(pos, pname, true)
+ else
+ minetest.chat_send_player(pname, "Configuring TCB: Internal error, TCBS doesn't exist. Aborted.")
+ end
+ else
+ minetest.chat_send_player(pname, "Configuring TCB: Cannot use static signals for routesetting. Aborted.")
+ end
+ else
+ minetest.chat_send_player(pname, "Configuring TCB: Not a compatible signal. Aborted.")
+ end
+ else
+ minetest.chat_send_player(pname, "Configuring TCB: Node is too far away. Aborted.")
+ end
+ players_assign_signal[pname] = nil
+ end
+end)
+
+-- TCB Form
+
+local function mktcbformspec(tcbs, btnpref, offset, pname)
+ local form = ""
+ local ts
+ if tcbs.ts_id then
+ ts = ildb.get_ts(tcbs.ts_id)
+ end
+ if ts then
+ form = form.."label[0.5,"..offset..";Side "..btnpref..": "..minetest.formspec_escape(ts.name).."]"
+ form = form.."button[0.5,"..(offset+0.5)..";5,1;"..btnpref.."_gotots;Show track section]"
+ if ildb.may_modify_tcbs(tcbs) then
+ -- Note: the security check to prohibit those actions is located in database.lua in the corresponding functions.
+ form = form.."button[0.5,"..(offset+1.5)..";2.5,1;"..btnpref.."_update;Update near TCBs]"
+ form = form.."button[3 ,"..(offset+1.5)..";2.5,1;"..btnpref.."_remove;Remove from section]"
+ end
+ else
+ tcbs.ts_id = nil
+ form = form.."label[0.5,"..offset..";Side "..btnpref..": ".."End of interlocking]"
+ form = form.."button[0.5,"..(offset+0.5)..";5,1;"..btnpref.."_makeil;Create Interlocked Track Section]"
+ --if tcbs.section_free then
+ --form = form.."button[0.5,"..(offset+1.5)..";5,1;"..btnpref.."_setlocked;Section is free]"
+ --else
+ --form = form.."button[0.5,"..(offset+1.5)..";5,1;"..btnpref.."_setfree;Section is blocked]"
+ --end
+ end
+ if tcbs.signal then
+ form = form.."button[0.5,"..(offset+2.5)..";5,1;"..btnpref.."_sigdia;Signalling]"
+ else
+ form = form.."button[0.5,"..(offset+2.5)..";5,1;"..btnpref.."_asnsig;Assign a signal]"
+ end
+ return form
+end
+
+
+function advtrains.interlocking.show_tcb_form(pos, pname)
+ if not minetest.check_player_privs(pname, "interlocking") then
+ minetest.chat_send_player(pname, "Insufficient privileges to use this!")
+ return
+ end
+ local tcb = ildb.get_tcb(pos)
+ if not tcb then return end
+
+ local form = "size[6,9] label[0.5,0.5;Track Circuit Break Configuration]"
+ form = form .. mktcbformspec(tcb[1], "A", 1, pname)
+ form = form .. mktcbformspec(tcb[2], "B", 5, pname)
+
+ minetest.show_formspec(pname, "at_il_tcbconfig_"..minetest.pos_to_string(pos), form)
+ advtrains.interlocking.show_tcb_marker(pos)
+end
+
+--helper: length of nil table is 0
+local function nlen(t)
+ if not t then return 0 end
+ return #t
+end
+
+
+minetest.register_on_player_receive_fields(function(player, formname, fields)
+ local pname = player:get_player_name()
+ if not minetest.check_player_privs(pname, "interlocking") then
+ return
+ end
+ local pts = string.match(formname, "^at_il_tcbconfig_(.+)$")
+ local pos
+ if pts then
+ pos = minetest.string_to_pos(pts)
+ end
+ if pos and not fields.quit then
+ local tcb = ildb.get_tcb(pos)
+ if not tcb then return end
+ local f_gotots = {fields.A_gotots, fields.B_gotots}
+ local f_update = {fields.A_update, fields.B_update}
+ local f_remove = {fields.A_remove, fields.B_remove}
+ local f_makeil = {fields.A_makeil, fields.B_makeil}
+ local f_setlocked = {fields.A_setlocked, fields.B_setlocked}
+ local f_setfree = {fields.A_setfree, fields.B_setfree}
+ local f_asnsig = {fields.A_asnsig, fields.B_asnsig}
+ local f_sigdia = {fields.A_sigdia, fields.B_sigdia}
+
+ for connid=1,2 do
+ local tcbs = tcb[connid]
+ if tcbs.ts_id then
+ if f_gotots[connid] then
+ advtrains.interlocking.show_ts_form(tcbs.ts_id, pname)
+ return
+ end
+ if f_update[connid] then
+ ildb.sync_tcb_neighbors(pos, connid)
+ end
+ if f_remove[connid] then
+ ildb.remove_from_interlocking({p=pos, s=connid})
+ end
+ else
+ if f_makeil[connid] then
+ -- try sinc_tcb_neighbors first
+ ildb.sync_tcb_neighbors(pos, connid)
+ -- if that didn't work, create new section
+ if not tcbs.ts_id then
+ ildb.create_ts({p=pos, s=connid})
+ ildb.sync_tcb_neighbors(pos, connid)
+ end
+ end
+ -- non-interlocked
+ if f_setfree[connid] then
+ tcbs.section_free = true
+ end
+ if f_setlocked[connid] then
+ tcbs.section_free = nil
+ end
+ end
+ if f_asnsig[connid] and not tcbs.signal then
+ minetest.chat_send_player(pname, "Configuring TCB: Please punch the signal to assign.")
+ players_assign_signal[pname] = {p=pos, s=connid}
+ minetest.close_formspec(pname, formname)
+ return
+ end
+ if f_sigdia[connid] and tcbs.signal then
+ advtrains.interlocking.show_signalling_form({p=pos, s=connid}, pname)
+ return
+ end
+
+ end
+ advtrains.interlocking.show_tcb_form(pos, pname)
+ end
+
+end)
+
+
+
+-- TS Formspec
+
+-- textlist selection temporary storage
+local ts_pselidx = {}
+
+function advtrains.interlocking.show_ts_form(ts_id, pname, sel_tcb)
+ if not minetest.check_player_privs(pname, "interlocking") then
+ minetest.chat_send_player(pname, "Insufficient privileges to use this!")
+ return
+ end
+ local ts = ildb.get_ts(ts_id)
+ if not ts_id then return end
+
+ local form = "size[10,10]label[0.5,0.5;Track Section Detail - "..ts_id.."]"
+ form = form.."field[0.8,2;5.2,1;name;Section name;"..minetest.formspec_escape(ts.name).."]"
+ form = form.."button[5.5,1.7;1,1;setname;Set]"
+ local hint
+
+ local strtab = {}
+ for idx, sigd in ipairs(ts.tc_breaks) do
+ strtab[#strtab+1] = minetest.formspec_escape(sigd_to_string(sigd))
+ advtrains.interlocking.show_tcb_marker(sigd.p)
+ end
+
+ form = form.."textlist[0.5,3;5,3;tcblist;"..table.concat(strtab, ",").."]"
+
+ if ildb.may_modify_ts(ts) then
+
+ if players_link_ts[pname] then
+ local other_id = players_link_ts[pname]
+ local other_ts = ildb.get_ts(other_id)
+ if other_ts then
+ if ildb.may_modify_ts(other_ts) then
+ form = form.."button[5.5,3;3.5,1;mklink;Join with "..minetest.formspec_escape(other_ts.name).."]"
+ form = form.."button[9 ,3;0.5,1;cancellink;X]"
+ end
+ end
+ else
+ form = form.."button[5.5,3;4,1;link;Join into other section]"
+ hint = 1
+ end
+ form = form.."button[5.5,4;4,1;dissolve;Dissolve Section]"
+ form = form.."tooltip[dissolve;This will remove the track section and set all its end points to End Of Interlocking]"
+ if sel_tcb then
+ form = form.."button[5.5,5;4,1;del_tcb;Unlink selected TCB]"
+ hint = 2
+ end
+ else
+ hint=3
+ end
+
+ if ts.route then
+ form = form.."label[0.5,6.1;Route is set: "..ts.route.rsn.."]"
+ elseif ts.route_post then
+ form = form.."label[0.5,6.1;Section holds "..#(ts.route_post.lcks or {}).." route locks.]"
+ end
+ -- occupying trains
+ if ts.trains and #ts.trains>0 then
+ form = form.."label[0.5,7.1;Trains on this section:]"
+ form = form.."textlist[0.5,7.7;3,2;trnlist;"..table.concat(ts.trains, ",").."]"
+ else
+ form = form.."label[0.5,7.1;No trains on this section.]"
+ end
+
+ form = form.."button[5.5,7;4,1;reset;Reset section state]"
+
+ if hint == 1 then
+ form = form.."label[0.5,0.75;Use the 'Join' button to designate rail crosses and link not listed far-away TCBs]"
+ elseif hint == 2 then
+ form = form.."label[0.5,0.75;Unlinking a TCB will set it to non-interlocked mode.]"
+ elseif hint == 3 then
+ form = form.."label[0.5,0.75;You cannot modify track sections when a route is set or a train is on the section.]"
+ --form = form.."label[0.5,1;Trying to unlink a TCB directly connected to this track will not work.]"
+ end
+
+ ts_pselidx[pname]=sel_tcb
+ minetest.show_formspec(pname, "at_il_tsconfig_"..ts_id, form)
+
+end
+
+
+minetest.register_on_player_receive_fields(function(player, formname, fields)
+ local pname = player:get_player_name()
+ if not minetest.check_player_privs(pname, "interlocking") then
+ return
+ end
+ -- independent of the formspec, clear this whenever some formspec event happens
+ local tpsi = ts_pselidx[pname]
+ ts_pselidx[pname] = nil
+
+ local ts_id = string.match(formname, "^at_il_tsconfig_(.+)$")
+ if ts_id and not fields.quit then
+ local ts = ildb.get_ts(ts_id)
+ if not ts then return end
+
+ local sel_tcb
+ if fields.tcblist then
+ local tev = minetest.explode_textlist_event(fields.tcblist)
+ sel_tcb = tev.index
+ ts_pselidx[pname] = sel_tcb
+ elseif tpsi then
+ sel_tcb = tpsi
+ end
+
+ if ildb.may_modify_ts(ts) then
+ if players_link_ts[pname] then
+ if fields.cancellink then
+ players_link_ts[pname] = nil
+ elseif fields.mklink then
+ ildb.link_track_sections(players_link_ts[pname], ts_id)
+ players_link_ts[pname] = nil
+ end
+ end
+
+ if fields.del_tcb and sel_tcb and sel_tcb > 0 and sel_tcb <= #ts.tc_breaks then
+ if not ildb.remove_from_interlocking(ts.tc_breaks[sel_tcb]) then
+ minetest.chat_send_player(pname, "Please unassign signal first!")
+ end
+ sel_tcb = nil
+ end
+
+ if fields.link then
+ players_link_ts[pname] = ts_id
+ end
+ if fields.dissolve then
+ ildb.dissolve_ts(ts_id)
+ minetest.close_formspec(pname, formname)
+ return
+ end
+ end
+
+ if fields.setname then
+ ts.name = fields.name
+ if ts.name == "" then
+ ts.name = "Section "..ts_id
+ end
+ end
+
+ if fields.reset then
+ -- User requested resetting the section
+ -- Show him what this means...
+ local form = "size[7,5]label[0.5,0.5;Reset track section]"
+ form = form.."label[0.5,1;This will clear the list of trains\nand the routesetting status of this section.\nAre you sure?]"
+ form = form.."button_exit[0.5,2.5; 5,1;reset;Yes]"
+ form = form.."button_exit[0.5,3.5; 5,1;cancel;Cancel]"
+ minetest.show_formspec(pname, "at_il_tsreset_"..ts_id, form)
+ return
+ end
+
+ advtrains.interlocking.show_ts_form(ts_id, pname, sel_tcb)
+ return
+ end
+
+ ts_id = string.match(formname, "^at_il_tsreset_(.+)$")
+ if ts_id and fields.reset then
+ local ts = ildb.get_ts(ts_id)
+ if not ts then return end
+ ts.trains = {}
+ if ts.route_post then
+ advtrains.interlocking.route.free_route_locks(ts_id, ts.route_post.locks)
+ end
+ ts.route_post = nil
+ ts.route = nil
+ for _, sigd in ipairs(ts.tc_breaks) do
+ local tcbs = ildb.get_tcbs(sigd)
+ advtrains.interlocking.update_signal_aspect(tcbs)
+ end
+ minetest.chat_send_player(pname, "Reset track section "..ts_id.."!")
+ end
+end)
+
+-- TCB marker entities
+
+-- table with objectRefs
+local markerent = {}
+
+minetest.register_entity("advtrains_interlocking:tcbmarker", {
+ visual = "mesh",
+ mesh = "trackplane.b3d",
+ textures = {"at_il_tcb_marker.png"},
+ collisionbox = {-1,-0.5,-1, 1,-0.4,1},
+ visual_size = {x=10, y=10},
+ on_punch = function(self)
+ self.object:remove()
+ end,
+ on_rightclick = function(self, player)
+ if self.tcbpos and player then
+ advtrains.interlocking.show_tcb_form(self.tcbpos, player:get_player_name())
+ end
+ end,
+ get_staticdata = function() return "STATIC" end,
+ on_activate = function(self, sdata) if sdata=="STATIC" then self.object:remove() end end,
+ static_save = false,
+})
+
+function advtrains.interlocking.show_tcb_marker(pos)
+ --atdebug("showing tcb marker",pos)
+ local tcb = ildb.get_tcb(pos)
+ if not tcb then return end
+ local node_ok, conns, rhe = advtrains.get_rail_info_at(pos, advtrains.all_tracktypes)
+ if not node_ok then return end
+ local yaw = advtrains.conn_angle_median(conns[2].c, conns[1].c)
+
+ local itex = {}
+ for connid=1,2 do
+ local tcbs = tcb[connid]
+ local ts
+ if tcbs.ts_id then
+ ts = ildb.get_ts(tcbs.ts_id)
+ end
+ if ts then
+ itex[connid] = ts.name
+ else
+ itex[connid] = "--EOI--"
+ end
+ end
+
+ local pts = advtrains.roundfloorpts(pos)
+ if markerent[pts] then
+ markerent[pts]:remove()
+ end
+
+ local obj = minetest.add_entity(pos, "advtrains_interlocking:tcbmarker")
+ if not obj then return end
+ obj:set_yaw(yaw)
+ obj:set_properties({
+ infotext = "A = "..itex[1].."\nB = "..itex[2]
+ })
+ local le = obj:get_luaentity()
+ if le then le.tcbpos = pos end
+
+ markerent[pts] = obj
+end
+
+-- Signalling formspec - set routes a.s.o
+
+-- textlist selection temporary storage
+local sig_pselidx = {}
+-- Players having a signalling form open
+local p_open_sig_form = {}
+
+function advtrains.interlocking.show_signalling_form(sigd, pname, sel_rte)
+ if not minetest.check_player_privs(pname, "train_operator") then
+ minetest.chat_send_player(pname, "Insufficient privileges to use this!")
+ return
+ end
+ local hasprivs = minetest.check_player_privs(pname, "interlocking")
+ local tcbs = ildb.get_tcbs(sigd)
+
+ if not tcbs.signal then return end
+ if not tcbs.signal_name then tcbs.signal_name = "Signal at "..minetest.pos_to_string(sigd.p) end
+ if not tcbs.routes then tcbs.routes = {} end
+
+ local form = "size[7,10]label[0.5,0.5;Signal at "..minetest.pos_to_string(sigd.p).."]"
+ form = form.."field[0.8,1.5;5.2,1;name;Signal name;"..minetest.formspec_escape(tcbs.signal_name).."]"
+ form = form.."button[5.5,1.2;1,1;setname;Set]"
+
+ if tcbs.routeset then
+ local rte = tcbs.routes[tcbs.routeset]
+ if not rte then
+ atwarn("Unknown route set from signal!")
+ tcbs.routeset = nil
+ return
+ end
+ form = form.."label[0.5,2.5;A route is requested from this signal:]"
+ form = form.."label[0.5,3.0;"..minetest.formspec_escape(rte.name).."]"
+ if tcbs.route_committed then
+ form = form.."label[0.5,3.5;Route has been set.]"
+ else
+ form = form.."label[0.5,3.5;Waiting for route to be set...]"
+ if tcbs.route_rsn then
+ form = form.."label[0.5,4;"..minetest.formspec_escape(tcbs.route_rsn).."]"
+ end
+ end
+ if not tcbs.route_auto then
+ form = form.."button[0.5,7; 5,1;auto;Enable Automatic Working]"
+ else
+ form = form.."label[0.5,7 ;Automatic Working is active.]"
+ form = form.."label[0.5,7.3;Route is re-set when a train passed.]"
+ form = form.."button[0.5,7.7; 5,1;noauto;Disable Automatic Working]"
+ end
+
+ form = form.."button[0.5,6; 5,1;cancelroute;Cancel Route]"
+ else
+ if not tcbs.route_origin then
+ local strtab = {}
+ for idx, route in ipairs(tcbs.routes) do
+ local clr = ""
+ if route.ars then
+ clr = "#FF5555"
+ if route.ars.default then
+ clr = "#55FF55"
+ end
+ end
+ strtab[#strtab+1] = clr .. minetest.formspec_escape(route.name)
+ end
+ form = form.."label[0.5,2.5;Routes:]"
+ form = form.."textlist[0.5,3;5,3;rtelist;"..table.concat(strtab, ",").."]"
+ if sel_rte then
+ form = form.."button[0.5,6; 5,1;setroute;Set Route]"
+ form = form.."button[0.5,7;2,1;dsproute;Show]"
+ if hasprivs then
+ form = form.."button[3.5,7;2,1;editroute;Edit]"
+ end
+ else
+ if tcbs.ars_disabled then
+ form = form.."label[0.5,6 ;NOTE: ARS is disabled.]"
+ form = form.."label[0.5,6.5;Routes are not automatically set.]"
+ end
+ end
+ if hasprivs then
+ form = form.."button[0.5,8;2.5,1;newroute;New Route]"
+ form = form.."button[ 3,8;2.5,1;unassign;Unassign Signal]"
+ form = form.."button[ 3,9;2.5,1;influp;Influence Point]"
+ end
+ if tcbs.ars_disabled then
+ form = form.."button[0.5,9;2.5,1;arsenable;Enable ARS]"
+ else
+ form = form.."button[0.5,9;2.5,1;arsdisable;Disable ARS]"
+ end
+ elseif sigd_equal(tcbs.route_origin, sigd) then
+ -- something has gone wrong: tcbs.routeset should have been set...
+ form = form.."label[0.5,2.5;Inconsistent state: route_origin is same TCBS but no route set. Try again.]"
+ ilrs.cancel_route_from(sigd)
+ else
+ form = form.."label[0.5,2.5;Route is set over this signal by:\n"..sigd_to_string(tcbs.route_origin).."]"
+ form = form.."label[0.5,4;Wait for this route to be cancelled in order to do anything here.]"
+ end
+ end
+ sig_pselidx[pname] = sel_rte
+ minetest.show_formspec(pname, "at_il_signalling_"..minetest.pos_to_string(sigd.p).."_"..sigd.s, form)
+ p_open_sig_form[pname] = sigd
+
+ -- always a good idea to update the signal aspect
+ advtrains.interlocking.update_signal_aspect(tcbs)
+end
+
+function advtrains.interlocking.update_player_forms(sigd)
+ for pname, tsigd in pairs(p_open_sig_form) do
+ if advtrains.interlocking.sigd_equal(sigd, tsigd) then
+ advtrains.interlocking.show_signalling_form(sigd, pname, nil)
+ end
+ end
+end
+
+
+minetest.register_on_player_receive_fields(function(player, formname, fields)
+ local pname = player:get_player_name()
+ if not minetest.check_player_privs(pname, "train_operator") then
+ return
+ end
+ local hasprivs = minetest.check_player_privs(pname, "interlocking")
+
+ -- independent of the formspec, clear this whenever some formspec event happens
+ local tpsi = sig_pselidx[pname]
+ sig_pselidx[pname] = nil
+ p_open_sig_form[pname] = nil
+
+ local pts, connids = string.match(formname, "^at_il_signalling_([^_]+)_(%d)$")
+ local pos, connid
+ if pts then
+ pos = minetest.string_to_pos(pts)
+ connid = tonumber(connids)
+ if not connid or connid<1 or connid>2 then return end
+ end
+ if pos and connid and not fields.quit then
+ local sigd = {p=pos, s=connid}
+ local tcbs = ildb.get_tcbs(sigd)
+ if not tcbs then return end
+
+ local sel_rte
+ if fields.rtelist then
+ local tev = minetest.explode_textlist_event(fields.rtelist)
+ sel_rte = tev.index
+ elseif tpsi then
+ sel_rte = tpsi
+ end
+ if fields.setname and fields.name and hasprivs then
+ tcbs.signal_name = fields.name
+ end
+ if tcbs.routeset and fields.cancelroute then
+ if tcbs.routes[tcbs.routeset] and tcbs.routes[tcbs.routeset].ars then
+ tcbs.ars_disabled = true
+ end
+ -- if route committed, cancel route ts info
+ ilrs.update_route(sigd, tcbs, nil, true)
+ end
+ if not tcbs.routeset then
+ if fields.newroute and hasprivs then
+ advtrains.interlocking.init_route_prog(pname, sigd)
+ minetest.close_formspec(pname, formname)
+ return
+ end
+ if sel_rte and tcbs.routes[sel_rte] then
+ if fields.setroute then
+ ilrs.update_route(sigd, tcbs, sel_rte)
+ end
+ if fields.dsproute then
+ local t = os.clock()
+ advtrains.interlocking.visualize_route(sigd, tcbs.routes[sel_rte], "disp_"..t)
+ minetest.after(10, function() advtrains.interlocking.clear_visu_context("disp_"..t) end)
+ end
+ if fields.editroute and hasprivs then
+ advtrains.interlocking.show_route_edit_form(pname, sigd, sel_rte)
+ --local rte = tcbs.routes[sel_rte]
+ --minetest.show_formspec(pname, formname.."_renroute_"..sel_rte, "field[name;Enter new route name;"..rte.name.."]")
+ return
+ end
+ end
+ end
+
+ if fields.unassign and hasprivs then
+ -- unassigning the signal from the tcbs
+ -- only when no route is set.
+ -- Routes and name remain saved, in case the player wants to reassign a new signal
+ if not tcbs.routeset then
+ local signal_pos = tcbs.signal
+ ildb.set_sigd_for_signal(signal_pos, nil)
+ tcbs.signal = nil
+ tcbs.aspect = nil
+ minetest.close_formspec(pname, formname)
+ minetest.chat_send_player(pname, "Signal has been unassigned. Name and routes are kept for reuse.")
+ return
+ else
+ minetest.chat_send_player(pname, "Please cancel route first!")
+ end
+ end
+ if fields.influp and hasprivs then
+ advtrains.interlocking.show_ip_form(tcbs.signal, pname)
+ return
+ end
+
+ if tcbs.ars_disabled and fields.arsenable then
+ tcbs.ars_disabled = nil
+ end
+ if not tcbs.ars_disabled and fields.arsdisable then
+ tcbs.ars_disabled = true
+ end
+
+ if fields.auto then
+ tcbs.route_auto = true
+ end
+ if fields.noauto then
+ tcbs.route_auto = false
+ end
+
+ advtrains.interlocking.show_signalling_form(sigd, pname, sel_rte)
+ return
+ end
+
+
+ if not hasprivs then return end
+ -- rename route
+ local rind, rte_id
+ pts, connids, rind = string.match(formname, "^at_il_signalling_([^_]+)_(%d)_renroute_(%d+)$")
+ if pts then
+ pos = minetest.string_to_pos(pts)
+ connid = tonumber(connids)
+ rte_id = tonumber(rind)
+ if not connid or connid<1 or connid>2 then return end
+ end
+ if pos and connid and rind and fields.name then
+ local sigd = {p=pos, s=connid}
+ local tcbs = ildb.get_tcbs(sigd)
+ if tcbs.routes[rte_id] then
+ tcbs.routes[rte_id].name = fields.name
+ advtrains.interlocking.show_signalling_form(sigd, pname)
+ end
+ end
+end)
diff --git a/advtrains/advtrains_interlocking/textures/advtrains_dtrack_npr_placer.png b/advtrains/advtrains_interlocking/textures/advtrains_dtrack_npr_placer.png
new file mode 100644
index 0000000..0d1c769
--- /dev/null
+++ b/advtrains/advtrains_interlocking/textures/advtrains_dtrack_npr_placer.png
Binary files differ
diff --git a/advtrains/advtrains_interlocking/textures/advtrains_dtrack_shared_npr.png b/advtrains/advtrains_interlocking/textures/advtrains_dtrack_shared_npr.png
new file mode 100644
index 0000000..0116c27
--- /dev/null
+++ b/advtrains/advtrains_interlocking/textures/advtrains_dtrack_shared_npr.png
Binary files differ
diff --git a/advtrains/advtrains_interlocking/textures/at_il_route_end.png b/advtrains/advtrains_interlocking/textures/at_il_route_end.png
new file mode 100644
index 0000000..1433f0c
--- /dev/null
+++ b/advtrains/advtrains_interlocking/textures/at_il_route_end.png
Binary files differ
diff --git a/advtrains/advtrains_interlocking/textures/at_il_route_lock.png b/advtrains/advtrains_interlocking/textures/at_il_route_lock.png
new file mode 100644
index 0000000..6a5269b
--- /dev/null
+++ b/advtrains/advtrains_interlocking/textures/at_il_route_lock.png
Binary files differ
diff --git a/advtrains/advtrains_interlocking/textures/at_il_route_lock_edit.png b/advtrains/advtrains_interlocking/textures/at_il_route_lock_edit.png
new file mode 100644
index 0000000..df5f923
--- /dev/null
+++ b/advtrains/advtrains_interlocking/textures/at_il_route_lock_edit.png
Binary files differ
diff --git a/advtrains/advtrains_interlocking/textures/at_il_route_set.png b/advtrains/advtrains_interlocking/textures/at_il_route_set.png
new file mode 100644
index 0000000..3531420
--- /dev/null
+++ b/advtrains/advtrains_interlocking/textures/at_il_route_set.png
Binary files differ
diff --git a/advtrains/advtrains_interlocking/textures/at_il_route_start.png b/advtrains/advtrains_interlocking/textures/at_il_route_start.png
new file mode 100644
index 0000000..dcb5160
--- /dev/null
+++ b/advtrains/advtrains_interlocking/textures/at_il_route_start.png
Binary files differ
diff --git a/advtrains/advtrains_interlocking/textures/at_il_routep_advance.png b/advtrains/advtrains_interlocking/textures/at_il_routep_advance.png
new file mode 100644
index 0000000..d971e85
--- /dev/null
+++ b/advtrains/advtrains_interlocking/textures/at_il_routep_advance.png
Binary files differ
diff --git a/advtrains/advtrains_interlocking/textures/at_il_routep_end_here.png b/advtrains/advtrains_interlocking/textures/at_il_routep_end_here.png
new file mode 100644
index 0000000..9dd3088
--- /dev/null
+++ b/advtrains/advtrains_interlocking/textures/at_il_routep_end_here.png
Binary files differ
diff --git a/advtrains/advtrains_interlocking/textures/at_il_routep_end_over.png b/advtrains/advtrains_interlocking/textures/at_il_routep_end_over.png
new file mode 100644
index 0000000..e03198b
--- /dev/null
+++ b/advtrains/advtrains_interlocking/textures/at_il_routep_end_over.png
Binary files differ
diff --git a/advtrains/advtrains_interlocking/textures/at_il_routep_end_over_last.png b/advtrains/advtrains_interlocking/textures/at_il_routep_end_over_last.png
new file mode 100644
index 0000000..f4fb1aa
--- /dev/null
+++ b/advtrains/advtrains_interlocking/textures/at_il_routep_end_over_last.png
Binary files differ
diff --git a/advtrains/advtrains_interlocking/textures/at_il_signal_asp_danger.png b/advtrains/advtrains_interlocking/textures/at_il_signal_asp_danger.png
new file mode 100644
index 0000000..fca786d
--- /dev/null
+++ b/advtrains/advtrains_interlocking/textures/at_il_signal_asp_danger.png
Binary files differ
diff --git a/advtrains/advtrains_interlocking/textures/at_il_signal_asp_free.png b/advtrains/advtrains_interlocking/textures/at_il_signal_asp_free.png
new file mode 100644
index 0000000..e9d6e9c
--- /dev/null
+++ b/advtrains/advtrains_interlocking/textures/at_il_signal_asp_free.png
Binary files differ
diff --git a/advtrains/advtrains_interlocking/textures/at_il_signal_asp_slow.png b/advtrains/advtrains_interlocking/textures/at_il_signal_asp_slow.png
new file mode 100644
index 0000000..9242bb3
--- /dev/null
+++ b/advtrains/advtrains_interlocking/textures/at_il_signal_asp_slow.png
Binary files differ
diff --git a/advtrains/advtrains_interlocking/textures/at_il_signal_ip.png b/advtrains/advtrains_interlocking/textures/at_il_signal_ip.png
new file mode 100644
index 0000000..bf1618a
--- /dev/null
+++ b/advtrains/advtrains_interlocking/textures/at_il_signal_ip.png
Binary files differ
diff --git a/advtrains/advtrains_interlocking/textures/at_il_signal_off.png b/advtrains/advtrains_interlocking/textures/at_il_signal_off.png
new file mode 100644
index 0000000..f9b1f79
--- /dev/null
+++ b/advtrains/advtrains_interlocking/textures/at_il_signal_off.png
Binary files differ
diff --git a/advtrains/advtrains_interlocking/textures/at_il_tcb_marker.png b/advtrains/advtrains_interlocking/textures/at_il_tcb_marker.png
new file mode 100644
index 0000000..3efc38a
--- /dev/null
+++ b/advtrains/advtrains_interlocking/textures/at_il_tcb_marker.png
Binary files differ
diff --git a/advtrains/advtrains_interlocking/textures/at_il_tcb_node.png b/advtrains/advtrains_interlocking/textures/at_il_tcb_node.png
new file mode 100644
index 0000000..d5f615f
--- /dev/null
+++ b/advtrains/advtrains_interlocking/textures/at_il_tcb_node.png
Binary files differ
diff --git a/advtrains/advtrains_interlocking/textures/at_il_tool.png b/advtrains/advtrains_interlocking/textures/at_il_tool.png
new file mode 100644
index 0000000..f6ce1cc
--- /dev/null
+++ b/advtrains/advtrains_interlocking/textures/at_il_tool.png
Binary files differ
diff --git a/advtrains/advtrains_interlocking/textures/at_il_turnout_cr_l.png b/advtrains/advtrains_interlocking/textures/at_il_turnout_cr_l.png
new file mode 100644
index 0000000..fb79e3d
--- /dev/null
+++ b/advtrains/advtrains_interlocking/textures/at_il_turnout_cr_l.png
Binary files differ
diff --git a/advtrains/advtrains_interlocking/textures/at_il_turnout_cr_r.png b/advtrains/advtrains_interlocking/textures/at_il_turnout_cr_r.png
new file mode 100644
index 0000000..e04dfbd
--- /dev/null
+++ b/advtrains/advtrains_interlocking/textures/at_il_turnout_cr_r.png
Binary files differ
diff --git a/advtrains/advtrains_interlocking/textures/at_il_turnout_free.png b/advtrains/advtrains_interlocking/textures/at_il_turnout_free.png
new file mode 100644
index 0000000..5c83193
--- /dev/null
+++ b/advtrains/advtrains_interlocking/textures/at_il_turnout_free.png
Binary files differ
diff --git a/advtrains/advtrains_interlocking/textures/at_il_turnout_st.png b/advtrains/advtrains_interlocking/textures/at_il_turnout_st.png
new file mode 100644
index 0000000..50d5ad5
--- /dev/null
+++ b/advtrains/advtrains_interlocking/textures/at_il_turnout_st.png
Binary files differ
diff --git a/advtrains/advtrains_interlocking/tool.lua b/advtrains/advtrains_interlocking/tool.lua
new file mode 100644
index 0000000..5d38b3a
--- /dev/null
+++ b/advtrains/advtrains_interlocking/tool.lua
@@ -0,0 +1,66 @@
+-- tool.lua
+-- Interlocking tool
+
+local ilrs = advtrains.interlocking.route
+
+minetest.register_craftitem("advtrains_interlocking:tool",{
+ description = "Interlocking tool\nright-click turnouts to inspect route locks",
+ groups = {cracky=1}, -- key=name, value=rating; rating=1..3.
+ inventory_image = "at_il_tool.png",
+ wield_image = "at_il_tool.png",
+ stack_max = 1,
+ on_place = function(itemstack, placer, pointed_thing)
+ local pname = placer:get_player_name()
+ if not pname then
+ return
+ end
+ if not minetest.check_player_privs(pname, {interlocking=true}) then
+ minetest.chat_send_player(pname, "Insufficient privileges to use this!")
+ return
+ end
+ if pointed_thing.type=="node" then
+ local pos=pointed_thing.under
+ if advtrains.is_passive(pos) then
+ local form = "size[7,5]label[0.5,0.5;Route lock inspector]"
+ local pts = minetest.pos_to_string(pos)
+
+ local rtl = ilrs.has_route_lock(pts)
+
+ if rtl then
+ form = form.."label[0.5,1;Route locks currently put:\n"..rtl.."]"
+ form = form.."button_exit[0.5,3.5; 5,1;clear;Clear]"
+ else
+ form = form.."label[0.5,1;No route locks set]"
+ form = form.."button_exit[0.5,3.5; 5,1;emplace;Emplace manual lock]"
+ end
+
+ minetest.show_formspec(pname, "at_il_rtool_"..pts, form)
+ else
+ minetest.chat_send_player(pname, "Cannot use this here.")
+ return
+ end
+ end
+ end,
+})
+
+minetest.register_on_player_receive_fields(function(player, formname, fields)
+ local pname = player:get_player_name()
+ if not minetest.check_player_privs(pname, "interlocking") then
+ return
+ end
+ local pos
+ local pts = string.match(formname, "^at_il_rtool_(.+)$")
+ if pts then
+ pos = minetest.string_to_pos(pts)
+ end
+ if pos then
+ if advtrains.is_passive(pos) then
+ if fields.clear then
+ ilrs.remove_route_locks(pts)
+ end
+ if fields.emplace then
+ ilrs.add_manual_route_lock(pts, "Manual lock ("..pname..")")
+ end
+ end
+ end
+end)
diff --git a/advtrains/advtrains_interlocking/train_sections.lua b/advtrains/advtrains_interlocking/train_sections.lua
new file mode 100644
index 0000000..757f36a
--- /dev/null
+++ b/advtrains/advtrains_interlocking/train_sections.lua
@@ -0,0 +1,199 @@
+-- train_related.lua
+-- Occupation of track sections - mainly implementation of train callbacks
+
+--[[
+Track section occupation is saved as follows
+
+In train:
+train.il_sections = {
+ [n] = {ts_id = <...> (origin = <sigd>)}
+}
+-- "origin" is the TCB (signal describer) the train initially entered this section
+
+In track section
+ts.trains = {
+ [n] = <train_id>
+}
+
+When any inconsistency is detected, we will assume the most restrictive setup.
+It will be possible to indicate a section "free" via the GUI.
+]]
+
+local ildb = advtrains.interlocking.db
+
+local sigd_equal = advtrains.interlocking.sigd_equal
+
+local function itexist(tbl, com)
+ for _,item in ipairs(tbl) do
+ if (item==com) then
+ return true
+ end
+ end
+ return false
+end
+local function itkexist(tbl, ikey, com)
+ for _,item in ipairs(tbl) do
+ if item[ikey] == com then
+ return true
+ end
+ end
+ return false
+end
+
+local function itremove(tbl, com)
+ local i=1
+ while i <= #tbl do
+ if tbl[i] == com then
+ table.remove(tbl, i)
+ else
+ i = i + 1
+ end
+ end
+end
+local function itkremove(tbl, ikey, com)
+ local i=1
+ while i <= #tbl do
+ if tbl[i][ikey] == com then
+ table.remove(tbl, i)
+ else
+ i = i + 1
+ end
+ end
+end
+
+local function setsection(tid, train, ts_id, ts, sigd)
+ -- train
+ if not train.il_sections then train.il_sections = {} end
+ if not itkexist(train.il_sections, "ts_id", ts_id) then
+ table.insert(train.il_sections, {ts_id = ts_id, origin = sigd})
+ end
+
+ -- ts
+ if not ts.trains then ts.trains = {} end
+ if not itexist(ts.trains, tid) then
+ table.insert(ts.trains, tid)
+ end
+
+ -- routes
+ local tcbs = advtrains.interlocking.db.get_tcbs(sigd)
+
+ -- route setting - clear route state
+ if ts.route then
+ --atdebug(tid,"enters",ts_id,"examining Routestate",ts.route)
+ if not sigd_equal(ts.route.entry, sigd) then
+ -- Train entered not from the route. Locate origin and cancel route!
+ atwarn("Train",tid,"hit route",ts.route.rsn,"!")
+ advtrains.interlocking.route.cancel_route_from(ts.route.origin)
+ atwarn("Route was cancelled.")
+ else
+ -- train entered route regularily. Reset route and signal
+ tcbs.route_committed = nil
+ tcbs.route_comitted = nil -- TODO compatibility cleanup
+ tcbs.aspect = nil
+ tcbs.route_origin = nil
+ advtrains.interlocking.update_signal_aspect(tcbs)
+ if tcbs.signal and sigd_equal(ts.route.entry, ts.route.origin) then
+ if tcbs.route_auto and tcbs.routeset then
+ --atdebug("Resetting route (",ts.route.origin,")")
+ advtrains.interlocking.route.update_route(ts.route.origin, tcbs)
+ else
+ tcbs.routeset = nil
+ end
+ end
+ end
+ ts.route = nil
+ end
+ if tcbs.signal then
+ advtrains.interlocking.route.update_route(sigd, tcbs)
+ end
+end
+
+local function freesection(tid, train, ts_id, ts)
+ -- train
+ if not train.il_sections then train.il_sections = {} end
+ itkremove(train.il_sections, "ts_id", ts_id)
+
+ -- ts
+ if not ts.trains then ts.trains = {} end
+ itremove(ts.trains, tid)
+
+ if ts.route_post then
+ advtrains.interlocking.route.free_route_locks(ts_id, ts.route_post.locks)
+ if ts.route_post.next then
+ --this does nothing when the train went the right way, because
+ -- "route" info is already cleared.
+ advtrains.interlocking.route.cancel_route_from(ts.route_post.next)
+ end
+ ts.route_post = nil
+ end
+ -- This must be delayed, because this code is executed in-between a train step
+ -- TODO use luaautomation timers?
+ minetest.after(0, advtrains.interlocking.route.update_waiting, "ts", ts_id)
+end
+
+
+-- This is regular operation
+-- The train is on a track and drives back and forth
+
+-- This sets the section for both directions, to be failsafe
+advtrains.tnc_register_on_enter(function(pos, id, train, index)
+ local tcb = ildb.get_tcb(pos)
+ if tcb then
+ for connid=1,2 do
+ local ts = tcb[connid].ts_id and ildb.get_ts(tcb[connid].ts_id)
+ if ts then
+ setsection(id, train, tcb[connid].ts_id, ts, {p=pos, s=connid})
+ end
+ end
+ end
+end)
+
+
+-- this time, of course, only clear the backside (cp connid)
+advtrains.tnc_register_on_leave(function(pos, id, train, index)
+ local tcb = ildb.get_tcb(pos)
+ if tcb and train.path_cp[index] then
+ local connid = train.path_cp[index]
+ local ts = tcb[connid].ts_id and ildb.get_ts(tcb[connid].ts_id)
+ if ts then
+ freesection(id, train, tcb[connid].ts_id, ts)
+ end
+ end
+end)
+
+-- those callbacks are needed to account for created and removed trains (also regarding coupling)
+
+advtrains.te_register_on_create(function(id, train)
+ -- let's see what track sections we find here
+ local index = atround(train.index)
+ local pos = advtrains.path_get(train, index)
+ local ts_id, origin = ildb.get_ts_at_pos(pos)
+ if ts_id then
+ local ts = ildb.get_ts(ts_id)
+ if ts then
+ setsection(id, train, ts_id, ts, origin)
+ else
+ atwarn("ILDB corruption: TCB",origin," has invalid TS reference")
+ end
+ -- Make train a shunt move
+ train.is_shunt = true
+ elseif ts_id==nil then
+ atlog("Train",id,": Unable to determine whether to block a track section!")
+ else
+ --atdebug("Train",id,": Outside of interlocked area!")
+ end
+end)
+
+advtrains.te_register_on_remove(function(id, train)
+ if train.il_sections then
+ for idx, item in ipairs(train.il_sections) do
+
+ local ts = item.ts_id and ildb.get_ts(item.ts_id)
+
+ if ts and ts.trains then
+ itremove(ts.trains, id)
+ end
+ end
+ train.il_sections = nil
+ end
+end)
diff --git a/advtrains/advtrains_interlocking/tsr_rail.lua b/advtrains/advtrains_interlocking/tsr_rail.lua
new file mode 100644
index 0000000..a500c8f
--- /dev/null
+++ b/advtrains/advtrains_interlocking/tsr_rail.lua
@@ -0,0 +1,56 @@
+-- tsr_rail.lua
+-- Point speed restriction rails
+-- Simple rail whose only purpose is to place a TSR on the position, as a temporary solution until the timetable system covers everything.
+-- This code resembles the code in lines/stoprail.lua
+
+local function updateform(pos)
+ local meta = minetest.get_meta(pos)
+ local pe = advtrains.encode_pos(pos)
+ local npr = advtrains.interlocking.npr_rails[pe] or 2
+
+ meta:set_string("infotext", "Point speed restriction: "..npr)
+ meta:set_string("formspec", "field[npr;Set point speed restriction:;"..npr.."]")
+end
+
+
+local adefunc = function(def, preset, suffix, rotation)
+ return {
+ after_place_node=function(pos)
+ updateform(pos)
+ end,
+ after_dig_node=function(pos)
+ local pe = advtrains.encode_pos(pos)
+ advtrains.interlocking.npr_rails[pe] = nil
+ end,
+ on_receive_fields = function(pos, formname, fields, player)
+ if fields.npr then
+ local pe = advtrains.encode_pos(pos)
+ advtrains.interlocking.npr_rails[pe] = tonumber(fields.npr)
+ updateform(pos)
+ end
+ end,
+ advtrains = {
+ on_train_approach = function(pos,train_id, train, index)
+ if train.path_cn[index] == 1 then
+ local pe = advtrains.encode_pos(pos)
+ local npr = advtrains.interlocking.npr_rails[pe] or 2
+ advtrains.lzb_add_checkpoint(train, index, npr, nil)
+ end
+ end,
+ },
+ }
+end
+
+
+if minetest.get_modpath("advtrains_train_track") ~= nil then
+ advtrains.register_tracks("default", {
+ nodename_prefix="advtrains_interlocking:dtrack_npr",
+ texture_prefix="advtrains_dtrack_npr",
+ models_prefix="advtrains_dtrack",
+ models_suffix=".b3d",
+ shared_texture="advtrains_dtrack_shared_npr.png",
+ description="Point Speed Restriction Rail",
+ formats={},
+ get_additional_definiton = adefunc,
+ }, advtrains.trackpresets.t_30deg_straightonly)
+end \ No newline at end of file
diff --git a/advtrains/advtrains_itrainmap/depends.txt b/advtrains/advtrains_itrainmap/depends.txt
new file mode 100644
index 0000000..6f00bf6
--- /dev/null
+++ b/advtrains/advtrains_itrainmap/depends.txt
@@ -0,0 +1 @@
+advtrains \ No newline at end of file
diff --git a/advtrains/advtrains_itrainmap/init.lua b/advtrains/advtrains_itrainmap/init.lua
new file mode 100644
index 0000000..0443609
--- /dev/null
+++ b/advtrains/advtrains_itrainmap/init.lua
@@ -0,0 +1,149 @@
+
+
+local map_def={
+ example = {
+ p1x=168,
+ p1z=530,
+ p2x=780,
+ p2z=1016,
+ background="itm_example.png",
+ },
+}
+
+local itm_cache={}
+local itm_pdata={}
+local itm_conf_mindia=0.1
+
+minetest.register_privilege("itm", { description = "Allows to display train map", give_to_singleplayer = true, default = false })
+
+local function create_map_form_with_bg(d)
+ local minx, minz, maxx, maxz = math.min(d.p1x, d.p2x), math.min(d.p1z, d.p2z), math.max(d.p1x, d.p2x), math.max(d.p1z, d.p2z)
+ local form_x, form_z=10,10
+ local edge_x, edge_z = form_x/(maxx-minx), form_z/(maxz-minz)
+ local len_x, len_z=math.max(edge_x, itm_conf_mindia), math.max(edge_z, itm_conf_mindia)
+ local form="size["..(form_x+edge_x)..","..(form_z+edge_z).."] background[0,0;0,0;"..d.background..";true] "
+ local lbl={}
+
+ for pts, tid in pairs(advtrains.detector.on_node) do
+ local pos=minetest.string_to_pos(pts)
+ form=form.."box["..(edge_x*(pos.x-minx))..","..(form_z-(edge_z*(pos.z-minz)))..";"..len_x..","..len_z..";red]"
+ lbl[sid(tid)]=pos
+ end
+
+ for t_id, xz in pairs(lbl) do
+ form=form.."label["..(edge_x*(xz.x-minx))..","..(form_x-(edge_z*(xz.z-minz)))..";"..t_id.."]"
+ end
+ return form
+end
+
+local function create_map_form(d)
+ if d.background then
+ return create_map_form_with_bg(d)
+ end
+
+ local minx, minz, maxx, maxz = math.min(d.p1x, d.p2x), math.min(d.p1z, d.p2z), math.max(d.p1x, d.p2x), math.max(d.p1z, d.p2z)
+ local form_x, form_z=10,10
+ local edge_x, edge_z = form_x/(maxx-minx), form_z/(maxz-minz)
+ local len_x, len_z=math.max(edge_x, itm_conf_mindia), math.max(edge_z, itm_conf_mindia)
+ local form="size["..(form_x+edge_x)..","..(form_z+edge_z).."]"
+ local lbl={}
+
+ for x,itx in pairs(itm_cache) do
+ if x>=minx and x<=maxx then
+ for z,y in pairs(itx) do
+ if z>=minz and z<=maxz then
+ local adn=advtrains.detector.get({x=x, y=y, z=z})
+ local color="gray"
+ if adn then
+ color="red"
+ lbl[sid(adn)]={x=x, z=z}
+ end
+ form=form.."box["..(edge_x*(x-minx))..","..(form_z-(edge_z*(z-minz)))..";"..len_x..","..len_z..";"..color.."]"
+ end
+ end
+ end
+ end
+ for t_id, xz in pairs(lbl) do
+ form=form.."label["..(edge_x*(xz.x-minx))..","..(form_x-(edge_z*(xz.z-minz)))..";"..t_id.."]"
+ end
+ return form
+end
+
+local function cache_ndb()
+ itm_cache={}
+ local ndb_nodes=advtrains.ndb.get_nodes()
+ for y, xzt in pairs(ndb_nodes) do
+ for x, zt in pairs(xzt) do
+ for z, _ in pairs(zt) do
+ if not itm_cache[x] then
+ itm_cache[x]={}
+ end
+ itm_cache[x][z]=y
+ end
+ end
+ end
+end
+
+minetest.register_chatcommand("itm", {
+ params="[x1 z1 x2 z2] or [mdef]",
+ description="Display advtrains train map of given area.\nFirst form:[x1 z1 x2 z2] - specify area directly.\nSecond form:[mdef] - Use a predefined map background(see init.lua)\nThird form: No parameters - use WorldEdit position markers.",
+ privs={itm=true},
+ func = function(name, param)
+ local mdef=string.match(param, "^(%S+)$")
+ if mdef then
+ local d=map_def[mdef]
+ if not d then
+ return false, "Map definiton not found: "..mdef
+ end
+ itm_pdata[name]=map_def[mdef]
+ minetest.show_formspec(name, "itrainmap", create_map_form(d))
+ return true, "Showing train map: "..mdef
+ end
+ local x1, z1, x2, z2=string.match(param, "^(%S+) (%S+) (%S+) (%S+)$")
+ if not (x1 and z1 and x2 and z2) then
+ if worldedit then
+ local wep1, wep2=worldedit.pos1[name], worldedit.pos2[name]
+ if wep1 and wep2 then
+ x1, z1, x2, z2=wep1.x, wep1.z, wep2.x, wep2.z
+ end
+ end
+ end
+ if not (x1 and z1 and x2 and z2) then
+ return false, "Invalid parameters and no WE positions set"
+ end
+ local d={p1x=x1, p1z=z1, p2x=x2, p2z=z2}
+ itm_pdata[name]=d
+ minetest.show_formspec(name, "itrainmap", create_map_form(d))
+ return true, "Showing ("..x1..","..z1..")-("..x2..","..z2..")"
+ end,
+})
+minetest.register_chatcommand("itm_cache_ndb", {
+ params="",
+ description="Cache advtrains node database again. Run when tracks changed.",
+ privs={itm=true},
+ func = function(name, param)
+ cache_ndb()
+ return true, "Done caching node database."
+ end,
+})
+
+local timer=0
+function advtrains_itm_mainloop(dtime)
+ timer=timer-math.min(dtime, 0.1)
+ if timer<=0 then
+ for pname,d in pairs(itm_pdata) do
+ minetest.show_formspec(pname, "itrainmap", create_map_form(d))
+ end
+ timer=2
+ end
+end
+minetest.register_on_player_receive_fields(function(player, formname, fields)
+ if formname=="itrainmap" and fields.quit then
+ itm_pdata[player:get_player_name()]=nil
+ end
+end)
+
+function advtrains_itm_init()
+ --automatically run itm_cache_ndb
+ minetest.after(2, cache_ndb)
+end
diff --git a/advtrains/advtrains_itrainmap/textures/itm_example.png b/advtrains/advtrains_itrainmap/textures/itm_example.png
new file mode 100644
index 0000000..caf084a
--- /dev/null
+++ b/advtrains/advtrains_itrainmap/textures/itm_example.png
Binary files differ
diff --git a/advtrains/advtrains_line_automation/depends.txt b/advtrains/advtrains_line_automation/depends.txt
new file mode 100644
index 0000000..ce2e23c
--- /dev/null
+++ b/advtrains/advtrains_line_automation/depends.txt
@@ -0,0 +1,2 @@
+advtrains_interlocking
+advtrains_train_track? \ No newline at end of file
diff --git a/advtrains/advtrains_line_automation/init.lua b/advtrains/advtrains_line_automation/init.lua
new file mode 100644
index 0000000..7b758bc
--- /dev/null
+++ b/advtrains/advtrains_line_automation/init.lua
@@ -0,0 +1,47 @@
+-- Advtrains line automation system
+
+advtrains.lines = {
+ -- [station code] = {name=..., owner=...}
+ stations = {},
+
+ --[[ [new pos hash] = {
+ stn = <station code>,
+ track = <platform identifier>,
+ doors = <door side L,R,C>
+ wait = <least wait time>
+ reverse = <boolean>
+ signal = <position of signal that is the "exit signal" for this platform>
+ }]]
+ stops = {},
+}
+
+
+local modpath = minetest.get_modpath(minetest.get_current_modname()) .. DIR_DELIM
+
+dofile(modpath.."railwaytime.lua")
+dofile(modpath.."scheduler.lua")
+dofile(modpath.."stoprail.lua")
+
+
+function advtrains.lines.load(data)
+ if data then
+ advtrains.lines.stations = data.stations or {}
+ advtrains.lines.stops = data.stops or {}
+ advtrains.lines.rwt.set_time(data.rwt_time)
+ advtrains.lines.sched.load(data.scheduler_queue)
+ end
+end
+
+function advtrains.lines.save()
+ return {
+ stations = advtrains.lines.stations,
+ stops = advtrains.lines.stops,
+ rwt_time = advtrains.lines.rwt.get_time(),
+ scheduler_queue = advtrains.lines.sched.save()
+ }
+end
+
+function advtrains.lines.step(dtime)
+ advtrains.lines.rwt.step(dtime)
+ advtrains.lines.sched.run()
+end
diff --git a/advtrains/advtrains_line_automation/railwaytime.lua b/advtrains/advtrains_line_automation/railwaytime.lua
new file mode 100644
index 0000000..258009e
--- /dev/null
+++ b/advtrains/advtrains_line_automation/railwaytime.lua
@@ -0,0 +1,308 @@
+-- railwaytime.lua
+-- Advtrains uses a desynchronized time for train movement. Everything is counted relative to this time counter.
+-- The advtrains-internal time is in no way synchronized to the real-life time, due to:
+-- - Lag
+-- - Server stops/restarts
+-- However, this means that implementing a "timetable" system using the "real time" is not practical. Therefore,
+-- we introduce a custom time system, the RWT(Railway Time), which has nothing to do with RLT(Real-Life Time)
+-- RWT has a time cycle of 1 hour. This should be sufficient for most train lines that will ever be built in Minetest.
+-- A RWT looks like this: 37;25
+-- The ; is to distinguish it from a normal RLT (which has colons e.g. 12:34:56). Left number is minutes, right number is seconds.
+-- The minimum RWT is 00;00, the maximum is 59;59.
+-- It is OK to leave one places out at either end, esp. when writing relative times, such as:
+-- 43;3 22;0 2;30 0;10 ;10
+-- Those places are then filled with zeroes. Indeed, ";" would be valid for 00;00 .
+
+-- There is an "adapt mode", which was proposed by gpcf, and results in RWT automatically adapting itself to real-world time.
+-- It works by shifting the minute/second after the realtime minute/second, adjusting the cycle value as needed.
+
+-- Using negative times is discouraged. If you need a negative time, you may insert a minus (-) ONLY in the "c" place
+
+--[[
+1;23;45 = {
+ s=45,
+ m=23,
+ c=1, -- Cycle(~hour), not displayed most time
+}
+
+Railway times can exist in 3 forms:
+- as table (see above)
+- as string (like "12;34")
+- as number (of seconds)
+
+Forms are automagically converted as needed by the converter functions to_*
+To be sure a rwt is in the required form, explicitly use a converter.
+
+]]
+
+local rwt = {}
+
+--Time Stamp (Seconds since start of world)
+local e_time = 0
+local e_has_loaded = false
+
+local setting_rwt_real = minetest.settings:get("advtrains_lines_rwt_realtime")
+if setting_rwt_real=="" then
+ setting_rwt_real = "independent"
+end
+
+local e_last_epoch -- last real-time timestamp
+
+-- Advance RWT to match minute/second to the current real-world time
+-- only accounts for the minute/second part, leaves hour/cycle untouched
+local function adapt_real_time()
+ local datetab = os.date("*t")
+ local real_sectotal = 60*datetab.min + datetab.sec
+
+ local rwttab = rwt.now()
+ local rwt_sectotal = 60*rwttab.m + rwttab.s
+
+ --calculate the difference and take it %3600 (seconds/hour) to always move forward
+ local secsfwd = (real_sectotal - rwt_sectotal) % 3600
+
+ atlog("[lines][rwt] Skipping",secsfwd,"seconds forward to sync rwt (",rwt.to_string(rwttab),") to real time (",os.date("%H:%M:%S"),")")
+
+ e_time = e_time + secsfwd
+end
+
+function rwt.set_time(t)
+ e_time = t or 0
+ if setting_rwt_real == "adapt_real" then
+ adapt_real_time()
+ end
+ atlog("[lines][rwt] Initialized railway time: ",rwt.to_string(e_time))
+ e_last_epoch = os.time()
+
+ e_has_loaded = true
+end
+
+function rwt.get_time()
+ return e_time
+end
+
+function rwt.step(dt)
+ if not e_has_loaded then
+ rwt.set_time(0)
+ end
+
+ if setting_rwt_real=="independent" then
+ -- Regular stepping with dtime
+ e_time = e_time + dt
+ else
+ -- advance with real-world time
+ local diff = os.time() - e_last_epoch
+ e_last_epoch = os.time()
+
+ if diff>0 then
+ e_time = e_time + diff
+ end
+ end
+end
+
+function rwt.now()
+ return rwt.to_table(e_time)
+end
+
+function rwt.new(c, m, s)
+ return {
+ c = c or 0,
+ m = m or 0,
+ s = s or 0
+ }
+end
+function rwt.copy(rwtime)
+ local rwtimet = rwt.to_table(rwtime)
+ return {
+ c = rwtimet.c or 0,
+ m = rwtimet.m or 0,
+ s = rwtimet.s or 0
+ }
+end
+
+function rwt.to_table(rwtime)
+ if type(rwtime) == "table" then
+ return rwtime
+ elseif type(rwtime) == "string" then
+ return rwt.parse(rwtime)
+ elseif type(rwtime) == "number" then
+ local res = {}
+ local seconds = atfloor(rwtime)
+ res.s = seconds % 60
+ local minutes = atfloor(seconds/60)
+ res.m = minutes % 60
+ res.c = atfloor(minutes/60)
+ return res
+ end
+end
+
+function rwt.to_secs(rwtime, c_over)
+ local res = rwtime
+ if type(rwtime) == "string" then
+ res = rwt.parse(rwtime)
+ elseif type(rwtime) == "number" then
+ return rwtime
+ end
+ if type(res)=="table" then
+ return (c_over or res.c)*60*60 + res.m*60 + res.s
+ end
+end
+
+function rwt.to_string(rwtime_p, no_cycle)
+ local rwtime = rwt.to_table(rwtime_p)
+ if rwtime.c~=0 and not no_cycle then
+ return string.format("%d;%02d;%02d", rwtime.c, rwtime.m, rwtime.s)
+ else
+ return string.format("%02d;%02d", rwtime.m, rwtime.s)
+ end
+end
+
+---
+
+local function v_n(str, cpl)
+ if not str then return nil end
+ if str == "" then
+ return 0
+ end
+ local n = tonumber(str)
+ if not cpl and (n<0 or n>59) then
+ return nil
+ end
+ return n
+end
+
+function rwt.parse(str)
+ --atdebug("parse",str)
+ --3-value form
+ local str_c, str_m, str_s = string.match(str, "^(%-?%d?%d?);(%d%d);(%d?%d?)$")
+ if str_c and str_m and str_s then
+ --atdebug("3v",str_c, str_m, str_s)
+ local c, m, s = v_n(str_c, true), v_n(str_m), v_n(str_s)
+ if c and m and s then
+ return rwt.new(c,m,s)
+ end
+ end
+ --2-value form
+ local str_m, str_s = string.match(str, "^(%d?%d?);(%d?%d?)$")
+ if str_m and str_s then
+ --atdebug("2v",str_m, str_s)
+ local m, s = v_n(str_m), v_n(str_s)
+ if m and s then
+ return rwt.new(0,m,s)
+ end
+ end
+end
+
+---
+
+function rwt.add(t1, t2)
+ local t1s = rwt.to_secs(t1)
+ local t2s = rwt.to_secs(t2)
+ return rwt.to_table(t1s + t2s)
+end
+
+-- How many seconds FROM t1 TO t2
+function rwt.diff(t1, t2)
+ local t1s = rwt.to_secs(t1)
+ local t2s = rwt.to_secs(t2)
+ return t2s - t1s
+end
+
+-- Subtract t2 from t1 (inverted argument order compared to diff())
+function rwt.sub(t1, t2)
+ return rwt.to_table(rwt.diff(t2, t1))
+end
+
+-- Adjusts t2 by thresh and then returns time from t1 to t2
+function rwt.adj_diff(t1, t2, thresh)
+ local newc = rwt.adjust_cycle(t2, thresh, t1)
+ local t1s = rwt.to_secs(t1)
+ local t2s = rwt.to_secs(t2, newc)
+ return t1s - t2s
+end
+
+
+
+-- Threshold values
+-- "reftime" is the time to which this is made relative and defaults to now.
+rwt.CA_FUTURE = 60*60 - 1 -- Selected so that time lies at or in the future of reftime (at nearest point in time)
+rwt.CA_FUTURES = 60*60 -- Same, except when times are equal, advances one full cycle
+rwt.CA_PAST = 0 -- Selected so that time lies at or in the past of reftime
+rwt.CA_PASTS = -1 -- Same, except when times are equal, goes back one full cycle
+rwt.CA_CENTER = 30*60 -- If time is within past 30 minutes of reftime, selected as past, else selected as future.
+
+-- Adjusts the "cycle" value of a railway time to be in some relation to reftime.
+-- Returns new cycle
+function rwt.adjust_cycle(rwtime, reftime_p, thresh)
+ local reftime = reftime_p or rwt.now()
+
+ local reftimes = rwt.to_secs(reftime)
+
+ local rwtimes = rwt.to_secs(rwtime, 0)
+ local timeres = reftimes + thresh - rwtimes
+ local cycles = atfloor(timeres / (60*60))
+
+ return cycles
+end
+
+function rwt.adjust(rwtime, reftime, thresh)
+ local cp = rwt.copy(rwtime)
+ cp.c = rwt.adjust_cycle(rwtime, reftime, thresh)
+ return cp
+end
+
+-- Useful for departure times: returns time (in seconds)
+-- until the next (adjusted FUTURE) occurence of deptime is reached
+-- in this case, rwtime is used as reftime and deptime should lie in the future of rwtime
+-- rwtime defaults to NOW
+function rwt.get_time_until(deptime, rwtime_p)
+ local rwtime = rwtime_p or rwt.now()
+ return rwt.adj_diff(rwtime, deptime, rwt.CA_FUTURE)
+end
+
+
+-- Helper functions for handling "repeating times" (rpt)
+-- Those are generic declarations for time intervals like "every 5 minutes", with an optional offset
+-- ( /02;00-00;45 in timetable syntax
+
+-- Get the time (in seconds) until the next time this rpt occurs
+function rwt.time_to_next_rpt(rwtime, rpt_interval, rpt_offset)
+ local rpti_s = rwt.to_secs(rpt_interval)
+
+ return (rpti_s - rwt.time_from_last_rpt(rwtime, rpti_s, rpt_offset)) % rpti_s
+ -- Modulo is just there to clip a false value of rpti_s to 0
+end
+
+
+-- Get the time (in seconds) since the last time this rpt occured
+function rwt.time_from_last_rpt(rwtime, rpt_interval, rpt_offset)
+ local rwtime_s = rwt.to_secs(rwtime)
+ local rpti_s = rwt.to_secs(rpt_interval)
+ local rpto_s = rwt.to_secs(rpt_offset)
+
+ return ((rwtime_s - rpto_s) % rpti_s)
+end
+
+-- From rwtime, get the next time that is divisible by rpt_interval offset by rpt_offset
+function rwt.next_rpt(rwtime, rpt_interval, rpt_offset)
+ local rwtime_s = rwt.to_secs(rwtime)
+ local rpti_s = rwt.to_secs(rpt_interval)
+ local time_from_last = rwt.time_from_last_rpt(rwtime_s, rpti_s, rpt_offset)
+
+ local res_s = rwtime_s - time_from_last + rpti_s
+
+ return rwt.to_table(res_s)
+end
+
+-- from rwtime, get the last time that this rpt matched (which is actually just next_rpt - rpt_offset
+function rwt.last_rpt(rwtime, rpt_interval, rpt_offset)
+ local rwtime_s = rwt.to_sec(rwtime)
+ local rpti_s = rwt.to_sec(rpt_interval)
+ local time_from_last = rwt.time_from_last_rpt(rwtime, rpt_interval, rpt_offset)
+
+ local res_s = rwtime_s - time_from_last
+
+ return rwt.to_table(res_s)
+end
+
+
+advtrains.lines.rwt = rwt
diff --git a/advtrains/advtrains_line_automation/readme.txt b/advtrains/advtrains_line_automation/readme.txt
new file mode 100644
index 0000000..3280ce9
--- /dev/null
+++ b/advtrains/advtrains_line_automation/readme.txt
@@ -0,0 +1,5 @@
+== advtrains_line_automation
+This mod provides an extension to the interlocking system which allows to automatically operate trains on train lines.
+
+This extension makes use of the table
+advtrains.lines \ No newline at end of file
diff --git a/advtrains/advtrains_line_automation/scheduler.lua b/advtrains/advtrains_line_automation/scheduler.lua
new file mode 100644
index 0000000..6025b02
--- /dev/null
+++ b/advtrains/advtrains_line_automation/scheduler.lua
@@ -0,0 +1,133 @@
+-- scheduler.lua
+-- Implementation of a Railway time schedule queue
+-- In contrast to the LuaATC interrupt queue, this one can handle many different
+-- event receivers. This is done by registering a callback with the scheduler
+
+local ln = advtrains.lines
+local sched = {}
+
+local UNITS_THRESH = 10
+local MAX_PER_ITER = 10
+
+local callbacks = {}
+
+-- Register a handler callback to handle scheduler items.
+-- e - a handler identifier (corresponds to "handler" in enqueue() )
+-- func - a function(evtdata) to be executed when a schedule item expires
+-- evtdata - arbitrary data that has been passed into enqueue()
+function sched.register_callback(e, func)
+ callbacks[e] = func
+end
+
+--[[
+{
+ t = <railway time in seconds>
+ e = <handler callback>
+ d = <data table>
+ u = <unit identifier>
+}
+The "unit identifier" is there to prevent schedule overflows. It can be, for example, the position hash
+of a node or a train ID. If the number of schedules for a unit exceeds UNITS_THRESH, further schedules are
+blocked.
+]]--
+local queue = {}
+
+local units_cnt = {}
+
+function sched.load(data)
+ if data then
+ for i,elem in ipairs(data) do
+ table.insert(queue, elem)
+ units_cnt[elem.u] = (units_cnt[elem.u] or 0) + 1
+ end
+ atlog("[lines][scheduler] Loaded the schedule queue,",#data,"items.")
+ end
+end
+function sched.save()
+ return queue
+end
+
+function sched.run()
+ local ctime = ln.rwt.get_time()
+ local cnt = 0
+ local ucn, elem
+ while cnt <= MAX_PER_ITER do
+ elem = queue[1]
+ if elem and elem.t <= ctime then
+ table.remove(queue, 1)
+ if callbacks[elem.e] then
+ -- run it
+ callbacks[elem.e](elem.d)
+ else
+ atwarn("[lines][scheduler] No callback to handle schedule",elem)
+ end
+ cnt=cnt+1
+ ucn = units_cnt[elem.u]
+ if ucn and ucn>0 then
+ units_cnt[elem.u] = ucn - 1
+ end
+ else
+ break
+ end
+ end
+end
+
+-- Enqueue a new scheduled item to be executed at "rwtime"
+-- handler: a string identifying the handler to use (registered with sched.register_callback())
+-- evtdata: Arbitrary Lua data to be passed to the handler callback
+-- unitid: An arbitrary string uniquely identifying the thing that is issuing this enqueue.
+-- used to prevent expotentially growing "scheduler bombs"
+-- unitlim: Custom override for UNITS_THRESH (see there)
+function sched.enqueue(rwtime, handler, evtdata, unitid, unitlim)
+ local qtime = ln.rwt.to_secs(rwtime)
+ assert(type(handler)=="string")
+ assert(type(unitid)=="string")
+ assert(type(unitlim)=="number")
+
+ local cnt=1
+ local ucn, elem
+
+ ucn = (units_cnt[unitid] or 0)
+ local ulim=(unitlim or UNITS_THRESH)
+ if ucn >= ulim then
+ atlog("[lines][scheduler] discarding enqueue for",handler,"(limit",ulim,") because unit",unitid,"has already",ucn,"schedules enqueued")
+ return false
+ end
+
+ while true do
+ elem = queue[cnt]
+ if not elem or elem.t > qtime then
+ table.insert(queue, cnt, {
+ t=qtime,
+ e=handler,
+ d=evtdata,
+ u=unitid,
+ })
+ units_cnt[unitid] = ucn + 1
+ return true
+ end
+ cnt = cnt+1
+ end
+end
+
+-- See enqueue(). Same meaning, except that rwtime is relative to now.
+function sched.enqueue_in(rwtime, handler, evtdata, unitid, unitlim)
+ local ctime = ln.rwt.get_time()
+ local rwtime_s = ln.rwt.to_secs(rwtime)
+ sched.enqueue(ctime + rwtime_s, handler, evtdata, unitid, unitlim)
+end
+
+-- Discards all schedules for unit "unitid" (removes them from the queue)
+function sched.discard_all(unitid)
+ local i = 1
+ while i<=#queue do
+ if queue[i].u == unitid then
+ table.remove(queue,i)
+ else
+ i=i+1
+ end
+ end
+ units_cnt[unitid] = 0
+end
+
+ln.sched = sched
diff --git a/advtrains/advtrains_line_automation/settingtypes.txt b/advtrains/advtrains_line_automation/settingtypes.txt
new file mode 100644
index 0000000..ea3f66e
--- /dev/null
+++ b/advtrains/advtrains_line_automation/settingtypes.txt
@@ -0,0 +1,6 @@
+# This controls how the Railway Time relates to real-world time:
+# *independent - RWT counts independent of real time synchronized to ingame steps. Recommended for singleplayer and ad-hoc servers.
+# *follow_real - RWT is independent of real time, but counts up in real-world time speed
+# *adapt_real - RWT adapts its minute and second to real-world time. When the server is stopped and restarted, this results in a "time jump".
+# Time will jump for 1 cycle (59;59) at maximum.
+advtrains_lines_rwt_realtime (RWT real time adaption) enum independent independent,follow_real,adapt_real \ No newline at end of file
diff --git a/advtrains/advtrains_line_automation/stoprail.lua b/advtrains/advtrains_line_automation/stoprail.lua
new file mode 100644
index 0000000..ee8faac
--- /dev/null
+++ b/advtrains/advtrains_line_automation/stoprail.lua
@@ -0,0 +1,218 @@
+-- stoprail.lua
+-- adds "stop rail". Recognized by lzb. (part of behavior is implemented there)
+
+
+local function to_int(n)
+ --- Disallow floating-point numbers
+ local k = tonumber(n)
+ if k then
+ return math.floor(k)
+ end
+end
+
+local function updatemeta(pos)
+ local meta = minetest.get_meta(pos)
+ local pe = advtrains.encode_pos(pos)
+ local stdata = advtrains.lines.stops[pe]
+ if not stdata then
+ meta:set_string("infotext", "Error")
+ end
+
+ meta:set_string("infotext", "Stn. "..stdata.stn.." T. "..stdata.track)
+end
+
+local door_dropdown = {L=1, R=2, C=3}
+local door_dropdown_rev = {Right="R", Left="L", Closed="C"}
+
+local function show_stoprailform(pos, player)
+ local pe = advtrains.encode_pos(pos)
+ local pname = player:get_player_name()
+ if minetest.is_protected(pos, pname) then
+ minetest.chat_send_player(pname, "Position is protected!")
+ return
+ end
+
+ local stdata = advtrains.lines.stops[pe]
+ if not stdata then
+ advtrains.lines.stops[pe] = {
+ stn="", track="", doors="R", wait=10, ars={default=true}, ddelay=1,speed="M"
+ }
+ stdata = advtrains.lines.stops[pe]
+ end
+
+ local stn = advtrains.lines.stations[stdata.stn]
+ local stnname = stn and stn.name or ""
+ if not stdata.ddelay then
+ stdata.ddelay = 1
+ end
+ if not stdata.speed then
+ stdata.speed = "M"
+ end
+
+ local form = "size[8,7]"
+ form = form.."field[0.5,0.5;7,1;stn;"..attrans("Station Code")..";"..minetest.formspec_escape(stdata.stn).."]"
+ form = form.."field[0.5,1.5;7,1;stnname;"..attrans("Station Name")..";"..minetest.formspec_escape(stnname).."]"
+ form = form.."field[0.5,2.5;2,1;ddelay;"..attrans("Door Delay")..";"..minetest.formspec_escape(stdata.ddelay).."]"
+ form = form.."field[3,2.5;3,1;speed;"..attrans("Departure Speed")..";"..minetest.formspec_escape(stdata.speed).."]"
+ form = form.."label[0.5,3;Door side:]"
+ form = form.."dropdown[0.5,3;2;doors;Left,Right,Closed;"..door_dropdown[stdata.doors].."]"
+ form = form.."dropdown[3,3;1.5;reverse;---,Reverse;"..(stdata.reverse and 2 or 1).."]"
+
+ form = form.."field[5,3.5;2,1;track;"..attrans("Track")..";"..minetest.formspec_escape(stdata.track).."]"
+ form = form.."field[5,4.5;2,1;wait;"..attrans("Stop Time")..";"..stdata.wait.."]"
+
+ form = form.."textarea[0.5,4;4,2;ars;Trains stopping here (ARS rules);"..advtrains.interlocking.ars_to_text(stdata.ars).."]"
+
+ form = form.."button[0.5,6;7,1;save;"..attrans("Save").."]"
+
+ minetest.show_formspec(pname, "at_lines_stop_"..pe, form)
+end
+
+minetest.register_on_player_receive_fields(function(player, formname, fields)
+ local pname = player:get_player_name()
+ local pe = string.match(formname, "^at_lines_stop_(............)$")
+ local pos = advtrains.decode_pos(pe)
+ if pos then
+ if minetest.is_protected(pos, pname) then
+ minetest.chat_send_player(pname, "Position is protected!")
+ return
+ end
+
+ local stdata = advtrains.lines.stops[pe]
+ if fields.save then
+ if fields.stn and stdata.stn ~= fields.stn then
+ if fields.stn ~= "" then
+ local stn = advtrains.lines.stations[fields.stn]
+ if stn then
+ if (stn.owner == pname or minetest.check_player_privs(pname, "train_admin")) then
+ stdata.stn = fields.stn
+ else
+ minetest.chat_send_player(pname, "Station code '"..fields.stn.."' does already exist and is owned by "..stn.owner)
+ end
+ else
+ advtrains.lines.stations[fields.stn] = {name = fields.stnname, owner = pname}
+ stdata.stn = fields.stn
+ end
+ end
+ updatemeta(pos)
+ show_stoprailform(pos, player)
+ return
+ end
+ local stn = advtrains.lines.stations[stdata.stn]
+ if stn and fields.stnname and fields.stnname ~= stn.name then
+ if (stn.owner == pname or minetest.check_player_privs(pname, "train_admin")) then
+ stn.name = fields.stnname
+ else
+ minetest.chat_send_player(pname, "Not allowed to edit station name, owned by "..stn.owner)
+ end
+ end
+
+ -- dropdowns
+ if fields.doors then
+ stdata.doors = door_dropdown_rev[fields.doors] or "C"
+ end
+ if fields.reverse then
+ stdata.reverse = fields.reverse == "Reverse"
+ end
+
+
+ if fields.track then
+ stdata.track = fields.track
+ end
+ if fields.wait then
+ stdata.wait = to_int(fields.wait) or 10
+ end
+
+ if fields.ars then
+ stdata.ars = advtrains.interlocking.text_to_ars(fields.ars)
+ end
+
+ if fields.ddelay then
+ stdata.ddelay = to_int(fields.ddelay) or 1
+ end
+ if fields.speed then
+ stdata.speed = to_int(fields.speed) or "M"
+ end
+
+ --TODO: signal
+ updatemeta(pos)
+ show_stoprailform(pos, player)
+ end
+ end
+
+end)
+
+
+local adefunc = function(def, preset, suffix, rotation)
+ return {
+ after_place_node=function(pos)
+ local pe = advtrains.encode_pos(pos)
+ advtrains.lines.stops[pe] = {
+ stn="", track="", doors="R", wait=10
+ }
+ updatemeta(pos)
+ end,
+ after_dig_node=function(pos)
+ local pe = advtrains.encode_pos(pos)
+ advtrains.lines.stops[pe] = nil
+ end,
+ on_rightclick = function(pos, node, player)
+ show_stoprailform(pos, player)
+ end,
+ advtrains = {
+ on_train_approach = function(pos,train_id, train, index)
+ if train.path_cn[index] == 1 then
+ local pe = advtrains.encode_pos(pos)
+ local stdata = advtrains.lines.stops[pe]
+ if stdata and stdata.stn then
+
+ --TODO REMOVE AFTER SOME TIME (only migration)
+ if not stdata.ars then
+ stdata.ars = {default=true}
+ end
+ if stdata.ars and (stdata.ars.default or advtrains.interlocking.ars_check_rule_match(stdata.ars, train) ) then
+ advtrains.lzb_add_checkpoint(train, index, 2, nil)
+ local stn = advtrains.lines.stations[stdata.stn]
+ local stnname = stn and stn.name or "Unknown Station"
+ train.text_inside = "Next Stop:\n"..stnname
+ end
+ end
+ end
+ end,
+ on_train_enter = function(pos, train_id, train, index)
+ if train.path_cn[index] == 1 then
+ local pe = advtrains.encode_pos(pos)
+ local stdata = advtrains.lines.stops[pe]
+ if not stdata then
+ return
+ end
+
+ if stdata.ars and (stdata.ars.default or advtrains.interlocking.ars_check_rule_match(stdata.ars, train) ) then
+ local stn = advtrains.lines.stations[stdata.stn]
+ local stnname = stn and stn.name or "Unknown Station"
+
+ -- Send ATC command and set text
+ advtrains.atc.train_set_command(train, "B0 W O"..stdata.doors.." D"..stdata.wait.." OC "..(stdata.reverse and "R" or "").."D"..(stdata.ddelay or 1) .. "S" ..(stdata.speed or "M"), true)
+ train.text_inside = stnname
+ if tonumber(stdata.wait) then
+ minetest.after(tonumber(stdata.wait), function() train.text_inside = "" end)
+ end
+ end
+ end
+ end
+ },
+ }
+end
+
+if minetest.get_modpath("advtrains_train_track") ~= nil then
+ advtrains.register_tracks("default", {
+ nodename_prefix="advtrains_line_automation:dtrack_stop",
+ texture_prefix="advtrains_dtrack_stop",
+ models_prefix="advtrains_dtrack",
+ models_suffix=".b3d",
+ shared_texture="advtrains_dtrack_shared_stop.png",
+ description="Station/Stop Rail",
+ formats={},
+ get_additional_definiton = adefunc,
+ }, advtrains.trackpresets.t_30deg_straightonly)
+end \ No newline at end of file
diff --git a/advtrains/advtrains_line_automation/textures/advtrains_dtrack_shared_stop.png b/advtrains/advtrains_line_automation/textures/advtrains_dtrack_shared_stop.png
new file mode 100644
index 0000000..b6629cf
--- /dev/null
+++ b/advtrains/advtrains_line_automation/textures/advtrains_dtrack_shared_stop.png
Binary files differ
diff --git a/advtrains/advtrains_line_automation/textures/advtrains_dtrack_stop_placer.png b/advtrains/advtrains_line_automation/textures/advtrains_dtrack_stop_placer.png
new file mode 100644
index 0000000..0d1c769
--- /dev/null
+++ b/advtrains/advtrains_line_automation/textures/advtrains_dtrack_stop_placer.png
Binary files differ
diff --git a/advtrains/advtrains_luaautomation/README.txt b/advtrains/advtrains_luaautomation/README.txt
new file mode 100644
index 0000000..287a0bd
--- /dev/null
+++ b/advtrains/advtrains_luaautomation/README.txt
@@ -0,0 +1,288 @@
+
+#### Advtrains - Lua Automation features
+
+This mod offers components that run LUA code and interface with each other through a global environment. It makes complex automated railway systems possible.
+
+### atlatc
+The mod is sometimes abbreviated as 'atlatc'. This stands for AdvTrainsLuaATC. This short name has been chosen for user convenience, since the name of this mod ('advtrains_luaautomation') is very long.
+
+### Privilege
+To perform any operations using this mod (except executing operation panels), players need the "atlatc" privilege.
+This privilege should never be granted to anyone except trusted administrators. Even though the LUA environment is sandboxed, it is still possible to DoS the server by coding infinite loops or requesting expotentially growing interrupts.
+
+### Active and passive
+Active components are these who have LUA code running in them. They are triggered on specific events. Passive components are dumb, they only have a state and can be set to another state, they can't perform actions themselves.
+
+### Environments
+
+Each active component is assigned to an environment. This is where all data are held. Components in different environments can't inferface with each other.
+This system allows multiple independent automation systems to run simultaneously without polluting each other's environment.
+
+/env_create <env_name>
+Create environment with the given name. To be able to do anything, you first need to create an environment. Choose the name wisely, you can't change it afterwards.
+
+/env_setup <env_name>
+Invoke the form to edit the environment's initialization code. For more information, see the section on active components. You can also delete an environment from here.
+
+### Active components
+
+The code of every active component is run on specific events which are explained soon. When run, every variable written that is not local and is no function or userdata is saved over code re-runs and over server restarts. Additionally, the following global variables are defined:
+
+# event
+The variable 'event' contains a table with information on the current event. How this table can look is explained below.
+
+# S
+The variable 'S' contains a table which is shared between all components of the environment. Its contents are persistent over server restarts. May not contain functions, every other value is allowed.
+Example:
+Component 1: S.stuff="foo"
+Component 2: print(S.stuff)
+-> foo
+
+# F
+The variable 'F' also contains a table which is shared between all components of the environment. Its contents are discarded on server shutdown or when the init code gets re-run. Every data type is allowed, even functions.
+The purpose of this table is not to save data, but to provide static value and function definitions. The table should be populated by the init code.
+
+# Standard Lua functions
+The following standard Lua libraries are available:
+string, math, table, os
+The following standard Lua functions are available:
+assert, error, ipairs, pairs, next, select, tonumber, tostring, type, unpack
+
+Every attempt to overwrite any of the predefined values results in an error.
+
+# LuaAutomation-specific global functions
+
+POS(x,y,z)
+Shorthand function to create a position vector {x=?, y=?, z=?} with less characters
+
+In the following functions, all parameters named 'pos' designate a position. You can use either:
+- a default Minetest position vector (like {x=34, y=2, z=-18})
+- the POS(34,2,-18) shorthand
+- A string, the passive component name. See 'passive component naming'.
+
+getstate(pos)
+Get the state of the passive component at position 'pos'. See section on passive components for more info.
+pos can be either a position vector (created by POS()) or a string, the name of this passive component.
+
+setstate(pos, newstate)
+Set the state of the passive component at position 'pos'.
+
+is_passive(pos)
+Checks whether there is a passive component at the position pos (and/or whether a passive component with this name exists)
+
+interrupt(time, message)
+Cause LuaAutomation to trigger an 'int' event on this component after the given time in seconds with the specified 'message' field. 'message' can be of any Lua data type.
+Not available in init code!
+
+interrupt_pos(pos, message)
+Immediately trigger an 'ext_int' event on the active component at position pos. 'message' is like in interrupt().
+USE WITH CARE, or better don't use! Incorrect use can result in expotential growth of interrupts.
+
+digiline_send(channel, message)
+Make this active component send a digiline message on the specified channel.
+Not available in init code!
+
+-- The next 4 functions are available when advtrains_interlocking is enabled: --
+
+can_set_route(pos, route_name)
+Returns whether it is possible to set the route designated by route_name from the signal at pos.
+
+set_route(pos, route_name)
+Requests the given route from the signal at pos. Has the same effect as clicking "Set Route" in the signalling dialog.
+
+cancel_route(pos)
+Cancels the route that is set from the signal at pos. Has the same effect as clicking "Cancel Route" in the signalling dialog.
+
+get_aspect(pos)
+Returns the signal aspect of the signal at pos. A signal aspect has the following format:
+aspect = {
+ main = { -- the next track section in line. Shows blocked for shunt routes
+ free = <boolean>,
+ speed = <int km/h>,
+ },
+ shunt = { -- whether a "shunting allowed" aspect should be shown
+ free = <boolean>,
+ }
+ dst = { -- the aspect of the next main signal on (at end of) route
+ free = <boolean>,
+ speed = <int km/h>,
+ }
+ info = {
+ call_on = <boolean>, -- Call-on route, expect train in track ahead
+ dead_end = <boolean>, -- Route ends on a dead end (e.g. bumper)
+ }
+}
+As of August 2018, only the aspect.main.free field is ever used by the interlocking system.
+
+# Lines
+
+The advtrains_line_automation component adds a few contraptions that should make creating timeable systems easier.
+Part of its functionality is also available in LuaATC:
+
+- rwt.* - all Railway Time functions are included as documented in https://advtrains.de/wiki/doku.php?id=dev:lines:rwt
+
+- schedule(rw_time, msg)
+- schedule_in(rw_dtime, msg)
+Schedules an event of type {type="schedule", schedule=true, msg=msg} at (resp. after) the specified railway time.
+(which can be in any format). You can only schedule one event this way. (uses the new lines-internal scheduler)
+
+## Components and events
+
+The event table is a table of the following format:
+{
+ type = "<type>",
+ <type> = true,
+ ... additional content ...
+}
+You can check for the event type by either using
+if event.type == "wanted" then ...do stuff... end
+or
+if event.wanted then ...do stuff... end
+(if 'wanted' is the event type to check for)
+
+# Init code
+The initialization code is not a component as such, but rather a part of the whole environment. It can (and should) be used to make definitions that other components can refer to.
+Examples:
+A function to define behavior for trains in subway stations:
+function F.station()
+ if event.train then atc_send("B0WOL") end
+ if event.int and event.message="depart" then atc_send("OCD1SM") end
+end
+
+The init code is run whenever the F table needs to be refilled with data. This is the case on server startup and whenever the init code is changed and you choose to run it.
+Functions are run in the environment of the currently active node, regardless of where they were defined. So, the 'event' table always reflects the state of the calling node.
+
+The 'event' table of the init code is always {type="init", init=true}.
+
+# ATC rails
+The Lua-controlled ATC rails are the only components that can actually interface with trains. The following event types are generated:
+
+{type="train", train=true, id="<train_id>"}
+This event is fired when a train enters the rail. The field 'id' is the unique train ID, which is 6-digit random numerical string.
+If the world contains trains from an older advtrains version, this string may be longer and contain a dot (.)
+
+{type="int", int=true, msg=<message>}
+Fired when an interrupt set by the 'interrupt' function runs out. 'message' is the message passed to the interrupt function.
+For backwards compatiblity reasons, <message> is also contained in an event.message field.
+{type="ext_int", ext_int=true, message=<message>}
+Fired when another node called 'interrupt_pos' on this position. 'message' is the message passed to the interrupt_pos function.
+
+{type="digiline", digiline=true, channel=<channel>, msg=<message>}
+Fired when the controller receives a digiline message.
+
+In addition to the default environment functions, the following functions are available:
+
+atc_send(<atc_command>)
+ Sends the specified ATC command to the train and returns true. If there is no train, returns false and does nothing.
+atc_reset()
+ Resets the train's current ATC command. If there is no train, returns false and does nothing.
+atc_arrow
+ Boolean, true when the train is driving in the direction of the arrows of the ATC rail. Nil if there is no train.
+atc_id
+ Train ID of the train currently passing the controller. Nil if there's no train.
+atc_speed
+ Speed of the train, or nil if there is no train.
+atc_set_text_outside(text)
+ Set text shown on the outside of the train. Pass nil to show no text.
+atc_set_text_inside(text)
+ Set text shown to train passengers. Pass nil to show no text.
+get_line()
+ Returns the "Line" property of the train (a string).
+ This can be used to distinguish between trains of different lines and route them appropriately.
+ The interlocking system also uses this property for Automatic Routesetting.
+set_line(line)
+ Sets the "Line" property of the train (a string).
+ If the first digit of this string is a number (0-9), any subway wagons on the train will have this one displayed as line number
+ (where "0" is actually shown as Line 10 on the train)
+get_rc()
+ Returns the "Routingcode" property of the train (a string).
+ The interlocking system uses this property for Automatic Routesetting.
+set_rc(routingcode)
+ Sets the "Routingcode" property of the train (a string).
+ The interlocking system uses this property for Automatic Routesetting.
+split_at_index(index, command)
+ Splits the train at the specified index, into a train with index-1 wagons and a second train starting with the index-th wagon.
+ command specifies an atc command to be sent to the second train after decoupling.
+split_at_fc(command, len)
+ Splits the train in such a way that all cars with non-empty
+ current FC of the first part of the train have the same FC. The
+ command specified is sent to the rear part, as with
+ split_at_index. It returns the fc of the cars of the first part.
+
+ The optional argument len specifies the maximum length for the
+ first part of the train. Say, we have len=3, and the train has ""
+ "" "foo" "foo" "foo" "bar", then the first train part will be ""
+ "" "foo".
+
+ Example : Train has current FCs "" "" "foo" "bar" "foo"
+ Result: first train: "" "" "foo"; second train: "bar" "foo"
+ The command returns "foo" in this case
+split_off_locomotive(command, len)
+ Splits off the locomotives at the front of the train, which are
+ identified by an empty FC. command specifies the command to be
+ executed by the rear half of the train.
+
+ The optional argument len specifies the maximum length for the
+ first part of the train. Say, we have len=3, and the train has ""
+ "" "foo" "foo" "foo" "bar", then the first train part will be ""
+ "" "foo".
+step_fc()
+ Steps the FCs of all train cars forward. FCs are composed of codes
+ separated by exclamation marks (!), for instance
+ "foo!bar!baz". Each wagon has a current FC, indicating its next
+ destination. Stepping the freight code forward, selects the next
+ code after the !. If the end of the string is reached, then the
+ first code is selected, except if the string ends with a question
+ mark, then the order is reversed.
+
+train_length()
+ returns the number of cars the train is composed of
+set_autocouple()
+ Sets the train into autocouple mode
+unset_autocouple()
+ Unsets autocouple mode
+
+set_shunt(), unset_shunt()
+ deprecated aliases for set_autocouple() and unset_autocouple(), will be removed from a later release.
+
+
+# Operator panel
+This simple node executes its actions when punched. It can be used to change a switch and update the corresponding signals or similar applications.
+
+The event fired is {type="punch", punch=true} by default. In case of an interrupt or a digiline message, the events are similar to the ones of the ATC rail.
+
+### Passive components
+
+All passive components can be interfaced with the setstate and getstate functions(see above).
+Below, each apperance is mapped to the "state" of that node.
+
+## Signals
+The light signals are interfaceable, the analog signals are not.
+"green" - Signal shows green light
+"red" - Signal shows red light
+
+## Switches
+All default rail switches are interfaceable, independent of orientation.
+"cr" - The switch is set in the direction that is not straight.
+"st" - The switch is set in the direction that is straight.
+
+## Mesecon Switch
+The Mesecon switch can be switched using LuaAutomation. Note that this is not possible on levers, only the full-node 'Switch' block.
+"on" - the switch is switched on
+"off" - the switch is switched off
+
+##Andrew's Cross
+"on" - it blinks
+"off" - it does not blink
+
+### Passive component naming
+You can assign names to passive components using the Passive Component Naming tool.
+Once you set a name for any component, you can reference it by that name in the getstate() and setstate() functions, like this:
+(Imagine a signal that you have named "Stn_P1_out" at position (1,2,3) )
+setstate("Stn_P1_out", "green") instead of setstate(POS(1,2,3), "green")
+This way, you don't need to memorize positions.
+
+PC-Naming can also be used to name interlocking signals for route setting via the set_route() functions. IMPORTANT: The "Signal Name" set in the
+signalling formspec is completely independent and can NOT be used to look up the position, you need to explicitly use the PCNaming tool.
+
+--TODO: Ein paar mehr Codebeispiele wären schön, insbesondere mit os.date und so...
diff --git a/advtrains/advtrains_luaautomation/active_common.lua b/advtrains/advtrains_luaautomation/active_common.lua
new file mode 100644
index 0000000..dac81b3
--- /dev/null
+++ b/advtrains/advtrains_luaautomation/active_common.lua
@@ -0,0 +1,175 @@
+
+
+local ac = {nodes={}}
+
+function ac.load(data)
+ if data then
+ ac.nodes=data.nodes
+ end
+end
+function ac.save()
+ return {nodes = ac.nodes}
+end
+
+function ac.after_place_node(pos, player)
+ local meta=minetest.get_meta(pos)
+ meta:set_string("formspec", ac.getform(pos, meta))
+ meta:set_string("infotext", "LuaAutomation component, unconfigured.")
+ local ph=minetest.pos_to_string(pos)
+ --just get first available key!
+ for en,_ in pairs(atlatc.envs) do
+ ac.nodes[ph]={env=en}
+ return
+ end
+end
+function ac.getform(pos, meta_p)
+ local meta = meta_p or minetest.get_meta(pos)
+ local envs_asvalues={}
+
+ local ph=minetest.pos_to_string(pos)
+ local nodetbl = ac.nodes[ph]
+ local env, code, err = nil, "", ""
+ if nodetbl then
+ code=nodetbl.code or ""
+ err=nodetbl.err or ""
+ env=nodetbl.env or ""
+ end
+ local sel = 1
+ for n,_ in pairs(atlatc.envs) do
+ envs_asvalues[#envs_asvalues+1]=minetest.formspec_escape(n)
+ if n==env then
+ sel=#envs_asvalues
+ end
+ end
+ local form = "size[10,10]dropdown[0,0;3;env;"..table.concat(envs_asvalues, ",")..";"..sel.."]"
+ .."button[4,0;2,1;save;Save]button[7,0;2,1;cle;Clear local env] textarea[0.2,1;10,10;code;Code;"..minetest.formspec_escape(code).."]"
+ .."label[0,9.8;"..err.."]"
+ return form
+end
+
+function ac.after_dig_node(pos, node, player)
+ advtrains.invalidate_all_paths(pos)
+ advtrains.ndb.clear(pos)
+ local ph=minetest.pos_to_string(pos)
+ ac.nodes[ph]=nil
+end
+
+function ac.on_receive_fields(pos, formname, fields, player)
+ if not minetest.check_player_privs(player:get_player_name(), {atlatc=true}) then
+ minetest.chat_send_player(player:get_player_name(), "Missing privilege: atlatc - Operation cancelled!")
+ return
+ end
+
+ local meta=minetest.get_meta(pos)
+ local ph=minetest.pos_to_string(pos)
+ local nodetbl = ac.nodes[ph] or {}
+ --if fields.quit then return end
+ if fields.env then
+ nodetbl.env=fields.env
+ end
+ if fields.code then
+ nodetbl.code=fields.code
+ end
+ if fields.save then
+ -- reset certain things
+ nodetbl.err=nil
+ if advtrains.lines and advtrains.lines.sched then
+ -- discard all schedules for this node
+ advtrains.lines.sched.discard_all(advtrains.encode_pos(pos))
+ end
+ end
+ if fields.cle then
+ nodetbl.data={}
+ end
+
+ ac.nodes[ph]=nodetbl
+
+ meta:set_string("formspec", ac.getform(pos, meta))
+ if nodetbl.env then
+ meta:set_string("infotext", "LuaAutomation component, assigned to environment '"..nodetbl.env.."'")
+ else
+ meta:set_string("infotext", "LuaAutomation component, invalid enviroment set!")
+ end
+end
+
+function ac.run_in_env(pos, evtdata, customfct_p)
+ local ph=minetest.pos_to_string(pos)
+ local nodetbl = ac.nodes[ph]
+ if not nodetbl then
+ atwarn("LuaAutomation component at",ph,": Data not in memory! Please visit component and click 'Save'!")
+ return
+ end
+
+ local meta
+ if minetest.get_node_or_nil(pos) then
+ meta=minetest.get_meta(pos)
+ end
+
+ if not nodetbl.env or not atlatc.envs[nodetbl.env] then
+ atwarn("LuaAutomation component at",ph,": Not an existing environment: "..(nodetbl.env or "<nil>"))
+ return false
+ end
+ if not nodetbl.code or nodetbl.code=="" then
+ atwarn("LuaAutomation component at",ph,": No code to run! (insert -- to suppress warning)")
+ return false
+ end
+
+ local customfct=customfct_p or {}
+ -- add interrupt function
+ customfct.interrupt=function(t, imesg)
+ assertt(t, "number")
+ assert(t >= 0)
+ atlatc.interrupt.add(t, pos, {type="int", int=true, message=imesg, msg=imesg}) --Compatiblity "message" field.
+ end
+ -- add digiline_send function, if digiline is loaded
+ if minetest.global_exists("digiline") then
+ customfct.digiline_send=function(channel, msg)
+ assertt(channel, "string")
+ digiline:receptor_send(pos, digiline.rules.default, channel, msg)
+ end
+ end
+ -- add lines scheduler if enabled
+ if advtrains.lines and advtrains.lines.sched then
+ customfct.schedule = function(rwtime, msg)
+ return advtrains.lines.sched.enqueue(rwtime, "atlatc_env", {pos=pos, msg=msg}, advtrains.encode_pos(pos), 1)
+ end
+ customfct.schedule_in = function(rwtime, msg)
+ return advtrains.lines.sched.enqueue_in(rwtime, "atlatc_env", {pos=pos, msg=msg}, advtrains.encode_pos(pos), 1)
+ end
+ end
+
+ local datain=nodetbl.data or {}
+ local succ, dataout = atlatc.envs[nodetbl.env]:execute_code(datain, nodetbl.code, evtdata, customfct)
+ if succ then
+ atlatc.active.nodes[ph].data=atlatc.remove_invalid_data(dataout)
+ else
+ atlatc.active.nodes[ph].err=dataout
+ atwarn("LuaAutomation ATC interface rail at",ph,": LUA Error:",dataout)
+ if meta then
+ meta:set_string("infotext", "LuaAutomation ATC interface rail, ERROR:"..dataout)
+ end
+ end
+ if meta then
+ meta:set_string("formspec", ac.getform(pos, meta))
+ end
+end
+
+function ac.on_digiline_receive(pos, node, channel, msg)
+ atlatc.interrupt.add(0, pos, {type="digiline", digiline=true, channel = channel, msg = msg})
+end
+
+if advtrains.lines and advtrains.lines.sched then
+ advtrains.lines.sched.register_callback("atlatc_env", function(data)
+ -- This adds another interrupt to the atlatc queue... there might be a better way
+ atlatc.interrupt.add(0, data.pos, {type="schedule",schedule=true, msg=data.msg})
+ end)
+end
+
+ac.trackdef_advtrains_defs = {
+ on_train_enter = function(pos, train_id)
+ --do async. Event is fired in train steps
+ atlatc.interrupt.add(0, pos, {type="train", train=true, id=train_id})
+ end,
+}
+
+atlatc.active=ac
diff --git a/advtrains/advtrains_luaautomation/atc_rail.lua b/advtrains/advtrains_luaautomation/atc_rail.lua
new file mode 100644
index 0000000..6083dfc
--- /dev/null
+++ b/advtrains/advtrains_luaautomation/atc_rail.lua
@@ -0,0 +1,194 @@
+-- atc_rail.lua
+-- registers and handles the ATC rail. Active component.
+-- This is the only component that can interface with trains, so train interface goes here too.
+
+--Using subtable
+local r={}
+
+function r.fire_event(pos, evtdata)
+
+ local ph=minetest.pos_to_string(pos)
+ local railtbl = atlatc.active.nodes[ph]
+
+ if not railtbl then
+ atwarn("LuaAutomation ATC interface rail at",ph,": Data not in memory! Please visit position and click 'Save'!")
+ return
+ end
+
+
+ local arrowconn = railtbl.arrowconn
+ if not arrowconn then
+ atwarn("LuaAutomation ATC interface rail at",ph,": Incomplete Data! Please visit position and click 'Save'!")
+ return
+ end
+
+ --prepare ingame API for ATC. Regenerate each time since pos needs to be known
+ --If no train, then return false.
+ local train_id=advtrains.get_train_at_pos(pos)
+ local train, atc_arrow, tvel
+ if train_id then train=advtrains.trains[train_id] end
+ if train then
+ if not train.path then
+ --we happened to get in between an invalidation step
+ --delay
+ atlatc.interrupt.add(0,pos,evtdata)
+ return
+ end
+ local index = advtrains.path_lookup(train, pos)
+
+ local iconnid = 1
+ if index then
+ iconnid = train.path_cn[index]
+ else
+ atwarn("ATC rail at", pos, ": Rail not on train's path! Can't determine arrow direction. Assuming +!")
+ end
+ atc_arrow = iconnid == 1
+
+ tvel=train.velocity
+ end
+ local customfct={
+ atc_send = function(cmd)
+ if not train_id then return false end
+ assertt(cmd, "string")
+ advtrains.atc.train_set_command(train, cmd, atc_arrow)
+ return true
+ end,
+ split_at_index = function(index, cmd)
+ if not train_id then return false end
+ assertt(cmd, "string")
+ if type(index) ~= "number" then
+ return false
+ end
+ local new_id = advtrains.split_train_at_index(train, index)
+ if new_id then
+ minetest.after(1,advtrains.atc.train_set_command,advtrains.trains[new_id], cmd, atc_arrow)
+ return true
+ end
+ return false
+ end,
+ split_at_fc = function(cmd, len)
+ assertt(cmd, "string")
+ if not train_id then return false end
+ local new_id, fc = advtrains.split_train_at_fc(train, false, len)
+ if new_id then
+ minetest.after(1,advtrains.atc.train_set_command,advtrains.trains[new_id], cmd, atc_arrow)
+ end
+ return fc or ""
+ end,
+ split_off_locomotive = function(cmd, len)
+ assertt(cmd, "string")
+ if not train_id then return false end
+ local new_id, fc = advtrains.split_train_at_fc(train, true, len)
+ if new_id then
+ minetest.after(1,advtrains.atc.train_set_command,advtrains.trains[new_id], cmd, atc_arrow)
+ end
+ end,
+ train_length = function ()
+ if not train_id then return false end
+ return #train.trainparts
+ end,
+ step_fc = function()
+ if not train_id then return false end
+ advtrains.train_step_fc(train)
+ end,
+ set_shunt = function()
+ if not train_id then return false end
+ train.autocouple = true
+ end,
+ unset_shunt = function()
+ if not train_id then return false end
+ train.autocouple = nil
+ end,
+ set_autocouple = function ()
+ if not train_id then return false end
+ train.autocouple = true
+ end,
+ unset_autocouple = function ()
+ if not train_id then return false end
+ train.autocouple = nil
+ end,
+ set_line = function(line)
+ if type(line)~="string" and type(line)~="number" then
+ return false
+ end
+ train.line = line .. ""
+ minetest.after(0, advtrains.invalidate_path, train_id)
+ return true
+ end,
+ get_line = function()
+ return train.line
+ end,
+ set_rc = function(rc)
+ if type(rc)~="string"then
+ return false
+ end
+ train.routingcode = rc
+ minetest.after(0, advtrains.invalidate_path, train_id)
+ return true
+ end,
+ get_rc = function()
+ return train.routingcode
+ end,
+ atc_reset = function(cmd)
+ if not train_id then return false end
+ assertt(cmd, "string")
+ advtrains.atc.train_reset_command(train)
+ return true
+ end,
+ atc_arrow = atc_arrow,
+ atc_id = train_id,
+ atc_speed = tvel,
+ atc_set_text_outside = function(text)
+ if not train_id then return false end
+ if text then assertt(text, "string") end
+ advtrains.trains[train_id].text_outside=text
+ return true
+ end,
+ atc_set_text_inside = function(text)
+ if not train_id then return false end
+ if text then assertt(text, "string") end
+ advtrains.trains[train_id].text_inside=text
+ return true
+ end,
+ }
+
+ atlatc.active.run_in_env(pos, evtdata, customfct)
+
+end
+
+if minetest.get_modpath("advtrains_train_track") ~= nil then
+ advtrains.register_tracks("default", {
+ nodename_prefix="advtrains_luaautomation:dtrack",
+ texture_prefix="advtrains_dtrack_atc",
+ models_prefix="advtrains_dtrack",
+ models_suffix=".b3d",
+ shared_texture="advtrains_dtrack_shared_atc.png",
+ description=atltrans("LuaAutomation ATC Rail"),
+ formats={},
+ get_additional_definiton = function(def, preset, suffix, rotation)
+ return {
+ after_place_node = atlatc.active.after_place_node,
+ after_dig_node = atlatc.active.after_dig_node,
+ on_receive_fields = function(pos, ...)
+ atlatc.active.on_receive_fields(pos, ...)
+ --set arrowconn (for ATC)
+ local ph=minetest.pos_to_string(pos)
+ local _, conns=advtrains.get_rail_info_at(pos, advtrains.all_tracktypes)
+ atlatc.active.nodes[ph].arrowconn=conns[1].c
+ end,
+ advtrains = atlatc.active.trackdef_advtrains_defs,
+ luaautomation = {
+ fire_event=r.fire_event
+ },
+ digiline = {
+ receptor = {},
+ effector = {
+ action = atlatc.active.on_digiline_receive
+ },
+ },
+ }
+ end,
+ }, advtrains.trackpresets.t_30deg_straightonly)
+end
+
+atlatc.rail = r
diff --git a/advtrains/advtrains_luaautomation/chatcmds.lua b/advtrains/advtrains_luaautomation/chatcmds.lua
new file mode 100644
index 0000000..2d0c69d
--- /dev/null
+++ b/advtrains/advtrains_luaautomation/chatcmds.lua
@@ -0,0 +1,84 @@
+--chatcmds.lua
+--Registers commands to modify the init and step code for LuaAutomation
+
+--position helper.
+--punching a node will result in that position being saved and inserted into a text field on the top of init form.
+local punchpos={}
+
+minetest.register_on_punchnode(function(pos, node, player, pointed_thing)
+ local pname=player:get_player_name()
+ punchpos[pname]=pos
+end)
+
+local function get_init_form(env, pname)
+ local err = env.init_err or ""
+ local code = env.init_code or ""
+ local ppos=punchpos[pname]
+ local pp=""
+ if ppos then
+ pp="POS"..minetest.pos_to_string(ppos)
+ end
+ local form = "size[10,10]button[0,0;2,1;run;Run InitCode]button[2,0;2,1;cls;Clear S]"
+ .."button[4,0;2,1;save;Save] button[6,0;2,1;del;Delete Env.] field[8.1,0.5;2,1;punchpos;Last punched position;"..pp.."]"
+ .."textarea[0.2,1;10,10;code;Environment initialization code;"..minetest.formspec_escape(code).."]"
+ .."label[0,9.8;"..err.."]"
+ return form
+end
+
+core.register_chatcommand("env_setup", {
+ params = "<environment name>",
+ description = "Set up and modify AdvTrains LuaAutomation environment",
+ privs = {atlatc=true},
+ func = function(name, param)
+ local env=atlatc.envs[param]
+ if not env then return false,"Invalid environment name!" end
+ minetest.show_formspec(name, "atlatc_envsetup_"..param, get_init_form(env, name))
+ return true
+ end,
+})
+
+core.register_chatcommand("env_create", {
+ params = "<environment name>",
+ description = "Create an AdvTrains LuaAutomation environment",
+ privs = {atlatc=true},
+ func = function(name, param)
+ if not param or param=="" then return false, "Name required!" end
+ if atlatc.envs[param] then return false, "Environment already exists!" end
+ atlatc.envs[param] = atlatc.env_new(param)
+ return true, "Created environment '"..param.."'. Use '/env_setup "..param.."' to define global initialization code, or start building LuaATC components!"
+ end,
+})
+
+
+minetest.register_on_player_receive_fields(function(player, formname, fields)
+
+ local pname=player:get_player_name()
+ if not minetest.check_player_privs(pname, {atlatc=true}) then return end
+
+ local envname=string.match(formname, "^atlatc_delconfirm_(.+)$")
+ if envname and fields.sure=="YES" then
+ atlatc.envs[envname]=nil
+ minetest.chat_send_player(pname, "Environment deleted!")
+ return
+ end
+
+ envname=string.match(formname, "^atlatc_envsetup_(.+)$")
+ if not envname then return end
+
+ local env=atlatc.envs[envname]
+ if not env then return end
+
+ if fields.del then
+ minetest.show_formspec(pname, "atlatc_delconfirm_"..envname, "field[sure;"..minetest.formspec_escape("SURE TO DELETE ENVIRONMENT "..envname.."? Type YES (all uppercase) to continue or just quit form to cancel.")..";]")
+ return
+ end
+
+ env.init_err=nil
+ if fields.code then
+ env.init_code=fields.code
+ end
+ if fields.run then
+ env:run_initcode()
+ minetest.show_formspec(pname, formname, get_init_form(env, pname))
+ end
+end)
diff --git a/advtrains/advtrains_luaautomation/depends.txt b/advtrains/advtrains_luaautomation/depends.txt
new file mode 100644
index 0000000..d5523e1
--- /dev/null
+++ b/advtrains/advtrains_luaautomation/depends.txt
@@ -0,0 +1,4 @@
+advtrains
+advtrains_interlocking?
+advtrains_line_automation?
+mesecons_switch? \ No newline at end of file
diff --git a/advtrains/advtrains_luaautomation/environment.lua b/advtrains/advtrains_luaautomation/environment.lua
new file mode 100644
index 0000000..3e7787b
--- /dev/null
+++ b/advtrains/advtrains_luaautomation/environment.lua
@@ -0,0 +1,362 @@
+-------------
+-- lua sandboxed environment
+
+-- function to cross out functions and userdata.
+-- modified from dump()
+function atlatc.remove_invalid_data(o, nested)
+ if o==nil then return nil end
+ local valid_dt={["nil"]=true, boolean=true, number=true, string=true}
+ if type(o) ~= "table" then
+ --check valid data type
+ if not valid_dt[type(o)] then
+ return nil
+ end
+ return o
+ end
+ -- Contains table -> true/nil of currently nested tables
+ nested = nested or {}
+ if nested[o] then
+ return nil
+ end
+ nested[o] = true
+ for k, v in pairs(o) do
+ v = atlatc.remove_invalid_data(v, nested)
+ end
+ nested[o] = nil
+ return o
+end
+
+
+local env_proto={
+ load = function(self, envname, data)
+ self.name=envname
+ self.sdata=data.sdata and atlatc.remove_invalid_data(data.sdata) or {}
+ self.fdata={}
+ self.init_code=data.init_code or ""
+ self.step_code=data.step_code or ""
+ end,
+ save = function(self)
+ -- throw any function values out of the sdata table
+ self.sdata = atlatc.remove_invalid_data(self.sdata)
+ return {sdata = self.sdata, init_code=self.init_code, step_code=self.step_code}
+ end,
+}
+
+--Environment
+--Code modified from mesecons_luacontroller (credit goes to Jeija and mesecons contributors)
+
+local safe_globals = {
+ "assert", "error", "ipairs", "next", "pairs", "select",
+ "tonumber", "tostring", "type", "unpack", "_VERSION"
+}
+
+--print is actually minetest.chat_send_all()
+--using advtrains.print_concat_table because it's cool
+local function safe_print(t, ...)
+ local str=advtrains.print_concat_table({t, ...})
+ minetest.log("action", "[atlatc] "..str)
+ minetest.chat_send_all(str)
+end
+
+local function safe_date(f, t)
+ if not f then
+ -- fall back to old behavior
+ return(os.date("*t",os.time()))
+ else
+ --pass parameters
+ return os.date(f,t)
+ end
+end
+
+-- string.rep(str, n) with a high value for n can be used to DoS
+-- the server. Therefore, limit max. length of generated string.
+local function safe_string_rep(str, n)
+ if #str * n > 2000 then
+ debug.sethook() -- Clear hook
+ error("string.rep: string length overflow", 2)
+ end
+
+ return string.rep(str, n)
+end
+
+-- string.find with a pattern can be used to DoS the server.
+-- Therefore, limit string.find to patternless matching.
+-- Note: Disabled security since there are enough security leaks and this would be unneccessary anyway to DoS the server
+local function safe_string_find(...)
+ --if (select(4, ...)) ~= true then
+ -- debug.sethook() -- Clear hook
+ -- error("string.find: 'plain' (fourth parameter) must always be true for security reasons.")
+ --end
+
+ return string.find(...)
+end
+
+local mp=minetest.get_modpath("advtrains_luaautomation")
+
+local static_env = {
+ --core LUA functions
+ print = safe_print,
+ string = {
+ byte = string.byte,
+ char = string.char,
+ format = string.format,
+ len = string.len,
+ lower = string.lower,
+ upper = string.upper,
+ rep = safe_string_rep,
+ reverse = string.reverse,
+ sub = string.sub,
+ find = safe_string_find,
+ },
+ math = {
+ abs = math.abs,
+ acos = math.acos,
+ asin = math.asin,
+ atan = math.atan,
+ atan2 = math.atan2,
+ ceil = math.ceil,
+ cos = math.cos,
+ cosh = math.cosh,
+ deg = math.deg,
+ exp = math.exp,
+ floor = math.floor,
+ fmod = math.fmod,
+ frexp = math.frexp,
+ huge = math.huge,
+ ldexp = math.ldexp,
+ log = math.log,
+ log10 = math.log10,
+ max = math.max,
+ min = math.min,
+ modf = math.modf,
+ pi = math.pi,
+ pow = math.pow,
+ rad = math.rad,
+ random = math.random,
+ sin = math.sin,
+ sinh = math.sinh,
+ sqrt = math.sqrt,
+ tan = math.tan,
+ tanh = math.tanh,
+ },
+ table = {
+ concat = table.concat,
+ insert = table.insert,
+ maxn = table.maxn,
+ remove = table.remove,
+ sort = table.sort,
+ },
+ os = {
+ clock = os.clock,
+ difftime = os.difftime,
+ time = os.time,
+ date = safe_date,
+ },
+ POS = function(x,y,z) return {x=x, y=y, z=z} end,
+ getstate = advtrains.getstate,
+ setstate = advtrains.setstate,
+ is_passive = advtrains.is_passive,
+ --interrupts are handled per node, position unknown. (same goes for digilines)
+ --however external interrupts can be set here.
+ interrupt_pos = function(parpos, imesg)
+ local pos=atlatc.pcnaming.resolve_pos(parpos)
+ atlatc.interrupt.add(0, pos, {type="ext_int", ext_int=true, message=imesg})
+ end,
+}
+
+-- If interlocking is present, enable route setting functions
+if advtrains.interlocking then
+ local function gen_checks(signal, route_name, noroutesearch)
+ assertt(route_name, "string")
+ local pos = atlatc.pcnaming.resolve_pos(signal)
+ local sigd = advtrains.interlocking.db.get_sigd_for_signal(pos)
+ if not sigd then
+ error("There's no signal at "..minetest.pos_to_string(pos))
+ end
+ local tcbs = advtrains.interlocking.db.get_tcbs(sigd)
+ if not tcbs then
+ error("Inconsistent configuration, no tcbs for signal at "..minetest.pos_to_string(pos))
+ end
+
+ local routeid, route
+ if not noroutesearch then
+ for routeidt, routet in ipairs(tcbs.routes) do
+ if routet.name == route_name then
+ routeid = routeidt
+ route = routet
+ break
+ end
+ end
+ if not route then
+ error("No route called "..route_name.." at "..minetest.pos_to_string(pos))
+ end
+ end
+ return pos, sigd, tcbs, routeid, route
+ end
+
+
+ static_env.can_set_route = function(signal, route_name)
+ local pos, sigd, tcbs, routeid, route = gen_checks(signal, route_name)
+ -- if route is already set on signal, return whether it's committed
+ if tcbs.routeset == routeid then
+ return tcbs.route_committed
+ end
+ -- actually try setting route (parameter 'true' designates try-run
+ local ok = advtrains.interlocking.route.set_route(sigd, route, true)
+ return ok
+ end
+ static_env.set_route = function(signal, route_name)
+ local pos, sigd, tcbs, routeid, route = gen_checks(signal, route_name)
+ return advtrains.interlocking.route.update_route(sigd, tcbs, routeid)
+ end
+ static_env.cancel_route = function(signal)
+ local pos, sigd, tcbs, routeid, route = gen_checks(signal, "", true)
+ return advtrains.interlocking.route.update_route(sigd, tcbs, nil, true)
+ end
+ static_env.get_aspect = function(signal)
+ local pos = atlatc.pcnaming.resolve_pos(signal)
+ return advtrains.interlocking.signal_get_aspect(pos)
+ end
+ static_env.set_aspect = function(signal, asp)
+ local pos = atlatc.pcnaming.resolve_pos(signal)
+ return advtrains.interlocking.signal_set_aspect(pos)
+ end
+end
+
+-- Lines-specific:
+if advtrains.lines then
+ local atlrwt = advtrains.lines.rwt
+ static_env.rwt = {
+ now = atlrwt.now,
+ new = atlrwt.new,
+ copy = atlrwt.copy,
+ to_table = atlrwt.to_table,
+ to_secs = atlrwt.to_secs,
+ to_string = atlrwt.to_string,
+ add = atlrwt.add,
+ diff = atlrwt.diff,
+ sub = atlrwt.sub,
+ adj_diff = atlrwt.adj_diff,
+ adjust_cycle = atlrwt.adjust_cycle,
+ adjust = atlrwt.adjust,
+ to_string = atlrwt.to_string,
+ get_time_until = atlrwt.get_time_until,
+ next_rpt = atlrwt.next_rpt,
+ last_rpt = atlrwt.last_rpt,
+ time_from_last_rpt = atlrwt.time_from_last_rpt,
+ time_to_next_rpt = atlrwt.time_to_next_rpt,
+ }
+end
+
+for _, name in pairs(safe_globals) do
+ static_env[name] = _G[name]
+end
+
+
+--The environment all code calls get is a table that has set static_env as metatable.
+--In general, every variable is local to a single code chunk, but kept persistent over code re-runs. Data is also saved, but functions and userdata and circular references are removed
+--Init code and step code's environments are not saved
+-- S - Table that can contain any save data global to the environment. Will be saved statically. Can't contain functions or userdata or circular references.
+-- F - Table global to the environment, can contain volatile data that is deleted when server quits.
+-- The init code should populate this table with functions and other definitions.
+
+local proxy_env={}
+--proxy_env gets a new metatable in every run, but is the shared environment of all functions ever defined.
+
+-- returns: true, fenv if successful; nil, error if error
+function env_proto:execute_code(localenv, code, evtdata, customfct)
+ local metatbl ={
+ __index = function(t, i)
+ if i=="S" then
+ return self.sdata
+ elseif i=="F" then
+ return self.fdata
+ elseif i=="event" then
+ return evtdata
+ elseif customfct and customfct[i] then
+ return customfct[i]
+ elseif localenv and localenv[i] then
+ return localenv[i]
+ end
+ return static_env[i]
+ end,
+ __newindex = function(t, i, v)
+ if i=="S" or i=="F" or i=="event" or (customfct and customfct[i]) or static_env[i] then
+ debug.sethook()
+ error("Trying to overwrite environment contents")
+ end
+ localenv[i]=v
+ end,
+ }
+ setmetatable(proxy_env, metatbl)
+ local fun, err=loadstring(code)
+ if not fun then
+ return false, err
+ end
+
+ setfenv(fun, proxy_env)
+ local succ, data = pcall(fun)
+ if succ then
+ data=localenv
+ end
+ return succ, data
+end
+
+function env_proto:run_initcode()
+ if self.init_code and self.init_code~="" then
+ local old_fdata=self.fdata
+ self.fdata = {}
+ atprint("[atlatc]Running initialization code for environment '"..self.name.."'")
+ local succ, err = self:execute_code({}, self.init_code, {type="init", init=true})
+ if not succ then
+ atwarn("[atlatc]Executing InitCode for '"..self.name.."' failed:"..err)
+ self.init_err=err
+ if old_fdata then
+ self.fdata=old_fdata
+ atwarn("[atlatc]The 'F' table has been restored to the previous state.")
+ end
+ end
+ end
+end
+function env_proto:run_stepcode()
+ if self.step_code and self.step_code~="" then
+ local succ, err = self:execute_code({}, self.step_code, nil, {})
+ if not succ then
+ --TODO
+ end
+ end
+end
+
+--- class interface
+
+function atlatc.env_new(name)
+ local newenv={
+ name=name,
+ init_code="",
+ step_code="",
+ sdata={}
+ }
+ setmetatable(newenv, {__index=env_proto})
+ return newenv
+end
+function atlatc.env_load(name, data)
+ local newenv={}
+ setmetatable(newenv, {__index=env_proto})
+ newenv:load(name, data)
+ return newenv
+end
+
+function atlatc.run_initcode()
+ for envname, env in pairs(atlatc.envs) do
+ env:run_initcode()
+ end
+end
+function atlatc.run_stepcode()
+ for envname, env in pairs(atlatc.envs) do
+ env:run_stepcode()
+ end
+end
+
+
+
+
diff --git a/advtrains/advtrains_luaautomation/init.lua b/advtrains/advtrains_luaautomation/init.lua
new file mode 100644
index 0000000..eca5633
--- /dev/null
+++ b/advtrains/advtrains_luaautomation/init.lua
@@ -0,0 +1,109 @@
+-- advtrains_luaautomation/init.lua
+-- Lua automation features for advtrains
+-- Uses global table 'atlatc' (AdvTrains_LuaATC)
+
+-- Boilerplate to support localized strings if intllib mod is installed.
+if intllib then
+ atltrans = intllib.Getter()
+else
+ atltrans = function(s,a,...)a={a,...}return s:gsub("@(%d+)",function(n)return a[tonumber(n)]end)end
+end
+
+--Privilege
+--Only trusted players should be enabled to build stuff which can break the server.
+
+atlatc = { envs = {}}
+
+minetest.register_privilege("atlatc", { description = "Player can place and modify LUA ATC components. Grant with care! Allows to execute bad LUA code.", give_to_singleplayer = false, default= false })
+
+--assertt helper. error if a variable is not of a type
+function assertt(var, typ)
+ if type(var)~=typ then
+ error("Assertion failed, variable has to be of type "..typ)
+ end
+end
+
+local mp=minetest.get_modpath("advtrains_luaautomation")
+if not mp then
+ error("Mod name error: Mod folder is not named 'advtrains_luaautomation'!")
+end
+dofile(mp.."/environment.lua")
+dofile(mp.."/interrupt.lua")
+dofile(mp.."/active_common.lua")
+dofile(mp.."/atc_rail.lua")
+dofile(mp.."/operation_panel.lua")
+dofile(mp.."/pcnaming.lua")
+
+dofile(mp.."/chatcmds.lua")
+
+
+local filename=minetest.get_worldpath().."/advtrains_luaautomation"
+
+function atlatc.load()
+ local file, err = io.open(filename, "r")
+ if not file then
+ minetest.log("warning", " Failed to read advtrains_luaautomation save data from file "..filename..": "..(err or "Unknown Error"))
+ minetest.log("warning", " (this is normal when first enabling advtrains on this world)")
+ else
+ atprint("luaautomation reading file:",filename)
+ local tbl = minetest.deserialize(file:read("*a"))
+ if type(tbl) == "table" then
+ if tbl.version==1 then
+ for envname, data in pairs(tbl.envs) do
+ atlatc.envs[envname]=atlatc.env_load(envname, data)
+ end
+ atlatc.active.load(tbl.active)
+ atlatc.interrupt.load(tbl.interrupt)
+ atlatc.pcnaming.load(tbl.pcnaming)
+ end
+ else
+ minetest.log("error", " Failed to read advtrains_luaautomation save data from file "..filename..": Not a table!")
+ end
+ file:close()
+ end
+ -- run init code of all environments
+ atlatc.run_initcode()
+end
+
+
+atlatc.save = function()
+ --versions:
+ -- 1 - Initial save format.
+
+ local envdata={}
+ for envname, env in pairs(atlatc.envs) do
+ envdata[envname]=env:save()
+ end
+ local save_tbl={
+ version = 1,
+ envs=envdata,
+ active = atlatc.active.save(),
+ interrupt = atlatc.interrupt.save(),
+ pcnaming = atlatc.pcnaming.save(),
+ }
+
+ local datastr = minetest.serialize(save_tbl)
+ if not datastr then
+ minetest.log("error", " Failed to save advtrains_luaautomation save data to file "..filename..": Can't serialize!")
+ return
+ end
+ local file, err = io.open(filename, "w")
+ if err then
+ minetest.log("error", " Failed to save advtrains_luaautomation save data to file "..filename..": "..(err or "Unknown Error"))
+ return
+ end
+ file:write(datastr)
+ file:close()
+end
+
+
+-- globalstep for step code
+local timer, step_int=0, 2
+
+function atlatc.mainloop_stepcode(dtime)
+ timer=timer+dtime
+ if timer>step_int then
+ timer=0
+ atlatc.run_stepcode()
+ end
+end
diff --git a/advtrains/advtrains_luaautomation/interrupt.lua b/advtrains/advtrains_luaautomation/interrupt.lua
new file mode 100644
index 0000000..525c3b4
--- /dev/null
+++ b/advtrains/advtrains_luaautomation/interrupt.lua
@@ -0,0 +1,48 @@
+-- interrupt.lua
+-- implements interrupt queue
+
+--to be saved: pos and evtdata
+local iq={}
+local queue={}
+local timer=0
+local run=false
+
+function iq.load(data)
+ local d=data or {}
+ queue = d.queue or {}
+ timer = d.timer or 0
+end
+function iq.save()
+ return {queue = queue, timer=timer}
+end
+
+function iq.add(t, pos, evtdata)
+ queue[#queue+1]={t=t+timer, p=pos, e=evtdata}
+ run=true
+end
+
+function iq.mainloop(dtime)
+ timer=timer + math.min(dtime, 0.2)
+ for i=1,#queue do
+ local qe=queue[i]
+ if not qe then
+ table.remove(queue, i)
+ i=i-1
+ elseif timer>qe.t then
+ local pos, evtdata=queue[i].p, queue[i].e
+ local node=advtrains.ndb.get_node(pos)
+ local ndef=minetest.registered_nodes[node.name]
+ if ndef and ndef.luaautomation and ndef.luaautomation.fire_event then
+ ndef.luaautomation.fire_event(pos, evtdata)
+ else
+ atwarn("[atlatc][interrupt] Couldn't run event",evtdata.type,"on",pos,", something wrong with the node",node)
+ end
+ table.remove(queue, i)
+ i=i-1
+ end
+ end
+end
+
+
+
+atlatc.interrupt=iq
diff --git a/advtrains/advtrains_luaautomation/operation_panel.lua b/advtrains/advtrains_luaautomation/operation_panel.lua
new file mode 100644
index 0000000..f8b93b5
--- /dev/null
+++ b/advtrains/advtrains_luaautomation/operation_panel.lua
@@ -0,0 +1,28 @@
+
+local function on_punch(pos, player)
+ atlatc.interrupt.add(0, pos, {type="punch", punch=true})
+end
+
+
+minetest.register_node("advtrains_luaautomation:oppanel", {
+ drawtype = "normal",
+ tiles={"atlatc_oppanel.png"},
+ description = "LuaAutomation operation panel",
+ groups = {
+ cracky = 1,
+ save_in_at_nodedb=1,
+ },
+ after_place_node = atlatc.active.after_place_node,
+ after_dig_node = atlatc.active.after_dig_node,
+ on_receive_fields = atlatc.active.on_receive_fields,
+ on_punch = on_punch,
+ luaautomation = {
+ fire_event=atlatc.active.run_in_env
+ },
+ digiline = {
+ receptor = {},
+ effector = {
+ action = atlatc.active.on_digiline_receive
+ },
+ },
+})
diff --git a/advtrains/advtrains_luaautomation/p_display.lua b/advtrains/advtrains_luaautomation/p_display.lua
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/advtrains/advtrains_luaautomation/p_display.lua
diff --git a/advtrains/advtrains_luaautomation/passive_api.txt b/advtrains/advtrains_luaautomation/passive_api.txt
new file mode 100644
index 0000000..9852e94
--- /dev/null
+++ b/advtrains/advtrains_luaautomation/passive_api.txt
@@ -0,0 +1,24 @@
+Lua Automation - Passive Component API
+
+Passive components are nodes that do not have code running in them. However, active components can query these and request actions from them. Examples:
+Switches
+Signals
+Displays
+Mesecon Transmitter
+Those passive components can also be used inside interlocking systems.
+
+All passive components have a table called 'advtrains' in their node definition and have the group 'save_in_nodedb' set, so they work in unloaded chunks.
+Example for a switch:
+advtrains = {
+ getstate = function(pos, node)
+ return "st"
+ end,
+ -- OR
+ getstate = "st",
+
+ setstate = function(pos, node, newstate)
+ if newstate=="cr" then
+ advtrains.ndb.swap_node(pos, <corresponding switch alt>)
+ end
+ end
+} \ No newline at end of file
diff --git a/advtrains/advtrains_luaautomation/pcnaming.lua b/advtrains/advtrains_luaautomation/pcnaming.lua
new file mode 100644
index 0000000..ebb769f
--- /dev/null
+++ b/advtrains/advtrains_luaautomation/pcnaming.lua
@@ -0,0 +1,76 @@
+--pcnaming.lua
+--a.k.a Passive component naming
+--Allows to assign names to passive components, so they can be called like:
+--setstate("iamasignal", "green")
+atlatc.pcnaming={name_map={}}
+function atlatc.pcnaming.load(stuff)
+ if type(stuff)=="table" then
+ atlatc.pcnaming.name_map=stuff
+ end
+end
+function atlatc.pcnaming.save()
+ return atlatc.pcnaming.name_map
+end
+
+function atlatc.pcnaming.resolve_pos(pos, func_name)
+ if type(pos)=="string" then
+ local e = atlatc.pcnaming.name_map[pos]
+ if e then return e end
+ elseif type(pos)=="table" and pos.x and pos.y and pos.z then
+ return pos
+ end
+ error("Invalid position supplied to " .. (func_name or "???")..": " .. dump(pos))
+end
+
+minetest.register_craftitem("advtrains_luaautomation:pcnaming",{
+ description = attrans("Passive Component Naming Tool\n\nRight-click to name a passive component."),
+ groups = {cracky=1}, -- key=name, value=rating; rating=1..3.
+ inventory_image = "atlatc_pcnaming.png",
+ wield_image = "atlatc_pcnaming.png",
+ stack_max = 1,
+ on_place = function(itemstack, placer, pointed_thing)
+ local pname = placer:get_player_name()
+ if not pname then
+ return
+ end
+ if not minetest.check_player_privs(pname, {atlatc=true}) then
+ minetest.chat_send_player(pname, "Missing privilege: atlatc")
+ return
+ end
+ if pointed_thing.type=="node" then
+ local pos=pointed_thing.under
+ if advtrains.is_protected(pos, pname) then
+ minetest.record_protection_violation(pos, pname)
+ return
+ end
+ local node = advtrains.ndb.get_node(pos)
+ if node.name and (minetest.get_item_group(node.name, "advtrains_signal")>0 or advtrains.is_passive(pos)) then
+ --look if this one already has a name
+ local pn=""
+ for name, npos in pairs(atlatc.pcnaming.name_map) do
+ if vector.equals(npos, pos) then
+ pn=name
+ end
+ end
+ minetest.show_formspec(pname, "atlatc_naming_"..minetest.pos_to_string(pos), "field[pn;Set name of component (empty to clear);"..minetest.formspec_escape(pn).."]")
+ end
+ end
+ end,
+})
+minetest.register_on_player_receive_fields(function(player, formname, fields)
+ local pts=string.match(formname, "^atlatc_naming_(.+)")
+ if pts then
+ local pos=minetest.string_to_pos(pts)
+ if fields.pn then
+ --first remove all occurences
+ for name, npos in pairs(atlatc.pcnaming.name_map) do
+ if vector.equals(npos, pos) then
+ atlatc.pcnaming.name_map[name]=nil
+ end
+ end
+ if fields.pn~="" then
+ atlatc.pcnaming.name_map[fields.pn]=pos
+ end
+ end
+ end
+end)
diff --git a/advtrains/advtrains_luaautomation/textures/atlatc_oppanel.png b/advtrains/advtrains_luaautomation/textures/atlatc_oppanel.png
new file mode 100644
index 0000000..96eb30e
--- /dev/null
+++ b/advtrains/advtrains_luaautomation/textures/atlatc_oppanel.png
Binary files differ
diff --git a/advtrains/advtrains_luaautomation/textures/atlatc_pcnaming.png b/advtrains/advtrains_luaautomation/textures/atlatc_pcnaming.png
new file mode 100644
index 0000000..3fccdfc
--- /dev/null
+++ b/advtrains/advtrains_luaautomation/textures/atlatc_pcnaming.png
Binary files differ
diff --git a/advtrains/advtrains_signals_ks/depends.txt b/advtrains/advtrains_signals_ks/depends.txt
new file mode 100644
index 0000000..9ddc3eb
--- /dev/null
+++ b/advtrains/advtrains_signals_ks/depends.txt
@@ -0,0 +1,2 @@
+advtrains
+advtrains_interlocking \ No newline at end of file
diff --git a/advtrains/advtrains_signals_ks/init.lua b/advtrains/advtrains_signals_ks/init.lua
new file mode 100644
index 0000000..c65d5f8
--- /dev/null
+++ b/advtrains/advtrains_signals_ks/init.lua
@@ -0,0 +1,255 @@
+-- Ks signals
+-- Can display main aspects (no Zs) + Sht
+
+-- Note that the group value of advtrains_signal is 2, which means "step 2 of signal capabilities"
+-- advtrains_signal=1 is meant for signals that do not implement set_aspect.
+
+local setaspectf = function(rot)
+ return function(pos, node, asp)
+ if not asp.main.free then
+ if asp.shunt.free then
+ advtrains.ndb.swap_node(pos, {name="advtrains_signals_ks:hs_shunt_"..rot, param2 = node.param2})
+ else
+ advtrains.ndb.swap_node(pos, {name="advtrains_signals_ks:hs_danger_"..rot, param2 = node.param2})
+ end
+ else
+ if asp.dst.free and asp.main.speed == -1 then
+ advtrains.ndb.swap_node(pos, {name="advtrains_signals_ks:hs_free_"..rot, param2 = node.param2})
+ else
+ advtrains.ndb.swap_node(pos, {name="advtrains_signals_ks:hs_slow_"..rot, param2 = node.param2})
+ end
+ end
+ end
+end
+
+local suppasp = {
+ main = {
+ free = nil,
+ speed = {6, -1},
+ },
+ dst = {
+ free = nil,
+ speed = nil,
+ },
+ shunt = {
+ free = nil,
+ proceed_as_main = true,
+ },
+ info = {
+ call_on = false,
+ dead_end = false,
+ w_speed = nil,
+ }
+}
+
+--Rangiersignal
+local setaspectf_ra = function(rot)
+ return function(pos, node, asp)
+ if asp.shunt.free then
+ advtrains.ndb.swap_node(pos, {name="advtrains_signals_ks:ra_shuntd_"..rot, param2 = node.param2})
+ else
+ advtrains.ndb.swap_node(pos, {name="advtrains_signals_ks:ra_danger_"..rot, param2 = node.param2})
+ end
+ local meta = minetest.get_meta(pos)
+ if meta then
+ meta:set_string("infotext", minetest.serialize(asp))
+ end
+ end
+end
+
+local suppasp_ra = {
+ main = {
+ free = true,
+ },
+ dst = {
+ free = nil,
+ speed = nil,
+ },
+ shunt = {
+ free = nil,
+ proceed_as_main = false,
+ },
+ info = {
+ call_on = false,
+ dead_end = false,
+ w_speed = nil,
+ }
+}
+
+advtrains.trackplacer.register_tracktype("advtrains_signals_ks:hs")
+advtrains.trackplacer.register_tracktype("advtrains_signals_ks:ra")
+advtrains.trackplacer.register_tracktype("advtrains_signals_ks:sign")
+advtrains.trackplacer.register_tracktype("advtrains_signals_ks:mast")
+
+for _, rtab in ipairs({
+ {rot = "0", sbox = {-1/8, -1/2, -1/2, 1/8, 1/2, -1/4}, ici=true},
+ {rot = "30", sbox = {-3/8, -1/2, -1/2, -1/8, 1/2, -1/4},},
+ {rot = "45", sbox = {-1/2, -1/2, -1/2, -1/4, 1/2, -1/4},},
+ {rot = "60", sbox = {-1/2, -1/2, -3/8, -1/4, 1/2, -1/8},},
+ }) do
+ local rot = rtab.rot
+ for typ, prts in pairs({
+ danger = {asp = advtrains.interlocking.DANGER, n = "slow", ici=true},
+ slow = {asp = { main = { free = true, speed = 6 }, shunt = {proceed_as_main = true}} , n = "free"},
+ free = {asp = { main = { free = true, speed = -1 }, shunt = {proceed_as_main = true}} , n = "shunt"},
+ shunt = {asp = { main = {free = false}, shunt = {free = true} } , n = "danger"},
+ }) do
+ minetest.register_node("advtrains_signals_ks:hs_"..typ.."_"..rot, {
+ description = "Ks Main Signal",
+ drawtype = "mesh",
+ mesh = "advtrains_signals_ks_main_smr"..rot..".obj",
+ tiles = {"advtrains_signals_ks_mast.png", "advtrains_signals_ks_head.png", "advtrains_signals_ks_head.png", "advtrains_signals_ks_ltm_"..typ..".png"},
+
+ paramtype="light",
+ sunlight_propagates=true,
+ light_source = 4,
+
+ paramtype2 = "facedir",
+ selection_box = {
+ type = "fixed",
+ fixed = {rtab.sbox, {-1/4, -1/2, -1/4, 1/4, -7/16, 1/4}}
+ },
+ groups = {
+ cracky = 2,
+ advtrains_signal = 2,
+ not_blocking_trains = 1,
+ save_in_at_nodedb = 1,
+ not_in_creative_inventory = (rtab.ici and prts.ici) and 0 or 1,
+ },
+ drop = "advtrains_signals_ks:hs_danger_0",
+ inventory_image = "advtrains_signals_ks_hs_inv.png",
+ sounds = default.node_sound_stone_defaults(),
+ advtrains = {
+ set_aspect = setaspectf(rot),
+ supported_aspects = suppasp,
+ get_aspect = function(pos, node)
+ return prts.asp
+ end,
+ },
+ on_rightclick = advtrains.interlocking.signal_rc_handler,
+ can_dig = advtrains.interlocking.signal_can_dig,
+ })
+ -- rotatable by trackworker
+ advtrains.trackplacer.add_worked("advtrains_signals_ks:hs", typ, "_"..rot, prts.n)
+ end
+
+
+ --Rangiersignale:
+ for typ, prts in pairs({
+ danger = {asp = { main = {free = true}, shunt = {free = false} }, n = "shuntd", ici=true},
+ shuntd = {asp = { main = {free = true}, shunt = {free = true} } , n = "danger"},
+ }) do
+ minetest.register_node("advtrains_signals_ks:ra_"..typ.."_"..rot, {
+ description = "Ks Shunting Signal",
+ drawtype = "mesh",
+ mesh = "advtrains_signals_ks_sht_smr"..rot..".obj",
+ tiles = {"advtrains_signals_ks_mast.png", "advtrains_signals_ks_head.png", "advtrains_signals_ks_head.png", "advtrains_signals_ks_ltm_"..typ..".png"},
+
+ paramtype="light",
+ sunlight_propagates=true,
+ light_source = 4,
+
+ paramtype2 = "facedir",
+ selection_box = {
+ type = "fixed",
+ fixed = {-1/4, -1/2, -1/4, 1/4, 0, 1/4}
+ },
+ groups = {
+ cracky = 2,
+ advtrains_signal = 2,
+ not_blocking_trains = 1,
+ save_in_at_nodedb = 1,
+ not_in_creative_inventory = (rtab.ici and prts.ici) and 0 or 1,
+ },
+ drop = "advtrains_signals_ks:ra_danger_0",
+ inventory_image = "advtrains_signals_ks_ra_inv.png",
+ sounds = default.node_sound_stone_defaults(),
+ advtrains = {
+ set_aspect = setaspectf_ra(rot),
+ supported_aspects = suppasp_ra,
+ get_aspect = function(pos, node)
+ return prts.asp
+ end,
+ },
+ on_rightclick = advtrains.interlocking.signal_rc_handler,
+ can_dig = advtrains.interlocking.signal_can_dig,
+ })
+ -- rotatable by trackworker
+ advtrains.trackplacer.add_worked("advtrains_signals_ks:ra", typ, "_"..rot, prts.n)
+ end
+
+ --Schilder:
+ for typ, prts in pairs({
+ -- Speed restrictions:
+ ["8"] = {asp = { main = {free = true, speed = 8}, shunt = {free = true} }, n = "12", ici=true},
+ ["12"] = {asp = { main = {free = true, speed = 12}, shunt = {free = true} }, n = "16"},
+ ["16"] = {asp = { main = {free = true, speed = 16}, shunt = {free = true} }, n = "e"},
+ -- Speed restriction lifted
+ ["e"] = {asp = { main = {free = true, speed = -1}, shunt = {free = true} }, n = "hfs"},
+ -- Halt for shunt moves:
+ ["hfs"] = {asp = { main = {free = true}, shunt = {free = false} }, n = "8"},
+ }) do
+ minetest.register_node("advtrains_signals_ks:sign_"..typ.."_"..rot, {
+ description = "Signal Sign",
+ drawtype = "mesh",
+ mesh = "advtrains_signals_ks_sign_smr"..rot..".obj",
+ tiles = {"advtrains_signals_ks_signpost.png", "advtrains_signals_ks_sign_"..typ..".png"},
+
+ paramtype="light",
+ sunlight_propagates=true,
+ light_source = 4,
+
+ paramtype2 = "facedir",
+ selection_box = {
+ type = "fixed",
+ fixed = {rtab.sbox, {-1/4, -1/2, -1/4, 1/4, -7/16, 1/4}}
+ },
+ groups = {
+ cracky = 2,
+ advtrains_signal = 2,
+ not_blocking_trains = 1,
+ save_in_at_nodedb = 1,
+ not_in_creative_inventory = (rtab.ici and prts.ici) and 0 or 1,
+ },
+ drop = "advtrains_signals_ks:sign_e_0",
+ inventory_image = "advtrains_signals_ks_sign_8.png",
+ sounds = default.node_sound_stone_defaults(),
+ advtrains = {
+ -- This is a static signal! No set_aspect
+ get_aspect = function(pos, node)
+ return prts.asp
+ end,
+ },
+ on_rightclick = advtrains.interlocking.signal_rc_handler,
+ can_dig = advtrains.interlocking.signal_can_dig,
+ })
+ -- rotatable by trackworker
+ advtrains.trackplacer.add_worked("advtrains_signals_ks:sign", typ, "_"..rot, prts.n)
+ end
+
+ minetest.register_node("advtrains_signals_ks:mast_mast_"..rot, {
+ description = "Ks Mast",
+ drawtype = "mesh",
+ mesh = "advtrains_signals_ks_mast_smr"..rot..".obj",
+ tiles = {"advtrains_signals_ks_mast.png"},
+
+ paramtype="light",
+ sunlight_propagates=true,
+ --light_source = 4,
+
+ paramtype2 = "facedir",
+ selection_box = {
+ type = "fixed",
+ fixed = {rtab.sbox, {-1/4, -1/2, -1/4, 1/4, -7/16, 1/4}}
+ },
+ groups = {
+ cracky = 2,
+ not_blocking_trains = 1,
+ not_in_creative_inventory = (rtab.ici) and 0 or 1,
+ },
+ drop = "advtrains_signals_ks:mast_mast_0",
+ sounds = default.node_sound_stone_defaults(),
+ })
+ advtrains.trackplacer.add_worked("advtrains_signals_ks:mast","mast", "_"..rot)
+end
+
diff --git a/advtrains/advtrains_signals_ks/init_degrotate_nodes.lua b/advtrains/advtrains_signals_ks/init_degrotate_nodes.lua
new file mode 100644
index 0000000..a4380d2
--- /dev/null
+++ b/advtrains/advtrains_signals_ks/init_degrotate_nodes.lua
@@ -0,0 +1,94 @@
+-- Ks Signals for advtrains
+-- will implement the advtrains signal API (which does not exist yet)
+
+local function place_degrotate(pos, placer, itemstack, pointed_thing)
+ local yaw = placer:get_look_horizontal()
+ local param = math.floor(yaw * 90 / math.pi + 0.5)
+ local n = minetest.get_node(pos)
+ n.param2 = param
+ minetest.set_node(pos, n)
+end
+
+minetest.register_node("advtrains_signals_ks:mast", {
+ drawtype = "mesh",
+ paramtype="light",
+ paramtype2="degrotate",
+ walkable = false,
+ selection_box = {
+ type = "fixed",
+ fixed = {-1/4, -1/2, -1/4, 1/4, 1/2, 1/4},
+ },
+ mesh = "advtrains_signals_ks_mast.obj",
+ tiles = {"advtrains_signals_ks_mast.png"},
+ description="Ks Signal Mast",
+ sunlight_propagates=true,
+ groups = {
+ cracky=3,
+ not_blocking_trains=1,
+ --save_in_at_nodedb=2,
+ },
+ after_place_node = place_degrotate,
+})
+
+minetest.register_node("advtrains_signals_ks:head_main", {
+ drawtype = "mesh",
+ paramtype="light",
+ paramtype2="degrotate",
+ walkable = false,
+ selection_box = {
+ type = "fixed",
+ fixed = {-1/4, -1/2, -1/4, 1/4, 1/2, 1/4},
+ },
+ mesh = "advtrains_signals_ks_head_main.obj",
+ tiles = {"advtrains_signals_ks_mast.png", "advtrains_signals_ks_head.png"},
+ description="Ks Main Signal Screen",
+ sunlight_propagates=true,
+ groups = {
+ cracky=3,
+ not_blocking_trains=1,
+ --save_in_at_nodedb=2,
+ },
+ after_place_node = place_degrotate,
+})
+
+minetest.register_node("advtrains_signals_ks:zs_top", {
+ drawtype = "mesh",
+ paramtype="light",
+ paramtype2="degrotate",
+ walkable = false,
+ selection_box = {
+ type = "fixed",
+ fixed = {-1/4, -1/2, -1/4, 1/4, 1/2, 1/4},
+ },
+ mesh = "advtrains_signals_ks_zs_top.obj",
+ tiles = {"advtrains_signals_ks_mast.png", "advtrains_signals_ks_head.png"},
+ description="Ks Speed Restriction Signal (top)",
+ sunlight_propagates=true,
+ groups = {
+ cracky=3,
+ not_blocking_trains=1,
+ --save_in_at_nodedb=2,
+ },
+ after_place_node = place_degrotate,
+})
+
+minetest.register_node("advtrains_signals_ks:zs_bottom", {
+ drawtype = "mesh",
+ paramtype="light",
+ paramtype2="degrotate",
+ walkable = false,
+ selection_box = {
+ type = "fixed",
+ fixed = {-1/4, -1/2, -1/4, 1/4, 1/2, 1/4},
+ },
+ mesh = "advtrains_signals_ks_zs_bottom.obj",
+ tiles = {"advtrains_signals_ks_mast.png", "advtrains_signals_ks_head.png"},
+ description="Ks Speed Restriction Signal (bottom)",
+ sunlight_propagates=true,
+ groups = {
+ cracky=3,
+ not_blocking_trains=1,
+ --save_in_at_nodedb=2,
+ },
+ after_place_node = place_degrotate,
+})
diff --git a/advtrains/advtrains_signals_ks/models/advtrains_signals_ks_head_dist.obj b/advtrains/advtrains_signals_ks/models/advtrains_signals_ks_head_dist.obj
new file mode 100644
index 0000000..28399e1
--- /dev/null
+++ b/advtrains/advtrains_signals_ks/models/advtrains_signals_ks_head_dist.obj
@@ -0,0 +1,270 @@
+# Blender v2.76 (sub 0) OBJ File: 'signal_ks_export.blend'
+# www.blender.org
+mtllib advtrains_signals_ks_head_dist.mtl
+o VSSignalschirm_Cube.003
+v 0.028581 -0.498051 0.268412
+v -0.028581 -0.498051 0.268412
+v -0.028581 -0.498051 0.496774
+v 0.028581 -0.498051 0.496774
+v 0.028581 -0.498051 0.325575
+v 0.028581 -0.498051 0.439611
+v -0.028581 -0.498051 0.325575
+v -0.028581 -0.498051 0.439611
+v -0.028581 -0.292188 0.439611
+v -0.028581 -0.164298 0.439611
+v 0.028581 -0.164298 0.439611
+v 0.028581 -0.292188 0.439611
+v 0.028581 -0.292188 0.496774
+v 0.028581 -0.164298 0.496774
+v -0.028581 -0.164298 0.496774
+v -0.028581 -0.292188 0.496774
+v -0.028581 -0.292188 0.325575
+v -0.028581 -0.164298 0.325575
+v -0.028581 -0.164298 0.268412
+v -0.028581 -0.292188 0.268412
+v 0.028581 -0.292188 0.268412
+v 0.028581 -0.164298 0.268412
+v 0.028581 -0.164298 0.325575
+v 0.028581 -0.292188 0.325575
+v -0.028581 -0.163378 0.439611
+v 0.028581 -0.163378 0.439611
+v 0.028581 -0.163378 0.496774
+v -0.028581 -0.163378 0.496774
+v -0.028581 -0.163378 0.325575
+v -0.028581 -0.163378 0.268412
+v 0.028581 -0.163378 0.268412
+v 0.028581 -0.163378 0.325575
+v 0.028581 -0.163378 0.268412
+v -0.028581 -0.163378 0.268412
+v -0.028581 -0.163378 0.496774
+v 0.028581 -0.163378 0.496774
+v 0.028581 -0.163378 0.325575
+v 0.028581 -0.163378 0.439611
+v -0.028581 -0.163378 0.325575
+v -0.028581 -0.163378 0.439611
+v -0.028581 0.040885 0.439611
+v -0.028581 0.167782 0.439611
+v 0.028581 0.167782 0.439611
+v 0.028581 0.040885 0.439611
+v 0.028581 0.040885 0.496774
+v 0.028581 0.167782 0.496774
+v -0.028581 0.167782 0.496774
+v -0.028581 0.040885 0.496774
+v -0.028581 0.040885 0.325575
+v -0.028581 0.167782 0.325575
+v -0.028581 0.167782 0.268412
+v -0.028581 0.040885 0.268412
+v 0.028581 0.040885 0.268412
+v 0.028581 0.167782 0.268412
+v 0.028581 0.167782 0.325575
+v 0.028581 0.040885 0.325575
+v -0.269369 -0.249462 0.548486
+v 0.230631 -0.249462 0.548486
+v -0.269369 0.273111 0.548486
+v 0.230631 0.273111 0.548486
+v -0.269369 0.273111 0.501067
+v -0.269369 -0.249462 0.501068
+v 0.230631 -0.249462 0.501068
+v 0.230631 0.273111 0.501067
+vt 0.538102 0.501950
+vt 0.538102 0.192341
+vt 0.615085 0.192341
+vt 0.538102 0.000000
+vt 0.615085 0.000000
+vt 0.000000 0.501950
+vt 0.000000 0.192341
+vt 0.076983 0.192341
+vt 0.000000 0.000000
+vt 0.076983 0.000000
+vt 0.615085 0.501950
+vt 0.692068 0.192341
+vt 0.692068 0.000000
+vt 0.692068 0.501950
+vt 0.769051 0.192341
+vt 0.769051 0.000000
+vt 0.769051 0.501950
+vt 0.846034 0.192341
+vt 0.846034 0.000000
+vt 0.846034 0.996502
+vt 0.846034 0.686893
+vt 0.923017 0.686893
+vt 0.307543 0.501950
+vt 0.307542 0.192341
+vt 0.384525 0.192341
+vt 0.307542 0.000000
+vt 0.384525 0.000000
+vt 0.230559 0.501950
+vt 0.230559 0.192341
+vt 0.230559 0.000000
+vt 0.923017 0.478709
+vt 1.000000 0.478709
+vt 1.000000 0.650215
+vt 0.846034 0.600923
+vt 0.846034 0.429417
+vt 0.923017 0.429417
+vt 0.923017 0.600923
+vt 0.846034 0.343447
+vt 0.923017 0.343447
+vt 0.538102 1.000000
+vt 0.538102 0.692796
+vt 0.615085 0.692796
+vt 0.000000 1.000000
+vt 0.000000 0.692797
+vt 0.076983 0.692797
+vt 0.076983 0.501950
+vt 0.692068 1.000000
+vt 0.692068 0.692796
+vt 0.769051 0.692796
+vt 0.692068 0.809153
+vt 0.615085 0.809153
+vt 0.615085 1.000000
+vt 0.769051 1.000000
+vt 0.846034 0.692796
+vt 0.846034 0.501950
+vt 0.923017 0.307203
+vt 0.923017 0.000000
+vt 1.000000 0.000000
+vt 0.307543 1.000000
+vt 0.307542 0.692797
+vt 0.384525 0.692797
+vt 0.384525 0.501950
+vt 0.230559 1.000000
+vt 0.230559 0.692797
+vt 1.000000 0.307203
+vt 0.846034 0.257476
+vt 0.846034 0.085970
+vt 0.923017 0.085970
+vt 0.923017 0.257476
+vt 0.923017 0.996502
+vt 0.923017 0.650215
+vt 0.076983 1.000000
+vt 0.846034 1.000000
+vt 0.384526 1.000000
+vt 0.500000 0.500000
+vt 0.500000 0.000000
+vt 0.047418 1.000000
+vt 0.047418 0.500000
+vt 0.094836 0.500000
+vt 0.142255 0.500000
+vt 0.142255 0.978402
+vt 0.094836 0.978402
+vt 0.189673 0.500000
+vt 1.000000 0.500000
+vt 0.000000 0.500000
+vt 0.094836 1.000000
+vt 0.189673 0.978402
+vn 1.000000 0.000000 0.000000
+vn -1.000000 0.000000 -0.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+g VSSignalschirm_Cube.003_Mast
+usemtl Mast
+s off
+f 6/1/1 12/2/1 13/3/1
+f 12/2/1 11/4/1 14/5/1
+f 3/6/2 16/7/2 9/8/2
+f 16/7/2 15/9/2 10/10/2
+f 4/11/3 13/3/3 16/12/3
+f 13/3/3 14/5/3 15/13/3
+f 8/14/4 9/12/4 12/15/4
+f 9/12/4 10/13/4 11/16/4
+f 2/17/4 20/15/4 21/18/4
+f 20/15/4 19/16/4 22/19/4
+f 5/20/3 24/21/3 17/22/3
+f 1/23/1 21/24/1 24/25/1
+f 21/24/1 22/26/1 23/27/1
+f 7/28/2 17/29/2 20/24/2
+f 17/29/2 18/30/2 19/26/2
+f 23/27/1 11/4/1 12/2/1
+f 17/31/5 24/32/5 12/33/5
+f 17/29/2 9/8/2 10/10/2
+f 18/34/6 10/35/6 11/36/6
+f 18/34/6 23/37/6 22/22/6
+f 10/35/6 15/38/6 14/39/6
+f 29/9/6 25/9/6 26/9/6
+f 38/40/1 44/41/1 45/42/1
+f 44/41/1 43/1/1 46/11/1
+f 35/43/2 48/44/2 41/45/2
+f 48/44/2 47/6/2 42/46/2
+f 36/47/3 45/48/3 48/49/3
+f 45/48/3 46/14/3 47/17/3
+f 40/14/4 41/50/4 44/51/4
+f 41/50/4 42/47/4 43/52/4
+f 34/53/4 52/49/4 53/54/4
+f 52/49/4 51/17/4 54/55/4
+f 37/56/3 56/57/3 49/58/3
+f 33/59/1 53/60/1 56/61/1
+f 53/60/1 54/23/1 55/62/1
+f 39/63/2 49/64/2 52/60/2
+f 49/64/2 50/28/2 51/23/2
+f 55/62/1 43/1/1 44/41/1
+f 49/56/5 56/65/5 44/32/5
+f 49/64/2 41/45/2 42/46/2
+f 50/66/6 42/67/6 43/68/6
+f 50/66/6 55/69/6 54/39/6
+f 42/67/6 47/19/6 46/57/6
+f 4/11/1 6/1/1 13/3/1
+f 13/3/1 12/2/1 14/5/1
+f 8/46/2 3/6/2 9/8/2
+f 9/8/2 16/7/2 10/10/2
+f 3/14/3 4/11/3 16/12/3
+f 16/12/3 13/3/3 15/13/3
+f 6/17/4 8/14/4 12/15/4
+f 12/15/4 9/12/4 11/16/4
+f 1/55/4 2/17/4 21/18/4
+f 21/18/4 20/15/4 22/19/4
+f 7/70/3 5/20/3 17/22/3
+f 5/62/1 1/23/1 24/25/1
+f 24/25/1 21/24/1 23/27/1
+f 2/23/2 7/28/2 20/24/2
+f 20/24/2 17/29/2 19/26/2
+f 24/25/1 23/27/1 12/2/1
+f 9/71/5 17/31/5 12/33/5
+f 18/30/2 17/29/2 10/10/2
+f 23/37/6 18/34/6 11/36/6
+f 19/21/6 18/34/6 22/22/6
+f 11/36/6 10/35/6 14/39/6
+f 32/9/6 29/9/6 26/9/6
+f 36/52/1 38/40/1 45/42/1
+f 45/42/1 44/41/1 46/11/1
+f 40/72/2 35/43/2 41/45/2
+f 41/45/2 48/44/2 42/46/2
+f 35/53/3 36/47/3 48/49/3
+f 48/49/3 45/48/3 47/17/3
+f 38/11/4 40/14/4 44/51/4
+f 44/51/4 41/50/4 43/52/4
+f 33/73/4 34/53/4 53/54/4
+f 53/54/4 52/49/4 54/55/4
+f 39/65/3 37/56/3 49/58/3
+f 37/74/1 33/59/1 56/61/1
+f 56/61/1 53/60/1 55/62/1
+f 34/59/2 39/63/2 52/60/2
+f 52/60/2 49/64/2 51/23/2
+f 56/61/1 55/62/1 44/41/1
+f 41/31/5 49/56/5 44/32/5
+f 50/28/2 49/64/2 42/46/2
+f 55/69/6 50/66/6 43/68/6
+f 51/38/6 50/66/6 54/39/6
+f 43/68/6 42/67/6 46/57/6
+g VSSignalschirm_Cube.003_Schirm
+usemtl Schirm
+f 58/75/3 60/76/3 59/58/3
+f 61/9/4 64/76/4 63/75/4
+f 61/77/2 62/78/2 57/79/2
+f 64/80/6 61/81/6 59/82/6
+f 62/81/5 63/80/5 58/83/5
+f 63/78/1 64/77/1 60/43/1
+f 57/84/3 58/75/3 59/58/3
+f 62/85/4 61/9/4 63/75/4
+f 59/86/2 61/77/2 57/79/2
+f 60/79/6 64/80/6 59/82/6
+f 57/87/5 62/81/5 58/83/5
+f 58/85/1 63/78/1 60/43/1
+l 26 27
+l 28 25
+l 27 28
+l 30 31
+l 31 32
+l 29 30
diff --git a/advtrains/advtrains_signals_ks/models/advtrains_signals_ks_head_main.obj b/advtrains/advtrains_signals_ks/models/advtrains_signals_ks_head_main.obj
new file mode 100644
index 0000000..283ef46
--- /dev/null
+++ b/advtrains/advtrains_signals_ks/models/advtrains_signals_ks_head_main.obj
@@ -0,0 +1,286 @@
+# Blender v2.76 (sub 0) OBJ File: 'signal_ks_export.blend'
+# www.blender.org
+mtllib advtrains_signals_ks_head_main.mtl
+o HSSignalschirm_Cube.002
+v -0.028581 -0.498051 0.439611
+v 0.028581 -0.498051 0.439611
+v 0.028581 -0.498051 0.496774
+v -0.028581 -0.498051 0.496774
+v -0.028581 -0.498051 0.325575
+v -0.028581 -0.498051 0.268412
+v 0.028581 -0.498051 0.268412
+v 0.028581 -0.498051 0.325575
+v 0.028581 -0.498051 0.268412
+v -0.028581 -0.498051 0.268412
+v -0.028581 -0.498051 0.496774
+v 0.028581 -0.498051 0.496774
+v 0.028581 -0.498051 0.325575
+v 0.028581 -0.498051 0.439611
+v -0.028581 -0.498051 0.325575
+v -0.028581 -0.498051 0.439611
+v -0.028581 -0.292188 0.439611
+v -0.028581 -0.164298 0.439611
+v 0.028581 -0.164298 0.439611
+v 0.028581 -0.292188 0.439611
+v 0.028581 -0.292188 0.496774
+v 0.028581 -0.164298 0.496774
+v -0.028581 -0.164298 0.496774
+v -0.028581 -0.292188 0.496774
+v -0.028581 -0.292188 0.325575
+v -0.028581 -0.164298 0.325575
+v -0.028581 -0.164298 0.268412
+v -0.028581 -0.292188 0.268412
+v 0.028581 -0.292188 0.268412
+v 0.028581 -0.164298 0.268412
+v 0.028581 -0.164298 0.325575
+v 0.028581 -0.292188 0.325575
+v -0.028581 -0.163378 0.439611
+v 0.028581 -0.163378 0.439611
+v 0.028581 -0.163378 0.496774
+v -0.028581 -0.163378 0.496774
+v -0.028581 -0.163378 0.325575
+v -0.028581 -0.163378 0.268412
+v 0.028581 -0.163378 0.268412
+v 0.028581 -0.163378 0.325575
+v 0.028581 -0.163378 0.268412
+v -0.028581 -0.163378 0.268412
+v -0.028581 -0.163378 0.496774
+v 0.028581 -0.163378 0.496774
+v 0.028581 -0.163378 0.325575
+v 0.028581 -0.163378 0.439611
+v -0.028581 -0.163378 0.325575
+v -0.028581 -0.163378 0.439611
+v -0.028581 0.040885 0.439611
+v -0.028581 0.167782 0.439611
+v 0.028581 0.167782 0.439611
+v 0.028581 0.040885 0.439611
+v 0.028581 0.040885 0.496774
+v 0.028581 0.167782 0.496774
+v -0.028581 0.167782 0.496774
+v -0.028581 0.040885 0.496774
+v -0.028581 0.040885 0.325575
+v -0.028581 0.167782 0.325575
+v -0.028581 0.167782 0.268412
+v -0.028581 0.040885 0.268412
+v 0.028581 0.040885 0.268412
+v 0.028581 0.167782 0.268412
+v 0.028581 0.167782 0.325575
+v 0.028581 0.040885 0.325575
+v -0.269369 -0.475166 0.548486
+v 0.230631 -0.475166 0.548486
+v -0.269369 0.273749 0.548486
+v 0.230631 0.273749 0.548486
+v -0.269369 0.273749 0.501067
+v -0.269369 -0.475166 0.501068
+v 0.230631 -0.475166 0.501068
+v 0.230631 0.273749 0.501067
+vt 0.000000 0.000000
+vt 0.538102 0.501950
+vt 0.538102 0.192341
+vt 0.615085 0.192341
+vt 0.538102 0.000000
+vt 0.615085 0.000000
+vt 0.000000 0.501950
+vt 0.000000 0.192341
+vt 0.076983 0.192341
+vt 0.076983 0.000000
+vt 0.615085 0.501950
+vt 0.692068 0.192341
+vt 0.692068 0.000000
+vt 0.692068 0.501950
+vt 0.769051 0.192341
+vt 0.769051 0.000000
+vt 0.769051 0.501950
+vt 0.846034 0.192341
+vt 0.846034 0.000000
+vt 0.846034 0.996502
+vt 0.846034 0.686893
+vt 0.923017 0.686893
+vt 0.307543 0.501950
+vt 0.307542 0.192341
+vt 0.384525 0.192341
+vt 0.307542 0.000000
+vt 0.384525 0.000000
+vt 0.230559 0.501950
+vt 0.230559 0.192341
+vt 0.230559 0.000000
+vt 0.923017 0.478709
+vt 1.000000 0.478709
+vt 1.000000 0.650215
+vt 0.846034 0.600923
+vt 0.846034 0.429417
+vt 0.923017 0.429417
+vt 0.923017 0.600923
+vt 0.846034 0.343447
+vt 0.923017 0.343447
+vt 0.538102 1.000000
+vt 0.538102 0.692796
+vt 0.615085 0.692796
+vt 0.000000 1.000000
+vt 0.000000 0.692797
+vt 0.076983 0.692797
+vt 0.076983 0.501950
+vt 0.692068 1.000000
+vt 0.692068 0.692796
+vt 0.769051 0.692796
+vt 0.692068 0.809153
+vt 0.615085 0.809153
+vt 0.615085 1.000000
+vt 0.769051 1.000000
+vt 0.846034 0.692796
+vt 0.846034 0.501950
+vt 0.923017 0.307203
+vt 0.923017 0.000000
+vt 1.000000 0.000000
+vt 0.307543 1.000000
+vt 0.307542 0.692797
+vt 0.384525 0.692797
+vt 0.384525 0.501950
+vt 0.230559 1.000000
+vt 0.230559 0.692797
+vt 1.000000 0.307203
+vt 0.846034 0.257476
+vt 0.846034 0.085970
+vt 0.923017 0.085970
+vt 0.923017 0.257476
+vt 0.923017 0.996502
+vt 0.923017 0.650215
+vt 0.076983 1.000000
+vt 0.846034 1.000000
+vt 0.384526 1.000000
+vt 0.437731 0.748915
+vt 0.437731 0.000000
+vt 0.875462 0.000000
+vt 0.000000 0.748915
+vt 0.916975 0.748915
+vt 0.916975 0.000000
+vt 0.958487 0.000000
+vt 1.000000 0.500000
+vt 0.958487 0.500000
+vt 0.958487 1.000000
+vt 0.875462 0.748915
+vt 0.958487 0.748915
+vt 1.000000 1.000000
+vn 0.000000 1.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn -1.000000 0.000000 -0.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 -1.000000 0.000000
+g HSSignalschirm_Cube.002_Mast
+usemtl Mast
+s off
+f 5/1/1 1/1/1 2/1/1
+f 14/2/2 20/3/2 21/4/2
+f 20/3/2 19/5/2 22/6/2
+f 11/7/3 24/8/3 17/9/3
+f 24/8/3 23/1/3 18/10/3
+f 12/11/4 21/4/4 24/12/4
+f 21/4/4 22/6/4 23/13/4
+f 16/14/5 17/12/5 20/15/5
+f 17/12/5 18/13/5 19/16/5
+f 10/17/5 28/15/5 29/18/5
+f 28/15/5 27/16/5 30/19/5
+f 13/20/4 32/21/4 25/22/4
+f 9/23/2 29/24/2 32/25/2
+f 29/24/2 30/26/2 31/27/2
+f 15/28/3 25/29/3 28/24/3
+f 25/29/3 26/30/3 27/26/3
+f 31/27/2 19/5/2 20/3/2
+f 25/31/6 32/32/6 20/33/6
+f 25/29/3 17/9/3 18/10/3
+f 26/34/1 18/35/1 19/36/1
+f 26/34/1 31/37/1 30/22/1
+f 18/35/1 23/38/1 22/39/1
+f 37/1/1 33/1/1 34/1/1
+f 46/40/2 52/41/2 53/42/2
+f 52/41/2 51/2/2 54/11/2
+f 43/43/3 56/44/3 49/45/3
+f 56/44/3 55/7/3 50/46/3
+f 44/47/4 53/48/4 56/49/4
+f 53/48/4 54/14/4 55/17/4
+f 48/14/5 49/50/5 52/51/5
+f 49/50/5 50/47/5 51/52/5
+f 42/53/5 60/49/5 61/54/5
+f 60/49/5 59/17/5 62/55/5
+f 45/56/4 64/57/4 57/58/4
+f 41/59/2 61/60/2 64/61/2
+f 61/60/2 62/23/2 63/62/2
+f 47/63/3 57/64/3 60/60/3
+f 57/64/3 58/28/3 59/23/3
+f 63/62/2 51/2/2 52/41/2
+f 57/56/6 64/65/6 52/32/6
+f 57/64/3 49/45/3 50/46/3
+f 58/66/1 50/67/1 51/68/1
+f 58/66/1 63/69/1 62/39/1
+f 50/67/1 55/19/1 54/57/1
+f 8/1/1 5/1/1 2/1/1
+f 12/11/2 14/2/2 21/4/2
+f 21/4/2 20/3/2 22/6/2
+f 16/46/3 11/7/3 17/9/3
+f 17/9/3 24/8/3 18/10/3
+f 11/14/4 12/11/4 24/12/4
+f 24/12/4 21/4/4 23/13/4
+f 14/17/5 16/14/5 20/15/5
+f 20/15/5 17/12/5 19/16/5
+f 9/55/5 10/17/5 29/18/5
+f 29/18/5 28/15/5 30/19/5
+f 15/70/4 13/20/4 25/22/4
+f 13/62/2 9/23/2 32/25/2
+f 32/25/2 29/24/2 31/27/2
+f 10/23/3 15/28/3 28/24/3
+f 28/24/3 25/29/3 27/26/3
+f 32/25/2 31/27/2 20/3/2
+f 17/71/6 25/31/6 20/33/6
+f 26/30/3 25/29/3 18/10/3
+f 31/37/1 26/34/1 19/36/1
+f 27/21/1 26/34/1 30/22/1
+f 19/36/1 18/35/1 22/39/1
+f 40/1/1 37/1/1 34/1/1
+f 44/52/2 46/40/2 53/42/2
+f 53/42/2 52/41/2 54/11/2
+f 48/72/3 43/43/3 49/45/3
+f 49/45/3 56/44/3 50/46/3
+f 43/53/4 44/47/4 56/49/4
+f 56/49/4 53/48/4 55/17/4
+f 46/11/5 48/14/5 52/51/5
+f 52/51/5 49/50/5 51/52/5
+f 41/73/5 42/53/5 61/54/5
+f 61/54/5 60/49/5 62/55/5
+f 47/65/4 45/56/4 57/58/4
+f 45/74/2 41/59/2 64/61/2
+f 64/61/2 61/60/2 63/62/2
+f 42/59/3 47/63/3 60/60/3
+f 60/60/3 57/64/3 59/23/3
+f 64/61/2 63/62/2 52/41/2
+f 49/31/6 57/56/6 52/32/6
+f 58/28/3 57/64/3 50/46/3
+f 63/69/1 58/66/1 51/68/1
+f 59/38/1 58/66/1 62/39/1
+f 51/68/1 50/67/1 54/57/1
+g HSSignalschirm_Cube.002_Schirm
+usemtl Schirm
+f 66/75/4 68/76/4 67/77/4
+f 69/75/5 72/78/5 71/1/5
+f 69/79/3 70/80/3 65/81/3
+f 72/58/1 69/82/1 67/83/1
+f 70/84/6 71/83/6 66/82/6
+f 71/80/2 72/79/2 68/85/2
+f 65/85/4 66/75/4 67/77/4
+f 70/76/5 69/75/5 71/1/5
+f 67/86/3 69/79/3 65/81/3
+f 68/81/1 72/58/1 67/83/1
+f 65/87/6 70/84/6 66/82/6
+f 66/77/2 71/80/2 68/85/2
+l 2 3
+l 4 1
+l 3 4
+l 6 7
+l 7 8
+l 5 6
+l 34 35
+l 36 33
+l 35 36
+l 38 39
+l 39 40
+l 37 38
diff --git a/advtrains/advtrains_signals_ks/models/advtrains_signals_ks_lamps_dist.obj b/advtrains/advtrains_signals_ks/models/advtrains_signals_ks_lamps_dist.obj
new file mode 100644
index 0000000..c4f8a61
--- /dev/null
+++ b/advtrains/advtrains_signals_ks/models/advtrains_signals_ks_lamps_dist.obj
@@ -0,0 +1,1989 @@
+# Blender v2.76 (sub 0) OBJ File: 'signal_ks_export.blend'
+# www.blender.org
+mtllib advtrains_signals_ks_lamps_dist.mtl
+o VSLampen_Cube.004
+v 1.356099 0.195342 5.864285
+v 1.356098 0.189842 5.594683
+v 1.324589 0.300536 6.389298
+v 1.324588 0.295033 5.594215
+v 1.273160 0.397563 6.388865
+v 1.273160 0.392062 5.593781
+v 1.203793 0.482692 6.388486
+v 1.203794 0.477191 5.593402
+v 1.119149 0.552651 6.388174
+v 1.119148 0.547151 5.593091
+v 1.022483 0.604755 6.387940
+v 1.022485 0.599256 5.592857
+v 0.917511 0.636999 6.387797
+v 0.917511 0.631500 5.592714
+v 0.808263 0.648141 6.387748
+v 0.808264 0.642644 5.592665
+v 0.698939 0.637761 6.387794
+v 0.698940 0.632259 5.592710
+v 0.593745 0.606253 6.387936
+v 0.593744 0.600751 5.592852
+v 0.496716 0.554824 6.388164
+v 0.496716 0.549324 5.593081
+v 0.411588 0.485459 6.388473
+v 0.411586 0.479957 5.593389
+v 0.341628 0.400816 6.388850
+v 0.341625 0.395314 5.593767
+v 0.289521 0.304149 6.389282
+v 0.289522 0.298649 5.594199
+v 0.257278 0.199179 5.864267
+v 0.257278 0.193676 5.594666
+v 0.245926 0.085112 5.864237
+v 0.246134 0.084478 5.595152
+v 0.256836 -0.021166 5.862653
+v 0.256504 -0.024828 5.595598
+v 0.288031 -0.124601 5.863041
+v 0.288019 -0.130073 5.596006
+v 0.339461 -0.221624 5.863426
+v 0.339445 -0.227102 5.596392
+v 0.408828 -0.306751 5.863764
+v 0.408815 -0.312234 5.596729
+v 0.493473 -0.376709 5.864041
+v 0.493457 -0.382198 5.597005
+v 0.590136 -0.428808 5.864248
+v 0.590124 -0.434302 5.597212
+v 0.695107 -0.461050 5.864375
+v 0.695100 -0.466548 5.597339
+v 0.804351 -0.472194 5.864418
+v 0.804351 -0.477695 5.597383
+v 0.913672 -0.461815 5.864378
+v 0.913679 -0.467312 5.597343
+v 1.018864 -0.430305 5.864253
+v 1.018874 -0.435800 5.597218
+v 1.115892 -0.378882 5.864049
+v 1.115906 -0.384370 5.597014
+v 1.201019 -0.309515 5.863774
+v 1.201035 -0.315001 5.596738
+v 1.270979 -0.224876 5.863439
+v 1.270996 -0.230353 5.596403
+v 1.323086 -0.128213 5.863057
+v 1.323098 -0.133684 5.596019
+v 1.355004 -0.024994 5.862668
+v 1.355350 -0.028662 5.595614
+v 1.366655 0.081200 5.864254
+v 1.366481 0.080568 5.595167
+v 1.380815 0.199851 5.864238
+v 1.380815 0.194667 5.229348
+v 1.347889 0.309774 6.389203
+v 1.347889 0.304590 5.228831
+v 1.294148 0.411161 6.388727
+v 1.294148 0.405980 5.228355
+v 1.221662 0.500120 6.388309
+v 1.221663 0.494936 5.227938
+v 1.133213 0.573224 6.387966
+v 1.133212 0.568041 5.227594
+v 1.032202 0.627670 6.387711
+v 1.032202 0.622487 5.227339
+v 0.922510 0.661364 6.387552
+v 0.922510 0.656181 5.227180
+v 0.808350 0.673008 6.387497
+v 0.808351 0.667827 5.227125
+v 0.694112 0.662162 6.387548
+v 0.694114 0.656978 5.227177
+v 0.584189 0.629235 6.387703
+v 0.584189 0.624051 5.227331
+v 0.482798 0.575494 6.387955
+v 0.482799 0.570312 5.227584
+v 0.393842 0.503009 6.388296
+v 0.393842 0.497827 5.227924
+v 0.320737 0.414561 6.388711
+v 0.320736 0.409379 5.228340
+v 0.266289 0.313551 6.389186
+v 0.266290 0.308367 5.228814
+v 0.232596 0.203858 5.864219
+v 0.232596 0.198676 5.229330
+v 0.220950 0.089702 5.864219
+v 0.220951 0.084519 5.229865
+v 0.231799 -0.024533 5.862726
+v 0.231799 -0.029716 5.230402
+v 0.264725 -0.134459 5.863242
+v 0.264724 -0.139641 5.230918
+v 0.318466 -0.235846 5.863719
+v 0.318465 -0.241029 5.231395
+v 0.390952 -0.324803 5.864136
+v 0.390953 -0.329985 5.231813
+v 0.479402 -0.397909 5.864480
+v 0.479401 -0.403091 5.232156
+v 0.580414 -0.452354 5.864735
+v 0.580413 -0.457536 5.232411
+v 0.690105 -0.486047 5.864894
+v 0.690106 -0.491229 5.232570
+v 0.804264 -0.497692 5.864949
+v 0.804263 -0.502876 5.232625
+v 0.918500 -0.486845 5.864897
+v 0.918501 -0.492027 5.232574
+v 1.028426 -0.453917 5.864743
+v 1.028425 -0.459100 5.232419
+v 1.129816 -0.400180 5.864491
+v 1.129816 -0.405360 5.232167
+v 1.218773 -0.327692 5.864150
+v 1.218772 -0.332875 5.231826
+v 1.291878 -0.239244 5.863734
+v 1.291878 -0.244427 5.231411
+v 1.346324 -0.138234 5.863259
+v 1.346325 -0.143416 5.230936
+v 1.380017 -0.028543 5.862744
+v 1.380018 -0.033725 5.230421
+v 1.391665 0.085615 5.864237
+v 1.391664 0.080432 5.229884
+v -0.966289 1.760967 5.864285
+v -0.966289 1.758691 5.594683
+v -0.979322 1.804477 6.389298
+v -0.979322 1.802200 5.594215
+v -1.000594 1.844609 6.388865
+v -1.000594 1.842333 5.593781
+v -1.029285 1.879819 6.388486
+v -1.029285 1.877545 5.593402
+v -1.064296 1.908756 6.388174
+v -1.064296 1.906481 5.593091
+v -1.104278 1.930307 6.387940
+v -1.104278 1.928033 5.592857
+v -1.147697 1.943644 6.387797
+v -1.147697 1.941369 5.592714
+v -1.192884 1.948253 6.387748
+v -1.192883 1.945979 5.592665
+v -1.238102 1.943959 6.387794
+v -1.238102 1.941683 5.592710
+v -1.281613 1.930927 6.387936
+v -1.281613 1.928651 5.592852
+v -1.321745 1.909655 6.388164
+v -1.321746 1.907380 5.593081
+v -1.356956 1.880964 6.388473
+v -1.356957 1.878689 5.593389
+v -1.385893 1.845954 6.388850
+v -1.385894 1.843678 5.593767
+v -1.407445 1.805971 6.389282
+v -1.407444 1.803696 5.594199
+v -1.420781 1.762553 5.864267
+v -1.420781 1.760277 5.594666
+v -1.425477 1.715373 5.864237
+v -1.425391 1.715111 5.595152
+v -1.420964 1.671415 5.862653
+v -1.421102 1.669900 5.595598
+v -1.408062 1.628632 5.863041
+v -1.408066 1.626369 5.596006
+v -1.386789 1.588502 5.863426
+v -1.386796 1.586236 5.596392
+v -1.358097 1.553291 5.863764
+v -1.358103 1.551024 5.596729
+v -1.323087 1.524355 5.864041
+v -1.323093 1.522085 5.597005
+v -1.283105 1.502807 5.864248
+v -1.283110 1.500534 5.597212
+v -1.239687 1.489471 5.864375
+v -1.239690 1.487197 5.597339
+v -1.194502 1.484861 5.864418
+v -1.194502 1.482586 5.597383
+v -1.149285 1.489154 5.864378
+v -1.149282 1.486880 5.597343
+v -1.105775 1.502187 5.864253
+v -1.105771 1.499915 5.597218
+v -1.065643 1.523457 5.864049
+v -1.065637 1.521187 5.597014
+v -1.030433 1.552148 5.863774
+v -1.030426 1.549879 5.596738
+v -1.001496 1.587157 5.863439
+v -1.001489 1.584891 5.596403
+v -0.979944 1.627138 5.863057
+v -0.979939 1.624875 5.596019
+v -0.966742 1.669832 5.862668
+v -0.966598 1.668314 5.595614
+v -0.961923 1.713755 5.864254
+v -0.961995 1.713493 5.595167
+v -0.956066 1.762831 5.864238
+v -0.956066 1.760688 5.229348
+v -0.969685 1.808297 6.389203
+v -0.969685 1.806154 5.228831
+v -0.991913 1.850233 6.388727
+v -0.991913 1.848090 5.228355
+v -1.021894 1.887028 6.388309
+v -1.021894 1.884884 5.227938
+v -1.058478 1.917265 6.387966
+v -1.058479 1.915121 5.227594
+v -1.100258 1.939785 6.387711
+v -1.100258 1.937642 5.227339
+v -1.145629 1.953721 6.387552
+v -1.145629 1.951578 5.227180
+v -1.192848 1.958538 6.387497
+v -1.192847 1.956395 5.227125
+v -1.240099 1.954051 6.387548
+v -1.240098 1.951908 5.227177
+v -1.285565 1.940433 6.387703
+v -1.285565 1.938288 5.227331
+v -1.327502 1.918204 6.387955
+v -1.327502 1.916061 5.227584
+v -1.364296 1.888223 6.388296
+v -1.364296 1.886080 5.227924
+v -1.394534 1.851640 6.388711
+v -1.394534 1.849496 5.228340
+v -1.417054 1.809860 6.389186
+v -1.417054 1.807716 5.228814
+v -1.430991 1.764489 5.864219
+v -1.430990 1.762345 5.229330
+v -1.435807 1.717272 5.864219
+v -1.435807 1.715128 5.229865
+v -1.431320 1.670022 5.862726
+v -1.431320 1.667878 5.230402
+v -1.417701 1.624554 5.863242
+v -1.417701 1.622411 5.230918
+v -1.395473 1.582619 5.863719
+v -1.395473 1.580475 5.231395
+v -1.365491 1.545825 5.864136
+v -1.365491 1.543681 5.231813
+v -1.328907 1.515587 5.864480
+v -1.328907 1.513443 5.232156
+v -1.287126 1.493068 5.864735
+v -1.287127 1.490924 5.232411
+v -1.241756 1.479131 5.864894
+v -1.241756 1.476988 5.232570
+v -1.194538 1.474315 5.864949
+v -1.194538 1.472170 5.232625
+v -1.147288 1.478801 5.864897
+v -1.147287 1.476658 5.232574
+v -1.101820 1.492421 5.864743
+v -1.101821 1.490277 5.232419
+v -1.059884 1.514648 5.864491
+v -1.059884 1.512505 5.232167
+v -1.023089 1.544630 5.864150
+v -1.023090 1.542486 5.231826
+v -0.992852 1.581213 5.863734
+v -0.992852 1.579070 5.231411
+v -0.970332 1.622993 5.863259
+v -0.970331 1.620850 5.230936
+v -0.956396 1.668364 5.862744
+v -0.956395 1.666220 5.230421
+v -0.951578 1.715581 5.864237
+v -0.951578 1.713438 5.229884
+v -0.643901 0.195342 5.864285
+v -0.643902 0.189842 5.594683
+v -0.675411 0.300537 6.389298
+v -0.675412 0.295033 5.594215
+v -0.726840 0.397562 6.388865
+v -0.726840 0.392062 5.593781
+v -0.796207 0.482692 6.388486
+v -0.796206 0.477191 5.593402
+v -0.880851 0.552651 6.388174
+v -0.880852 0.547151 5.593091
+v -0.977517 0.604755 6.387940
+v -0.977515 0.599256 5.592857
+v -1.082489 0.636999 6.387797
+v -1.082489 0.631500 5.592714
+v -1.191737 0.648142 6.387748
+v -1.191736 0.642644 5.592665
+v -1.301062 0.637761 6.387794
+v -1.301060 0.632259 5.592710
+v -1.406255 0.606253 6.387936
+v -1.406256 0.600751 5.592852
+v -1.503284 0.554824 6.388164
+v -1.503284 0.549324 5.593081
+v -1.588412 0.485460 6.388473
+v -1.588414 0.479957 5.593389
+v -1.658372 0.400816 6.388850
+v -1.658375 0.395314 5.593767
+v -1.710479 0.304149 6.389282
+v -1.710478 0.298648 5.594199
+v -1.742722 0.199179 5.864267
+v -1.742722 0.193676 5.594666
+v -1.754074 0.085112 5.864237
+v -1.753866 0.084478 5.595152
+v -1.743164 -0.021166 5.862653
+v -1.743496 -0.024828 5.595598
+v -1.711969 -0.124601 5.863041
+v -1.711981 -0.130073 5.596006
+v -1.660540 -0.221624 5.863426
+v -1.660555 -0.227101 5.596392
+v -1.591172 -0.306751 5.863764
+v -1.591185 -0.312234 5.596729
+v -1.506527 -0.376709 5.864041
+v -1.506543 -0.382199 5.597005
+v -1.409864 -0.428808 5.864248
+v -1.409876 -0.434301 5.597212
+v -1.304893 -0.461050 5.864375
+v -1.304900 -0.466548 5.597339
+v -1.195649 -0.472194 5.864418
+v -1.195649 -0.477695 5.597383
+v -1.086329 -0.461815 5.864378
+v -1.086321 -0.467312 5.597343
+v -0.981136 -0.430305 5.864253
+v -0.981126 -0.435800 5.597218
+v -0.884108 -0.378882 5.864049
+v -0.884094 -0.384369 5.597014
+v -0.798981 -0.309516 5.863774
+v -0.798965 -0.315000 5.596738
+v -0.729021 -0.224876 5.863439
+v -0.729004 -0.230353 5.596403
+v -0.676914 -0.128213 5.863057
+v -0.676902 -0.133684 5.596019
+v -0.644996 -0.024994 5.862668
+v -0.644650 -0.028661 5.595614
+v -0.633345 0.081199 5.864254
+v -0.633519 0.080568 5.595167
+v -0.619185 0.199851 5.864238
+v -0.619185 0.194668 5.229348
+v -0.652111 0.309774 6.389203
+v -0.652111 0.304590 5.228831
+v -0.705852 0.411161 6.388727
+v -0.705852 0.405980 5.228355
+v -0.778338 0.500120 6.388309
+v -0.778337 0.494936 5.227938
+v -0.866787 0.573224 6.387966
+v -0.866788 0.568041 5.227594
+v -0.967798 0.627670 6.387711
+v -0.967798 0.622487 5.227339
+v -1.077490 0.661364 6.387552
+v -1.077490 0.656180 5.227180
+v -1.191650 0.673008 6.387497
+v -1.191649 0.667827 5.227125
+v -1.305888 0.662162 6.387548
+v -1.305886 0.656978 5.227177
+v -1.415811 0.629236 6.387703
+v -1.415811 0.624051 5.227331
+v -1.517202 0.575494 6.387955
+v -1.517201 0.570312 5.227584
+v -1.606158 0.503009 6.388296
+v -1.606158 0.497827 5.227924
+v -1.679263 0.414561 6.388711
+v -1.679264 0.409379 5.228340
+v -1.733711 0.313551 6.389186
+v -1.733710 0.308368 5.228814
+v -1.767405 0.203858 5.864219
+v -1.767404 0.198676 5.229330
+v -1.779050 0.089702 5.864219
+v -1.779049 0.084519 5.229865
+v -1.768201 -0.024533 5.862726
+v -1.768202 -0.029716 5.230402
+v -1.735275 -0.134459 5.863242
+v -1.735276 -0.139641 5.230918
+v -1.681534 -0.235847 5.863719
+v -1.681535 -0.241029 5.231395
+v -1.609048 -0.324803 5.864136
+v -1.609047 -0.329986 5.231813
+v -1.520598 -0.397909 5.864480
+v -1.520599 -0.403091 5.232156
+v -1.419586 -0.452353 5.864735
+v -1.419587 -0.457536 5.232411
+v -1.309895 -0.486047 5.864894
+v -1.309894 -0.491229 5.232570
+v -1.195736 -0.497692 5.864949
+v -1.195737 -0.502877 5.232625
+v -1.081500 -0.486845 5.864897
+v -1.081499 -0.492027 5.232574
+v -0.971574 -0.453917 5.864743
+v -0.971575 -0.459100 5.232419
+v -0.870184 -0.400180 5.864491
+v -0.870184 -0.405360 5.232167
+v -0.781227 -0.327693 5.864150
+v -0.781228 -0.332875 5.231826
+v -0.708122 -0.239244 5.863734
+v -0.708122 -0.244427 5.231411
+v -0.653676 -0.138234 5.863259
+v -0.653675 -0.143416 5.230936
+v -0.619983 -0.028543 5.862744
+v -0.619982 -0.033725 5.230421
+v -0.608335 0.085615 5.864237
+v -0.608336 0.080432 5.229884
+v -0.951578 -1.572011 5.229884
+v -0.951578 -1.569868 5.864237
+v -0.956395 -1.619229 5.230421
+v -0.956396 -1.617086 5.862744
+v -0.970331 -1.664599 5.230936
+v -0.970332 -1.662456 5.863259
+v -0.992852 -1.706379 5.231411
+v -0.992852 -1.704236 5.863734
+v -1.023090 -1.742963 5.231826
+v -1.023089 -1.740819 5.864150
+v -1.059884 -1.772945 5.232167
+v -1.059884 -1.770802 5.864491
+v -1.101821 -1.795172 5.232419
+v -1.101820 -1.793028 5.864743
+v -1.147287 -1.808791 5.232574
+v -1.147288 -1.806648 5.864897
+v -1.194538 -1.813279 5.232625
+v -1.194538 -1.811135 5.864949
+v -1.241756 -1.808461 5.232570
+v -1.241756 -1.806318 5.864894
+v -1.287127 -1.794525 5.232411
+v -1.287126 -1.792382 5.864735
+v -1.328907 -1.772006 5.232156
+v -1.328907 -1.769862 5.864480
+v -1.365491 -1.741768 5.231813
+v -1.365491 -1.739625 5.864136
+v -1.395473 -1.704974 5.231395
+v -1.395473 -1.702831 5.863719
+v -1.417701 -1.663038 5.230918
+v -1.417701 -1.660895 5.863242
+v -1.431320 -1.617571 5.230402
+v -1.431320 -1.615427 5.862726
+v -1.435807 -1.570321 5.229865
+v -1.435807 -1.568178 5.864219
+v -1.430990 -1.523104 5.229330
+v -1.430991 -1.520960 5.864219
+v -1.417054 -1.477733 5.228814
+v -1.417054 -1.475590 6.389186
+v -1.394534 -1.435953 5.228340
+v -1.394534 -1.433810 6.388711
+v -1.364296 -1.399369 5.227924
+v -1.364296 -1.397226 6.388296
+v -1.327502 -1.369388 5.227584
+v -1.327502 -1.367245 6.387955
+v -1.285565 -1.347161 5.227331
+v -1.285565 -1.345016 6.387703
+v -1.240098 -1.333542 5.227177
+v -1.240099 -1.331398 6.387548
+v -1.192847 -1.329054 5.227125
+v -1.192848 -1.326911 6.387497
+v -1.145629 -1.333871 5.227180
+v -1.145629 -1.331728 6.387552
+v -1.100258 -1.347808 5.227339
+v -1.100258 -1.345664 6.387711
+v -1.058479 -1.370328 5.227594
+v -1.058478 -1.368184 6.387966
+v -1.021894 -1.400565 5.227938
+v -1.021894 -1.398421 6.388309
+v -0.991913 -1.437359 5.228355
+v -0.991913 -1.435216 6.388727
+v -0.969685 -1.479295 5.228831
+v -0.969685 -1.477152 6.389203
+v -0.956066 -1.524762 5.229348
+v -0.956066 -1.522618 5.864238
+v -0.961995 -1.571956 5.595167
+v -0.961923 -1.571694 5.864254
+v -0.966598 -1.617135 5.595614
+v -0.966742 -1.615618 5.862668
+v -0.979939 -1.660574 5.596019
+v -0.979944 -1.658311 5.863057
+v -1.001489 -1.700558 5.596403
+v -1.001496 -1.698292 5.863439
+v -1.030426 -1.735570 5.596738
+v -1.030433 -1.733301 5.863774
+v -1.065637 -1.764262 5.597014
+v -1.065643 -1.761992 5.864049
+v -1.105771 -1.785535 5.597218
+v -1.105775 -1.783262 5.864253
+v -1.149282 -1.798569 5.597343
+v -1.149285 -1.796295 5.864378
+v -1.194502 -1.802863 5.597383
+v -1.194502 -1.800588 5.864418
+v -1.239690 -1.798252 5.597339
+v -1.239687 -1.795979 5.864375
+v -1.283110 -1.784915 5.597212
+v -1.283105 -1.782643 5.864248
+v -1.323093 -1.763364 5.597005
+v -1.323087 -1.761094 5.864041
+v -1.358103 -1.734425 5.596729
+v -1.358097 -1.732158 5.863764
+v -1.386796 -1.699213 5.596392
+v -1.386789 -1.696948 5.863426
+v -1.408066 -1.659081 5.596006
+v -1.408062 -1.656817 5.863041
+v -1.421102 -1.615549 5.595598
+v -1.420964 -1.614034 5.862653
+v -1.425391 -1.570338 5.595152
+v -1.425477 -1.570076 5.864237
+v -1.420781 -1.525172 5.594666
+v -1.420781 -1.522896 5.864267
+v -1.407444 -1.481753 5.594199
+v -1.407445 -1.479478 6.389282
+v -1.385894 -1.441771 5.593767
+v -1.385893 -1.439495 6.388850
+v -1.356957 -1.406760 5.593389
+v -1.356956 -1.404485 6.388473
+v -1.321746 -1.378070 5.593081
+v -1.321745 -1.375794 6.388164
+v -1.281613 -1.356798 5.592852
+v -1.281613 -1.354522 6.387936
+v -1.238102 -1.343766 5.592710
+v -1.238102 -1.341490 6.387794
+v -1.192883 -1.339470 5.592665
+v -1.192884 -1.337197 6.387748
+v -1.147697 -1.344080 5.592714
+v -1.147697 -1.341805 6.387797
+v -1.104278 -1.357417 5.592857
+v -1.104278 -1.355142 6.387940
+v -1.064296 -1.378968 5.593091
+v -1.064296 -1.376693 6.388174
+v -1.029285 -1.407905 5.593402
+v -1.029285 -1.405630 6.388486
+v -1.000594 -1.443116 5.593781
+v -1.000594 -1.440841 6.388865
+v -0.979322 -1.483249 5.594215
+v -0.979322 -1.480973 6.389298
+v -0.966289 -1.526758 5.594683
+v -0.966289 -1.524483 5.864285
+vt 0.442670 0.517822
+vt 0.228883 0.517823
+vt 0.228889 0.488295
+vt 0.797953 0.896311
+vt 0.741726 0.913364
+vt 0.594127 0.834472
+vt 0.577066 0.778233
+vt 0.655948 0.630639
+vt 0.770682 0.619333
+vt 0.859798 0.692466
+vt 0.876858 0.748707
+vt 0.683240 0.907605
+vt 0.655960 0.896305
+vt 0.582826 0.719746
+vt 0.610530 0.667916
+vt 0.683222 0.619339
+vt 0.822512 0.647036
+vt 0.843392 0.667915
+vt 0.871097 0.807194
+vt 0.843391 0.859025
+vt 0.770685 0.907604
+vt 0.712199 0.913364
+vt 0.631409 0.879901
+vt 0.610530 0.859023
+vt 0.582827 0.807192
+vt 0.577066 0.748705
+vt 0.594126 0.692467
+vt 0.631409 0.647037
+vt 0.712194 0.613573
+vt 0.741722 0.613573
+vt 0.797962 0.630631
+vt 0.871098 0.719747
+vt 0.876858 0.778235
+vt 0.859797 0.834474
+vt 0.822501 0.879912
+vt 0.442971 0.724510
+vt 0.443060 0.754024
+vt 0.370472 0.723575
+vt 0.442967 0.311134
+vt 0.370467 0.312068
+vt 0.443056 0.281620
+vt 0.443160 0.252098
+vt 0.371348 0.252525
+vt 0.443163 0.783546
+vt 0.371352 0.783117
+vt 0.006929 0.253167
+vt 0.177644 0.253134
+vt 0.006828 0.284020
+vt 0.007055 0.808541
+vt 0.006941 0.777687
+vt 0.177771 0.808498
+vt 0.006827 0.746834
+vt 0.176852 0.746796
+vt 0.006727 0.314875
+vt 0.176753 0.314837
+vt 0.371492 0.871219
+vt 0.371495 0.841694
+vt 0.443305 0.842613
+vt 0.615392 0.436018
+vt 0.610260 0.440534
+vt 0.592437 0.415287
+vt 0.816609 0.103895
+vt 0.836176 0.125250
+vt 0.831035 0.128981
+vt 0.706468 0.066881
+vt 0.736753 0.067631
+vt 0.735929 0.074111
+vt 0.647824 0.083609
+vt 0.650942 0.089526
+vt 0.626230 0.105756
+vt 0.765981 0.074365
+vt 0.763884 0.080481
+vt 0.579817 0.387126
+vt 0.586362 0.385333
+vt 0.621946 0.100560
+vt 0.605204 0.126737
+vt 0.706979 0.073452
+vt 0.678244 0.078632
+vt 0.792953 0.086670
+vt 0.812355 0.108585
+vt 0.676401 0.072253
+vt 0.789700 0.092175
+vt 0.599888 0.122511
+vt 0.589057 0.151745
+vt 0.582798 0.148853
+vt 0.579868 0.178984
+vt 0.850517 0.149568
+vt 0.844628 0.151667
+vt 0.572791 0.357181
+vt 0.571207 0.326153
+vt 0.578089 0.326242
+vt 0.579568 0.357437
+vt 0.892437 0.349226
+vt 0.885423 0.348954
+vt 0.885704 0.319257
+vt 0.886223 0.285996
+vt 0.879631 0.287703
+vt 0.636826 0.456466
+vt 0.632640 0.461897
+vt 0.874138 0.409852
+vt 0.856681 0.436209
+vt 0.851292 0.431762
+vt 0.661830 0.472412
+vt 0.658752 0.478560
+vt 0.689480 0.483245
+vt 0.687628 0.489885
+vt 0.718747 0.488548
+vt 0.718195 0.495436
+vt 0.779839 0.488518
+vt 0.749318 0.494983
+vt 0.748545 0.488099
+vt 0.808610 0.476251
+vt 0.777761 0.481894
+vt 0.834553 0.458608
+vt 0.805300 0.470133
+vt 0.830124 0.453224
+vt 0.573209 0.178195
+vt 0.886228 0.380492
+vt 0.867982 0.406513
+vt 0.879533 0.378395
+vt 0.370709 0.754396
+vt 0.319322 0.130795
+vt 0.319224 0.161649
+vt 0.007220 0.160604
+vt 0.007387 0.901104
+vt 0.319390 0.899923
+vt 0.319502 0.930776
+vt 0.442778 0.399714
+vt 0.228990 0.399716
+vt 0.229046 0.370189
+vt 0.007499 0.931958
+vt 0.319616 0.961631
+vt 0.006361 0.469146
+vt 0.176387 0.469108
+vt 0.176362 0.499962
+vt 0.442678 0.488295
+vt 0.228910 0.458769
+vt 0.007727 0.006334
+vt 0.319730 0.007378
+vt 0.319626 0.038233
+vt 0.228890 0.547350
+vt 0.007613 0.962812
+vt 0.319730 0.992485
+vt 0.228946 0.606403
+vt 0.228912 0.576877
+vt 0.442700 0.576876
+vt 0.228992 0.635930
+vt 0.442734 0.606402
+vt 0.442833 0.370188
+vt 0.229109 0.340661
+vt 0.229113 0.694984
+vt 0.229049 0.665457
+vt 0.442837 0.665456
+vt 0.442901 0.694984
+vt 0.370705 0.281246
+vt 0.371443 0.812167
+vt 0.443254 0.813086
+vt 0.892437 0.317355
+vt 0.371421 0.900745
+vt 0.443302 0.872141
+vt 0.371269 0.930272
+vt 0.443231 0.901668
+vt 0.007276 0.870250
+vt 0.319278 0.869069
+vt 0.006405 0.438291
+vt 0.176430 0.438254
+vt 0.443090 0.104449
+vt 0.371280 0.105372
+vt 0.371043 0.075847
+vt 0.443237 0.133976
+vt 0.371427 0.134897
+vt 0.443305 0.163503
+vt 0.371495 0.164423
+vt 0.443305 0.193031
+vt 0.371495 0.193949
+vt 0.443252 0.222558
+vt 0.371442 0.223476
+vt 0.177399 0.283987
+vt 0.006543 0.376583
+vt 0.176568 0.376545
+vt 0.176492 0.407399
+vt 0.006467 0.407437
+vt 0.007165 0.839396
+vt 0.319168 0.838215
+vt 0.370694 0.989321
+vt 0.371029 0.959797
+vt 0.442838 0.960722
+vt 0.442780 0.635930
+vt 0.442698 0.458768
+vt 0.228944 0.429242
+vt 0.006337 0.500000
+vt 0.176359 0.530816
+vt 0.319524 0.069087
+vt 0.007520 0.068042
+vt 0.319423 0.099941
+vt 0.007419 0.098896
+vt 0.007319 0.129750
+vt 0.442897 0.340661
+vt 0.319126 0.192504
+vt 0.007122 0.191458
+vt 0.319029 0.223358
+vt 0.007025 0.222313
+vt 0.177512 0.777645
+vt 0.443079 0.931196
+vt 0.176656 0.345691
+vt 0.006631 0.345729
+vt 0.442853 0.074922
+vt 0.370712 0.046322
+vt 0.442732 0.429241
+vt 0.442678 0.547349
+vt 0.176377 0.561671
+vt 0.006351 0.561708
+vt 0.176415 0.592525
+vt 0.006390 0.592562
+vt 0.176474 0.623379
+vt 0.006448 0.623417
+vt 0.176549 0.654233
+vt 0.006524 0.654271
+vt 0.176640 0.685087
+vt 0.006614 0.685125
+vt 0.176742 0.715941
+vt 0.006716 0.715979
+vt 0.598317 0.411848
+vt 0.007623 0.037188
+vt 0.007728 0.993666
+vt 0.442504 0.990249
+vt 0.006334 0.530854
+vt 0.442522 0.045396
+vn 0.094500 -0.995500 0.006900
+vn -0.000000 0.004400 1.000000
+vn 0.000000 0.004500 1.000000
+vn 0.000000 0.004000 1.000000
+vn 0.000300 0.004100 1.000000
+vn -0.000200 0.004400 1.000000
+vn 0.000100 0.004500 1.000000
+vn -0.000000 0.004600 1.000000
+vn -0.000100 0.004400 1.000000
+vn -0.000300 0.003800 1.000000
+vn 0.000100 0.004000 1.000000
+vn -0.000100 0.003900 1.000000
+vn -0.000000 0.004100 1.000000
+vn -0.000200 0.004000 1.000000
+vn -0.001200 0.004200 1.000000
+vn -0.995500 -0.094600 0.001900
+vn 0.994800 -0.101500 0.002100
+vn 0.995500 0.094400 -0.002500
+vn -0.994800 0.101400 -0.002700
+vn 0.995500 0.094500 -0.000800
+vn -0.994800 0.101500 -0.000800
+vn -0.995500 -0.094500 0.000800
+vn 0.994800 -0.101500 0.000800
+vn -0.770700 0.637000 -0.013100
+vn -0.008000 0.009000 0.999900
+vn -0.002300 0.006600 1.000000
+vn -0.000500 0.010000 1.000000
+vn 0.002400 0.009000 1.000000
+vn -0.001400 0.009500 1.000000
+vn -0.002300 0.005400 1.000000
+vn 0.003000 0.008100 1.000000
+vn 0.000600 0.010100 0.999900
+vn -0.002400 0.007600 1.000000
+vn 0.001500 0.009400 1.000000
+vn -0.002100 0.008700 1.000000
+vn 0.003100 0.007000 1.000000
+vn 0.002800 0.005900 1.000000
+vn -0.001800 0.005700 1.000000
+vn 0.001800 0.000200 1.000000
+vn 0.003100 -0.013400 0.999900
+vn 0.004900 -0.014400 0.999900
+vn -0.182400 -0.960000 0.212300
+vn -0.008800 0.012000 0.999900
+vn 0.008800 0.011900 0.999900
+vn -0.008500 0.015200 0.999800
+vn -0.007000 0.017900 0.999800
+vn -0.004600 0.019900 0.999800
+vn 0.001600 0.020800 0.999800
+vn 0.004600 0.019800 0.999800
+vn 0.007100 0.017800 0.999800
+vn 0.008500 0.015000 0.999900
+vn 0.361500 -0.909800 0.204000
+vn 0.007900 0.008900 0.999900
+vn 0.006200 0.005600 1.000000
+vn -0.000100 0.004300 1.000000
+vn -0.995800 -0.092100 0.000900
+vn 0.637100 0.770800 -0.003400
+vn -0.631700 0.775200 -0.003500
+vn 0.770800 -0.637100 0.004400
+vn -0.468300 0.883500 -0.003900
+vn 0.287000 -0.957900 0.007900
+vn 0.286900 -0.957900 0.006600
+vn -0.094500 0.995500 -0.004400
+vn -0.101500 -0.994800 0.006900
+vn -0.286900 0.957900 -0.004300
+vn -0.474500 -0.880200 0.006100
+vn -0.637100 -0.770800 0.005300
+vn 0.880300 -0.474500 0.003300
+vn -0.883600 -0.468300 0.003200
+vn -0.955100 -0.296300 0.002100
+vn 0.995100 -0.099000 0.001000
+vn 0.994800 0.102100 0.000500
+vn -0.880200 0.474500 -0.009800
+vn -0.001500 0.020800 0.999800
+vn -0.955400 0.295400 -0.005300
+vn -0.000800 -0.000200 1.000000
+vn -0.631600 0.775100 -0.016000
+vn -0.468200 0.883400 -0.018200
+vn -0.770800 0.637100 -0.002800
+vn 0.468300 -0.883500 0.007200
+vn 0.293600 0.955700 -0.019700
+vn 0.474400 0.880100 -0.018100
+vn 0.637000 0.770700 -0.015900
+vn 0.775200 0.631600 -0.013000
+vn 0.883500 0.468300 -0.009600
+vn 0.957400 0.288700 -0.005200
+vn -0.994000 0.109100 0.000400
+vn 0.770800 -0.637100 0.005200
+vn 0.631700 -0.775200 0.006400
+vn -0.880300 0.474500 -0.002100
+vn -0.094500 0.995300 -0.020500
+vn -0.775200 -0.631700 0.004400
+vn 0.468300 -0.883500 0.006100
+vn 0.094500 -0.995500 0.008200
+vn 0.101500 0.994800 -0.004400
+vn 0.293600 0.955900 -0.004300
+vn 0.474500 0.880300 -0.003900
+vn 0.952900 -0.303200 0.002100
+vn 0.775200 0.631700 -0.002800
+vn 0.883600 0.468300 -0.002100
+vn 0.956200 0.292700 -0.001300
+vn -0.995500 -0.094600 0.000800
+vn -0.286900 0.957800 -0.019700
+vn 0.955900 -0.293600 0.002400
+vn 0.880300 -0.474500 0.003900
+vn -0.955900 0.293600 -0.002400
+vn 0.101500 0.994600 -0.020500
+vn 0.631700 -0.775200 0.005400
+vn -0.293600 -0.955900 0.006600
+vn -0.101500 -0.994800 0.008200
+vn -0.293600 -0.955900 0.007800
+vn -0.474500 -0.880200 0.007200
+vn -0.637100 -0.770800 0.006300
+vn -0.775200 -0.631700 0.005200
+vn -0.883600 -0.468300 0.003800
+vn -0.958000 -0.286900 0.002400
+vn 0.094600 -0.995500 0.006900
+vn -0.770800 0.637000 -0.013100
+vn -0.005700 0.007000 1.000000
+vn -0.003100 0.007000 1.000000
+vn -0.000500 0.010100 0.999900
+vn 0.002100 0.008600 1.000000
+vn -0.001600 0.009800 1.000000
+vn -0.006300 0.005700 1.000000
+vn 0.002400 0.007600 1.000000
+vn 0.000500 0.010000 1.000000
+vn -0.003000 0.008100 1.000000
+vn 0.001600 0.009700 1.000000
+vn -0.002500 0.009100 1.000000
+vn 0.002300 0.006600 1.000000
+vn 0.001800 0.005700 1.000000
+vn -0.002800 0.006000 1.000000
+vn 0.000700 -0.000200 1.000000
+vn -0.005100 -0.014400 0.999900
+vn -0.003200 -0.013400 0.999900
+vn -0.368000 -0.907200 0.204000
+vn -0.007300 0.010000 0.999900
+vn 0.007200 0.009900 0.999900
+vn -0.007600 0.013300 0.999900
+vn -0.006600 0.016400 0.999800
+vn -0.004500 0.018900 0.999800
+vn 0.001700 0.020400 0.999800
+vn 0.004600 0.018800 0.999800
+vn 0.006600 0.016300 0.999800
+vn 0.007600 0.013100 0.999900
+vn 0.175700 -0.961300 0.212300
+vn 0.005700 0.007000 1.000000
+vn 0.002200 0.005400 1.000000
+vn -0.468300 0.883600 -0.003900
+vn -0.957900 -0.286900 0.005900
+vn -0.880300 0.474400 -0.009800
+vn -0.001600 0.020400 0.999800
+vn -0.955900 0.293500 -0.006100
+vn -0.002000 0.000200 1.000000
+vn -0.468300 0.883400 -0.018200
+vn 0.637100 0.770600 -0.015900
+vn 0.883500 0.468200 -0.009700
+vn 0.958000 0.286800 -0.005900
+vn 0.955900 -0.293600 0.006000
+vn 0.957900 0.286900 -0.002300
+vn -0.286900 0.957700 -0.019700
+vn -0.954100 0.299500 -0.001300
+vn -0.002400 0.006600 1.000000
+vn -0.008900 0.012000 0.999900
+vn -0.003000 0.007000 1.000000
+vn 0.002500 0.007600 1.000000
+vn 0.006700 0.016300 0.999800
+vn -0.001900 0.000200 1.000000
+vn 0.000200 0.010900 0.999900
+vn -0.019300 0.021700 0.999600
+vn -0.000000 0.009600 1.000000
+vn -0.000600 0.009200 1.000000
+vn 0.880300 -0.474500 0.001600
+vn 0.000100 0.010700 0.999900
+vn -0.003000 0.010200 0.999900
+vn -0.955400 0.295400 -0.002200
+vn -0.995500 -0.094600 0.000300
+vn -0.880300 0.474500 -0.000900
+vn 0.631700 -0.775200 0.002600
+vn 0.000300 0.009700 1.000000
+vn 0.952900 -0.303200 0.000900
+vn 0.000100 0.009600 1.000000
+vn 0.293600 0.955900 -0.001800
+vn 0.637100 0.770800 -0.001400
+vn 0.020700 0.036300 0.999100
+vn -0.094500 0.995500 -0.001800
+vn -0.775200 -0.631700 0.001800
+vn 0.994800 -0.101500 0.000900
+vn -0.101500 -0.994800 0.002800
+vn -0.000000 0.010800 0.999900
+vn 0.000100 0.009700 1.000000
+vn -0.000100 0.009900 1.000000
+vn -0.994800 0.101400 -0.001100
+vn 0.883600 0.468300 -0.000900
+vn -0.995800 -0.092100 0.000400
+vn 0.005900 0.021700 0.999700
+vn -0.005100 0.021000 0.999800
+vn -0.011000 0.048000 0.998800
+vn 0.000000 0.010900 0.999900
+vn 0.004000 0.050300 0.998700
+vn 0.994800 0.102100 0.000200
+vn -0.637100 -0.770800 0.002200
+vn 0.094500 -0.995500 0.002800
+vn -0.005500 0.013100 0.999900
+vn 0.094500 -0.995500 0.003400
+vn 0.011600 -0.034800 0.999300
+vn -0.001200 0.024100 0.999700
+vn 0.775200 0.631700 -0.005400
+vn 0.995500 0.094500 -0.000300
+vn -0.775200 -0.631700 0.002100
+vn 0.995500 0.094400 -0.001000
+vn -0.468300 0.883500 -0.007500
+vn -0.005600 0.016000 0.999900
+vn 0.007300 0.019500 0.999800
+vn 0.468300 -0.883500 0.002500
+vn 0.631700 -0.775200 0.002200
+vn -0.003700 0.050300 0.998700
+vn 0.021300 0.028700 0.999400
+vn -0.293600 -0.955900 0.002700
+vn -0.101500 -0.994800 0.003400
+vn -0.004400 0.013800 0.999900
+vn -0.287000 0.957900 -0.008200
+vn 0.101500 0.994800 -0.008500
+vn -0.000100 0.010800 0.999900
+vn -0.880300 0.474500 -0.004000
+vn 0.883600 0.468300 -0.004000
+vn -0.003500 0.023000 0.999700
+vn 0.293600 0.955900 -0.008100
+vn 0.017100 0.042900 0.998900
+vn 0.994800 -0.101500 0.000300
+vn -0.286900 0.957900 -0.001800
+vn -0.995500 -0.094500 0.000300
+vn -0.883600 -0.468300 0.001600
+vn -0.020600 0.036600 0.999100
+vn -0.994000 0.109100 0.000200
+vn -0.000300 0.009700 1.000000
+vn -0.000000 0.011200 0.999900
+vn 0.004400 0.000400 1.000000
+vn 0.770800 -0.637100 0.001800
+vn 0.995100 -0.099000 0.000400
+vn -0.474500 -0.880300 0.002500
+vn -0.637100 -0.770800 0.002600
+vn 0.770800 -0.637100 0.002200
+vn -0.883600 -0.468300 0.001300
+vn 0.101500 0.994800 -0.001800
+vn -0.000100 0.009500 1.000000
+vn 0.000800 0.009900 1.000000
+vn -0.631700 0.775200 -0.006600
+vn 0.956200 0.292700 -0.000500
+vn -0.016900 0.043300 0.998900
+vn 0.637100 0.770800 -0.006600
+vn -0.955900 0.293600 -0.001000
+vn -0.000000 0.010700 0.999900
+vn 0.286900 -0.957900 0.002700
+vn 0.011200 0.047900 0.998800
+vn -0.000300 0.010700 0.999900
+vn 0.367900 -0.925900 0.085900
+vn -0.958000 -0.286900 0.001000
+vn -0.021400 0.029100 0.999300
+vn 0.007400 -0.032300 0.999400
+vn -0.631700 0.775200 -0.001400
+vn -0.293600 -0.955900 0.003200
+vn 0.775200 0.631700 -0.001200
+vn 0.955900 -0.293600 0.001000
+vn -0.994800 0.101500 -0.000300
+vn -0.005800 0.018500 0.999800
+vn 0.006900 0.014300 0.999900
+vn -0.770800 0.637100 -0.001200
+vn 0.474500 0.880300 -0.001600
+vn -0.474500 -0.880300 0.003000
+vn 0.015100 0.013600 0.999800
+vn 0.880300 -0.474500 0.001400
+vn -0.094500 0.995500 -0.008500
+vn -0.185900 -0.978500 0.089500
+vn 0.007600 0.016800 0.999800
+vn 0.003500 0.022800 0.999700
+vn 0.474500 0.880200 -0.007500
+vn -0.770800 0.637100 -0.005400
+vn 0.019100 0.021500 0.999600
+vn -0.000300 0.010400 0.999900
+vn 0.468300 -0.883600 0.003000
+vn 0.957400 0.288700 -0.002100
+vn -0.001800 -0.000500 1.000000
+vn -0.955100 -0.296300 0.000800
+vn 0.287000 -0.957900 0.003200
+vn -0.468300 0.883600 -0.001600
+vn 0.001400 0.024400 0.999700
+vn 0.094600 -0.995500 0.002800
+vn -0.770800 0.637000 -0.005400
+vn -0.013700 0.017000 0.999800
+vn -0.007300 0.016900 0.999800
+vn -0.001300 0.024400 0.999700
+vn 0.005100 0.020900 0.999800
+vn -0.003800 0.023600 0.999700
+vn -0.015100 0.013800 0.999800
+vn 0.005900 0.018500 0.999800
+vn 0.001300 0.024100 0.999700
+vn -0.007200 0.019600 0.999800
+vn 0.004000 0.023500 0.999700
+vn -0.006000 0.022000 0.999700
+vn 0.005500 0.015900 0.999900
+vn 0.004400 0.013700 0.999900
+vn -0.006700 0.014400 0.999900
+vn 0.001800 -0.000500 1.000000
+vn -0.012400 -0.034700 0.999300
+vn -0.007700 -0.032300 0.999400
+vn -0.374500 -0.923300 0.085900
+vn -0.017600 0.024100 0.999600
+vn 0.017500 0.023800 0.999600
+vn -0.018300 0.032100 0.999300
+vn -0.016000 0.039700 0.999100
+vn -0.010800 0.045700 0.998900
+vn 0.004100 0.049300 0.998800
+vn 0.011000 0.045400 0.998900
+vn 0.016000 0.039400 0.999100
+vn 0.018400 0.031700 0.999300
+vn 0.179100 -0.979700 0.089500
+vn 0.013700 0.016800 0.999800
+vn 0.005400 0.012900 0.999900
+vn -0.957900 -0.286900 0.002400
+vn -0.880300 0.474400 -0.004000
+vn -0.003800 0.049400 0.998800
+vn -0.955900 0.293500 -0.002500
+vn -0.004700 0.000500 1.000000
+vn 0.637100 0.770700 -0.006600
+vn 0.958000 0.286800 -0.002400
+vn 0.468300 -0.883600 0.002500
+vn 0.955900 -0.293600 0.002500
+vn 0.957900 0.286900 -0.001000
+vn -0.954100 0.299500 -0.000600
+vn -0.004500 0.013800 0.999900
+vn 0.007500 0.016800 0.999800
+vn -0.000200 0.010700 0.999900
+vn 0.000100 0.010900 0.999900
+vn 0.004300 0.000400 1.000000
+vn -0.006600 0.014400 0.999900
+vn 0.000000 0.009500 1.000000
+vn 0.005600 0.015900 0.999900
+vn -0.019200 0.021700 0.999600
+vn -0.000500 0.009200 1.000000
+vn 0.003900 0.050300 0.998700
+vn 0.016100 0.039400 0.999100
+vn 0.000200 0.009700 1.000000
+vn -0.015900 0.039700 0.999100
+vn -0.004600 0.000500 1.000000
+vn 0.003900 0.023500 0.999700
+vn 0.015000 0.013600 0.999800
+vn 0.020600 0.036300 0.999100
+g VSLampen_Cube.004_Yellow
+usemtl Yellow
+s off
+f 16/1/1 15/2/1 17/3/1
+f 64/4/2 4/5/2 16/6/2
+f 16/6/3 20/7/3 32/8/3
+f 64/4/4 40/9/4 48/10/4
+f 48/10/4 52/11/4 64/4/4
+f 16/6/3 4/5/3 8/12/3
+f 8/12/3 10/13/3 16/6/3
+f 32/8/3 20/7/3 24/14/3
+f 24/14/2 28/15/2 32/8/2
+f 32/8/5 34/16/5 40/9/5
+f 40/9/4 44/17/4 46/18/4
+f 64/4/4 52/11/4 56/19/4
+f 56/19/4 60/20/4 64/4/4
+f 64/4/6 2/21/6 4/5/6
+f 4/5/7 6/22/7 8/12/7
+f 16/6/3 10/13/3 12/23/3
+f 12/23/3 14/24/3 16/6/3
+f 16/6/8 18/25/8 20/7/8
+f 20/7/2 22/26/2 24/14/2
+f 24/14/9 26/27/9 28/15/9
+f 28/15/7 30/28/7 32/8/7
+f 40/9/10 34/16/10 36/29/10
+f 36/29/11 38/30/11 40/9/11
+f 40/9/12 42/31/12 44/17/12
+f 40/9/4 46/18/4 48/10/4
+f 48/10/13 50/32/13 52/11/13
+f 52/11/4 54/33/4 56/19/4
+f 56/19/14 58/34/14 60/20/14
+f 60/20/15 62/35/15 64/4/15
+f 2/36/16 64/37/16 1/38/16
+f 30/39/17 29/40/17 32/41/17
+f 34/42/18 32/41/18 33/43/18
+f 62/44/19 61/45/19 64/37/19
+f 66/46/20 65/47/20 128/48/20
+f 94/49/21 96/50/21 93/51/21
+f 98/52/22 97/53/22 96/50/22
+f 126/54/23 128/48/23 125/55/23
+f 55/56/24 57/57/24 58/58/24
+f 57/59/25 121/60/25 123/61/25
+f 87/62/26 89/63/26 25/64/26
+f 79/65/27 81/66/27 17/67/27
+f 75/68/28 11/69/28 9/70/28
+f 81/66/29 83/71/29 19/72/29
+f 123/61/30 125/73/30 61/74/30
+f 73/75/31 9/70/31 7/76/31
+f 79/65/32 15/77/32 13/78/32
+f 85/79/33 87/62/33 23/80/33
+f 11/69/34 75/68/34 77/81/34
+f 83/71/35 85/79/35 21/82/35
+f 71/83/36 7/76/36 5/84/36
+f 69/85/37 5/84/37 3/86/37
+f 89/63/38 91/87/38 27/88/38
+f 127/89/39 65/90/39 1/91/39
+f 125/73/40 127/89/40 63/92/40
+f 97/93/41 33/94/41 31/95/41
+f 91/87/42 93/96/42 29/97/42
+f 55/98/43 119/99/43 121/60/43
+f 101/100/44 103/101/44 39/102/44
+f 53/103/45 117/104/45 119/99/45
+f 51/105/46 115/106/46 117/104/46
+f 49/107/47 113/108/47 115/106/47
+f 109/109/48 111/110/48 47/111/48
+f 107/112/49 109/109/49 45/113/49
+f 105/114/50 107/112/50 43/115/50
+f 103/101/51 105/114/51 41/116/51
+f 67/117/52 3/86/52 1/91/52
+f 99/118/53 101/100/53 37/119/53
+f 99/118/54 35/120/54 33/94/54
+f 40/9/55 64/4/55 16/6/55
+f 64/37/56 63/121/56 1/38/56
+f 73/122/57 71/123/57 72/124/57
+f 88/125/58 87/126/58 85/127/58
+f 24/128/59 23/129/59 25/130/59
+f 86/131/60 85/127/60 83/132/60
+f 116/133/61 115/134/61 113/135/61
+f 18/136/62 17/3/62 19/137/62
+f 82/138/63 81/139/63 79/140/63
+f 13/141/64 15/2/64 16/1/64
+f 84/142/65 83/132/65 81/143/65
+f 9/144/66 11/145/66 12/146/66
+f 7/147/67 9/144/67 10/148/67
+f 26/149/68 25/130/68 27/150/68
+f 3/151/69 5/152/69 6/153/69
+f 1/38/70 3/151/70 4/154/70
+f 29/40/71 31/155/71 32/41/71
+f 32/41/72 31/155/72 33/43/72
+f 57/57/73 59/156/73 60/157/73
+f 47/111/74 111/110/74 113/108/74
+f 59/156/75 61/45/75 62/44/75
+f 95/158/76 31/95/76 29/97/76
+f 53/159/77 55/56/77 56/160/77
+f 51/161/78 53/159/78 54/162/78
+f 90/163/79 89/164/79 87/126/79
+f 118/165/80 117/166/80 115/134/80
+f 44/167/81 43/168/81 45/169/81
+f 42/170/82 41/171/82 43/168/82
+f 40/172/83 39/173/83 41/171/83
+f 38/174/84 37/175/84 39/173/84
+f 36/176/85 35/177/85 37/175/85
+f 34/42/86 33/43/86 35/177/86
+f 61/45/87 63/121/87 64/37/87
+f 65/47/20 127/178/20 128/48/20
+f 122/179/88 121/180/88 119/181/88
+f 120/182/89 119/181/89 117/166/89
+f 92/183/90 91/184/90 89/164/90
+f 47/185/91 49/186/91 50/187/91
+f 5/152/92 7/147/92 8/188/92
+f 20/189/93 19/137/93 21/190/93
+f 114/191/94 113/135/94 111/192/94
+f 79/140/95 77/193/95 78/194/95
+f 77/193/96 75/195/96 76/196/96
+f 75/195/97 73/122/97 74/197/97
+f 28/198/98 27/150/98 29/40/98
+f 71/123/99 69/199/99 70/200/99
+f 69/199/100 67/201/100 68/202/100
+f 68/202/101 67/201/101 65/47/101
+f 96/50/21 95/203/21 93/51/21
+f 97/53/102 95/203/102 96/50/102
+f 49/186/103 51/161/103 52/204/103
+f 126/54/104 125/55/104 123/205/104
+f 124/206/105 123/205/105 121/180/105
+f 92/183/106 94/49/106 93/51/106
+f 46/207/107 45/169/107 47/208/107
+f 22/209/108 21/190/108 23/129/108
+f 11/145/109 13/141/109 14/210/109
+f 111/192/110 109/211/110 110/212/110
+f 109/211/111 107/213/111 108/214/111
+f 107/213/112 105/215/112 106/216/112
+f 105/215/113 103/217/113 104/218/113
+f 103/217/114 101/219/114 102/220/114
+f 101/219/115 99/221/115 100/222/115
+f 99/221/116 97/53/116 98/52/116
+f 128/48/23 127/178/23 125/55/23
+f 18/136/117 16/1/117 17/3/117
+f 56/160/118 55/56/118 58/58/118
+f 59/223/119 57/59/119 123/61/119
+f 23/80/120 87/62/120 25/64/120
+f 15/77/121 79/65/121 17/67/121
+f 73/75/122 75/68/122 9/70/122
+f 17/67/123 81/66/123 19/72/123
+f 59/223/124 123/61/124 61/74/124
+f 71/83/125 73/75/125 7/76/125
+f 77/81/126 79/65/126 13/78/126
+f 21/82/127 85/79/127 23/80/127
+f 13/78/128 11/69/128 77/81/128
+f 19/72/129 83/71/129 21/82/129
+f 69/85/130 71/83/130 5/84/130
+f 67/117/131 69/85/131 3/86/131
+f 25/64/132 89/63/132 27/88/132
+f 63/92/133 127/89/133 1/91/133
+f 61/74/134 125/73/134 63/92/134
+f 95/158/135 97/93/135 31/95/135
+f 27/88/136 91/87/136 29/97/136
+f 57/59/137 55/98/137 121/60/137
+f 37/119/138 101/100/138 39/102/138
+f 55/98/139 53/103/139 119/99/139
+f 53/103/140 51/105/140 117/104/140
+f 51/105/141 49/107/141 115/106/141
+f 45/113/142 109/109/142 47/111/142
+f 43/115/143 107/112/143 45/113/143
+f 41/116/144 105/114/144 43/115/144
+f 39/102/145 103/101/145 41/116/145
+f 65/90/146 67/117/146 1/91/146
+f 35/120/147 99/118/147 37/119/147
+f 97/93/148 99/118/148 33/94/148
+f 32/8/5 40/9/5 16/6/5
+f 74/197/57 73/122/57 72/124/57
+f 86/131/58 88/125/58 85/127/58
+f 26/149/59 24/128/59 25/130/59
+f 84/142/149 86/131/149 83/132/149
+f 114/191/61 116/133/61 113/135/61
+f 20/189/62 18/136/62 19/137/62
+f 80/224/63 82/138/63 79/140/63
+f 14/210/64 13/141/64 16/1/64
+f 82/225/65 84/142/65 81/143/65
+f 10/148/66 9/144/66 12/146/66
+f 8/188/67 7/147/67 10/148/67
+f 28/198/68 26/149/68 27/150/68
+f 4/154/69 3/151/69 6/153/69
+f 2/36/150 1/38/150 4/154/150
+f 58/58/151 57/57/151 60/157/151
+f 49/107/152 47/111/152 113/108/152
+f 60/157/153 59/156/153 62/44/153
+f 93/96/154 95/158/154 29/97/154
+f 54/162/77 53/159/77 56/160/77
+f 52/204/155 51/161/155 54/162/155
+f 88/125/79 90/163/79 87/126/79
+f 116/133/80 118/165/80 115/134/80
+f 46/207/81 44/167/81 45/169/81
+f 44/167/82 42/170/82 43/168/82
+f 42/170/156 40/172/156 41/171/156
+f 40/172/84 38/174/84 39/173/84
+f 38/174/157 36/176/157 37/175/157
+f 36/176/158 34/42/158 35/177/158
+f 120/182/88 122/179/88 119/181/88
+f 118/165/89 120/182/89 117/166/89
+f 90/163/90 92/183/90 89/164/90
+f 48/226/91 47/185/91 50/187/91
+f 6/153/92 5/152/92 8/188/92
+f 22/209/93 20/189/93 21/190/93
+f 112/227/94 114/191/94 111/192/94
+f 80/224/95 79/140/95 78/194/95
+f 78/194/96 77/193/96 76/196/96
+f 76/196/97 75/195/97 74/197/97
+f 30/39/159 28/198/159 29/40/159
+f 72/124/99 71/123/99 70/200/99
+f 70/200/100 69/199/100 68/202/100
+f 66/46/160 68/202/160 65/47/160
+f 50/187/161 49/186/161 52/204/161
+f 124/206/104 126/54/104 123/205/104
+f 122/179/105 124/206/105 121/180/105
+f 91/184/162 92/183/162 93/51/162
+f 48/228/107 46/207/107 47/208/107
+f 24/128/108 22/209/108 23/129/108
+f 12/146/109 11/145/109 14/210/109
+f 112/227/110 111/192/110 110/212/110
+f 110/212/111 109/211/111 108/214/111
+f 108/214/112 107/213/112 106/216/112
+f 106/216/113 105/215/113 104/218/113
+f 104/218/114 103/217/114 102/220/114
+f 102/220/115 101/219/115 100/222/115
+f 100/222/116 99/221/116 98/52/116
+g VSLampen_Cube.004_Green
+usemtl Green
+f 272/1/1 271/2/1 273/3/1
+f 320/4/2 260/5/2 272/6/2
+f 272/6/3 276/7/3 288/8/3
+f 320/4/4 296/9/4 304/10/4
+f 304/10/4 308/11/4 320/4/4
+f 272/6/3 260/5/3 264/12/3
+f 264/12/3 266/13/3 272/6/3
+f 288/8/3 276/7/3 280/14/3
+f 280/14/2 284/15/2 288/8/2
+f 288/8/5 290/16/5 296/9/5
+f 296/9/4 300/17/4 302/18/4
+f 320/4/4 308/11/4 312/19/4
+f 312/19/4 316/20/4 320/4/4
+f 320/4/6 258/21/6 260/5/6
+f 260/5/7 262/22/7 264/12/7
+f 272/6/3 266/13/3 268/23/3
+f 268/23/3 270/24/3 272/6/3
+f 272/6/8 274/25/8 276/7/8
+f 276/7/2 278/26/2 280/14/2
+f 280/14/9 282/27/9 284/15/9
+f 284/15/3 286/28/3 288/8/3
+f 296/9/10 290/16/10 292/29/10
+f 292/29/11 294/30/11 296/9/11
+f 296/9/12 298/31/12 300/17/12
+f 296/9/4 302/18/4 304/10/4
+f 304/10/13 306/32/13 308/11/13
+f 308/11/4 310/33/4 312/19/4
+f 312/19/14 314/34/14 316/20/14
+f 316/20/15 318/35/15 320/4/15
+f 258/36/16 320/37/16 257/38/16
+f 286/39/17 285/40/17 288/41/17
+f 290/42/18 288/41/18 289/43/18
+f 318/44/19 317/45/19 320/37/19
+f 322/46/20 321/47/20 384/48/20
+f 350/49/21 352/50/21 349/51/21
+f 354/52/22 353/53/22 352/50/22
+f 382/54/23 384/48/23 381/55/23
+f 311/56/24 313/57/24 314/58/24
+f 313/59/25 377/60/25 379/61/25
+f 343/62/163 345/63/163 281/64/163
+f 335/65/27 337/66/27 273/67/27
+f 331/68/28 267/69/28 265/70/28
+f 337/66/29 339/71/29 275/72/29
+f 379/61/30 381/73/30 317/74/30
+f 329/75/31 265/70/31 263/76/31
+f 335/65/32 271/77/32 269/78/32
+f 341/79/33 343/62/33 279/80/33
+f 267/69/34 331/68/34 333/81/34
+f 339/71/35 341/79/35 277/82/35
+f 327/83/36 263/76/36 261/84/36
+f 325/85/37 261/84/37 259/86/37
+f 345/63/38 347/87/38 283/88/38
+f 383/89/39 321/90/39 257/91/39
+f 381/73/40 383/89/40 319/92/40
+f 353/93/41 289/94/41 287/95/41
+f 347/87/42 349/96/42 285/97/42
+f 311/98/164 375/99/164 377/60/164
+f 357/100/44 359/101/44 295/102/44
+f 309/103/45 373/104/45 375/99/45
+f 307/105/46 371/106/46 373/104/46
+f 305/107/47 369/108/47 371/106/47
+f 365/109/48 367/110/48 303/111/48
+f 363/112/49 365/109/49 301/113/49
+f 361/114/50 363/112/50 299/115/50
+f 359/101/51 361/114/51 297/116/51
+f 323/117/52 259/86/52 257/91/52
+f 355/118/53 357/100/53 293/119/53
+f 355/118/54 291/120/54 289/94/54
+f 296/9/55 320/4/55 272/6/55
+f 320/37/56 319/121/56 257/38/56
+f 329/122/57 327/123/57 328/124/57
+f 344/125/58 343/126/58 341/127/58
+f 280/128/59 279/129/59 281/130/59
+f 342/131/60 341/127/60 339/132/60
+f 372/133/61 371/134/61 369/135/61
+f 274/136/62 273/3/62 275/137/62
+f 338/138/63 337/139/63 335/140/63
+f 269/141/64 271/2/64 272/1/64
+f 340/142/65 339/132/65 337/143/65
+f 265/144/66 267/145/66 268/146/66
+f 263/147/67 265/144/67 266/148/67
+f 282/149/68 281/130/68 283/150/68
+f 259/151/69 261/152/69 262/153/69
+f 257/38/70 259/151/70 260/154/70
+f 285/40/71 287/155/71 288/41/71
+f 288/41/72 287/155/72 289/43/72
+f 313/57/73 315/156/73 316/157/73
+f 303/111/74 367/110/74 369/108/74
+f 315/156/75 317/45/75 318/44/75
+f 351/158/76 287/95/76 285/97/76
+f 309/159/77 311/56/77 312/160/77
+f 307/161/78 309/159/78 310/162/78
+f 346/163/79 345/164/79 343/126/79
+f 374/165/80 373/166/80 371/134/80
+f 300/167/81 299/168/81 301/169/81
+f 298/170/82 297/171/82 299/168/82
+f 296/172/83 295/173/83 297/171/83
+f 294/174/84 293/175/84 295/173/84
+f 292/176/85 291/177/85 293/175/85
+f 290/42/86 289/43/86 291/177/86
+f 317/45/87 319/121/87 320/37/87
+f 321/47/20 383/178/20 384/48/20
+f 378/179/88 377/180/88 375/181/88
+f 376/182/89 375/181/89 373/166/89
+f 348/183/90 347/184/90 345/164/90
+f 303/185/91 305/186/91 306/187/91
+f 261/152/92 263/147/92 264/188/92
+f 276/189/93 275/137/93 277/190/93
+f 370/191/94 369/135/94 367/192/94
+f 335/140/95 333/193/95 334/194/95
+f 333/193/96 331/195/96 332/196/96
+f 331/195/97 329/122/97 330/197/97
+f 284/198/98 283/150/98 285/40/98
+f 327/123/99 325/199/99 326/200/99
+f 325/199/100 323/201/100 324/202/100
+f 324/202/101 323/201/101 321/47/101
+f 352/50/21 351/203/21 349/51/21
+f 353/53/102 351/203/102 352/50/102
+f 305/186/103 307/161/103 308/204/103
+f 382/54/104 381/55/104 379/205/104
+f 380/206/105 379/205/105 377/180/105
+f 348/183/106 350/49/106 349/51/106
+f 302/207/107 301/169/107 303/208/107
+f 278/209/108 277/190/108 279/129/108
+f 267/145/109 269/141/109 270/210/109
+f 367/192/110 365/211/110 366/212/110
+f 365/211/111 363/213/111 364/214/111
+f 363/213/112 361/215/112 362/216/112
+f 361/215/113 359/217/113 360/218/113
+f 359/217/114 357/219/114 358/220/114
+f 357/219/115 355/221/115 356/222/115
+f 355/221/116 353/53/116 354/52/116
+f 384/48/23 383/178/23 381/55/23
+f 274/136/117 272/1/117 273/3/117
+f 312/160/118 311/56/118 314/58/118
+f 315/223/119 313/59/119 379/61/119
+f 279/80/165 343/62/165 281/64/165
+f 271/77/121 335/65/121 273/67/121
+f 329/75/122 331/68/122 265/70/122
+f 273/67/123 337/66/123 275/72/123
+f 315/223/124 379/61/124 317/74/124
+f 327/83/166 329/75/166 263/76/166
+f 333/81/126 335/65/126 269/78/126
+f 277/82/127 341/79/127 279/80/127
+f 269/78/128 267/69/128 333/81/128
+f 275/72/129 339/71/129 277/82/129
+f 325/85/130 327/83/130 261/84/130
+f 323/117/131 325/85/131 259/86/131
+f 281/64/132 345/63/132 283/88/132
+f 319/92/133 383/89/133 257/91/133
+f 317/74/134 381/73/134 319/92/134
+f 351/158/135 353/93/135 287/95/135
+f 283/88/136 347/87/136 285/97/136
+f 313/59/137 311/98/137 377/60/137
+f 293/119/138 357/100/138 295/102/138
+f 311/98/139 309/103/139 375/99/139
+f 309/103/140 307/105/140 373/104/140
+f 307/105/141 305/107/141 371/106/141
+f 301/113/142 365/109/142 303/111/142
+f 299/115/143 363/112/143 301/113/143
+f 297/116/167 361/114/167 299/115/167
+f 295/102/145 359/101/145 297/116/145
+f 321/90/146 323/117/146 257/91/146
+f 291/120/147 355/118/147 293/119/147
+f 353/93/148 355/118/148 289/94/148
+f 288/8/5 296/9/5 272/6/5
+f 330/197/57 329/122/57 328/124/57
+f 342/131/58 344/125/58 341/127/58
+f 282/149/59 280/128/59 281/130/59
+f 340/142/149 342/131/149 339/132/149
+f 370/191/61 372/133/61 369/135/61
+f 276/189/62 274/136/62 275/137/62
+f 336/224/63 338/138/63 335/140/63
+f 270/210/64 269/141/64 272/1/64
+f 338/225/65 340/142/65 337/143/65
+f 266/148/66 265/144/66 268/146/66
+f 264/188/67 263/147/67 266/148/67
+f 284/198/68 282/149/68 283/150/68
+f 260/154/69 259/151/69 262/153/69
+f 258/36/150 257/38/150 260/154/150
+f 314/58/151 313/57/151 316/157/151
+f 305/107/152 303/111/152 369/108/152
+f 316/157/153 315/156/153 318/44/153
+f 349/96/168 351/158/168 285/97/168
+f 310/162/77 309/159/77 312/160/77
+f 308/204/155 307/161/155 310/162/155
+f 344/125/79 346/163/79 343/126/79
+f 372/133/80 374/165/80 371/134/80
+f 302/207/81 300/167/81 301/169/81
+f 300/167/82 298/170/82 299/168/82
+f 298/170/156 296/172/156 297/171/156
+f 296/172/84 294/174/84 295/173/84
+f 294/174/157 292/176/157 293/175/157
+f 292/176/158 290/42/158 291/177/158
+f 376/182/88 378/179/88 375/181/88
+f 374/165/89 376/182/89 373/166/89
+f 346/163/90 348/183/90 345/164/90
+f 304/226/91 303/185/91 306/187/91
+f 262/153/92 261/152/92 264/188/92
+f 278/209/93 276/189/93 277/190/93
+f 368/227/94 370/191/94 367/192/94
+f 336/224/95 335/140/95 334/194/95
+f 334/194/96 333/193/96 332/196/96
+f 332/196/97 331/195/97 330/197/97
+f 286/39/159 284/198/159 285/40/159
+f 328/124/99 327/123/99 326/200/99
+f 326/200/100 325/199/100 324/202/100
+f 322/46/160 324/202/160 321/47/160
+f 306/187/161 305/186/161 308/204/161
+f 380/206/104 382/54/104 379/205/104
+f 378/179/105 380/206/105 377/180/105
+f 347/184/162 348/183/162 349/51/162
+f 304/228/107 302/207/107 303/208/107
+f 280/128/108 278/209/108 279/129/108
+f 268/146/109 267/145/109 270/210/109
+f 368/227/110 367/192/110 366/212/110
+f 366/212/111 365/211/111 364/214/111
+f 364/214/112 363/213/112 362/216/112
+f 362/216/113 361/215/113 360/218/113
+f 360/218/114 359/217/114 358/220/114
+f 358/220/115 357/219/115 356/222/115
+f 356/222/116 355/221/116 354/52/116
+g VSLampen_Cube.004_Distance
+usemtl Distance
+f 132/5/169 134/22/169 136/12/169
+f 185/59/170 249/60/170 251/61/170
+f 176/10/171 180/11/171 192/4/171
+f 168/9/172 162/16/172 164/29/172
+f 252/206/173 251/205/173 249/180/173
+f 152/14/174 156/15/174 160/8/174
+f 188/20/175 190/35/175 192/4/175
+f 187/156/176 189/45/176 190/44/176
+f 225/53/177 223/203/177 224/50/177
+f 220/183/178 219/184/178 217/164/178
+f 248/182/179 247/181/179 245/166/179
+f 164/29/180 166/30/180 168/9/180
+f 156/198/181 155/150/181 157/40/181
+f 168/9/182 172/17/182 174/18/182
+f 205/193/183 203/195/183 204/196/183
+f 201/122/184 199/123/184 200/124/184
+f 231/101/185 233/114/185 169/116/185
+f 210/138/186 209/139/186 207/140/186
+f 133/152/187 135/147/187 136/188/187
+f 158/39/188 157/40/188 160/41/188
+f 141/141/189 143/2/189 144/1/189
+f 160/8/190 148/7/190 152/14/190
+f 180/11/191 182/33/191 184/19/191
+f 176/10/192 178/32/192 180/11/192
+f 190/44/193 189/45/193 192/37/193
+f 197/199/194 195/201/194 196/202/194
+f 192/37/195 191/121/195 129/38/195
+f 203/68/196 139/69/196 137/70/196
+f 211/71/197 213/79/197 149/82/197
+f 192/4/171 168/9/171 176/10/171
+f 177/107/198 241/108/198 243/106/198
+f 144/6/199 138/13/199 140/23/199
+f 237/109/200 239/110/200 175/111/200
+f 160/41/201 159/155/201 161/43/201
+f 135/147/202 137/144/202 138/148/202
+f 140/23/190 142/24/190 144/6/190
+f 144/1/203 143/2/203 145/3/203
+f 251/61/204 253/73/204 189/74/204
+f 242/191/205 241/135/205 239/192/205
+f 225/93/206 161/94/206 159/95/206
+f 207/65/207 209/66/207 145/67/207
+f 166/174/208 165/175/208 167/173/208
+f 193/47/209 255/178/209 256/48/209
+f 136/12/190 138/13/190 144/6/190
+f 231/217/210 229/219/210 230/220/210
+f 162/42/211 160/41/211 161/43/211
+f 179/161/212 181/159/212 182/162/212
+f 215/62/213 217/63/213 153/64/213
+f 201/75/214 137/70/214 135/76/214
+f 148/189/215 147/137/215 149/190/215
+f 150/209/216 149/190/216 151/129/216
+f 175/111/217 239/110/217 241/108/217
+f 229/100/218 231/101/218 167/102/218
+f 139/145/219 141/141/219 142/210/219
+f 239/192/220 237/211/220 238/212/220
+f 217/63/221 219/87/221 155/88/221
+f 177/186/222 179/161/222 180/204/222
+f 174/207/223 173/169/223 175/208/223
+f 152/14/224 154/27/224 156/15/224
+f 185/57/225 187/156/225 188/157/225
+f 164/176/226 163/177/226 165/175/226
+f 209/66/227 211/71/227 147/72/227
+f 172/167/228 171/168/228 173/169/228
+f 233/114/229 235/112/229 171/115/229
+f 254/54/230 256/48/230 253/55/230
+f 212/142/231 211/132/231 209/143/231
+f 226/52/232 225/53/232 224/50/232
+f 229/219/233 227/221/233 228/222/233
+f 181/103/234 245/104/234 247/99/234
+f 189/45/235 191/121/235 192/37/235
+f 184/19/236 186/34/236 188/20/236
+f 130/36/102 192/37/102 129/38/102
+f 194/46/209 193/47/209 256/48/209
+f 144/6/237 146/25/237 148/7/237
+f 144/6/190 148/7/190 160/8/190
+f 144/6/190 132/5/190 136/12/190
+f 156/15/190 158/28/190 160/8/190
+f 255/89/238 193/90/238 129/91/238
+f 152/128/239 151/129/239 153/130/239
+f 184/19/171 188/20/171 192/4/171
+f 192/4/171 180/11/171 184/19/171
+f 157/40/240 159/155/240 160/41/240
+f 137/144/241 139/145/241 140/146/241
+f 256/48/230 255/178/230 253/55/230
+f 233/215/242 231/217/242 232/218/242
+f 250/179/243 249/180/243 247/181/243
+f 131/151/244 133/152/244 134/153/244
+f 207/140/245 205/193/245 206/194/245
+f 168/9/246 170/31/246 172/17/246
+f 160/8/247 162/16/247 168/9/247
+f 181/159/248 183/56/248 184/160/248
+f 168/9/171 174/18/171 176/10/171
+f 196/202/249 195/201/249 193/47/249
+f 179/105/250 243/106/250 245/104/250
+f 168/172/251 167/173/251 169/171/251
+f 220/183/252 222/49/252 221/51/252
+f 192/4/253 132/5/253 144/6/253
+f 146/136/254 145/3/254 147/137/254
+f 235/112/255 237/109/255 173/113/255
+f 192/4/256 130/21/256 132/5/256
+f 195/117/257 131/86/257 129/91/257
+f 227/221/258 225/53/258 226/52/258
+f 183/98/259 247/99/259 249/60/259
+f 253/73/260 255/89/260 191/92/260
+f 216/125/261 215/126/261 213/127/261
+f 237/211/262 235/213/262 236/214/262
+f 199/123/263 197/199/263 198/200/263
+f 254/54/264 253/55/264 251/205/264
+f 224/50/265 223/203/265 221/51/265
+f 213/79/266 215/62/266 151/80/266
+f 148/7/253 150/26/253 152/14/253
+f 222/49/265 224/50/265 221/51/265
+f 197/85/267 133/84/267 131/86/267
+f 218/163/268 217/164/268 215/126/268
+f 203/195/269 201/122/269 202/197/269
+f 235/213/270 233/215/270 234/216/270
+f 227/118/271 163/120/271 161/94/271
+f 154/149/272 153/130/272 155/150/272
+f 175/185/273 177/186/273 178/187/273
+f 219/87/274 221/96/274 157/97/274
+f 199/83/275 135/76/275 133/84/275
+f 139/69/276 203/68/276 205/81/276
+f 170/170/277 169/171/277 171/168/277
+f 183/56/278 185/57/278 186/58/278
+f 227/118/279 229/100/279 165/119/279
+f 168/9/280 192/4/280 144/6/280
+f 246/165/281 245/166/281 243/134/281
+f 162/42/282 161/43/282 163/177/282
+f 223/158/283 159/95/283 157/97/283
+f 129/38/284 131/151/284 132/154/284
+f 244/133/285 243/134/285 241/135/285
+f 214/131/286 213/127/286 211/132/286
+f 207/65/287 143/77/287 141/78/287
+f 146/136/288 144/1/288 145/3/288
+f 184/160/289 183/56/289 186/58/289
+f 187/223/290 185/59/290 251/61/290
+f 151/80/291 215/62/291 153/64/291
+f 143/77/292 207/65/292 145/67/292
+f 201/75/293 203/68/293 137/70/293
+f 145/67/294 209/66/294 147/72/294
+f 187/223/295 251/61/295 189/74/295
+f 199/83/296 201/75/296 135/76/296
+f 205/81/297 207/65/297 141/78/297
+f 149/82/298 213/79/298 151/80/298
+f 141/78/299 139/69/299 205/81/299
+f 147/72/300 211/71/300 149/82/300
+f 197/85/301 199/83/301 133/84/301
+f 195/117/302 197/85/302 131/86/302
+f 153/64/303 217/63/303 155/88/303
+f 191/92/304 255/89/304 129/91/304
+f 189/74/305 253/73/305 191/92/305
+f 223/158/306 225/93/306 159/95/306
+f 155/88/307 219/87/307 157/97/307
+f 185/59/308 183/98/308 249/60/308
+f 165/119/309 229/100/309 167/102/309
+f 183/98/310 181/103/310 247/99/310
+f 181/103/311 179/105/311 245/104/311
+f 179/105/312 177/107/312 243/106/312
+f 173/113/313 237/109/313 175/111/313
+f 171/115/314 235/112/314 173/113/314
+f 169/116/315 233/114/315 171/115/315
+f 167/102/316 231/101/316 169/116/316
+f 193/90/317 195/117/317 129/91/317
+f 163/120/318 227/118/318 165/119/318
+f 225/93/319 227/118/319 161/94/319
+f 160/8/247 168/9/247 144/6/247
+f 202/197/184 201/122/184 200/124/184
+f 214/131/261 216/125/261 213/127/261
+f 154/149/239 152/128/239 153/130/239
+f 212/142/286 214/131/286 211/132/286
+f 242/191/285 244/133/285 241/135/285
+f 148/189/254 146/136/254 147/137/254
+f 208/224/186 210/138/186 207/140/186
+f 142/210/189 141/141/189 144/1/189
+f 210/225/231 212/142/231 209/143/231
+f 138/148/241 137/144/241 140/146/241
+f 136/188/202 135/147/202 138/148/202
+f 156/198/272 154/149/272 155/150/272
+f 132/154/244 131/151/244 134/153/244
+f 130/36/320 129/38/320 132/154/320
+f 186/58/321 185/57/321 188/157/321
+f 177/107/322 175/111/322 241/108/322
+f 188/157/323 187/156/323 190/44/323
+f 221/96/324 223/158/324 157/97/324
+f 182/162/248 181/159/248 184/160/248
+f 180/204/212 179/161/212 182/162/212
+f 216/125/268 218/163/268 215/126/268
+f 244/133/281 246/165/281 243/134/281
+f 174/207/228 172/167/228 173/169/228
+f 172/167/277 170/170/277 171/168/277
+f 170/170/325 168/172/325 169/171/325
+f 168/172/208 166/174/208 167/173/208
+f 166/174/226 164/176/226 165/175/226
+f 164/176/326 162/42/326 163/177/326
+f 248/182/243 250/179/243 247/181/243
+f 246/165/179 248/182/179 245/166/179
+f 218/163/178 220/183/178 217/164/178
+f 176/226/273 175/185/273 178/187/273
+f 134/153/187 133/152/187 136/188/187
+f 150/209/327 148/189/327 149/190/327
+f 240/227/205 242/191/205 239/192/205
+f 208/224/245 207/140/245 206/194/245
+f 206/194/183 205/193/183 204/196/183
+f 204/196/269 203/195/269 202/197/269
+f 158/39/328 156/198/328 157/40/328
+f 200/124/263 199/123/263 198/200/263
+f 198/200/194 197/199/194 196/202/194
+f 194/46/329 196/202/329 193/47/329
+f 178/187/222 177/186/222 180/204/222
+f 252/206/264 254/54/264 251/205/264
+f 250/179/173 252/206/173 249/180/173
+f 219/184/330 220/183/330 221/51/330
+f 176/228/223 174/207/223 175/208/223
+f 152/128/216 150/209/216 151/129/216
+f 140/146/219 139/145/219 142/210/219
+f 240/227/220 239/192/220 238/212/220
+f 238/212/262 237/211/262 236/214/262
+f 236/214/270 235/213/270 234/216/270
+f 234/216/242 233/215/242 232/218/242
+f 232/218/210 231/217/210 230/220/210
+f 230/220/233 229/219/233 228/222/233
+f 228/222/258 227/221/258 226/52/258
+g VSLampen_Cube.004_Repeater
+usemtl Repeater
+f 447/46/329 445/202/329 448/47/329
+f 485/15/190 483/28/190 481/8/190
+f 495/136/254 496/3/254 494/137/254
+f 495/136/288 497/1/288 496/3/288
+f 389/206/173 390/205/173 392/180/173
+f 462/105/312 464/107/312 398/106/312
+f 452/45/235 450/121/235 449/37/235
+f 511/36/102 449/37/102 512/38/102
+f 497/6/199 503/13/199 501/23/199
+f 497/1/203 498/2/203 496/3/203
+f 416/53/177 418/203/177 417/50/177
+f 418/158/283 482/95/283 484/97/283
+f 452/74/305 388/73/305 450/92/305
+f 466/185/273 464/186/273 463/187/273
+f 466/111/217 402/110/217 400/108/217
+f 424/63/331 422/87/331 486/88/331
+f 438/195/269 440/122/269 439/197/269
+f 462/161/212 460/159/212 459/162/212
+f 437/196/269 438/195/269 439/197/269
+f 494/72/300 430/71/300 492/82/300
+f 459/162/248 460/159/248 457/160/248
+f 487/149/239 489/128/239 488/130/239
+f 434/140/245 436/193/245 435/194/245
+f 406/112/255 404/109/255 468/113/255
+f 412/219/233 414/221/233 413/222/233
+f 456/57/225 454/156/225 453/157/225
+f 411/220/233 412/219/233 413/222/233
+f 393/182/243 391/179/243 394/181/243
+f 416/93/319 414/118/319 480/94/319
+f 442/83/332 506/76/332 508/84/332
+f 449/4/253 509/5/253 497/6/253
+f 475/174/226 477/176/226 476/175/226
+f 458/98/259 394/99/259 392/60/259
+f 496/67/294 432/66/294 494/72/294
+f 507/153/187 508/152/187 505/188/187
+f 397/133/281 395/165/281 398/134/281
+f 464/107/322 466/111/322 400/108/322
+f 429/142/231 430/132/231 432/143/231
+f 436/193/183 438/195/183 437/196/183
+f 454/223/295 390/61/295 452/74/295
+f 499/210/189 500/141/189 497/1/189
+f 479/42/282 480/43/282 478/177/282
+f 432/66/227 430/71/227 494/72/227
+f 465/226/273 466/185/273 463/187/273
+f 444/199/194 446/201/194 445/202/194
+f 440/75/293 438/68/293 504/70/293
+f 460/159/248 458/56/248 457/160/248
+f 456/59/308 458/98/308 392/60/308
+f 491/209/327 493/189/327 492/190/327
+f 429/142/286 427/131/286 430/132/286
+f 478/120/318 414/118/318 476/119/318
+f 388/73/260 386/89/260 450/92/260
+f 471/170/277 472/171/277 470/168/277
+f 467/207/228 469/167/228 468/169/228
+f 431/138/186 432/139/186 434/140/186
+f 450/92/304 386/89/304 512/91/304
+f 473/172/251 474/173/251 472/171/251
+f 387/54/264 388/55/264 390/205/264
+f 468/113/313 404/109/313 466/111/313
+f 497/6/237 495/25/237 493/7/237
+f 427/131/286 428/127/286 430/132/286
+f 399/191/285 397/133/285 400/135/285
+f 428/79/266 426/62/266 490/80/266
+f 493/7/333 491/26/333 489/14/333
+f 509/5/334 507/22/334 505/12/334
+f 410/217/210 412/219/210 411/220/210
+f 464/107/198 400/108/198 398/106/198
+f 438/68/196 502/69/196 504/70/196
+f 385/48/230 386/178/230 388/55/230
+f 460/103/234 396/104/234 394/99/234
+f 386/89/335 448/90/335 512/91/335
+f 409/218/210 410/217/210 411/220/210
+f 469/167/228 470/168/228 468/169/228
+f 509/154/244 510/151/244 507/153/244
+f 511/36/320 512/38/320 509/154/320
+f 443/200/194 444/199/194 445/202/194
+f 488/64/336 424/63/336 486/88/336
+f 405/214/270 406/213/270 407/216/270
+f 470/115/314 406/112/314 468/113/314
+f 489/128/239 490/129/239 488/130/239
+f 473/9/337 471/31/337 469/17/337
+f 444/85/338 442/83/338 508/84/338
+f 395/165/179 393/182/179 396/166/179
+f 456/59/339 392/60/339 390/61/339
+f 465/10/192 463/32/192 461/11/192
+f 453/20/175 451/35/175 449/4/175
+f 389/206/264 387/54/264 390/205/264
+f 493/189/215 494/137/215 492/190/215
+f 422/87/274 420/96/274 484/97/274
+f 498/77/292 434/65/292 496/67/292
+f 408/215/242 410/217/242 409/218/242
+f 487/149/272 488/130/272 486/150/272
+f 408/114/229 406/112/229 470/115/229
+f 445/202/249 446/201/249 448/47/249
+f 502/69/276 438/68/276 436/81/276
+f 506/147/202 504/144/202 503/148/202
+f 463/187/222 464/186/222 461/204/222
+f 503/148/241 504/144/241 501/146/241
+f 404/211/262 406/213/262 405/214/262
+f 489/128/216 491/209/216 490/129/216
+f 501/146/219 502/145/219 499/210/219
+f 449/4/171 473/9/171 465/10/171
+f 504/144/241 502/145/241 501/146/241
+f 387/54/230 385/48/230 388/55/230
+f 434/65/207 432/66/207 496/67/207
+f 483/39/188 484/40/188 481/41/188
+f 467/207/223 468/169/223 466/208/223
+f 473/9/340 479/16/340 477/29/340
+f 404/109/341 402/110/341 466/111/341
+f 472/116/342 408/114/342 470/115/342
+f 439/197/184 440/122/184 441/124/184
+f 481/41/201 482/155/201 480/43/201
+f 391/179/173 389/206/173 392/180/173
+f 399/191/205 400/135/205 402/192/205
+f 502/145/219 500/141/219 499/210/219
+f 481/8/190 493/7/190 489/14/190
+f 457/160/289 458/56/289 455/58/289
+f 476/119/309 412/100/309 474/102/309
+f 449/4/256 511/21/256 509/5/256
+f 492/82/298 428/79/298 490/80/298
+f 483/39/328 485/198/328 484/40/328
+f 473/172/208 475/174/208 474/173/208
+f 423/163/268 424/164/268 426/126/268
+f 457/19/171 453/20/171 449/4/171
+f 473/9/280 449/4/280 497/6/280
+f 505/188/202 506/147/202 503/148/202
+f 477/29/343 475/30/343 473/9/343
+f 454/223/290 456/59/290 390/61/290
+f 436/81/297 434/65/297 500/78/297
+f 401/227/220 402/192/220 403/212/220
+f 473/9/171 469/17/171 467/18/171
+f 448/47/209 386/178/209 385/48/209
+f 461/204/212 462/161/212 459/162/212
+f 485/198/272 487/149/272 486/150/272
+f 484/40/240 482/155/240 481/41/240
+f 497/6/190 493/7/190 481/8/190
+f 474/102/316 410/101/316 472/116/316
+f 453/157/323 454/156/323 451/44/323
+f 477/176/326 479/42/326 478/177/326
+f 431/225/231 429/142/231 432/143/231
+f 447/46/209 448/47/209 385/48/209
+f 433/224/245 434/140/245 435/194/245
+f 425/125/268 423/163/268 426/126/268
+f 481/8/247 473/9/247 497/6/247
+f 469/167/277 471/170/277 470/168/277
+f 493/189/254 495/136/254 494/137/254
+f 441/124/263 442/123/263 443/200/263
+f 465/228/223 467/207/223 466/208/223
+f 458/98/310 460/103/310 394/99/310
+f 413/222/258 414/221/258 415/52/258
+f 415/52/232 416/53/232 417/50/232
+f 442/83/296 440/75/296 506/76/296
+f 418/158/306 416/93/306 482/95/306
+f 449/4/171 461/11/171 457/19/171
+f 395/165/281 396/166/281 398/134/281
+f 391/179/243 392/180/243 394/181/243
+f 473/9/171 467/18/171 465/10/171
+f 421/183/252 419/49/252 420/51/252
+f 442/123/263 444/199/263 443/200/263
+f 419/49/265 417/50/265 420/51/265
+f 406/213/270 408/215/270 407/216/270
+f 458/56/278 456/57/278 455/58/278
+f 407/216/242 408/215/242 409/218/242
+f 397/133/285 398/134/285 400/135/285
+f 490/80/291 426/62/291 488/64/291
+f 455/58/321 456/57/321 453/157/321
+f 402/192/220 404/211/220 403/212/220
+f 475/174/208 476/175/208 474/173/208
+f 460/103/344 462/105/344 396/104/344
+f 505/12/190 503/13/190 497/6/190
+f 485/198/181 486/150/181 484/40/181
+f 433/224/186 431/138/186 434/140/186
+f 426/62/213 424/63/213 488/64/213
+f 420/96/345 418/158/345 484/97/345
+f 479/42/211 481/41/211 480/43/211
+f 423/163/178 421/183/178 424/164/178
+f 401/227/205 399/191/205 402/192/205
+f 486/88/307 422/87/307 484/97/307
+f 422/184/330 421/183/330 420/51/330
+f 403/212/262 404/211/262 405/214/262
+f 497/6/190 509/5/190 505/12/190
+f 446/117/257 510/86/257 512/91/257
+f 457/19/236 455/34/236 453/20/236
+f 500/78/346 502/69/346 436/81/346
+f 510/151/244 508/152/244 507/153/244
+f 481/8/247 479/16/247 473/9/247
+f 416/93/206 480/94/206 482/95/206
+f 393/182/179 394/181/179 396/166/179
+f 417/50/265 418/203/265 420/51/265
+f 444/85/267 508/84/267 510/86/267
+f 414/118/347 478/120/347 480/94/347
+f 414/118/279 412/100/279 476/119/279
+f 512/38/284 510/151/284 509/154/284
+f 434/65/287 498/77/287 500/78/287
+f 454/156/176 452/45/176 451/44/176
+f 421/183/178 422/184/178 424/164/178
+f 390/61/204 388/73/204 452/74/204
+f 414/221/258 416/53/258 415/52/258
+f 435/194/183 436/193/183 437/196/183
+f 427/131/261 425/125/261 428/127/261
+f 440/122/184 442/123/184 441/124/184
+f 440/75/214 504/70/214 506/76/214
+f 491/209/216 492/190/216 490/129/216
+f 412/100/218 410/101/218 474/102/218
+f 446/117/302 444/85/302 510/86/302
+f 464/186/222 462/161/222 461/204/222
+f 489/14/224 487/27/224 485/15/224
+f 477/176/226 478/177/226 476/175/226
+f 462/105/250 398/106/250 396/104/250
+f 465/10/171 461/11/171 449/4/171
+f 489/14/174 485/15/174 481/8/174
+f 501/23/190 499/24/190 497/6/190
+f 425/125/261 426/126/261 428/127/261
+f 448/90/317 446/117/317 512/91/317
+f 471/170/325 473/172/325 472/171/325
+f 410/101/348 408/114/348 472/116/348
+f 508/152/187 506/147/187 505/188/187
+f 500/141/189 498/2/189 497/1/189
+f 461/11/191 459/33/191 457/19/191
+f 451/44/193 452/45/193 449/37/193
+f 449/37/195 450/121/195 512/38/195
+f 430/71/197 428/79/197 492/82/197
diff --git a/advtrains/advtrains_signals_ks/models/advtrains_signals_ks_lamps_main.obj b/advtrains/advtrains_signals_ks/models/advtrains_signals_ks_lamps_main.obj
new file mode 100644
index 0000000..4949466
--- /dev/null
+++ b/advtrains/advtrains_signals_ks/models/advtrains_signals_ks_lamps_main.obj
@@ -0,0 +1,2719 @@
+# Blender v2.76 (sub 0) OBJ File: 'signal_ks_export.blend'
+# www.blender.org
+mtllib advtrains_signals_ks_lamps_main.mtl
+o HSLampen_Cube.000
+v 1.356099 -0.866613 5.864285
+v 1.356098 -0.872114 5.594683
+v 1.324589 -0.761419 6.389298
+v 1.324588 -0.766923 5.594215
+v 1.273160 -0.664393 6.388865
+v 1.273160 -0.669894 5.593781
+v 1.203793 -0.579264 6.388486
+v 1.203794 -0.584764 5.593402
+v 1.119149 -0.509304 6.388174
+v 1.119148 -0.514805 5.593091
+v 1.022483 -0.457200 6.387940
+v 1.022485 -0.462700 5.592857
+v 0.917511 -0.424956 6.387797
+v 0.917511 -0.430456 5.592714
+v 0.808263 -0.413814 6.387748
+v 0.808264 -0.419312 5.592665
+v 0.698939 -0.424194 6.387794
+v 0.698940 -0.429696 5.592710
+v 0.593745 -0.455702 6.387936
+v 0.593744 -0.461204 5.592852
+v 0.496716 -0.507132 6.388164
+v 0.496716 -0.512632 5.593081
+v 0.411588 -0.576496 6.388473
+v 0.411586 -0.581998 5.593389
+v 0.341628 -0.661139 6.388850
+v 0.341625 -0.666642 5.593767
+v 0.289521 -0.757806 6.389282
+v 0.289522 -0.763307 5.594199
+v 0.257278 -0.862776 5.864267
+v 0.257278 -0.868280 5.594666
+v 0.245926 -0.976844 5.864237
+v 0.246134 -0.977477 5.595152
+v 0.256836 -1.083121 5.862653
+v 0.256504 -1.086783 5.595598
+v 0.288031 -1.186557 5.863041
+v 0.288019 -1.192029 5.596006
+v 0.339461 -1.283579 5.863426
+v 0.339445 -1.289057 5.596392
+v 0.408828 -1.368706 5.863764
+v 0.408815 -1.374189 5.596729
+v 0.493473 -1.438664 5.864041
+v 0.493457 -1.444154 5.597005
+v 0.590136 -1.490763 5.864248
+v 0.590124 -1.496257 5.597212
+v 0.695107 -1.523005 5.864375
+v 0.695100 -1.528503 5.597339
+v 0.804351 -1.534149 5.864418
+v 0.804351 -1.539651 5.597383
+v 0.913672 -1.523771 5.864378
+v 0.913679 -1.529268 5.597343
+v 1.018864 -1.492260 5.864253
+v 1.018874 -1.497755 5.597218
+v 1.115892 -1.440837 5.864049
+v 1.115906 -1.446325 5.597014
+v 1.201019 -1.371471 5.863774
+v 1.201035 -1.376956 5.596738
+v 1.270979 -1.286831 5.863439
+v 1.270996 -1.292309 5.596403
+v 1.323086 -1.190168 5.863057
+v 1.323098 -1.195639 5.596019
+v 1.355004 -1.086950 5.862668
+v 1.355350 -1.090617 5.595614
+v 1.366655 -0.980756 5.864254
+v 1.366481 -0.981388 5.595167
+v 1.380815 -0.862105 5.864238
+v 1.380815 -0.867288 5.229348
+v 1.347889 -0.752182 6.389203
+v 1.347889 -0.757365 5.228831
+v 1.294148 -0.650795 6.388727
+v 1.294148 -0.655976 5.228355
+v 1.221662 -0.561836 6.388309
+v 1.221663 -0.567019 5.227938
+v 1.133213 -0.488731 6.387966
+v 1.133212 -0.493915 5.227594
+v 1.032202 -0.434285 6.387711
+v 1.032202 -0.439468 5.227339
+v 0.922510 -0.400592 6.387552
+v 0.922510 -0.405775 5.227180
+v 0.808350 -0.388948 6.387497
+v 0.808351 -0.394128 5.227125
+v 0.694112 -0.399794 6.387548
+v 0.694114 -0.404978 5.227177
+v 0.584189 -0.432720 6.387703
+v 0.584189 -0.437905 5.227331
+v 0.482798 -0.486462 6.387955
+v 0.482799 -0.491644 5.227584
+v 0.393842 -0.558946 6.388296
+v 0.393842 -0.564128 5.227924
+v 0.320737 -0.647394 6.388711
+v 0.320736 -0.652577 5.228340
+v 0.266289 -0.748405 6.389186
+v 0.266290 -0.753588 5.228814
+v 0.232596 -0.858097 5.864219
+v 0.232596 -0.863279 5.229330
+v 0.220950 -0.972254 5.864219
+v 0.220951 -0.977436 5.229865
+v 0.231799 -1.086489 5.862726
+v 0.231799 -1.091671 5.230402
+v 0.264725 -1.196414 5.863242
+v 0.264724 -1.201597 5.230918
+v 0.318466 -1.297802 5.863719
+v 0.318465 -1.302985 5.231395
+v 0.390952 -1.386758 5.864136
+v 0.390953 -1.391941 5.231813
+v 0.479402 -1.459865 5.864480
+v 0.479401 -1.465047 5.232156
+v 0.580414 -1.514309 5.864735
+v 0.580413 -1.519492 5.232411
+v 0.690105 -1.548002 5.864894
+v 0.690106 -1.553185 5.232570
+v 0.804264 -1.559648 5.864949
+v 0.804263 -1.564832 5.232625
+v 0.918500 -1.548801 5.864897
+v 0.918501 -1.553983 5.232574
+v 1.028426 -1.515873 5.864743
+v 1.028425 -1.521055 5.232419
+v 1.129816 -1.462135 5.864491
+v 1.129816 -1.467316 5.232167
+v 1.218773 -1.389648 5.864150
+v 1.218772 -1.394831 5.231826
+v 1.291878 -1.301200 5.863734
+v 1.291878 -1.306382 5.231411
+v 1.346324 -1.200189 5.863259
+v 1.346325 -1.205372 5.230936
+v 1.380017 -1.090498 5.862744
+v 1.380018 -1.095680 5.230421
+v 1.391665 -0.976340 5.864237
+v 1.391664 -0.981523 5.229884
+v -0.966289 1.760967 5.864285
+v -0.966289 1.758691 5.594683
+v -0.979322 1.804477 6.389298
+v -0.979322 1.802200 5.594215
+v -1.000594 1.844609 6.388865
+v -1.000594 1.842333 5.593781
+v -1.029285 1.879819 6.388486
+v -1.029285 1.877545 5.593402
+v -1.064296 1.908756 6.388174
+v -1.064296 1.906481 5.593091
+v -1.104278 1.930307 6.387940
+v -1.104278 1.928033 5.592857
+v -1.147697 1.943644 6.387797
+v -1.147697 1.941369 5.592714
+v -1.192884 1.948253 6.387748
+v -1.192883 1.945979 5.592665
+v -1.238102 1.943959 6.387794
+v -1.238102 1.941683 5.592710
+v -1.281613 1.930927 6.387936
+v -1.281613 1.928651 5.592852
+v -1.321745 1.909655 6.388164
+v -1.321746 1.907380 5.593081
+v -1.356956 1.880964 6.388473
+v -1.356957 1.878689 5.593389
+v -1.385893 1.845954 6.388850
+v -1.385894 1.843678 5.593767
+v -1.407445 1.805971 6.389282
+v -1.407444 1.803696 5.594199
+v -1.420781 1.762553 5.864267
+v -1.420781 1.760277 5.594666
+v -1.425477 1.715373 5.864237
+v -1.425391 1.715111 5.595152
+v -1.420964 1.671415 5.862653
+v -1.421102 1.669900 5.595598
+v -1.408062 1.628632 5.863041
+v -1.408066 1.626369 5.596006
+v -1.386789 1.588502 5.863426
+v -1.386796 1.586236 5.596392
+v -1.358097 1.553291 5.863764
+v -1.358103 1.551024 5.596729
+v -1.323087 1.524355 5.864041
+v -1.323093 1.522085 5.597005
+v -1.283105 1.502807 5.864248
+v -1.283110 1.500534 5.597212
+v -1.239687 1.489471 5.864375
+v -1.239690 1.487197 5.597339
+v -1.194502 1.484861 5.864418
+v -1.194502 1.482586 5.597383
+v -1.149285 1.489154 5.864378
+v -1.149282 1.486880 5.597343
+v -1.105775 1.502187 5.864253
+v -1.105771 1.499915 5.597218
+v -1.065643 1.523457 5.864049
+v -1.065637 1.521187 5.597014
+v -1.030433 1.552148 5.863774
+v -1.030426 1.549879 5.596738
+v -1.001496 1.587157 5.863439
+v -1.001489 1.584891 5.596403
+v -0.979944 1.627138 5.863057
+v -0.979939 1.624875 5.596019
+v -0.966742 1.669832 5.862668
+v -0.966598 1.668314 5.595614
+v -0.961923 1.713755 5.864254
+v -0.961995 1.713493 5.595167
+v -0.956066 1.762831 5.864238
+v -0.956066 1.760688 5.229348
+v -0.969685 1.808297 6.389203
+v -0.969685 1.806154 5.228831
+v -0.991913 1.850233 6.388727
+v -0.991913 1.848090 5.228355
+v -1.021894 1.887028 6.388309
+v -1.021894 1.884884 5.227938
+v -1.058478 1.917265 6.387966
+v -1.058479 1.915121 5.227594
+v -1.100258 1.939785 6.387711
+v -1.100258 1.937642 5.227339
+v -1.145629 1.953721 6.387552
+v -1.145629 1.951578 5.227180
+v -1.192848 1.958538 6.387497
+v -1.192847 1.956395 5.227125
+v -1.240099 1.954051 6.387548
+v -1.240098 1.951908 5.227177
+v -1.285565 1.940433 6.387703
+v -1.285565 1.938288 5.227331
+v -1.327502 1.918204 6.387955
+v -1.327502 1.916061 5.227584
+v -1.364296 1.888223 6.388296
+v -1.364296 1.886080 5.227924
+v -1.394534 1.851640 6.388711
+v -1.394534 1.849496 5.228340
+v -1.417054 1.809860 6.389186
+v -1.417054 1.807716 5.228814
+v -1.430991 1.764489 5.864219
+v -1.430990 1.762345 5.229330
+v -1.435807 1.717272 5.864219
+v -1.435807 1.715128 5.229865
+v -1.431320 1.670022 5.862726
+v -1.431320 1.667878 5.230402
+v -1.417701 1.624554 5.863242
+v -1.417701 1.622411 5.230918
+v -1.395473 1.582619 5.863719
+v -1.395473 1.580475 5.231395
+v -1.365491 1.545825 5.864136
+v -1.365491 1.543681 5.231813
+v -1.328907 1.515587 5.864480
+v -1.328907 1.513443 5.232156
+v -1.287126 1.493068 5.864735
+v -1.287127 1.490924 5.232411
+v -1.241756 1.479131 5.864894
+v -1.241756 1.476988 5.232570
+v -1.194538 1.474315 5.864949
+v -1.194538 1.472170 5.232625
+v -1.147288 1.478801 5.864897
+v -1.147287 1.476658 5.232574
+v -1.101820 1.492421 5.864743
+v -1.101821 1.490277 5.232419
+v -1.059884 1.514648 5.864491
+v -1.059884 1.512505 5.232167
+v -1.023089 1.544630 5.864150
+v -1.023090 1.542486 5.231826
+v -0.992852 1.581213 5.863734
+v -0.992852 1.579070 5.231411
+v -0.970332 1.622993 5.863259
+v -0.970331 1.620850 5.230936
+v -0.956396 1.668364 5.862744
+v -0.956395 1.666220 5.230421
+v -0.951578 1.715581 5.864237
+v -0.951578 1.713438 5.229884
+v -0.643901 -0.866613 5.864285
+v -0.643902 -0.872114 5.594683
+v -0.675411 -0.761419 6.389298
+v -0.675412 -0.766923 5.594215
+v -0.726840 -0.664393 6.388865
+v -0.726840 -0.669894 5.593781
+v -0.796207 -0.579264 6.388486
+v -0.796206 -0.584764 5.593402
+v -0.880851 -0.509304 6.388174
+v -0.880852 -0.514805 5.593091
+v -0.977517 -0.457200 6.387940
+v -0.977515 -0.462699 5.592857
+v -1.082489 -0.424957 6.387797
+v -1.082489 -0.430456 5.592714
+v -1.191737 -0.413814 6.387748
+v -1.191736 -0.419312 5.592665
+v -1.301062 -0.424194 6.387794
+v -1.301060 -0.429696 5.592710
+v -1.406255 -0.455702 6.387936
+v -1.406256 -0.461204 5.592852
+v -1.503284 -0.507132 6.388164
+v -1.503284 -0.512632 5.593081
+v -1.588412 -0.576496 6.388473
+v -1.588414 -0.581998 5.593389
+v -1.658372 -0.661139 6.388850
+v -1.658375 -0.666641 5.593767
+v -1.710479 -0.757806 6.389282
+v -1.710478 -0.763307 5.594199
+v -1.742722 -0.862777 5.864267
+v -1.742722 -0.868280 5.594666
+v -1.754074 -0.976844 5.864237
+v -1.753866 -0.977477 5.595152
+v -1.743164 -1.083121 5.862653
+v -1.743496 -1.086783 5.595598
+v -1.711969 -1.186557 5.863041
+v -1.711981 -1.192029 5.596006
+v -1.660540 -1.283579 5.863426
+v -1.660555 -1.289057 5.596392
+v -1.591172 -1.368706 5.863764
+v -1.591185 -1.374189 5.596729
+v -1.506527 -1.438665 5.864041
+v -1.506543 -1.444154 5.597005
+v -1.409864 -1.490763 5.864248
+v -1.409876 -1.496257 5.597212
+v -1.304893 -1.523005 5.864375
+v -1.304900 -1.528503 5.597339
+v -1.195649 -1.534150 5.864418
+v -1.195649 -1.539650 5.597383
+v -1.086329 -1.523771 5.864378
+v -1.086321 -1.529268 5.597343
+v -0.981136 -1.492261 5.864253
+v -0.981126 -1.497756 5.597218
+v -0.884108 -1.440837 5.864049
+v -0.884094 -1.446325 5.597014
+v -0.798981 -1.371471 5.863774
+v -0.798965 -1.376956 5.596738
+v -0.729021 -1.286831 5.863439
+v -0.729004 -1.292308 5.596403
+v -0.676914 -1.190168 5.863057
+v -0.676902 -1.195640 5.596019
+v -0.644996 -1.086950 5.862668
+v -0.644650 -1.090617 5.595614
+v -0.633345 -0.980756 5.864254
+v -0.633519 -0.981388 5.595167
+v -0.619185 -0.862105 5.864238
+v -0.619185 -0.867288 5.229348
+v -0.652111 -0.752182 6.389203
+v -0.652111 -0.757365 5.228831
+v -0.705852 -0.650795 6.388727
+v -0.705852 -0.655976 5.228355
+v -0.778338 -0.561836 6.388309
+v -0.778337 -0.567019 5.227938
+v -0.866787 -0.488731 6.387966
+v -0.866788 -0.493915 5.227594
+v -0.967798 -0.434285 6.387711
+v -0.967798 -0.439468 5.227339
+v -1.077490 -0.400592 6.387552
+v -1.077490 -0.405775 5.227180
+v -1.191650 -0.388948 6.387497
+v -1.191649 -0.394128 5.227125
+v -1.305888 -0.399794 6.387548
+v -1.305886 -0.404978 5.227177
+v -1.415811 -0.432720 6.387703
+v -1.415811 -0.437904 5.227331
+v -1.517202 -0.486461 6.387955
+v -1.517201 -0.491643 5.227584
+v -1.606158 -0.558947 6.388296
+v -1.606158 -0.564129 5.227924
+v -1.679263 -0.647395 6.388711
+v -1.679264 -0.652577 5.228340
+v -1.733711 -0.748405 6.389186
+v -1.733710 -0.753588 5.228814
+v -1.767405 -0.858098 5.864219
+v -1.767404 -0.863280 5.229330
+v -1.779050 -0.972254 5.864219
+v -1.779049 -0.977436 5.229865
+v -1.768201 -1.086489 5.862726
+v -1.768202 -1.091671 5.230402
+v -1.735275 -1.196415 5.863242
+v -1.735276 -1.201597 5.230918
+v -1.681534 -1.297802 5.863719
+v -1.681535 -1.302985 5.231395
+v -1.609048 -1.386759 5.864136
+v -1.609047 -1.391941 5.231813
+v -1.520598 -1.459865 5.864480
+v -1.520599 -1.465047 5.232156
+v -1.419586 -1.514309 5.864735
+v -1.419587 -1.519492 5.232411
+v -1.309895 -1.548002 5.864894
+v -1.309894 -1.553185 5.232570
+v -1.195736 -1.559648 5.864949
+v -1.195737 -1.564832 5.232625
+v -1.081500 -1.548801 5.864897
+v -1.081499 -1.553983 5.232574
+v -0.971574 -1.515873 5.864743
+v -0.971575 -1.521056 5.232419
+v -0.870184 -1.462135 5.864491
+v -0.870184 -1.467316 5.232167
+v -0.781227 -1.389648 5.864150
+v -0.781228 -1.394831 5.231826
+v -0.708122 -1.301200 5.863734
+v -0.708122 -1.306382 5.231411
+v -0.653676 -1.200189 5.863259
+v -0.653675 -1.205371 5.230936
+v -0.619983 -1.090498 5.862744
+v -0.619982 -1.095680 5.230421
+v -0.608335 -0.976341 5.864237
+v -0.608336 -0.981523 5.229884
+v -0.951578 -3.358915 5.229884
+v -0.951578 -3.356772 5.864237
+v -0.956395 -3.406133 5.230421
+v -0.956396 -3.403990 5.862744
+v -0.970331 -3.451504 5.230936
+v -0.970332 -3.449360 5.863259
+v -0.992852 -3.493283 5.231411
+v -0.992852 -3.491140 5.863734
+v -1.023090 -3.529868 5.231826
+v -1.023089 -3.527724 5.864150
+v -1.059884 -3.559849 5.232167
+v -1.059884 -3.557706 5.864491
+v -1.101821 -3.582077 5.232419
+v -1.101820 -3.579932 5.864743
+v -1.147287 -3.595695 5.232574
+v -1.147288 -3.593553 5.864897
+v -1.194538 -3.600183 5.232625
+v -1.194538 -3.598039 5.864949
+v -1.241756 -3.595365 5.232570
+v -1.241756 -3.593222 5.864894
+v -1.287127 -3.581429 5.232411
+v -1.287126 -3.579286 5.864735
+v -1.328907 -3.558910 5.232156
+v -1.328907 -3.556767 5.864480
+v -1.365491 -3.528672 5.231813
+v -1.365491 -3.526528 5.864136
+v -1.395473 -3.491878 5.231395
+v -1.395473 -3.489735 5.863719
+v -1.417701 -3.449943 5.230918
+v -1.417701 -3.447799 5.863242
+v -1.431320 -3.404475 5.230402
+v -1.431320 -3.402331 5.862726
+v -1.435807 -3.357225 5.229865
+v -1.435807 -3.355082 5.864219
+v -1.430990 -3.310008 5.229330
+v -1.430991 -3.307865 5.864219
+v -1.417054 -3.264637 5.228814
+v -1.417054 -3.262494 6.389186
+v -1.394534 -3.222857 5.228340
+v -1.394534 -3.220714 6.388711
+v -1.364296 -3.186274 5.227924
+v -1.364296 -3.184130 6.388296
+v -1.327502 -3.156292 5.227584
+v -1.327502 -3.154149 6.387955
+v -1.285565 -3.134065 5.227331
+v -1.285565 -3.131921 6.387703
+v -1.240098 -3.120446 5.227177
+v -1.240099 -3.118302 6.387548
+v -1.192847 -3.115959 5.227125
+v -1.192848 -3.113816 6.387497
+v -1.145629 -3.120776 5.227180
+v -1.145629 -3.118632 6.387552
+v -1.100258 -3.134712 5.227339
+v -1.100258 -3.132568 6.387711
+v -1.058479 -3.157232 5.227594
+v -1.058478 -3.155088 6.387966
+v -1.021894 -3.187469 5.227938
+v -1.021894 -3.185325 6.388309
+v -0.991913 -3.224263 5.228355
+v -0.991913 -3.222120 6.388727
+v -0.969685 -3.266200 5.228831
+v -0.969685 -3.264056 6.389203
+v -0.956066 -3.311666 5.229348
+v -0.956066 -3.309522 5.864238
+v -0.961995 -3.358860 5.595167
+v -0.961923 -3.358598 5.864254
+v -0.966598 -3.404039 5.595614
+v -0.966742 -3.402522 5.862668
+v -0.979939 -3.447478 5.596019
+v -0.979944 -3.445215 5.863057
+v -1.001489 -3.487463 5.596403
+v -1.001496 -3.485197 5.863439
+v -1.030426 -3.522474 5.596738
+v -1.030433 -3.520205 5.863774
+v -1.065637 -3.551166 5.597014
+v -1.065643 -3.548896 5.864049
+v -1.105771 -3.572439 5.597218
+v -1.105775 -3.570166 5.864253
+v -1.149282 -3.585473 5.597343
+v -1.149285 -3.583200 5.864378
+v -1.194502 -3.589768 5.597383
+v -1.194502 -3.587492 5.864418
+v -1.239690 -3.585157 5.597339
+v -1.239687 -3.582883 5.864375
+v -1.283110 -3.571819 5.597212
+v -1.283105 -3.569547 5.864248
+v -1.323093 -3.550268 5.597005
+v -1.323087 -3.547998 5.864041
+v -1.358103 -3.521330 5.596729
+v -1.358097 -3.519062 5.863764
+v -1.386796 -3.486117 5.596392
+v -1.386789 -3.483851 5.863426
+v -1.408066 -3.445985 5.596006
+v -1.408062 -3.443721 5.863041
+v -1.421102 -3.402453 5.595598
+v -1.420964 -3.400939 5.862653
+v -1.425391 -3.357242 5.595152
+v -1.425477 -3.356980 5.864237
+v -1.420781 -3.312076 5.594666
+v -1.420781 -3.309800 5.864267
+v -1.407444 -3.268657 5.594199
+v -1.407445 -3.266382 6.389282
+v -1.385894 -3.228675 5.593767
+v -1.385893 -3.226399 6.388850
+v -1.356957 -3.193665 5.593389
+v -1.356956 -3.191389 6.388473
+v -1.321746 -3.164974 5.593081
+v -1.321745 -3.162699 6.388164
+v -1.281613 -3.143702 5.592852
+v -1.281613 -3.141427 6.387936
+v -1.238102 -3.130670 5.592710
+v -1.238102 -3.128394 6.387794
+v -1.192883 -3.126374 5.592665
+v -1.192884 -3.124101 6.387748
+v -1.147697 -3.130984 5.592714
+v -1.147697 -3.128710 6.387797
+v -1.104278 -3.144321 5.592857
+v -1.104278 -3.142046 6.387940
+v -1.064296 -3.165872 5.593091
+v -1.064296 -3.163597 6.388174
+v -1.029285 -3.194809 5.593402
+v -1.029285 -3.192534 6.388486
+v -1.000594 -3.230020 5.593781
+v -1.000594 -3.227745 6.388865
+v -0.979322 -3.270153 5.594215
+v -0.979322 -3.267877 6.389298
+v -0.966289 -3.313662 5.594683
+v -0.966289 -3.311387 5.864285
+v 0.356099 0.705847 5.864285
+v 0.356098 0.700347 5.594683
+v 0.324589 0.811042 6.389298
+v 0.324588 0.805538 5.594215
+v 0.273160 0.908067 6.388865
+v 0.273160 0.902567 5.593781
+v 0.203793 0.993196 6.388486
+v 0.203794 0.987696 5.593402
+v 0.119149 1.063156 6.388174
+v 0.119148 1.057656 5.593091
+v 0.022483 1.115260 6.387940
+v 0.022485 1.109761 5.592857
+v -0.082489 1.147504 6.387797
+v -0.082489 1.142005 5.592714
+v -0.191737 1.158646 6.387748
+v -0.191736 1.153148 5.592665
+v -0.301062 1.148266 6.387794
+v -0.301060 1.142764 5.592710
+v -0.406255 1.116758 6.387936
+v -0.406256 1.111256 5.592852
+v -0.503284 1.065329 6.388164
+v -0.503284 1.059828 5.593081
+v -0.588412 0.995964 6.388473
+v -0.588414 0.990462 5.593389
+v -0.658372 0.911321 6.388850
+v -0.658375 0.905819 5.593767
+v -0.710479 0.814654 6.389282
+v -0.710478 0.809153 5.594199
+v -0.742722 0.709684 5.864267
+v -0.742722 0.704181 5.594666
+v -0.754074 0.595617 5.864237
+v -0.753866 0.594983 5.595152
+v -0.743164 0.489339 5.862653
+v -0.743496 0.485677 5.595598
+v -0.711969 0.385904 5.863041
+v -0.711981 0.380432 5.596006
+v -0.660540 0.288881 5.863426
+v -0.660555 0.283404 5.596392
+v -0.591172 0.203754 5.863764
+v -0.591185 0.198271 5.596729
+v -0.506527 0.133796 5.864041
+v -0.506543 0.128306 5.597005
+v -0.409864 0.081697 5.864248
+v -0.409876 0.076203 5.597212
+v -0.304893 0.049455 5.864375
+v -0.304900 0.043957 5.597339
+v -0.195649 0.038311 5.864418
+v -0.195649 0.032810 5.597383
+v -0.086328 0.048690 5.864378
+v -0.086321 0.043193 5.597343
+v 0.018864 0.080200 5.864253
+v 0.018874 0.074705 5.597218
+v 0.115892 0.131623 5.864049
+v 0.115906 0.126135 5.597014
+v 0.201019 0.200989 5.863774
+v 0.201035 0.195505 5.596738
+v 0.270979 0.285629 5.863439
+v 0.270996 0.280152 5.596403
+v 0.323086 0.382292 5.863057
+v 0.323098 0.376821 5.596019
+v 0.355004 0.485511 5.862668
+v 0.355350 0.481844 5.595614
+v 0.366655 0.591704 5.864254
+v 0.366481 0.591073 5.595167
+v 0.380815 0.710356 5.864238
+v 0.380815 0.705173 5.229348
+v 0.347889 0.820279 6.389203
+v 0.347889 0.815095 5.228831
+v 0.294148 0.921665 6.388727
+v 0.294148 0.916485 5.228355
+v 0.221662 1.010625 6.388309
+v 0.221663 1.005441 5.227938
+v 0.133213 1.083729 6.387966
+v 0.133212 1.078545 5.227594
+v 0.032202 1.138175 6.387711
+v 0.032202 1.132992 5.227339
+v -0.077490 1.171868 6.387552
+v -0.077490 1.166685 5.227180
+v -0.191650 1.183513 6.387497
+v -0.191649 1.178332 5.227125
+v -0.305888 1.172667 6.387548
+v -0.305886 1.167483 5.227177
+v -0.415811 1.139740 6.387703
+v -0.415811 1.134556 5.227331
+v -0.517202 1.085999 6.387955
+v -0.517201 1.080817 5.227584
+v -0.606158 1.013514 6.388296
+v -0.606158 1.008332 5.227924
+v -0.679263 0.925066 6.388711
+v -0.679264 0.919884 5.228340
+v -0.733711 0.824056 6.389186
+v -0.733710 0.818873 5.228814
+v -0.767404 0.714363 5.864219
+v -0.767404 0.709181 5.229330
+v -0.779050 0.600207 5.864219
+v -0.779049 0.595024 5.229865
+v -0.768201 0.485972 5.862726
+v -0.768202 0.480789 5.230402
+v -0.735275 0.376046 5.863242
+v -0.735276 0.370864 5.230918
+v -0.681534 0.274658 5.863719
+v -0.681535 0.269476 5.231395
+v -0.609048 0.185702 5.864136
+v -0.609047 0.180519 5.231813
+v -0.520598 0.112596 5.864480
+v -0.520599 0.107414 5.232156
+v -0.419586 0.058152 5.864735
+v -0.419587 0.052969 5.232411
+v -0.309895 0.024458 5.864894
+v -0.309894 0.019276 5.232570
+v -0.195736 0.012813 5.864949
+v -0.195737 0.007628 5.232625
+v -0.081500 0.023660 5.864897
+v -0.081499 0.018478 5.232574
+v 0.028426 0.056588 5.864743
+v 0.028425 0.051405 5.232419
+v 0.129816 0.110325 5.864491
+v 0.129816 0.105145 5.232167
+v 0.218773 0.182812 5.864150
+v 0.218772 0.177630 5.231826
+v 0.291878 0.271261 5.863734
+v 0.291878 0.266078 5.231411
+v 0.346324 0.372271 5.863259
+v 0.346325 0.367089 5.230936
+v 0.380017 0.481962 5.862744
+v 0.380018 0.476780 5.230421
+v 0.391665 0.596120 5.864237
+v 0.391664 0.590937 5.229884
+v 0.048422 -2.358916 5.229884
+v 0.048422 -2.356772 5.864237
+v 0.043605 -2.406133 5.230421
+v 0.043604 -2.403990 5.862744
+v 0.029669 -2.451504 5.230936
+v 0.029668 -2.449360 5.863259
+v 0.007148 -2.493284 5.231411
+v 0.007148 -2.491140 5.863734
+v -0.023090 -2.529867 5.231826
+v -0.023089 -2.527724 5.864150
+v -0.059884 -2.559849 5.232167
+v -0.059884 -2.557706 5.864491
+v -0.101821 -2.582077 5.232419
+v -0.101820 -2.579932 5.864743
+v -0.147287 -2.595695 5.232574
+v -0.147288 -2.593553 5.864897
+v -0.194538 -2.600183 5.232625
+v -0.194538 -2.598039 5.864949
+v -0.241756 -2.595365 5.232570
+v -0.241756 -2.593222 5.864894
+v -0.287127 -2.581429 5.232411
+v -0.287126 -2.579286 5.864735
+v -0.328907 -2.558910 5.232156
+v -0.328907 -2.556767 5.864480
+v -0.365491 -2.528672 5.231813
+v -0.365491 -2.526529 5.864136
+v -0.395473 -2.491878 5.231395
+v -0.395473 -2.489735 5.863719
+v -0.417701 -2.449942 5.230918
+v -0.417701 -2.447799 5.863242
+v -0.431320 -2.404475 5.230402
+v -0.431320 -2.402331 5.862726
+v -0.435807 -2.357225 5.229865
+v -0.435807 -2.355082 5.864219
+v -0.430990 -2.310008 5.229330
+v -0.430991 -2.307864 5.864219
+v -0.417054 -2.264637 5.228814
+v -0.417054 -2.262494 6.389186
+v -0.394534 -2.222857 5.228340
+v -0.394534 -2.220714 6.388711
+v -0.364296 -2.186274 5.227924
+v -0.364296 -2.184130 6.388296
+v -0.327502 -2.156292 5.227584
+v -0.327502 -2.154149 6.387955
+v -0.285565 -2.134065 5.227331
+v -0.285565 -2.131920 6.387703
+v -0.240098 -2.120446 5.227177
+v -0.240099 -2.118302 6.387548
+v -0.192847 -2.115958 5.227125
+v -0.192848 -2.113816 6.387497
+v -0.145629 -2.120776 5.227180
+v -0.145629 -2.118632 6.387552
+v -0.100258 -2.134712 5.227339
+v -0.100258 -2.132568 6.387711
+v -0.058479 -2.157232 5.227594
+v -0.058478 -2.155088 6.387966
+v -0.021894 -2.187469 5.227938
+v -0.021894 -2.185325 6.388309
+v 0.008087 -2.224263 5.228355
+v 0.008087 -2.222121 6.388727
+v 0.030315 -2.266200 5.228831
+v 0.030315 -2.264056 6.389203
+v 0.043935 -2.311666 5.229348
+v 0.043935 -2.309522 5.864238
+v 0.038005 -2.358860 5.595167
+v 0.038077 -2.358598 5.864254
+v 0.033402 -2.404039 5.595614
+v 0.033258 -2.402522 5.862668
+v 0.020062 -2.447478 5.596019
+v 0.020056 -2.445215 5.863057
+v -0.001489 -2.487462 5.596403
+v -0.001496 -2.485197 5.863439
+v -0.030426 -2.522474 5.596738
+v -0.030433 -2.520205 5.863774
+v -0.065637 -2.551166 5.597014
+v -0.065643 -2.548896 5.864049
+v -0.105771 -2.572439 5.597218
+v -0.105775 -2.570166 5.864253
+v -0.149282 -2.585473 5.597343
+v -0.149285 -2.583199 5.864378
+v -0.194502 -2.589767 5.597383
+v -0.194502 -2.587492 5.864418
+v -0.239690 -2.585156 5.597339
+v -0.239687 -2.582883 5.864375
+v -0.283110 -2.571819 5.597212
+v -0.283105 -2.569547 5.864248
+v -0.323093 -2.550268 5.597005
+v -0.323087 -2.547998 5.864041
+v -0.358103 -2.521329 5.596729
+v -0.358097 -2.519062 5.863764
+v -0.386796 -2.486117 5.596392
+v -0.386789 -2.483852 5.863426
+v -0.408066 -2.445985 5.596006
+v -0.408062 -2.443721 5.863041
+v -0.421102 -2.402453 5.595598
+v -0.420964 -2.400939 5.862653
+v -0.425391 -2.357242 5.595152
+v -0.425477 -2.356980 5.864237
+v -0.420781 -2.312076 5.594666
+v -0.420781 -2.309800 5.864267
+v -0.407444 -2.268657 5.594199
+v -0.407445 -2.266382 6.389282
+v -0.385894 -2.228675 5.593767
+v -0.385893 -2.226399 6.388850
+v -0.356957 -2.193665 5.593389
+v -0.356956 -2.191389 6.388473
+v -0.321746 -2.164974 5.593081
+v -0.321745 -2.162699 6.388164
+v -0.281613 -2.143702 5.592852
+v -0.281613 -2.141427 6.387936
+v -0.238102 -2.130670 5.592710
+v -0.238102 -2.128394 6.387794
+v -0.192883 -2.126374 5.592665
+v -0.192884 -2.124101 6.387748
+v -0.147697 -2.130984 5.592714
+v -0.147697 -2.128710 6.387797
+v -0.104278 -2.144320 5.592857
+v -0.104278 -2.142046 6.387940
+v -0.064296 -2.165872 5.593091
+v -0.064296 -2.163597 6.388174
+v -0.029285 -2.194809 5.593402
+v -0.029285 -2.192534 6.388486
+v -0.000594 -2.230020 5.593781
+v -0.000594 -2.227745 6.388865
+v 0.020678 -2.270153 5.594215
+v 0.020678 -2.267877 6.389298
+v 0.033711 -2.313662 5.594683
+v 0.033711 -2.311387 5.864285
+vt 0.442670 0.517822
+vt 0.228883 0.517823
+vt 0.228889 0.488295
+vt 0.797953 0.896311
+vt 0.741726 0.913364
+vt 0.594127 0.834472
+vt 0.577066 0.778233
+vt 0.655948 0.630639
+vt 0.770682 0.619333
+vt 0.859798 0.692466
+vt 0.876858 0.748707
+vt 0.683240 0.907605
+vt 0.655960 0.896305
+vt 0.582826 0.719746
+vt 0.610530 0.667916
+vt 0.683222 0.619339
+vt 0.822512 0.647036
+vt 0.843392 0.667915
+vt 0.871097 0.807194
+vt 0.843391 0.859025
+vt 0.770685 0.907604
+vt 0.712199 0.913364
+vt 0.631409 0.879901
+vt 0.610530 0.859023
+vt 0.582827 0.807192
+vt 0.577066 0.748705
+vt 0.594126 0.692467
+vt 0.631409 0.647037
+vt 0.712194 0.613573
+vt 0.741722 0.613573
+vt 0.797962 0.630631
+vt 0.871098 0.719747
+vt 0.876858 0.778235
+vt 0.859797 0.834474
+vt 0.822501 0.879912
+vt 0.442971 0.724510
+vt 0.443060 0.754024
+vt 0.370472 0.723575
+vt 0.442967 0.311134
+vt 0.370467 0.312068
+vt 0.443056 0.281620
+vt 0.443160 0.252098
+vt 0.371348 0.252525
+vt 0.443163 0.783546
+vt 0.371352 0.783117
+vt 0.006929 0.253167
+vt 0.177644 0.253134
+vt 0.006828 0.284020
+vt 0.007055 0.808541
+vt 0.006941 0.777687
+vt 0.177771 0.808498
+vt 0.006827 0.746834
+vt 0.176852 0.746796
+vt 0.006727 0.314875
+vt 0.176753 0.314837
+vt 0.371492 0.871219
+vt 0.371495 0.841694
+vt 0.443305 0.842613
+vt 0.615392 0.436018
+vt 0.610260 0.440534
+vt 0.592437 0.415287
+vt 0.816609 0.103895
+vt 0.836176 0.125250
+vt 0.831035 0.128981
+vt 0.706468 0.066881
+vt 0.736753 0.067631
+vt 0.735929 0.074111
+vt 0.647824 0.083609
+vt 0.650942 0.089526
+vt 0.626230 0.105756
+vt 0.765981 0.074365
+vt 0.763884 0.080481
+vt 0.579817 0.387126
+vt 0.586362 0.385333
+vt 0.621946 0.100560
+vt 0.605204 0.126737
+vt 0.706979 0.073452
+vt 0.678244 0.078632
+vt 0.792953 0.086670
+vt 0.812355 0.108585
+vt 0.676401 0.072253
+vt 0.789700 0.092175
+vt 0.599888 0.122511
+vt 0.589057 0.151745
+vt 0.582798 0.148853
+vt 0.579868 0.178984
+vt 0.850517 0.149568
+vt 0.844628 0.151667
+vt 0.572791 0.357181
+vt 0.571207 0.326153
+vt 0.578089 0.326242
+vt 0.579568 0.357437
+vt 0.892437 0.349226
+vt 0.885423 0.348954
+vt 0.885704 0.319257
+vt 0.886223 0.285996
+vt 0.879631 0.287703
+vt 0.636826 0.456466
+vt 0.632640 0.461897
+vt 0.874138 0.409852
+vt 0.856681 0.436209
+vt 0.851292 0.431762
+vt 0.661830 0.472412
+vt 0.658752 0.478560
+vt 0.689480 0.483245
+vt 0.687628 0.489885
+vt 0.718747 0.488548
+vt 0.718195 0.495436
+vt 0.779839 0.488518
+vt 0.749318 0.494983
+vt 0.748545 0.488099
+vt 0.808610 0.476251
+vt 0.777761 0.481894
+vt 0.834553 0.458608
+vt 0.805300 0.470133
+vt 0.830124 0.453224
+vt 0.573209 0.178195
+vt 0.886228 0.380492
+vt 0.867982 0.406513
+vt 0.879533 0.378395
+vt 0.370709 0.754396
+vt 0.319322 0.130795
+vt 0.319224 0.161649
+vt 0.007220 0.160604
+vt 0.007387 0.901104
+vt 0.319390 0.899923
+vt 0.319502 0.930776
+vt 0.442778 0.399714
+vt 0.228990 0.399716
+vt 0.229046 0.370189
+vt 0.007499 0.931958
+vt 0.319616 0.961631
+vt 0.006361 0.469146
+vt 0.176387 0.469108
+vt 0.176362 0.499962
+vt 0.442678 0.488295
+vt 0.228910 0.458769
+vt 0.007727 0.006334
+vt 0.319730 0.007378
+vt 0.319626 0.038233
+vt 0.228890 0.547350
+vt 0.007613 0.962812
+vt 0.319730 0.992485
+vt 0.228946 0.606403
+vt 0.228912 0.576877
+vt 0.442700 0.576876
+vt 0.228992 0.635930
+vt 0.442734 0.606402
+vt 0.442833 0.370188
+vt 0.229109 0.340661
+vt 0.229113 0.694984
+vt 0.229049 0.665457
+vt 0.442837 0.665456
+vt 0.442901 0.694984
+vt 0.370705 0.281246
+vt 0.371443 0.812167
+vt 0.443254 0.813086
+vt 0.892437 0.317355
+vt 0.371421 0.900745
+vt 0.443302 0.872141
+vt 0.371269 0.930272
+vt 0.443231 0.901668
+vt 0.007276 0.870250
+vt 0.319278 0.869069
+vt 0.006405 0.438291
+vt 0.176430 0.438254
+vt 0.443090 0.104449
+vt 0.371280 0.105372
+vt 0.371043 0.075847
+vt 0.443237 0.133976
+vt 0.371427 0.134897
+vt 0.443305 0.163503
+vt 0.371495 0.164423
+vt 0.443305 0.193031
+vt 0.371495 0.193949
+vt 0.443252 0.222558
+vt 0.371442 0.223476
+vt 0.177399 0.283987
+vt 0.006543 0.376583
+vt 0.176568 0.376545
+vt 0.176492 0.407399
+vt 0.006467 0.407437
+vt 0.007165 0.839396
+vt 0.319168 0.838215
+vt 0.370694 0.989321
+vt 0.371029 0.959797
+vt 0.442838 0.960722
+vt 0.442780 0.635930
+vt 0.442698 0.458768
+vt 0.228944 0.429242
+vt 0.006337 0.500000
+vt 0.176359 0.530816
+vt 0.319524 0.069087
+vt 0.007520 0.068042
+vt 0.319423 0.099941
+vt 0.007419 0.098896
+vt 0.007319 0.129750
+vt 0.442897 0.340661
+vt 0.319126 0.192504
+vt 0.007122 0.191458
+vt 0.319029 0.223358
+vt 0.007025 0.222313
+vt 0.177512 0.777645
+vt 0.443079 0.931196
+vt 0.176656 0.345691
+vt 0.006631 0.345729
+vt 0.442853 0.074922
+vt 0.370712 0.046322
+vt 0.442732 0.429241
+vt 0.442678 0.547349
+vt 0.176377 0.561671
+vt 0.006351 0.561708
+vt 0.176415 0.592525
+vt 0.006390 0.592562
+vt 0.176474 0.623379
+vt 0.006448 0.623417
+vt 0.176549 0.654233
+vt 0.006524 0.654271
+vt 0.176640 0.685087
+vt 0.006614 0.685125
+vt 0.176742 0.715941
+vt 0.006716 0.715979
+vt 0.598317 0.411848
+vt 0.007623 0.037188
+vt 0.007728 0.993666
+vt 0.442504 0.990249
+vt 0.006334 0.530854
+vt 0.442522 0.045396
+vn 0.094500 -0.995500 0.006900
+vn -0.000000 0.004400 1.000000
+vn 0.000000 0.004500 1.000000
+vn 0.000000 0.004000 1.000000
+vn 0.000300 0.004100 1.000000
+vn -0.000200 0.004400 1.000000
+vn 0.000100 0.004500 1.000000
+vn -0.000000 0.004600 1.000000
+vn -0.000100 0.004400 1.000000
+vn -0.000200 0.003800 1.000000
+vn 0.000100 0.004000 1.000000
+vn -0.000000 0.003900 1.000000
+vn -0.000000 0.004100 1.000000
+vn -0.000100 0.004000 1.000000
+vn -0.001200 0.004200 1.000000
+vn -0.995500 -0.094600 0.001900
+vn 0.994800 -0.101500 0.002100
+vn 0.995500 0.094400 -0.002500
+vn -0.994800 0.101400 -0.002700
+vn 0.995500 0.094500 -0.000800
+vn -0.994800 0.101500 -0.000800
+vn -0.995500 -0.094500 0.000800
+vn 0.994800 -0.101500 0.000800
+vn -0.770700 0.637000 -0.013100
+vn -0.008000 0.009000 0.999900
+vn -0.002400 0.006600 1.000000
+vn -0.000500 0.010000 1.000000
+vn 0.002400 0.009000 1.000000
+vn -0.001400 0.009500 1.000000
+vn -0.002300 0.005400 1.000000
+vn 0.003000 0.008100 1.000000
+vn 0.000600 0.010100 0.999900
+vn -0.002400 0.007600 1.000000
+vn 0.001500 0.009400 1.000000
+vn -0.002100 0.008700 1.000000
+vn 0.003100 0.007000 1.000000
+vn 0.002800 0.005900 1.000000
+vn -0.001800 0.005700 1.000000
+vn 0.001800 0.000200 1.000000
+vn 0.003000 -0.013400 0.999900
+vn 0.004900 -0.014400 0.999900
+vn -0.182400 -0.960000 0.212300
+vn -0.008900 0.012000 0.999900
+vn 0.008900 0.011900 0.999900
+vn -0.008500 0.015200 0.999800
+vn -0.007000 0.017900 0.999800
+vn -0.004600 0.019900 0.999800
+vn 0.001600 0.020800 0.999800
+vn 0.004600 0.019800 0.999800
+vn 0.007100 0.017800 0.999800
+vn 0.008600 0.015000 0.999900
+vn 0.361500 -0.909800 0.204000
+vn 0.007900 0.008900 0.999900
+vn 0.006200 0.005600 1.000000
+vn -0.000100 0.004300 1.000000
+vn -0.995800 -0.092100 0.000900
+vn 0.637100 0.770800 -0.003400
+vn -0.631700 0.775200 -0.003500
+vn 0.770800 -0.637100 0.004400
+vn -0.468300 0.883500 -0.003900
+vn 0.287000 -0.957900 0.007900
+vn 0.286900 -0.957900 0.006600
+vn -0.094500 0.995500 -0.004400
+vn -0.101500 -0.994800 0.006900
+vn -0.286900 0.957900 -0.004300
+vn -0.474500 -0.880200 0.006100
+vn -0.637100 -0.770800 0.005300
+vn 0.880300 -0.474500 0.003300
+vn -0.883600 -0.468300 0.003200
+vn -0.955100 -0.296300 0.002100
+vn 0.995100 -0.099000 0.001000
+vn 0.994800 0.102100 0.000500
+vn -0.880200 0.474500 -0.009800
+vn -0.001500 0.020800 0.999800
+vn -0.955400 0.295400 -0.005300
+vn -0.000800 -0.000200 1.000000
+vn -0.631600 0.775100 -0.016000
+vn -0.468200 0.883400 -0.018200
+vn -0.770800 0.637100 -0.002800
+vn 0.468300 -0.883500 0.007200
+vn 0.293600 0.955700 -0.019700
+vn 0.474400 0.880100 -0.018100
+vn 0.637000 0.770700 -0.015900
+vn 0.775200 0.631600 -0.013000
+vn 0.883500 0.468300 -0.009600
+vn 0.957400 0.288700 -0.005200
+vn -0.994000 0.109100 0.000400
+vn 0.770800 -0.637100 0.005200
+vn 0.631700 -0.775200 0.006400
+vn -0.880300 0.474500 -0.002100
+vn -0.094500 0.995300 -0.020500
+vn -0.775200 -0.631700 0.004400
+vn 0.468300 -0.883500 0.006100
+vn 0.094500 -0.995500 0.008200
+vn 0.101500 0.994800 -0.004400
+vn 0.293600 0.955900 -0.004300
+vn 0.474500 0.880300 -0.003900
+vn 0.952900 -0.303200 0.002100
+vn 0.775200 0.631700 -0.002800
+vn 0.883600 0.468300 -0.002100
+vn 0.956200 0.292700 -0.001300
+vn -0.995500 -0.094600 0.000800
+vn -0.286900 0.957800 -0.019700
+vn 0.955900 -0.293600 0.002400
+vn 0.880300 -0.474500 0.003900
+vn -0.955900 0.293600 -0.002400
+vn 0.101500 0.994600 -0.020500
+vn 0.631700 -0.775200 0.005400
+vn -0.293600 -0.955900 0.006600
+vn -0.101500 -0.994800 0.008200
+vn -0.293600 -0.955900 0.007800
+vn -0.474500 -0.880200 0.007200
+vn -0.637100 -0.770800 0.006300
+vn -0.775200 -0.631700 0.005200
+vn -0.883600 -0.468300 0.003800
+vn -0.958000 -0.286900 0.002400
+vn 0.094600 -0.995500 0.006900
+vn -0.770800 0.637000 -0.013100
+vn -0.005700 0.007000 1.000000
+vn -0.003000 0.007000 1.000000
+vn -0.000500 0.010100 0.999900
+vn 0.002100 0.008600 1.000000
+vn -0.001600 0.009800 1.000000
+vn -0.006300 0.005700 1.000000
+vn 0.002500 0.007600 1.000000
+vn 0.000500 0.010000 1.000000
+vn -0.003000 0.008100 1.000000
+vn 0.001600 0.009700 1.000000
+vn -0.002500 0.009100 1.000000
+vn 0.002300 0.006600 1.000000
+vn 0.001800 0.005700 1.000000
+vn -0.002800 0.006000 1.000000
+vn 0.000700 -0.000200 1.000000
+vn -0.005100 -0.014400 0.999900
+vn -0.003200 -0.013400 0.999900
+vn -0.368000 -0.907200 0.204000
+vn -0.007300 0.010000 0.999900
+vn 0.007200 0.009900 0.999900
+vn -0.007600 0.013300 0.999900
+vn -0.006600 0.016400 0.999800
+vn -0.004500 0.018900 0.999800
+vn 0.001700 0.020400 0.999800
+vn 0.004600 0.018800 0.999800
+vn 0.006600 0.016300 0.999800
+vn 0.007600 0.013100 0.999900
+vn 0.175700 -0.961300 0.212300
+vn 0.005600 0.007000 1.000000
+vn 0.002200 0.005400 1.000000
+vn -0.468300 0.883600 -0.003900
+vn -0.957900 -0.286900 0.005900
+vn -0.880300 0.474400 -0.009800
+vn -0.001600 0.020400 0.999800
+vn -0.955900 0.293500 -0.006100
+vn -0.002000 0.000200 1.000000
+vn -0.468300 0.883400 -0.018200
+vn 0.637100 0.770600 -0.015900
+vn 0.883500 0.468200 -0.009700
+vn 0.958000 0.286800 -0.005900
+vn 0.955900 -0.293600 0.006000
+vn 0.957900 0.286900 -0.002300
+vn -0.286900 0.957700 -0.019700
+vn -0.954100 0.299500 -0.001300
+vn -0.000300 0.003800 1.000000
+vn -0.000100 0.003900 1.000000
+vn -0.000200 0.004000 1.000000
+vn 0.003100 -0.013400 0.999900
+vn 0.008800 0.011900 0.999900
+vn 0.008500 0.015000 0.999900
+vn 0.002400 0.007600 1.000000
+vn 0.006700 0.016300 0.999800
+vn 0.005700 0.007000 1.000000
+vn -0.001900 0.000200 1.000000
+vn 0.000200 0.010900 0.999900
+vn -0.019300 0.021700 0.999600
+vn -0.000000 0.009600 1.000000
+vn -0.000600 0.009200 1.000000
+vn 0.880300 -0.474500 0.001600
+vn 0.000100 0.010700 0.999900
+vn -0.003000 0.010200 0.999900
+vn -0.955400 0.295400 -0.002200
+vn -0.995500 -0.094600 0.000300
+vn -0.880300 0.474500 -0.000900
+vn 0.631700 -0.775200 0.002600
+vn 0.000300 0.009700 1.000000
+vn 0.952900 -0.303200 0.000900
+vn 0.000100 0.009600 1.000000
+vn 0.293600 0.955900 -0.001800
+vn 0.637100 0.770800 -0.001400
+vn 0.020700 0.036300 0.999100
+vn -0.094500 0.995500 -0.001800
+vn -0.775200 -0.631700 0.001800
+vn 0.994800 -0.101500 0.000900
+vn -0.101500 -0.994800 0.002800
+vn -0.000000 0.010800 0.999900
+vn 0.000100 0.009700 1.000000
+vn -0.000100 0.009900 1.000000
+vn -0.994800 0.101400 -0.001100
+vn 0.883600 0.468300 -0.000900
+vn -0.995800 -0.092100 0.000400
+vn 0.005900 0.021700 0.999700
+vn -0.005100 0.021000 0.999800
+vn -0.011000 0.048000 0.998800
+vn 0.000000 0.010900 0.999900
+vn 0.004000 0.050300 0.998700
+vn 0.994800 0.102100 0.000200
+vn -0.637100 -0.770800 0.002200
+vn 0.094500 -0.995500 0.002800
+vn -0.005500 0.013100 0.999900
+vn 0.094500 -0.995500 0.003400
+vn 0.011600 -0.034800 0.999300
+vn -0.001200 0.024100 0.999700
+vn 0.775200 0.631700 -0.005400
+vn 0.995500 0.094500 -0.000300
+vn -0.775200 -0.631700 0.002100
+vn 0.995500 0.094400 -0.001000
+vn -0.468300 0.883500 -0.007500
+vn -0.005600 0.016000 0.999900
+vn 0.007300 0.019500 0.999800
+vn 0.468300 -0.883500 0.002500
+vn 0.631700 -0.775200 0.002200
+vn -0.003700 0.050300 0.998700
+vn 0.021300 0.028700 0.999400
+vn -0.293600 -0.955900 0.002700
+vn -0.101500 -0.994800 0.003400
+vn -0.004400 0.013800 0.999900
+vn -0.287000 0.957900 -0.008200
+vn 0.101500 0.994800 -0.008500
+vn -0.000100 0.010800 0.999900
+vn -0.880300 0.474500 -0.004000
+vn 0.883600 0.468300 -0.004000
+vn -0.003500 0.023000 0.999700
+vn 0.293600 0.955900 -0.008100
+vn 0.017100 0.042900 0.998900
+vn 0.994800 -0.101500 0.000300
+vn -0.286900 0.957900 -0.001800
+vn -0.995500 -0.094500 0.000300
+vn -0.883600 -0.468300 0.001600
+vn -0.020600 0.036600 0.999100
+vn -0.994000 0.109100 0.000200
+vn -0.000300 0.009700 1.000000
+vn -0.000000 0.011200 0.999900
+vn 0.004400 0.000400 1.000000
+vn 0.770800 -0.637100 0.001800
+vn 0.995100 -0.099000 0.000400
+vn -0.474500 -0.880300 0.002500
+vn -0.637100 -0.770800 0.002600
+vn 0.770800 -0.637100 0.002200
+vn -0.883600 -0.468300 0.001300
+vn 0.101500 0.994800 -0.001800
+vn -0.000100 0.009500 1.000000
+vn 0.000800 0.009900 1.000000
+vn -0.631700 0.775200 -0.006600
+vn 0.956200 0.292700 -0.000500
+vn -0.016900 0.043300 0.998900
+vn 0.637100 0.770800 -0.006600
+vn -0.955900 0.293600 -0.001000
+vn -0.000000 0.010700 0.999900
+vn 0.286900 -0.957900 0.002700
+vn 0.011200 0.047900 0.998800
+vn -0.000300 0.010700 0.999900
+vn 0.367900 -0.925900 0.085900
+vn -0.958000 -0.286900 0.001000
+vn -0.021400 0.029100 0.999300
+vn 0.007400 -0.032300 0.999400
+vn -0.631700 0.775200 -0.001400
+vn -0.293600 -0.955900 0.003200
+vn 0.775200 0.631700 -0.001200
+vn 0.955900 -0.293600 0.001000
+vn -0.994800 0.101500 -0.000300
+vn -0.005800 0.018500 0.999800
+vn 0.006900 0.014300 0.999900
+vn -0.770800 0.637100 -0.001200
+vn 0.474500 0.880300 -0.001600
+vn -0.474500 -0.880300 0.003000
+vn 0.015100 0.013600 0.999800
+vn 0.880300 -0.474500 0.001400
+vn -0.094500 0.995500 -0.008500
+vn -0.185900 -0.978500 0.089500
+vn 0.007600 0.016800 0.999800
+vn 0.003500 0.022800 0.999700
+vn 0.474500 0.880200 -0.007500
+vn -0.770800 0.637100 -0.005400
+vn 0.019100 0.021500 0.999600
+vn -0.000300 0.010400 0.999900
+vn 0.468300 -0.883600 0.003000
+vn 0.957400 0.288700 -0.002100
+vn -0.001800 -0.000500 1.000000
+vn -0.955100 -0.296300 0.000800
+vn 0.287000 -0.957900 0.003200
+vn -0.468300 0.883600 -0.001600
+vn 0.001400 0.024400 0.999700
+vn 0.094600 -0.995500 0.002800
+vn -0.770800 0.637000 -0.005400
+vn -0.013700 0.017000 0.999800
+vn -0.007300 0.016900 0.999800
+vn -0.001300 0.024400 0.999700
+vn 0.005100 0.020900 0.999800
+vn -0.003800 0.023600 0.999700
+vn -0.015100 0.013800 0.999800
+vn 0.005900 0.018500 0.999800
+vn 0.001300 0.024100 0.999700
+vn -0.007200 0.019600 0.999800
+vn 0.004000 0.023500 0.999700
+vn -0.006000 0.022000 0.999700
+vn 0.005500 0.015900 0.999900
+vn 0.004400 0.013700 0.999900
+vn -0.006700 0.014400 0.999900
+vn 0.001800 -0.000500 1.000000
+vn -0.012400 -0.034700 0.999300
+vn -0.007700 -0.032300 0.999400
+vn -0.374500 -0.923300 0.085900
+vn -0.017600 0.024100 0.999600
+vn 0.017500 0.023800 0.999600
+vn -0.018300 0.032100 0.999300
+vn -0.016000 0.039700 0.999100
+vn -0.010800 0.045700 0.998900
+vn 0.004100 0.049300 0.998800
+vn 0.011000 0.045400 0.998900
+vn 0.016000 0.039400 0.999100
+vn 0.018400 0.031700 0.999300
+vn 0.179100 -0.979700 0.089500
+vn 0.013700 0.016800 0.999800
+vn 0.005400 0.012900 0.999900
+vn -0.957900 -0.286900 0.002400
+vn -0.880300 0.474400 -0.004000
+vn -0.003800 0.049400 0.998800
+vn -0.955900 0.293500 -0.002500
+vn -0.004700 0.000500 1.000000
+vn 0.637100 0.770700 -0.006600
+vn 0.958000 0.286800 -0.002400
+vn 0.468300 -0.883600 0.002500
+vn 0.955900 -0.293600 0.002500
+vn 0.957900 0.286900 -0.001000
+vn -0.954100 0.299500 -0.000600
+vn 0.094600 -0.995500 0.002900
+vn -0.010800 0.045800 0.998900
+vn -0.012300 -0.034700 0.999300
+vn -0.004500 0.013800 0.999900
+vn -0.287000 0.957900 -0.001800
+vn 0.007300 -0.032300 0.999400
+vn 0.293700 0.955900 -0.008100
+vn 0.000300 0.010900 0.999900
+vn -0.006600 0.014400 0.999900
+vn -0.000000 0.009500 1.000000
+vn -0.019200 0.021700 0.999600
+vn 0.016100 0.039400 0.999100
+vn 0.000200 0.009700 1.000000
+vn 0.001300 0.024000 0.999700
+vn -0.015900 0.039700 0.999100
+vn -0.004600 0.000500 1.000000
+vn -0.000200 0.009700 1.000000
+vn 0.003900 0.023500 0.999700
+vn 0.000700 0.009900 1.000000
+vn 0.006700 0.014300 0.999900
+vn 0.019200 0.021500 0.999600
+vn 0.021400 0.028700 0.999400
+vn 0.004500 0.013700 0.999900
+vn 0.179100 -0.979800 0.089500
+vn 0.020600 0.036300 0.999100
+vn 0.000000 0.009700 1.000000
+vn -0.001300 0.004200 1.000000
+vn -0.001900 0.005700 1.000000
+vn 0.004800 -0.014400 0.999900
+vn 0.000500 0.009900 1.000000
+vn 0.001900 0.005700 1.000000
+vn -0.002700 0.006000 1.000000
+vn -0.000100 0.010700 0.999900
+vn 0.000100 0.010900 0.999900
+vn 0.005900 0.021800 0.999700
+vn -0.000500 0.009200 1.000000
+vn 0.003900 0.050300 0.998700
+vn -0.000100 0.009600 1.000000
+vn -0.000100 0.009700 1.000000
+vn 0.015000 0.013600 0.999800
+g HSLampen_Cube.000_Yellow
+usemtl Yellow
+s off
+f 16/1/1 15/2/1 17/3/1
+f 64/4/2 4/5/2 16/6/2
+f 16/6/3 20/7/3 32/8/3
+f 64/4/4 40/9/4 48/10/4
+f 48/10/4 52/11/4 64/4/4
+f 16/6/3 4/5/3 8/12/3
+f 8/12/3 10/13/3 16/6/3
+f 32/8/3 20/7/3 24/14/3
+f 24/14/2 28/15/2 32/8/2
+f 32/8/5 34/16/5 40/9/5
+f 40/9/4 44/17/4 46/18/4
+f 64/4/4 52/11/4 56/19/4
+f 56/19/4 60/20/4 64/4/4
+f 64/4/6 2/21/6 4/5/6
+f 4/5/7 6/22/7 8/12/7
+f 16/6/3 10/13/3 12/23/3
+f 12/23/3 14/24/3 16/6/3
+f 16/6/8 18/25/8 20/7/8
+f 20/7/2 22/26/2 24/14/2
+f 24/14/9 26/27/9 28/15/9
+f 28/15/7 30/28/7 32/8/7
+f 40/9/10 34/16/10 36/29/10
+f 36/29/11 38/30/11 40/9/11
+f 40/9/12 42/31/12 44/17/12
+f 40/9/4 46/18/4 48/10/4
+f 48/10/13 50/32/13 52/11/13
+f 52/11/4 54/33/4 56/19/4
+f 56/19/14 58/34/14 60/20/14
+f 60/20/15 62/35/15 64/4/15
+f 2/36/16 64/37/16 1/38/16
+f 30/39/17 29/40/17 32/41/17
+f 34/42/18 32/41/18 33/43/18
+f 62/44/19 61/45/19 64/37/19
+f 66/46/20 65/47/20 128/48/20
+f 94/49/21 96/50/21 93/51/21
+f 98/52/22 97/53/22 96/50/22
+f 126/54/23 128/48/23 125/55/23
+f 55/56/24 57/57/24 58/58/24
+f 57/59/25 121/60/25 123/61/25
+f 87/62/26 89/63/26 25/64/26
+f 79/65/27 81/66/27 17/67/27
+f 75/68/28 11/69/28 9/70/28
+f 81/66/29 83/71/29 19/72/29
+f 123/61/30 125/73/30 61/74/30
+f 73/75/31 9/70/31 7/76/31
+f 79/65/32 15/77/32 13/78/32
+f 85/79/33 87/62/33 23/80/33
+f 11/69/34 75/68/34 77/81/34
+f 83/71/35 85/79/35 21/82/35
+f 71/83/36 7/76/36 5/84/36
+f 69/85/37 5/84/37 3/86/37
+f 89/63/38 91/87/38 27/88/38
+f 127/89/39 65/90/39 1/91/39
+f 125/73/40 127/89/40 63/92/40
+f 97/93/41 33/94/41 31/95/41
+f 91/87/42 93/96/42 29/97/42
+f 55/98/43 119/99/43 121/60/43
+f 101/100/44 103/101/44 39/102/44
+f 53/103/45 117/104/45 119/99/45
+f 51/105/46 115/106/46 117/104/46
+f 49/107/47 113/108/47 115/106/47
+f 109/109/48 111/110/48 47/111/48
+f 107/112/49 109/109/49 45/113/49
+f 105/114/50 107/112/50 43/115/50
+f 103/101/51 105/114/51 41/116/51
+f 67/117/52 3/86/52 1/91/52
+f 99/118/53 101/100/53 37/119/53
+f 99/118/54 35/120/54 33/94/54
+f 40/9/55 64/4/55 16/6/55
+f 64/37/56 63/121/56 1/38/56
+f 73/122/57 71/123/57 72/124/57
+f 88/125/58 87/126/58 85/127/58
+f 24/128/59 23/129/59 25/130/59
+f 86/131/60 85/127/60 83/132/60
+f 116/133/61 115/134/61 113/135/61
+f 18/136/62 17/3/62 19/137/62
+f 82/138/63 81/139/63 79/140/63
+f 13/141/64 15/2/64 16/1/64
+f 84/142/65 83/132/65 81/143/65
+f 9/144/66 11/145/66 12/146/66
+f 7/147/67 9/144/67 10/148/67
+f 26/149/68 25/130/68 27/150/68
+f 3/151/69 5/152/69 6/153/69
+f 1/38/70 3/151/70 4/154/70
+f 29/40/71 31/155/71 32/41/71
+f 32/41/72 31/155/72 33/43/72
+f 57/57/73 59/156/73 60/157/73
+f 47/111/74 111/110/74 113/108/74
+f 59/156/75 61/45/75 62/44/75
+f 95/158/76 31/95/76 29/97/76
+f 53/159/77 55/56/77 56/160/77
+f 51/161/78 53/159/78 54/162/78
+f 90/163/79 89/164/79 87/126/79
+f 118/165/80 117/166/80 115/134/80
+f 44/167/81 43/168/81 45/169/81
+f 42/170/82 41/171/82 43/168/82
+f 40/172/83 39/173/83 41/171/83
+f 38/174/84 37/175/84 39/173/84
+f 36/176/85 35/177/85 37/175/85
+f 34/42/86 33/43/86 35/177/86
+f 61/45/87 63/121/87 64/37/87
+f 65/47/20 127/178/20 128/48/20
+f 122/179/88 121/180/88 119/181/88
+f 120/182/89 119/181/89 117/166/89
+f 92/183/90 91/184/90 89/164/90
+f 47/185/91 49/186/91 50/187/91
+f 5/152/92 7/147/92 8/188/92
+f 20/189/93 19/137/93 21/190/93
+f 114/191/94 113/135/94 111/192/94
+f 79/140/95 77/193/95 78/194/95
+f 77/193/96 75/195/96 76/196/96
+f 75/195/97 73/122/97 74/197/97
+f 28/198/98 27/150/98 29/40/98
+f 71/123/99 69/199/99 70/200/99
+f 69/199/100 67/201/100 68/202/100
+f 68/202/101 67/201/101 65/47/101
+f 96/50/21 95/203/21 93/51/21
+f 97/53/102 95/203/102 96/50/102
+f 49/186/103 51/161/103 52/204/103
+f 126/54/104 125/55/104 123/205/104
+f 124/206/105 123/205/105 121/180/105
+f 92/183/106 94/49/106 93/51/106
+f 46/207/107 45/169/107 47/208/107
+f 22/209/108 21/190/108 23/129/108
+f 11/145/109 13/141/109 14/210/109
+f 111/192/110 109/211/110 110/212/110
+f 109/211/111 107/213/111 108/214/111
+f 107/213/112 105/215/112 106/216/112
+f 105/215/113 103/217/113 104/218/113
+f 103/217/114 101/219/114 102/220/114
+f 101/219/115 99/221/115 100/222/115
+f 99/221/116 97/53/116 98/52/116
+f 128/48/23 127/178/23 125/55/23
+f 18/136/117 16/1/117 17/3/117
+f 56/160/118 55/56/118 58/58/118
+f 59/223/119 57/59/119 123/61/119
+f 23/80/120 87/62/120 25/64/120
+f 15/77/121 79/65/121 17/67/121
+f 73/75/122 75/68/122 9/70/122
+f 17/67/123 81/66/123 19/72/123
+f 59/223/124 123/61/124 61/74/124
+f 71/83/125 73/75/125 7/76/125
+f 77/81/126 79/65/126 13/78/126
+f 21/82/127 85/79/127 23/80/127
+f 13/78/128 11/69/128 77/81/128
+f 19/72/129 83/71/129 21/82/129
+f 69/85/130 71/83/130 5/84/130
+f 67/117/131 69/85/131 3/86/131
+f 25/64/132 89/63/132 27/88/132
+f 63/92/133 127/89/133 1/91/133
+f 61/74/134 125/73/134 63/92/134
+f 95/158/135 97/93/135 31/95/135
+f 27/88/136 91/87/136 29/97/136
+f 57/59/137 55/98/137 121/60/137
+f 37/119/138 101/100/138 39/102/138
+f 55/98/139 53/103/139 119/99/139
+f 53/103/140 51/105/140 117/104/140
+f 51/105/141 49/107/141 115/106/141
+f 45/113/142 109/109/142 47/111/142
+f 43/115/143 107/112/143 45/113/143
+f 41/116/144 105/114/144 43/115/144
+f 39/102/145 103/101/145 41/116/145
+f 65/90/146 67/117/146 1/91/146
+f 35/120/147 99/118/147 37/119/147
+f 97/93/148 99/118/148 33/94/148
+f 32/8/5 40/9/5 16/6/5
+f 74/197/57 73/122/57 72/124/57
+f 86/131/58 88/125/58 85/127/58
+f 26/149/59 24/128/59 25/130/59
+f 84/142/149 86/131/149 83/132/149
+f 114/191/61 116/133/61 113/135/61
+f 20/189/62 18/136/62 19/137/62
+f 80/224/63 82/138/63 79/140/63
+f 14/210/64 13/141/64 16/1/64
+f 82/225/65 84/142/65 81/143/65
+f 10/148/66 9/144/66 12/146/66
+f 8/188/67 7/147/67 10/148/67
+f 28/198/68 26/149/68 27/150/68
+f 4/154/69 3/151/69 6/153/69
+f 2/36/150 1/38/150 4/154/150
+f 58/58/151 57/57/151 60/157/151
+f 49/107/152 47/111/152 113/108/152
+f 60/157/153 59/156/153 62/44/153
+f 93/96/154 95/158/154 29/97/154
+f 54/162/77 53/159/77 56/160/77
+f 52/204/155 51/161/155 54/162/155
+f 88/125/79 90/163/79 87/126/79
+f 116/133/80 118/165/80 115/134/80
+f 46/207/81 44/167/81 45/169/81
+f 44/167/82 42/170/82 43/168/82
+f 42/170/156 40/172/156 41/171/156
+f 40/172/84 38/174/84 39/173/84
+f 38/174/157 36/176/157 37/175/157
+f 36/176/158 34/42/158 35/177/158
+f 120/182/88 122/179/88 119/181/88
+f 118/165/89 120/182/89 117/166/89
+f 90/163/90 92/183/90 89/164/90
+f 48/226/91 47/185/91 50/187/91
+f 6/153/92 5/152/92 8/188/92
+f 22/209/93 20/189/93 21/190/93
+f 112/227/94 114/191/94 111/192/94
+f 80/224/95 79/140/95 78/194/95
+f 78/194/96 77/193/96 76/196/96
+f 76/196/97 75/195/97 74/197/97
+f 30/39/159 28/198/159 29/40/159
+f 72/124/99 71/123/99 70/200/99
+f 70/200/100 69/199/100 68/202/100
+f 66/46/160 68/202/160 65/47/160
+f 50/187/161 49/186/161 52/204/161
+f 124/206/104 126/54/104 123/205/104
+f 122/179/105 124/206/105 121/180/105
+f 91/184/162 92/183/162 93/51/162
+f 48/228/107 46/207/107 47/208/107
+f 24/128/108 22/209/108 23/129/108
+f 12/146/109 11/145/109 14/210/109
+f 112/227/110 111/192/110 110/212/110
+f 110/212/111 109/211/111 108/214/111
+f 108/214/112 107/213/112 106/216/112
+f 106/216/113 105/215/113 104/218/113
+f 104/218/114 103/217/114 102/220/114
+f 102/220/115 101/219/115 100/222/115
+f 100/222/116 99/221/116 98/52/116
+g HSLampen_Cube.000_Green
+usemtl Green
+f 272/1/1 271/2/1 273/3/1
+f 320/4/2 260/5/2 272/6/2
+f 272/6/3 276/7/3 288/8/3
+f 320/4/4 296/9/4 304/10/4
+f 304/10/4 308/11/4 320/4/4
+f 272/6/3 260/5/3 264/12/3
+f 264/12/3 266/13/3 272/6/3
+f 288/8/3 276/7/3 280/14/3
+f 280/14/2 284/15/2 288/8/2
+f 288/8/5 290/16/5 296/9/5
+f 296/9/4 300/17/4 302/18/4
+f 320/4/4 308/11/4 312/19/4
+f 312/19/4 316/20/4 320/4/4
+f 320/4/6 258/21/6 260/5/6
+f 260/5/7 262/22/7 264/12/7
+f 272/6/3 266/13/3 268/23/3
+f 268/23/3 270/24/3 272/6/3
+f 272/6/8 274/25/8 276/7/8
+f 276/7/2 278/26/2 280/14/2
+f 280/14/9 282/27/9 284/15/9
+f 284/15/3 286/28/3 288/8/3
+f 296/9/163 290/16/163 292/29/163
+f 292/29/11 294/30/11 296/9/11
+f 296/9/164 298/31/164 300/17/164
+f 296/9/4 302/18/4 304/10/4
+f 304/10/13 306/32/13 308/11/13
+f 308/11/4 310/33/4 312/19/4
+f 312/19/165 314/34/165 316/20/165
+f 316/20/15 318/35/15 320/4/15
+f 258/36/16 320/37/16 257/38/16
+f 286/39/17 285/40/17 288/41/17
+f 290/42/18 288/41/18 289/43/18
+f 318/44/19 317/45/19 320/37/19
+f 322/46/20 321/47/20 384/48/20
+f 350/49/21 352/50/21 349/51/21
+f 354/52/22 353/53/22 352/50/22
+f 382/54/23 384/48/23 381/55/23
+f 311/56/24 313/57/24 314/58/24
+f 313/59/25 377/60/25 379/61/25
+f 343/62/26 345/63/26 281/64/26
+f 335/65/27 337/66/27 273/67/27
+f 331/68/28 267/69/28 265/70/28
+f 337/66/29 339/71/29 275/72/29
+f 379/61/30 381/73/30 317/74/30
+f 329/75/31 265/70/31 263/76/31
+f 335/65/32 271/77/32 269/78/32
+f 341/79/33 343/62/33 279/80/33
+f 267/69/34 331/68/34 333/81/34
+f 339/71/35 341/79/35 277/82/35
+f 327/83/36 263/76/36 261/84/36
+f 325/85/37 261/84/37 259/86/37
+f 345/63/38 347/87/38 283/88/38
+f 383/89/39 321/90/39 257/91/39
+f 381/73/166 383/89/166 319/92/166
+f 353/93/41 289/94/41 287/95/41
+f 347/87/42 349/96/42 285/97/42
+f 311/98/43 375/99/43 377/60/43
+f 357/100/167 359/101/167 295/102/167
+f 309/103/45 373/104/45 375/99/45
+f 307/105/46 371/106/46 373/104/46
+f 305/107/47 369/108/47 371/106/47
+f 365/109/48 367/110/48 303/111/48
+f 363/112/49 365/109/49 301/113/49
+f 361/114/50 363/112/50 299/115/50
+f 359/101/168 361/114/168 297/116/168
+f 323/117/52 259/86/52 257/91/52
+f 355/118/53 357/100/53 293/119/53
+f 355/118/54 291/120/54 289/94/54
+f 296/9/55 320/4/55 272/6/55
+f 320/37/56 319/121/56 257/38/56
+f 329/122/57 327/123/57 328/124/57
+f 344/125/58 343/126/58 341/127/58
+f 280/128/59 279/129/59 281/130/59
+f 342/131/60 341/127/60 339/132/60
+f 372/133/61 371/134/61 369/135/61
+f 274/136/62 273/3/62 275/137/62
+f 338/138/63 337/139/63 335/140/63
+f 269/141/64 271/2/64 272/1/64
+f 340/142/65 339/132/65 337/143/65
+f 265/144/66 267/145/66 268/146/66
+f 263/147/67 265/144/67 266/148/67
+f 282/149/68 281/130/68 283/150/68
+f 259/151/69 261/152/69 262/153/69
+f 257/38/70 259/151/70 260/154/70
+f 285/40/71 287/155/71 288/41/71
+f 288/41/72 287/155/72 289/43/72
+f 313/57/73 315/156/73 316/157/73
+f 303/111/74 367/110/74 369/108/74
+f 315/156/75 317/45/75 318/44/75
+f 351/158/76 287/95/76 285/97/76
+f 309/159/77 311/56/77 312/160/77
+f 307/161/78 309/159/78 310/162/78
+f 346/163/79 345/164/79 343/126/79
+f 374/165/80 373/166/80 371/134/80
+f 300/167/81 299/168/81 301/169/81
+f 298/170/82 297/171/82 299/168/82
+f 296/172/83 295/173/83 297/171/83
+f 294/174/84 293/175/84 295/173/84
+f 292/176/85 291/177/85 293/175/85
+f 290/42/86 289/43/86 291/177/86
+f 317/45/87 319/121/87 320/37/87
+f 321/47/20 383/178/20 384/48/20
+f 378/179/88 377/180/88 375/181/88
+f 376/182/89 375/181/89 373/166/89
+f 348/183/90 347/184/90 345/164/90
+f 303/185/91 305/186/91 306/187/91
+f 261/152/92 263/147/92 264/188/92
+f 276/189/93 275/137/93 277/190/93
+f 370/191/94 369/135/94 367/192/94
+f 335/140/95 333/193/95 334/194/95
+f 333/193/96 331/195/96 332/196/96
+f 331/195/97 329/122/97 330/197/97
+f 284/198/98 283/150/98 285/40/98
+f 327/123/99 325/199/99 326/200/99
+f 325/199/100 323/201/100 324/202/100
+f 324/202/101 323/201/101 321/47/101
+f 352/50/21 351/203/21 349/51/21
+f 353/53/102 351/203/102 352/50/102
+f 305/186/103 307/161/103 308/204/103
+f 382/54/104 381/55/104 379/205/104
+f 380/206/105 379/205/105 377/180/105
+f 348/183/106 350/49/106 349/51/106
+f 302/207/107 301/169/107 303/208/107
+f 278/209/108 277/190/108 279/129/108
+f 267/145/109 269/141/109 270/210/109
+f 367/192/110 365/211/110 366/212/110
+f 365/211/111 363/213/111 364/214/111
+f 363/213/112 361/215/112 362/216/112
+f 361/215/113 359/217/113 360/218/113
+f 359/217/114 357/219/114 358/220/114
+f 357/219/115 355/221/115 356/222/115
+f 355/221/116 353/53/116 354/52/116
+f 384/48/23 383/178/23 381/55/23
+f 274/136/117 272/1/117 273/3/117
+f 312/160/118 311/56/118 314/58/118
+f 315/223/119 313/59/119 379/61/119
+f 279/80/120 343/62/120 281/64/120
+f 271/77/121 335/65/121 273/67/121
+f 329/75/122 331/68/122 265/70/122
+f 273/67/123 337/66/123 275/72/123
+f 315/223/124 379/61/124 317/74/124
+f 327/83/169 329/75/169 263/76/169
+f 333/81/126 335/65/126 269/78/126
+f 277/82/127 341/79/127 279/80/127
+f 269/78/128 267/69/128 333/81/128
+f 275/72/129 339/71/129 277/82/129
+f 325/85/130 327/83/130 261/84/130
+f 323/117/131 325/85/131 259/86/131
+f 281/64/132 345/63/132 283/88/132
+f 319/92/133 383/89/133 257/91/133
+f 317/74/134 381/73/134 319/92/134
+f 351/158/135 353/93/135 287/95/135
+f 283/88/136 347/87/136 285/97/136
+f 313/59/137 311/98/137 377/60/137
+f 293/119/138 357/100/138 295/102/138
+f 311/98/139 309/103/139 375/99/139
+f 309/103/140 307/105/140 373/104/140
+f 307/105/141 305/107/141 371/106/141
+f 301/113/142 365/109/142 303/111/142
+f 299/115/143 363/112/143 301/113/143
+f 297/116/170 361/114/170 299/115/170
+f 295/102/145 359/101/145 297/116/145
+f 321/90/146 323/117/146 257/91/146
+f 291/120/171 355/118/171 293/119/171
+f 353/93/148 355/118/148 289/94/148
+f 288/8/5 296/9/5 272/6/5
+f 330/197/57 329/122/57 328/124/57
+f 342/131/58 344/125/58 341/127/58
+f 282/149/59 280/128/59 281/130/59
+f 340/142/149 342/131/149 339/132/149
+f 370/191/61 372/133/61 369/135/61
+f 276/189/62 274/136/62 275/137/62
+f 336/224/63 338/138/63 335/140/63
+f 270/210/64 269/141/64 272/1/64
+f 338/225/65 340/142/65 337/143/65
+f 266/148/66 265/144/66 268/146/66
+f 264/188/67 263/147/67 266/148/67
+f 284/198/68 282/149/68 283/150/68
+f 260/154/69 259/151/69 262/153/69
+f 258/36/150 257/38/150 260/154/150
+f 314/58/151 313/57/151 316/157/151
+f 305/107/152 303/111/152 369/108/152
+f 316/157/153 315/156/153 318/44/153
+f 349/96/172 351/158/172 285/97/172
+f 310/162/77 309/159/77 312/160/77
+f 308/204/155 307/161/155 310/162/155
+f 344/125/79 346/163/79 343/126/79
+f 372/133/80 374/165/80 371/134/80
+f 302/207/81 300/167/81 301/169/81
+f 300/167/82 298/170/82 299/168/82
+f 298/170/156 296/172/156 297/171/156
+f 296/172/84 294/174/84 295/173/84
+f 294/174/157 292/176/157 293/175/157
+f 292/176/158 290/42/158 291/177/158
+f 376/182/88 378/179/88 375/181/88
+f 374/165/89 376/182/89 373/166/89
+f 346/163/90 348/183/90 345/164/90
+f 304/226/91 303/185/91 306/187/91
+f 262/153/92 261/152/92 264/188/92
+f 278/209/93 276/189/93 277/190/93
+f 368/227/94 370/191/94 367/192/94
+f 336/224/95 335/140/95 334/194/95
+f 334/194/96 333/193/96 332/196/96
+f 332/196/97 331/195/97 330/197/97
+f 286/39/159 284/198/159 285/40/159
+f 328/124/99 327/123/99 326/200/99
+f 326/200/100 325/199/100 324/202/100
+f 322/46/160 324/202/160 321/47/160
+f 306/187/161 305/186/161 308/204/161
+f 380/206/104 382/54/104 379/205/104
+f 378/179/105 380/206/105 377/180/105
+f 347/184/162 348/183/162 349/51/162
+f 304/228/107 302/207/107 303/208/107
+f 280/128/108 278/209/108 279/129/108
+f 268/146/109 267/145/109 270/210/109
+f 368/227/110 367/192/110 366/212/110
+f 366/212/111 365/211/111 364/214/111
+f 364/214/112 363/213/112 362/216/112
+f 362/216/113 361/215/113 360/218/113
+f 360/218/114 359/217/114 358/220/114
+f 358/220/115 357/219/115 356/222/115
+f 356/222/116 355/221/116 354/52/116
+g HSLampen_Cube.000_Distance
+usemtl Distance
+f 132/5/173 134/22/173 136/12/173
+f 185/59/174 249/60/174 251/61/174
+f 176/10/175 180/11/175 192/4/175
+f 168/9/176 162/16/176 164/29/176
+f 252/206/177 251/205/177 249/180/177
+f 152/14/178 156/15/178 160/8/178
+f 188/20/179 190/35/179 192/4/179
+f 187/156/180 189/45/180 190/44/180
+f 225/53/181 223/203/181 224/50/181
+f 220/183/182 219/184/182 217/164/182
+f 248/182/183 247/181/183 245/166/183
+f 164/29/184 166/30/184 168/9/184
+f 156/198/185 155/150/185 157/40/185
+f 168/9/186 172/17/186 174/18/186
+f 205/193/187 203/195/187 204/196/187
+f 201/122/188 199/123/188 200/124/188
+f 231/101/189 233/114/189 169/116/189
+f 210/138/190 209/139/190 207/140/190
+f 133/152/191 135/147/191 136/188/191
+f 158/39/192 157/40/192 160/41/192
+f 141/141/193 143/2/193 144/1/193
+f 160/8/194 148/7/194 152/14/194
+f 180/11/195 182/33/195 184/19/195
+f 176/10/196 178/32/196 180/11/196
+f 190/44/197 189/45/197 192/37/197
+f 197/199/198 195/201/198 196/202/198
+f 192/37/199 191/121/199 129/38/199
+f 203/68/200 139/69/200 137/70/200
+f 211/71/201 213/79/201 149/82/201
+f 192/4/175 168/9/175 176/10/175
+f 177/107/202 241/108/202 243/106/202
+f 144/6/203 138/13/203 140/23/203
+f 237/109/204 239/110/204 175/111/204
+f 160/41/205 159/155/205 161/43/205
+f 135/147/206 137/144/206 138/148/206
+f 140/23/194 142/24/194 144/6/194
+f 144/1/207 143/2/207 145/3/207
+f 251/61/208 253/73/208 189/74/208
+f 242/191/209 241/135/209 239/192/209
+f 225/93/210 161/94/210 159/95/210
+f 207/65/211 209/66/211 145/67/211
+f 166/174/212 165/175/212 167/173/212
+f 193/47/213 255/178/213 256/48/213
+f 136/12/194 138/13/194 144/6/194
+f 231/217/214 229/219/214 230/220/214
+f 162/42/215 160/41/215 161/43/215
+f 179/161/216 181/159/216 182/162/216
+f 215/62/217 217/63/217 153/64/217
+f 201/75/218 137/70/218 135/76/218
+f 148/189/219 147/137/219 149/190/219
+f 150/209/220 149/190/220 151/129/220
+f 175/111/221 239/110/221 241/108/221
+f 229/100/222 231/101/222 167/102/222
+f 139/145/223 141/141/223 142/210/223
+f 239/192/224 237/211/224 238/212/224
+f 217/63/225 219/87/225 155/88/225
+f 177/186/226 179/161/226 180/204/226
+f 174/207/227 173/169/227 175/208/227
+f 152/14/228 154/27/228 156/15/228
+f 185/57/229 187/156/229 188/157/229
+f 164/176/230 163/177/230 165/175/230
+f 209/66/231 211/71/231 147/72/231
+f 172/167/232 171/168/232 173/169/232
+f 233/114/233 235/112/233 171/115/233
+f 254/54/234 256/48/234 253/55/234
+f 212/142/235 211/132/235 209/143/235
+f 226/52/236 225/53/236 224/50/236
+f 229/219/237 227/221/237 228/222/237
+f 181/103/238 245/104/238 247/99/238
+f 189/45/239 191/121/239 192/37/239
+f 184/19/240 186/34/240 188/20/240
+f 130/36/102 192/37/102 129/38/102
+f 194/46/213 193/47/213 256/48/213
+f 144/6/241 146/25/241 148/7/241
+f 144/6/194 148/7/194 160/8/194
+f 144/6/194 132/5/194 136/12/194
+f 156/15/194 158/28/194 160/8/194
+f 255/89/242 193/90/242 129/91/242
+f 152/128/243 151/129/243 153/130/243
+f 184/19/175 188/20/175 192/4/175
+f 192/4/175 180/11/175 184/19/175
+f 157/40/244 159/155/244 160/41/244
+f 137/144/245 139/145/245 140/146/245
+f 256/48/234 255/178/234 253/55/234
+f 233/215/246 231/217/246 232/218/246
+f 250/179/247 249/180/247 247/181/247
+f 131/151/248 133/152/248 134/153/248
+f 207/140/249 205/193/249 206/194/249
+f 168/9/250 170/31/250 172/17/250
+f 160/8/251 162/16/251 168/9/251
+f 181/159/252 183/56/252 184/160/252
+f 168/9/175 174/18/175 176/10/175
+f 196/202/253 195/201/253 193/47/253
+f 179/105/254 243/106/254 245/104/254
+f 168/172/255 167/173/255 169/171/255
+f 220/183/256 222/49/256 221/51/256
+f 192/4/257 132/5/257 144/6/257
+f 146/136/258 145/3/258 147/137/258
+f 235/112/259 237/109/259 173/113/259
+f 192/4/260 130/21/260 132/5/260
+f 195/117/261 131/86/261 129/91/261
+f 227/221/262 225/53/262 226/52/262
+f 183/98/263 247/99/263 249/60/263
+f 253/73/264 255/89/264 191/92/264
+f 216/125/265 215/126/265 213/127/265
+f 237/211/266 235/213/266 236/214/266
+f 199/123/267 197/199/267 198/200/267
+f 254/54/268 253/55/268 251/205/268
+f 224/50/269 223/203/269 221/51/269
+f 213/79/270 215/62/270 151/80/270
+f 148/7/257 150/26/257 152/14/257
+f 222/49/269 224/50/269 221/51/269
+f 197/85/271 133/84/271 131/86/271
+f 218/163/272 217/164/272 215/126/272
+f 203/195/273 201/122/273 202/197/273
+f 235/213/274 233/215/274 234/216/274
+f 227/118/275 163/120/275 161/94/275
+f 154/149/276 153/130/276 155/150/276
+f 175/185/277 177/186/277 178/187/277
+f 219/87/278 221/96/278 157/97/278
+f 199/83/279 135/76/279 133/84/279
+f 139/69/280 203/68/280 205/81/280
+f 170/170/281 169/171/281 171/168/281
+f 183/56/282 185/57/282 186/58/282
+f 227/118/283 229/100/283 165/119/283
+f 168/9/284 192/4/284 144/6/284
+f 246/165/285 245/166/285 243/134/285
+f 162/42/286 161/43/286 163/177/286
+f 223/158/287 159/95/287 157/97/287
+f 129/38/288 131/151/288 132/154/288
+f 244/133/289 243/134/289 241/135/289
+f 214/131/290 213/127/290 211/132/290
+f 207/65/291 143/77/291 141/78/291
+f 146/136/292 144/1/292 145/3/292
+f 184/160/293 183/56/293 186/58/293
+f 187/223/294 185/59/294 251/61/294
+f 151/80/295 215/62/295 153/64/295
+f 143/77/296 207/65/296 145/67/296
+f 201/75/297 203/68/297 137/70/297
+f 145/67/298 209/66/298 147/72/298
+f 187/223/299 251/61/299 189/74/299
+f 199/83/300 201/75/300 135/76/300
+f 205/81/301 207/65/301 141/78/301
+f 149/82/302 213/79/302 151/80/302
+f 141/78/303 139/69/303 205/81/303
+f 147/72/304 211/71/304 149/82/304
+f 197/85/305 199/83/305 133/84/305
+f 195/117/306 197/85/306 131/86/306
+f 153/64/307 217/63/307 155/88/307
+f 191/92/308 255/89/308 129/91/308
+f 189/74/309 253/73/309 191/92/309
+f 223/158/310 225/93/310 159/95/310
+f 155/88/311 219/87/311 157/97/311
+f 185/59/312 183/98/312 249/60/312
+f 165/119/313 229/100/313 167/102/313
+f 183/98/314 181/103/314 247/99/314
+f 181/103/315 179/105/315 245/104/315
+f 179/105/316 177/107/316 243/106/316
+f 173/113/317 237/109/317 175/111/317
+f 171/115/318 235/112/318 173/113/318
+f 169/116/319 233/114/319 171/115/319
+f 167/102/320 231/101/320 169/116/320
+f 193/90/321 195/117/321 129/91/321
+f 163/120/322 227/118/322 165/119/322
+f 225/93/323 227/118/323 161/94/323
+f 160/8/251 168/9/251 144/6/251
+f 202/197/188 201/122/188 200/124/188
+f 214/131/265 216/125/265 213/127/265
+f 154/149/243 152/128/243 153/130/243
+f 212/142/290 214/131/290 211/132/290
+f 242/191/289 244/133/289 241/135/289
+f 148/189/258 146/136/258 147/137/258
+f 208/224/190 210/138/190 207/140/190
+f 142/210/193 141/141/193 144/1/193
+f 210/225/235 212/142/235 209/143/235
+f 138/148/245 137/144/245 140/146/245
+f 136/188/206 135/147/206 138/148/206
+f 156/198/276 154/149/276 155/150/276
+f 132/154/248 131/151/248 134/153/248
+f 130/36/324 129/38/324 132/154/324
+f 186/58/325 185/57/325 188/157/325
+f 177/107/326 175/111/326 241/108/326
+f 188/157/327 187/156/327 190/44/327
+f 221/96/328 223/158/328 157/97/328
+f 182/162/252 181/159/252 184/160/252
+f 180/204/216 179/161/216 182/162/216
+f 216/125/272 218/163/272 215/126/272
+f 244/133/285 246/165/285 243/134/285
+f 174/207/232 172/167/232 173/169/232
+f 172/167/281 170/170/281 171/168/281
+f 170/170/329 168/172/329 169/171/329
+f 168/172/212 166/174/212 167/173/212
+f 166/174/230 164/176/230 165/175/230
+f 164/176/330 162/42/330 163/177/330
+f 248/182/247 250/179/247 247/181/247
+f 246/165/183 248/182/183 245/166/183
+f 218/163/182 220/183/182 217/164/182
+f 176/226/277 175/185/277 178/187/277
+f 134/153/191 133/152/191 136/188/191
+f 150/209/331 148/189/331 149/190/331
+f 240/227/209 242/191/209 239/192/209
+f 208/224/249 207/140/249 206/194/249
+f 206/194/187 205/193/187 204/196/187
+f 204/196/273 203/195/273 202/197/273
+f 158/39/332 156/198/332 157/40/332
+f 200/124/267 199/123/267 198/200/267
+f 198/200/198 197/199/198 196/202/198
+f 194/46/333 196/202/333 193/47/333
+f 178/187/226 177/186/226 180/204/226
+f 252/206/268 254/54/268 251/205/268
+f 250/179/177 252/206/177 249/180/177
+f 219/184/334 220/183/334 221/51/334
+f 176/228/227 174/207/227 175/208/227
+f 152/128/220 150/209/220 151/129/220
+f 140/146/223 139/145/223 142/210/223
+f 240/227/224 239/192/224 238/212/224
+f 238/212/266 237/211/266 236/214/266
+f 236/214/274 235/213/274 234/216/274
+f 234/216/246 233/215/246 232/218/246
+f 232/218/214 231/217/214 230/220/214
+f 230/220/237 229/219/237 228/222/237
+f 228/222/262 227/221/262 226/52/262
+g HSLampen_Cube.000_Repeater
+usemtl Repeater
+f 447/46/333 445/202/333 448/47/333
+f 485/15/194 483/28/194 481/8/194
+f 495/136/258 496/3/258 494/137/258
+f 495/136/335 497/1/335 496/3/335
+f 389/206/177 390/205/177 392/180/177
+f 462/105/336 464/107/336 398/106/336
+f 452/45/239 450/121/239 449/37/239
+f 511/36/102 449/37/102 512/38/102
+f 497/6/203 503/13/203 501/23/203
+f 497/1/207 498/2/207 496/3/207
+f 416/53/181 418/203/181 417/50/181
+f 418/158/287 482/95/287 484/97/287
+f 452/74/337 388/73/337 450/92/337
+f 466/185/277 464/186/277 463/187/277
+f 466/111/221 402/110/221 400/108/221
+f 424/63/338 422/87/338 486/88/338
+f 438/195/273 440/122/273 439/197/273
+f 462/161/216 460/159/216 459/162/216
+f 437/196/273 438/195/273 439/197/273
+f 494/72/304 430/71/304 492/82/304
+f 459/162/252 460/159/252 457/160/252
+f 487/149/243 489/128/243 488/130/243
+f 434/140/249 436/193/249 435/194/249
+f 406/112/259 404/109/259 468/113/259
+f 412/219/237 414/221/237 413/222/237
+f 456/57/229 454/156/229 453/157/229
+f 411/220/237 412/219/237 413/222/237
+f 393/182/247 391/179/247 394/181/247
+f 416/93/323 414/118/323 480/94/323
+f 442/83/279 506/76/279 508/84/279
+f 449/4/257 509/5/257 497/6/257
+f 475/174/230 477/176/230 476/175/230
+f 458/98/263 394/99/263 392/60/263
+f 496/67/298 432/66/298 494/72/298
+f 507/153/191 508/152/191 505/188/191
+f 397/133/285 395/165/285 398/134/285
+f 464/107/326 466/111/326 400/108/326
+f 429/142/339 430/132/339 432/143/339
+f 436/193/187 438/195/187 437/196/187
+f 454/223/299 390/61/299 452/74/299
+f 499/210/193 500/141/193 497/1/193
+f 479/42/286 480/43/286 478/177/286
+f 432/66/231 430/71/231 494/72/231
+f 465/226/277 466/185/277 463/187/277
+f 444/199/198 446/201/198 445/202/198
+f 440/75/297 438/68/297 504/70/297
+f 460/159/252 458/56/252 457/160/252
+f 456/59/312 458/98/312 392/60/312
+f 491/209/331 493/189/331 492/190/331
+f 429/142/290 427/131/290 430/132/290
+f 478/120/322 414/118/322 476/119/322
+f 388/73/340 386/89/340 450/92/340
+f 471/170/281 472/171/281 470/168/281
+f 467/207/341 469/167/341 468/169/341
+f 431/138/190 432/139/190 434/140/190
+f 450/92/308 386/89/308 512/91/308
+f 473/172/255 474/173/255 472/171/255
+f 387/54/268 388/55/268 390/205/268
+f 468/113/317 404/109/317 466/111/317
+f 497/6/241 495/25/241 493/7/241
+f 427/131/290 428/127/290 430/132/290
+f 399/191/289 397/133/289 400/135/289
+f 428/79/270 426/62/270 490/80/270
+f 493/7/257 491/26/257 489/14/257
+f 509/5/342 507/22/342 505/12/342
+f 410/217/214 412/219/214 411/220/214
+f 464/107/202 400/108/202 398/106/202
+f 438/68/200 502/69/200 504/70/200
+f 385/48/234 386/178/234 388/55/234
+f 460/103/238 396/104/238 394/99/238
+f 386/89/242 448/90/242 512/91/242
+f 409/218/214 410/217/214 411/220/214
+f 469/167/232 470/168/232 468/169/232
+f 509/154/248 510/151/248 507/153/248
+f 511/36/324 512/38/324 509/154/324
+f 443/200/198 444/199/198 445/202/198
+f 488/64/343 424/63/343 486/88/343
+f 405/214/274 406/213/274 407/216/274
+f 470/115/318 406/112/318 468/113/318
+f 489/128/243 490/129/243 488/130/243
+f 473/9/344 471/31/344 469/17/344
+f 444/85/305 442/83/305 508/84/305
+f 395/165/183 393/182/183 396/166/183
+f 456/59/345 392/60/345 390/61/345
+f 465/10/196 463/32/196 461/11/196
+f 453/20/179 451/35/179 449/4/179
+f 389/206/268 387/54/268 390/205/268
+f 493/189/219 494/137/219 492/190/219
+f 422/87/278 420/96/278 484/97/278
+f 498/77/296 434/65/296 496/67/296
+f 408/215/246 410/217/246 409/218/246
+f 487/149/276 488/130/276 486/150/276
+f 408/114/233 406/112/233 470/115/233
+f 445/202/253 446/201/253 448/47/253
+f 502/69/280 438/68/280 436/81/280
+f 506/147/206 504/144/206 503/148/206
+f 463/187/226 464/186/226 461/204/226
+f 503/148/245 504/144/245 501/146/245
+f 404/211/266 406/213/266 405/214/266
+f 489/128/220 491/209/220 490/129/220
+f 501/146/223 502/145/223 499/210/223
+f 449/4/175 473/9/175 465/10/175
+f 504/144/245 502/145/245 501/146/245
+f 387/54/234 385/48/234 388/55/234
+f 434/65/211 432/66/211 496/67/211
+f 483/39/192 484/40/192 481/41/192
+f 467/207/227 468/169/227 466/208/227
+f 473/9/176 479/16/176 477/29/176
+f 404/109/204 402/110/204 466/111/204
+f 472/116/346 408/114/346 470/115/346
+f 439/197/188 440/122/188 441/124/188
+f 481/41/205 482/155/205 480/43/205
+f 391/179/177 389/206/177 392/180/177
+f 399/191/209 400/135/209 402/192/209
+f 502/145/223 500/141/223 499/210/223
+f 481/8/194 493/7/194 489/14/194
+f 457/160/293 458/56/293 455/58/293
+f 476/119/313 412/100/313 474/102/313
+f 449/4/260 511/21/260 509/5/260
+f 492/82/302 428/79/302 490/80/302
+f 483/39/332 485/198/332 484/40/332
+f 473/172/212 475/174/212 474/173/212
+f 423/163/272 424/164/272 426/126/272
+f 457/19/175 453/20/175 449/4/175
+f 473/9/284 449/4/284 497/6/284
+f 505/188/206 506/147/206 503/148/206
+f 477/29/347 475/30/347 473/9/347
+f 454/223/294 456/59/294 390/61/294
+f 436/81/348 434/65/348 500/78/348
+f 401/227/224 402/192/224 403/212/224
+f 473/9/186 469/17/186 467/18/186
+f 448/47/213 386/178/213 385/48/213
+f 461/204/216 462/161/216 459/162/216
+f 485/198/276 487/149/276 486/150/276
+f 484/40/244 482/155/244 481/41/244
+f 497/6/194 493/7/194 481/8/194
+f 474/102/320 410/101/320 472/116/320
+f 453/157/327 454/156/327 451/44/327
+f 477/176/330 479/42/330 478/177/330
+f 431/225/235 429/142/235 432/143/235
+f 447/46/213 448/47/213 385/48/213
+f 433/224/249 434/140/249 435/194/249
+f 425/125/272 423/163/272 426/126/272
+f 481/8/251 473/9/251 497/6/251
+f 469/167/281 471/170/281 470/168/281
+f 493/189/258 495/136/258 494/137/258
+f 441/124/267 442/123/267 443/200/267
+f 465/228/227 467/207/227 466/208/227
+f 458/98/314 460/103/314 394/99/314
+f 413/222/262 414/221/262 415/52/262
+f 415/52/236 416/53/236 417/50/236
+f 442/83/300 440/75/300 506/76/300
+f 418/158/310 416/93/310 482/95/310
+f 449/4/175 461/11/175 457/19/175
+f 395/165/285 396/166/285 398/134/285
+f 391/179/247 392/180/247 394/181/247
+f 473/9/175 467/18/175 465/10/175
+f 421/183/256 419/49/256 420/51/256
+f 442/123/267 444/199/267 443/200/267
+f 419/49/269 417/50/269 420/51/269
+f 406/213/274 408/215/274 407/216/274
+f 458/56/282 456/57/282 455/58/282
+f 407/216/246 408/215/246 409/218/246
+f 397/133/289 398/134/289 400/135/289
+f 490/80/295 426/62/295 488/64/295
+f 455/58/325 456/57/325 453/157/325
+f 402/192/224 404/211/224 403/212/224
+f 475/174/212 476/175/212 474/173/212
+f 460/103/349 462/105/349 396/104/349
+f 505/12/194 503/13/194 497/6/194
+f 485/198/185 486/150/185 484/40/185
+f 433/224/190 431/138/190 434/140/190
+f 426/62/217 424/63/217 488/64/217
+f 420/96/350 418/158/350 484/97/350
+f 479/42/215 481/41/215 480/43/215
+f 423/163/182 421/183/182 424/164/182
+f 401/227/209 399/191/209 402/192/209
+f 486/88/311 422/87/311 484/97/311
+f 422/184/334 421/183/334 420/51/334
+f 403/212/266 404/211/266 405/214/266
+f 497/6/194 509/5/194 505/12/194
+f 446/117/261 510/86/261 512/91/261
+f 457/19/351 455/34/351 453/20/351
+f 500/78/352 502/69/352 436/81/352
+f 510/151/248 508/152/248 507/153/248
+f 481/8/353 479/16/353 473/9/353
+f 416/93/210 480/94/210 482/95/210
+f 393/182/183 394/181/183 396/166/183
+f 417/50/269 418/203/269 420/51/269
+f 444/85/354 508/84/354 510/86/354
+f 414/118/275 478/120/275 480/94/275
+f 414/118/355 412/100/355 476/119/355
+f 512/38/288 510/151/288 509/154/288
+f 434/65/291 498/77/291 500/78/291
+f 454/156/180 452/45/180 451/44/180
+f 421/183/182 422/184/182 424/164/182
+f 390/61/208 388/73/208 452/74/208
+f 414/221/262 416/53/262 415/52/262
+f 435/194/187 436/193/187 437/196/187
+f 427/131/265 425/125/265 428/127/265
+f 440/122/188 442/123/188 441/124/188
+f 440/75/218 504/70/218 506/76/218
+f 491/209/220 492/190/220 490/129/220
+f 412/100/356 410/101/356 474/102/356
+f 446/117/357 444/85/357 510/86/357
+f 464/186/226 462/161/226 461/204/226
+f 489/14/228 487/27/228 485/15/228
+f 477/176/230 478/177/230 476/175/230
+f 462/105/254 398/106/254 396/104/254
+f 465/10/175 461/11/175 449/4/175
+f 489/14/178 485/15/178 481/8/178
+f 501/23/194 499/24/194 497/6/194
+f 425/125/265 426/126/265 428/127/265
+f 448/90/358 446/117/358 512/91/358
+f 471/170/329 473/172/329 472/171/329
+f 410/101/359 408/114/359 472/116/359
+f 508/152/191 506/147/191 505/188/191
+f 500/141/193 498/2/193 497/1/193
+f 461/11/360 459/33/360 457/19/360
+f 451/44/197 452/45/197 449/37/197
+f 449/37/199 450/121/199 512/38/199
+f 430/71/201 428/79/201 492/82/201
+g HSLampen_Cube.000_Red
+usemtl Red
+f 528/1/1 527/2/1 529/3/1
+f 576/4/2 516/5/2 528/6/2
+f 528/6/3 532/7/3 544/8/3
+f 576/4/4 552/9/4 560/10/4
+f 560/10/4 564/11/4 576/4/4
+f 528/6/3 516/5/3 520/12/3
+f 520/12/3 522/13/3 528/6/3
+f 544/8/3 532/7/3 536/14/3
+f 536/14/2 540/15/2 544/8/2
+f 544/8/5 546/16/5 552/9/5
+f 552/9/4 556/17/4 558/18/4
+f 576/4/4 564/11/4 568/19/4
+f 568/19/4 572/20/4 576/4/4
+f 576/4/6 514/21/6 516/5/6
+f 516/5/7 518/22/7 520/12/7
+f 528/6/3 522/13/3 524/23/3
+f 524/23/3 526/24/3 528/6/3
+f 528/6/8 530/25/8 532/7/8
+f 532/7/2 534/26/2 536/14/2
+f 536/14/2 538/27/2 540/15/2
+f 540/15/3 542/28/3 544/8/3
+f 552/9/163 546/16/163 548/29/163
+f 548/29/11 550/30/11 552/9/11
+f 552/9/164 554/31/164 556/17/164
+f 552/9/4 558/18/4 560/10/4
+f 560/10/13 562/32/13 564/11/13
+f 564/11/4 566/33/4 568/19/4
+f 568/19/165 570/34/165 572/20/165
+f 572/20/361 574/35/361 576/4/361
+f 514/36/16 576/37/16 513/38/16
+f 542/39/17 541/40/17 544/41/17
+f 546/42/18 544/41/18 545/43/18
+f 574/44/19 573/45/19 576/37/19
+f 578/46/20 577/47/20 640/48/20
+f 606/49/21 608/50/21 605/51/21
+f 610/52/22 609/53/22 608/50/22
+f 638/54/23 640/48/23 637/55/23
+f 567/56/24 569/57/24 570/58/24
+f 569/59/25 633/60/25 635/61/25
+f 599/62/26 601/63/26 537/64/26
+f 591/65/27 593/66/27 529/67/27
+f 587/68/28 523/69/28 521/70/28
+f 593/66/29 595/71/29 531/72/29
+f 635/61/30 637/73/30 573/74/30
+f 585/75/31 521/70/31 519/76/31
+f 591/65/32 527/77/32 525/78/32
+f 597/79/33 599/62/33 535/80/33
+f 523/69/34 587/68/34 589/81/34
+f 595/71/35 597/79/35 533/82/35
+f 583/83/36 519/76/36 517/84/36
+f 581/85/37 517/84/37 515/86/37
+f 601/63/362 603/87/362 539/88/362
+f 639/89/39 577/90/39 513/91/39
+f 637/73/166 639/89/166 575/92/166
+f 609/93/363 545/94/363 543/95/363
+f 603/87/42 605/96/42 541/97/42
+f 567/98/43 631/99/43 633/60/43
+f 613/100/167 615/101/167 551/102/167
+f 565/103/45 629/104/45 631/99/45
+f 563/105/46 627/106/46 629/104/46
+f 561/107/47 625/108/47 627/106/47
+f 621/109/48 623/110/48 559/111/48
+f 619/112/49 621/109/49 557/113/49
+f 617/114/50 619/112/50 555/115/50
+f 615/101/168 617/114/168 553/116/168
+f 579/117/52 515/86/52 513/91/52
+f 611/118/53 613/100/53 549/119/53
+f 611/118/54 547/120/54 545/94/54
+f 552/9/55 576/4/55 528/6/55
+f 576/37/56 575/121/56 513/38/56
+f 585/122/57 583/123/57 584/124/57
+f 600/125/58 599/126/58 597/127/58
+f 536/128/59 535/129/59 537/130/59
+f 598/131/60 597/127/60 595/132/60
+f 628/133/61 627/134/61 625/135/61
+f 530/136/62 529/3/62 531/137/62
+f 594/138/63 593/139/63 591/140/63
+f 525/141/64 527/2/64 528/1/64
+f 596/142/65 595/132/65 593/143/65
+f 521/144/66 523/145/66 524/146/66
+f 519/147/67 521/144/67 522/148/67
+f 538/149/68 537/130/68 539/150/68
+f 515/151/69 517/152/69 518/153/69
+f 513/38/70 515/151/70 516/154/70
+f 541/40/71 543/155/71 544/41/71
+f 544/41/72 543/155/72 545/43/72
+f 569/57/73 571/156/73 572/157/73
+f 559/111/74 623/110/74 625/108/74
+f 571/156/75 573/45/75 574/44/75
+f 607/158/76 543/95/76 541/97/76
+f 565/159/77 567/56/77 568/160/77
+f 563/161/78 565/159/78 566/162/78
+f 602/163/79 601/164/79 599/126/79
+f 630/165/80 629/166/80 627/134/80
+f 556/167/81 555/168/81 557/169/81
+f 554/170/82 553/171/82 555/168/82
+f 552/172/83 551/173/83 553/171/83
+f 550/174/84 549/175/84 551/173/84
+f 548/176/85 547/177/85 549/175/85
+f 546/42/86 545/43/86 547/177/86
+f 573/45/87 575/121/87 576/37/87
+f 577/47/20 639/178/20 640/48/20
+f 634/179/88 633/180/88 631/181/88
+f 632/182/89 631/181/89 629/166/89
+f 604/183/90 603/184/90 601/164/90
+f 559/185/91 561/186/91 562/187/91
+f 517/152/92 519/147/92 520/188/92
+f 532/189/93 531/137/93 533/190/93
+f 626/191/94 625/135/94 623/192/94
+f 591/140/95 589/193/95 590/194/95
+f 589/193/96 587/195/96 588/196/96
+f 587/195/97 585/122/97 586/197/97
+f 540/198/98 539/150/98 541/40/98
+f 583/123/99 581/199/99 582/200/99
+f 581/199/100 579/201/100 580/202/100
+f 580/202/101 579/201/101 577/47/101
+f 608/50/21 607/203/21 605/51/21
+f 609/53/102 607/203/102 608/50/102
+f 561/186/103 563/161/103 564/204/103
+f 638/54/104 637/55/104 635/205/104
+f 636/206/105 635/205/105 633/180/105
+f 604/183/106 606/49/106 605/51/106
+f 558/207/107 557/169/107 559/208/107
+f 534/209/108 533/190/108 535/129/108
+f 523/145/109 525/141/109 526/210/109
+f 623/192/110 621/211/110 622/212/110
+f 621/211/111 619/213/111 620/214/111
+f 619/213/112 617/215/112 618/216/112
+f 617/215/113 615/217/113 616/218/113
+f 615/217/114 613/219/114 614/220/114
+f 613/219/115 611/221/115 612/222/115
+f 611/221/116 609/53/116 610/52/116
+f 640/48/23 639/178/23 637/55/23
+f 530/136/117 528/1/117 529/3/117
+f 568/160/118 567/56/118 570/58/118
+f 571/223/119 569/59/119 635/61/119
+f 535/80/120 599/62/120 537/64/120
+f 527/77/121 591/65/121 529/67/121
+f 585/75/122 587/68/122 521/70/122
+f 529/67/123 593/66/123 531/72/123
+f 571/223/124 635/61/124 573/74/124
+f 583/83/125 585/75/125 519/76/125
+f 589/81/364 591/65/364 525/78/364
+f 533/82/127 597/79/127 535/80/127
+f 525/78/128 523/69/128 589/81/128
+f 531/72/129 595/71/129 533/82/129
+f 581/85/130 583/83/130 517/84/130
+f 579/117/365 581/85/365 515/86/365
+f 537/64/366 601/63/366 539/88/366
+f 575/92/133 639/89/133 513/91/133
+f 573/74/134 637/73/134 575/92/134
+f 607/158/135 609/93/135 543/95/135
+f 539/88/136 603/87/136 541/97/136
+f 569/59/137 567/98/137 633/60/137
+f 549/119/138 613/100/138 551/102/138
+f 567/98/139 565/103/139 631/99/139
+f 565/103/140 563/105/140 629/104/140
+f 563/105/141 561/107/141 627/106/141
+f 557/113/142 621/109/142 559/111/142
+f 555/115/143 619/112/143 557/113/143
+f 553/116/170 617/114/170 555/115/170
+f 551/102/145 615/101/145 553/116/145
+f 577/90/146 579/117/146 513/91/146
+f 547/120/171 611/118/171 549/119/171
+f 609/93/148 611/118/148 545/94/148
+f 544/8/5 552/9/5 528/6/5
+f 586/197/57 585/122/57 584/124/57
+f 598/131/58 600/125/58 597/127/58
+f 538/149/59 536/128/59 537/130/59
+f 596/142/149 598/131/149 595/132/149
+f 626/191/61 628/133/61 625/135/61
+f 532/189/62 530/136/62 531/137/62
+f 592/224/63 594/138/63 591/140/63
+f 526/210/64 525/141/64 528/1/64
+f 594/225/65 596/142/65 593/143/65
+f 522/148/66 521/144/66 524/146/66
+f 520/188/67 519/147/67 522/148/67
+f 540/198/68 538/149/68 539/150/68
+f 516/154/69 515/151/69 518/153/69
+f 514/36/150 513/38/150 516/154/150
+f 570/58/151 569/57/151 572/157/151
+f 561/107/152 559/111/152 625/108/152
+f 572/157/153 571/156/153 574/44/153
+f 605/96/172 607/158/172 541/97/172
+f 566/162/77 565/159/77 568/160/77
+f 564/204/155 563/161/155 566/162/155
+f 600/125/79 602/163/79 599/126/79
+f 628/133/80 630/165/80 627/134/80
+f 558/207/81 556/167/81 557/169/81
+f 556/167/82 554/170/82 555/168/82
+f 554/170/156 552/172/156 553/171/156
+f 552/172/84 550/174/84 551/173/84
+f 550/174/157 548/176/157 549/175/157
+f 548/176/158 546/42/158 547/177/158
+f 632/182/88 634/179/88 631/181/88
+f 630/165/89 632/182/89 629/166/89
+f 602/163/90 604/183/90 601/164/90
+f 560/226/91 559/185/91 562/187/91
+f 518/153/92 517/152/92 520/188/92
+f 534/209/93 532/189/93 533/190/93
+f 624/227/94 626/191/94 623/192/94
+f 592/224/95 591/140/95 590/194/95
+f 590/194/96 589/193/96 588/196/96
+f 588/196/97 587/195/97 586/197/97
+f 542/39/159 540/198/159 541/40/159
+f 584/124/99 583/123/99 582/200/99
+f 582/200/100 581/199/100 580/202/100
+f 578/46/160 580/202/160 577/47/160
+f 562/187/161 561/186/161 564/204/161
+f 636/206/104 638/54/104 635/205/104
+f 634/179/105 636/206/105 633/180/105
+f 603/184/162 604/183/162 605/51/162
+f 560/228/107 558/207/107 559/208/107
+f 536/128/108 534/209/108 535/129/108
+f 524/146/109 523/145/109 526/210/109
+f 624/227/110 623/192/110 622/212/110
+f 622/212/111 621/211/111 620/214/111
+f 620/214/112 619/213/112 618/216/112
+f 618/216/113 617/215/113 616/218/113
+f 616/218/114 615/217/114 614/220/114
+f 614/220/115 613/219/115 612/222/115
+f 612/222/116 611/221/116 610/52/116
+g HSLampen_Cube.000_Shunt
+usemtl Shunt
+f 703/46/333 701/202/333 704/47/333
+f 741/15/194 739/28/194 737/8/194
+f 751/136/258 752/3/258 750/137/258
+f 751/136/335 753/1/335 752/3/335
+f 645/206/177 646/205/177 648/180/177
+f 718/105/316 720/107/316 654/106/316
+f 708/45/239 706/121/239 705/37/239
+f 767/36/102 705/37/102 768/38/102
+f 753/6/203 759/13/203 757/23/203
+f 753/1/207 754/2/207 752/3/207
+f 672/53/181 674/203/181 673/50/181
+f 674/158/287 738/95/287 740/97/287
+f 708/74/309 644/73/309 706/92/309
+f 722/185/277 720/186/277 719/187/277
+f 722/111/221 658/110/221 656/108/221
+f 680/63/338 678/87/338 742/88/338
+f 694/195/273 696/122/273 695/197/273
+f 718/161/216 716/159/216 715/162/216
+f 693/196/273 694/195/273 695/197/273
+f 750/72/304 686/71/304 748/82/304
+f 715/162/252 716/159/252 713/160/252
+f 743/149/243 745/128/243 744/130/243
+f 690/140/249 692/193/249 691/194/249
+f 662/112/259 660/109/259 724/113/259
+f 668/219/237 670/221/237 669/222/237
+f 712/57/229 710/156/229 709/157/229
+f 667/220/237 668/219/237 669/222/237
+f 649/182/247 647/179/247 650/181/247
+f 672/93/323 670/118/323 736/94/323
+f 698/83/279 762/76/279 764/84/279
+f 705/4/257 765/5/257 753/6/257
+f 731/174/230 733/176/230 732/175/230
+f 714/98/263 650/99/263 648/60/263
+f 752/67/298 688/66/298 750/72/298
+f 763/153/191 764/152/191 761/188/191
+f 653/133/285 651/165/285 654/134/285
+f 720/107/326 722/111/326 656/108/326
+f 685/142/235 686/132/235 688/143/235
+f 692/193/187 694/195/187 693/196/187
+f 710/223/299 646/61/299 708/74/299
+f 755/210/193 756/141/193 753/1/193
+f 735/42/286 736/43/286 734/177/286
+f 688/66/231 686/71/231 750/72/231
+f 721/226/277 722/185/277 719/187/277
+f 700/199/198 702/201/198 701/202/198
+f 696/75/297 694/68/297 760/70/297
+f 716/159/252 714/56/252 713/160/252
+f 712/59/312 714/98/312 648/60/312
+f 747/209/331 749/189/331 748/190/331
+f 685/142/290 683/131/290 686/132/290
+f 734/120/322 670/118/322 732/119/322
+f 644/73/264 642/89/264 706/92/264
+f 727/170/281 728/171/281 726/168/281
+f 723/207/232 725/167/232 724/169/232
+f 687/138/190 688/139/190 690/140/190
+f 706/92/308 642/89/308 768/91/308
+f 729/172/255 730/173/255 728/171/255
+f 643/54/268 644/55/268 646/205/268
+f 724/113/317 660/109/317 722/111/317
+f 753/6/241 751/25/241 749/7/241
+f 683/131/290 684/127/290 686/132/290
+f 655/191/289 653/133/289 656/135/289
+f 684/79/270 682/62/270 746/80/270
+f 749/7/367 747/26/367 745/14/367
+f 765/5/368 763/22/368 761/12/368
+f 666/217/214 668/219/214 667/220/214
+f 720/107/202 656/108/202 654/106/202
+f 694/68/369 758/69/369 760/70/369
+f 641/48/234 642/178/234 644/55/234
+f 716/103/238 652/104/238 650/99/238
+f 642/89/242 704/90/242 768/91/242
+f 665/218/214 666/217/214 667/220/214
+f 725/167/232 726/168/232 724/169/232
+f 765/154/248 766/151/248 763/153/248
+f 767/36/324 768/38/324 765/154/324
+f 699/200/198 700/199/198 701/202/198
+f 744/64/343 680/63/343 742/88/343
+f 661/214/274 662/213/274 663/216/274
+f 726/115/318 662/112/318 724/113/318
+f 745/128/243 746/129/243 744/130/243
+f 729/9/250 727/31/250 725/17/250
+f 700/85/305 698/83/305 764/84/305
+f 651/165/183 649/182/183 652/166/183
+f 712/59/345 648/60/345 646/61/345
+f 721/10/196 719/32/196 717/11/196
+f 709/20/179 707/35/179 705/4/179
+f 645/206/268 643/54/268 646/205/268
+f 749/189/219 750/137/219 748/190/219
+f 678/87/278 676/96/278 740/97/278
+f 754/77/296 690/65/296 752/67/296
+f 664/215/246 666/217/246 665/218/246
+f 743/149/276 744/130/276 742/150/276
+f 664/114/233 662/112/233 726/115/233
+f 701/202/253 702/201/253 704/47/253
+f 758/69/280 694/68/280 692/81/280
+f 762/147/206 760/144/206 759/148/206
+f 719/187/226 720/186/226 717/204/226
+f 759/148/245 760/144/245 757/146/245
+f 660/211/266 662/213/266 661/214/266
+f 745/128/220 747/209/220 746/129/220
+f 757/146/223 758/145/223 755/210/223
+f 705/4/175 729/9/175 721/10/175
+f 760/144/245 758/145/245 757/146/245
+f 643/54/234 641/48/234 644/55/234
+f 690/65/211 688/66/211 752/67/211
+f 739/39/192 740/40/192 737/41/192
+f 723/207/227 724/169/227 722/208/227
+f 729/9/370 735/16/370 733/29/370
+f 660/109/371 658/110/371 722/111/371
+f 728/116/346 664/114/346 726/115/346
+f 695/197/188 696/122/188 697/124/188
+f 737/41/205 738/155/205 736/43/205
+f 647/179/177 645/206/177 648/180/177
+f 655/191/209 656/135/209 658/192/209
+f 758/145/223 756/141/223 755/210/223
+f 737/8/194 749/7/194 745/14/194
+f 713/160/293 714/56/293 711/58/293
+f 732/119/313 668/100/313 730/102/313
+f 705/4/260 767/21/260 765/5/260
+f 748/82/302 684/79/302 746/80/302
+f 739/39/332 741/198/332 740/40/332
+f 729/172/212 731/174/212 730/173/212
+f 679/163/272 680/164/272 682/126/272
+f 713/19/372 709/20/372 705/4/372
+f 729/9/284 705/4/284 753/6/284
+f 761/188/206 762/147/206 759/148/206
+f 733/29/195 731/30/195 729/9/195
+f 710/223/294 712/59/294 646/61/294
+f 692/81/301 690/65/301 756/78/301
+f 657/227/224 658/192/224 659/212/224
+f 729/9/186 725/17/186 723/18/186
+f 704/47/213 642/178/213 641/48/213
+f 717/204/216 718/161/216 715/162/216
+f 741/198/276 743/149/276 742/150/276
+f 740/40/244 738/155/244 737/41/244
+f 753/6/194 749/7/194 737/8/194
+f 730/102/320 666/101/320 728/116/320
+f 709/157/327 710/156/327 707/44/327
+f 733/176/330 735/42/330 734/177/330
+f 687/225/235 685/142/235 688/143/235
+f 703/46/213 704/47/213 641/48/213
+f 689/224/249 690/140/249 691/194/249
+f 681/125/272 679/163/272 682/126/272
+f 737/8/251 729/9/251 753/6/251
+f 725/167/281 727/170/281 726/168/281
+f 749/189/258 751/136/258 750/137/258
+f 697/124/267 698/123/267 699/200/267
+f 721/228/227 723/207/227 722/208/227
+f 714/98/314 716/103/314 650/99/314
+f 669/222/262 670/221/262 671/52/262
+f 671/52/236 672/53/236 673/50/236
+f 698/83/300 696/75/300 762/76/300
+f 674/158/310 672/93/310 738/95/310
+f 705/4/175 717/11/175 713/19/175
+f 651/165/285 652/166/285 654/134/285
+f 647/179/247 648/180/247 650/181/247
+f 729/9/175 723/18/175 721/10/175
+f 677/183/256 675/49/256 676/51/256
+f 698/123/267 700/199/267 699/200/267
+f 675/49/269 673/50/269 676/51/269
+f 662/213/274 664/215/274 663/216/274
+f 714/56/282 712/57/282 711/58/282
+f 663/216/246 664/215/246 665/218/246
+f 653/133/289 654/134/289 656/135/289
+f 746/80/295 682/62/295 744/64/295
+f 711/58/325 712/57/325 709/157/325
+f 658/192/224 660/211/224 659/212/224
+f 731/174/212 732/175/212 730/173/212
+f 716/103/349 718/105/349 652/104/349
+f 761/12/194 759/13/194 753/6/194
+f 741/198/185 742/150/185 740/40/185
+f 689/224/190 687/138/190 690/140/190
+f 682/62/217 680/63/217 744/64/217
+f 676/96/328 674/158/328 740/97/328
+f 735/42/215 737/41/215 736/43/215
+f 679/163/182 677/183/182 680/164/182
+f 657/227/209 655/191/209 658/192/209
+f 742/88/311 678/87/311 740/97/311
+f 678/184/334 677/183/334 676/51/334
+f 659/212/266 660/211/266 661/214/266
+f 753/6/194 765/5/194 761/12/194
+f 702/117/261 766/86/261 768/91/261
+f 713/19/373 711/34/373 709/20/373
+f 756/78/303 758/69/303 692/81/303
+f 766/151/248 764/152/248 763/153/248
+f 737/8/251 735/16/251 729/9/251
+f 672/93/210 736/94/210 738/95/210
+f 649/182/183 650/181/183 652/166/183
+f 673/50/269 674/203/269 676/51/269
+f 700/85/271 764/84/271 766/86/271
+f 670/118/374 734/120/374 736/94/374
+f 670/118/283 668/100/283 732/119/283
+f 768/38/288 766/151/288 765/154/288
+f 690/65/291 754/77/291 756/78/291
+f 710/156/180 708/45/180 707/44/180
+f 677/183/182 678/184/182 680/164/182
+f 646/61/208 644/73/208 708/74/208
+f 670/221/262 672/53/262 671/52/262
+f 691/194/187 692/193/187 693/196/187
+f 683/131/265 681/125/265 684/127/265
+f 696/122/188 698/123/188 697/124/188
+f 696/75/218 760/70/218 762/76/218
+f 747/209/220 748/190/220 746/129/220
+f 668/100/222 666/101/222 730/102/222
+f 702/117/306 700/85/306 766/86/306
+f 720/186/226 718/161/226 717/204/226
+f 745/14/228 743/27/228 741/15/228
+f 733/176/230 734/177/230 732/175/230
+f 718/105/254 654/106/254 652/104/254
+f 721/10/175 717/11/175 705/4/175
+f 745/14/178 741/15/178 737/8/178
+f 757/23/194 755/24/194 753/6/194
+f 681/125/265 682/126/265 684/127/265
+f 704/90/321 702/117/321 768/91/321
+f 727/170/329 729/172/329 728/171/329
+f 666/101/359 664/114/359 728/116/359
+f 764/152/191 762/147/191 761/188/191
+f 756/141/193 754/2/193 753/1/193
+f 717/11/195 715/33/195 713/19/195
+f 707/44/197 708/45/197 705/37/197
+f 705/37/199 706/121/199 768/38/199
+f 686/71/201 684/79/201 748/82/201
diff --git a/advtrains/advtrains_signals_ks/models/advtrains_signals_ks_main_smr0.obj b/advtrains/advtrains_signals_ks/models/advtrains_signals_ks_main_smr0.obj
new file mode 100644
index 0000000..eb6d468
--- /dev/null
+++ b/advtrains/advtrains_signals_ks/models/advtrains_signals_ks_main_smr0.obj
@@ -0,0 +1,4280 @@
+# Blender v2.79 (sub 0) OBJ File: 'signal_ks_singlemesh_final.blend'
+# www.blender.org
+mtllib advtrains_signals_ks_main_smr0.mtl
+o KsHauptsignal_Plane.006
+v 0.028888 -0.503378 -0.439591
+v -0.028274 -0.503378 -0.439631
+v -0.028235 -0.503378 -0.496794
+v 0.028928 -0.503378 -0.496754
+v 0.028809 -0.503378 -0.325555
+v 0.028769 -0.503378 -0.268392
+v -0.028394 -0.503378 -0.268432
+v -0.028354 -0.503378 -0.325595
+v 0.028888 -0.299114 -0.439591
+v 0.028888 -0.172218 -0.439591
+v -0.028274 -0.172218 -0.439631
+v -0.028274 -0.299114 -0.439631
+v -0.028235 -0.299114 -0.496794
+v -0.028235 -0.172218 -0.496794
+v 0.028928 -0.172218 -0.496754
+v 0.028928 -0.299114 -0.496754
+v 0.028809 -0.299114 -0.325555
+v 0.028809 -0.172218 -0.325555
+v 0.028769 -0.172218 -0.268392
+v 0.028769 -0.299114 -0.268392
+v -0.028394 -0.299114 -0.268432
+v -0.028394 -0.172218 -0.268432
+v -0.028354 -0.172218 -0.325595
+v -0.028354 -0.299114 -0.325595
+v -0.135201 0.243339 -0.586523
+v -0.135219 0.242789 -0.559563
+v -0.132013 0.253858 -0.639022
+v -0.132068 0.253308 -0.559514
+v -0.126870 0.263561 -0.638975
+v -0.126926 0.263011 -0.559467
+v -0.119933 0.272074 -0.638933
+v -0.119989 0.271524 -0.559424
+v -0.111469 0.279070 -0.638896
+v -0.111524 0.278520 -0.559387
+v -0.101802 0.284280 -0.638865
+v -0.101858 0.283730 -0.559357
+v -0.091305 0.287504 -0.638844
+v -0.091361 0.286954 -0.559335
+v -0.080380 0.288619 -0.638831
+v -0.080436 0.288069 -0.559323
+v -0.069448 0.287581 -0.638828
+v -0.069504 0.287030 -0.559320
+v -0.058929 0.284430 -0.638835
+v -0.058984 0.283880 -0.559327
+v -0.049226 0.279287 -0.638851
+v -0.049281 0.278737 -0.559343
+v -0.040713 0.272350 -0.638876
+v -0.040768 0.271800 -0.559368
+v -0.033717 0.263886 -0.638909
+v -0.033772 0.263336 -0.559401
+v -0.028506 0.254219 -0.638948
+v -0.028562 0.253669 -0.559440
+v -0.025318 0.243722 -0.586445
+v -0.025337 0.243172 -0.559485
+v -0.024183 0.232316 -0.586441
+v -0.024223 0.232252 -0.559532
+v -0.025274 0.221688 -0.586283
+v -0.025260 0.221322 -0.559578
+v -0.028394 0.211344 -0.586324
+v -0.028411 0.210797 -0.559621
+v -0.033537 0.201642 -0.586366
+v -0.033554 0.201094 -0.559663
+v -0.040474 0.193129 -0.586405
+v -0.040491 0.192581 -0.559701
+v -0.048938 0.186134 -0.586439
+v -0.048955 0.185585 -0.559735
+v -0.058604 0.180924 -0.586466
+v -0.058622 0.180374 -0.559762
+v -0.069101 0.177700 -0.586486
+v -0.069119 0.177150 -0.559782
+v -0.080026 0.176585 -0.586498
+v -0.080044 0.176035 -0.559794
+v -0.090958 0.177623 -0.586502
+v -0.090977 0.177073 -0.559798
+v -0.101477 0.180774 -0.586496
+v -0.101497 0.180224 -0.559793
+v -0.111180 0.185916 -0.586483
+v -0.111200 0.185367 -0.559779
+v -0.119693 0.192853 -0.586461
+v -0.119713 0.192304 -0.559758
+v -0.126689 0.201317 -0.586433
+v -0.126709 0.200769 -0.559729
+v -0.131899 0.210983 -0.586398
+v -0.131919 0.210436 -0.559694
+v -0.135091 0.221305 -0.586361
+v -0.135144 0.220938 -0.559656
+v -0.136256 0.231924 -0.586521
+v -0.136258 0.231861 -0.559612
+v -0.137672 0.243790 -0.586520
+v -0.137717 0.243271 -0.523031
+v -0.134343 0.254782 -0.639014
+v -0.134424 0.254264 -0.522977
+v -0.128969 0.264921 -0.638963
+v -0.129050 0.264402 -0.522926
+v -0.121720 0.273816 -0.638916
+v -0.121801 0.273298 -0.522879
+v -0.112875 0.281127 -0.638876
+v -0.112956 0.280609 -0.522839
+v -0.102774 0.286572 -0.638843
+v -0.102855 0.286053 -0.522806
+v -0.091805 0.289941 -0.638820
+v -0.091886 0.289423 -0.522782
+v -0.080389 0.291105 -0.638806
+v -0.080470 0.290587 -0.522769
+v -0.068965 0.290021 -0.638803
+v -0.069047 0.289502 -0.522766
+v -0.057973 0.286728 -0.638811
+v -0.058054 0.286210 -0.522774
+v -0.047834 0.281354 -0.638829
+v -0.047915 0.280836 -0.522792
+v -0.038938 0.274105 -0.638857
+v -0.039019 0.273587 -0.522820
+v -0.031628 0.265261 -0.638893
+v -0.031709 0.264742 -0.522856
+v -0.026183 0.255160 -0.638937
+v -0.026264 0.254641 -0.522900
+v -0.022850 0.244190 -0.586438
+v -0.022895 0.243672 -0.522949
+v -0.021686 0.232775 -0.586437
+v -0.021730 0.232256 -0.523002
+v -0.022771 0.221351 -0.586289
+v -0.022815 0.220833 -0.523056
+v -0.026063 0.210359 -0.586343
+v -0.026107 0.209840 -0.523110
+v -0.031437 0.200220 -0.586394
+v -0.031481 0.199702 -0.523162
+v -0.038686 0.191324 -0.586441
+v -0.038730 0.190806 -0.523209
+v -0.047531 0.184013 -0.586481
+v -0.047575 0.183495 -0.523249
+v -0.057632 0.178569 -0.586514
+v -0.057676 0.178051 -0.523282
+v -0.068601 0.175200 -0.586538
+v -0.068645 0.174682 -0.523305
+v -0.080017 0.174035 -0.586551
+v -0.080061 0.173517 -0.523319
+v -0.091441 0.175120 -0.586554
+v -0.091485 0.174602 -0.523322
+v -0.102433 0.178413 -0.586546
+v -0.102477 0.177894 -0.523314
+v -0.112572 0.183787 -0.586528
+v -0.112616 0.183268 -0.523296
+v -0.121468 0.191035 -0.586500
+v -0.121512 0.190517 -0.523268
+v -0.128778 0.199880 -0.586464
+v -0.128823 0.199362 -0.523231
+v -0.134223 0.209981 -0.586420
+v -0.134267 0.209463 -0.523188
+v -0.137592 0.220950 -0.586371
+v -0.137637 0.220432 -0.523138
+v -0.138757 0.232366 -0.586521
+v -0.138801 0.231848 -0.523086
+v 0.097038 0.506097 -0.586361
+v 0.097019 0.505869 -0.559401
+v 0.098378 0.510448 -0.638861
+v 0.098323 0.510220 -0.559353
+v 0.100505 0.514461 -0.638817
+v 0.100450 0.514233 -0.559308
+v 0.103374 0.517982 -0.638777
+v 0.103319 0.517755 -0.559268
+v 0.106875 0.520876 -0.638743
+v 0.106820 0.520648 -0.559235
+v 0.110874 0.523031 -0.638717
+v 0.110818 0.522803 -0.559209
+v 0.115216 0.524364 -0.638700
+v 0.115160 0.524137 -0.559191
+v 0.119734 0.524825 -0.638692
+v 0.119679 0.524598 -0.559183
+v 0.124256 0.524396 -0.638693
+v 0.124201 0.524168 -0.559185
+v 0.128607 0.523093 -0.638704
+v 0.128552 0.522865 -0.559196
+v 0.132620 0.520966 -0.638724
+v 0.132565 0.520738 -0.559216
+v 0.136141 0.518097 -0.638753
+v 0.136086 0.517869 -0.559244
+v 0.139035 0.514596 -0.638788
+v 0.138980 0.514368 -0.559280
+v 0.141190 0.510597 -0.638830
+v 0.141135 0.510370 -0.559322
+v 0.142487 0.506255 -0.586328
+v 0.142469 0.506028 -0.559367
+v 0.142957 0.501537 -0.586324
+v 0.142930 0.501511 -0.559416
+v 0.142506 0.497142 -0.586166
+v 0.142501 0.496990 -0.559461
+v 0.141215 0.492863 -0.586206
+v 0.141197 0.492637 -0.559502
+v 0.139088 0.488850 -0.586246
+v 0.139070 0.488624 -0.559542
+v 0.136219 0.485329 -0.586282
+v 0.136201 0.485102 -0.559578
+v 0.132718 0.482436 -0.586312
+v 0.132700 0.482209 -0.559608
+v 0.128720 0.480281 -0.586335
+v 0.128702 0.480054 -0.559632
+v 0.124378 0.478947 -0.586351
+v 0.124360 0.478720 -0.559647
+v 0.119860 0.478486 -0.586358
+v 0.119841 0.478259 -0.559655
+v 0.115338 0.478915 -0.586358
+v 0.115319 0.478688 -0.559654
+v 0.110987 0.480219 -0.586348
+v 0.110968 0.479992 -0.559645
+v 0.106974 0.482346 -0.586331
+v 0.106954 0.482119 -0.559627
+v 0.103453 0.485215 -0.586305
+v 0.103433 0.484988 -0.559602
+v 0.100559 0.488716 -0.586274
+v 0.100539 0.488489 -0.559570
+v 0.098404 0.492714 -0.586237
+v 0.098384 0.492488 -0.559533
+v 0.097083 0.496983 -0.586199
+v 0.097050 0.496832 -0.559494
+v 0.096602 0.501376 -0.586358
+v 0.096590 0.501349 -0.559449
+v 0.096016 0.506283 -0.586357
+v 0.095972 0.506069 -0.522868
+v 0.097414 0.510830 -0.638853
+v 0.097333 0.510615 -0.522815
+v 0.099637 0.515023 -0.638803
+v 0.099556 0.514809 -0.522766
+v 0.102635 0.518703 -0.638760
+v 0.102554 0.518489 -0.522722
+v 0.106294 0.521727 -0.638723
+v 0.106213 0.521512 -0.522686
+v 0.110472 0.523979 -0.638694
+v 0.110391 0.523764 -0.522657
+v 0.115009 0.525372 -0.638675
+v 0.114928 0.525158 -0.522638
+v 0.119731 0.525854 -0.638666
+v 0.119650 0.525640 -0.522629
+v 0.124456 0.525405 -0.638668
+v 0.124375 0.525191 -0.522631
+v 0.129002 0.524043 -0.638681
+v 0.128921 0.523829 -0.522643
+v 0.133196 0.521821 -0.638703
+v 0.133115 0.521606 -0.522666
+v 0.136876 0.518822 -0.638734
+v 0.136795 0.518608 -0.522697
+v 0.139899 0.515164 -0.638774
+v 0.139818 0.514950 -0.522737
+v 0.142151 0.510986 -0.638820
+v 0.142070 0.510772 -0.522783
+v 0.143508 0.506449 -0.586322
+v 0.143464 0.506235 -0.522833
+v 0.143990 0.501727 -0.586322
+v 0.143946 0.501513 -0.522886
+v 0.143541 0.497002 -0.586173
+v 0.143497 0.496788 -0.522940
+v 0.142179 0.492455 -0.586225
+v 0.142135 0.492241 -0.522993
+v 0.139957 0.488262 -0.586274
+v 0.139912 0.488048 -0.523042
+v 0.136958 0.484583 -0.586318
+v 0.136914 0.484368 -0.523086
+v 0.133300 0.481559 -0.586355
+v 0.133256 0.481344 -0.523123
+v 0.129122 0.479307 -0.586384
+v 0.129078 0.479092 -0.523151
+v 0.124585 0.477913 -0.586403
+v 0.124541 0.477699 -0.523170
+v 0.119863 0.477432 -0.586412
+v 0.119819 0.477217 -0.523179
+v 0.115138 0.477880 -0.586410
+v 0.115094 0.477666 -0.523177
+v 0.110591 0.479242 -0.586397
+v 0.110547 0.479028 -0.523165
+v 0.106398 0.481465 -0.586375
+v 0.106354 0.481251 -0.523143
+v 0.102718 0.484463 -0.586344
+v 0.102674 0.484249 -0.523111
+v 0.099694 0.488121 -0.586304
+v 0.099650 0.487907 -0.523072
+v 0.097442 0.492299 -0.586258
+v 0.097398 0.492085 -0.523026
+v 0.096049 0.496836 -0.586208
+v 0.096005 0.496622 -0.522975
+v 0.095567 0.501558 -0.586357
+v 0.095523 0.501344 -0.522922
+v 0.064799 0.243339 -0.586384
+v 0.064781 0.242789 -0.559423
+v 0.067987 0.253858 -0.638883
+v 0.067932 0.253308 -0.559374
+v 0.073130 0.263561 -0.638836
+v 0.073074 0.263011 -0.559327
+v 0.080067 0.272074 -0.638793
+v 0.080011 0.271524 -0.559285
+v 0.088531 0.279070 -0.638756
+v 0.088476 0.278520 -0.559248
+v 0.098198 0.284280 -0.638726
+v 0.098142 0.283730 -0.559217
+v 0.108695 0.287504 -0.638704
+v 0.108639 0.286954 -0.559196
+v 0.119620 0.288619 -0.638692
+v 0.119564 0.288069 -0.559183
+v 0.130552 0.287581 -0.638689
+v 0.130496 0.287030 -0.559180
+v 0.141071 0.284430 -0.638695
+v 0.141016 0.283880 -0.559187
+v 0.150774 0.279287 -0.638712
+v 0.150719 0.278737 -0.559203
+v 0.159287 0.272350 -0.638736
+v 0.159232 0.271800 -0.559228
+v 0.166283 0.263886 -0.638769
+v 0.166228 0.263336 -0.559261
+v 0.171494 0.254219 -0.638809
+v 0.171438 0.253669 -0.559300
+v 0.174681 0.243722 -0.586305
+v 0.174663 0.243172 -0.559345
+v 0.175817 0.232316 -0.586301
+v 0.175777 0.232252 -0.559393
+v 0.174726 0.221688 -0.586144
+v 0.174740 0.221322 -0.559438
+v 0.171606 0.211344 -0.586185
+v 0.171589 0.210797 -0.559481
+v 0.166463 0.201642 -0.586227
+v 0.166446 0.201094 -0.559523
+v 0.159526 0.193129 -0.586265
+v 0.159509 0.192581 -0.559562
+v 0.151062 0.186134 -0.586299
+v 0.151045 0.185585 -0.559595
+v 0.141396 0.180924 -0.586326
+v 0.141378 0.180374 -0.559623
+v 0.130899 0.177700 -0.586346
+v 0.130881 0.177150 -0.559643
+v 0.119974 0.176585 -0.586358
+v 0.119956 0.176035 -0.559655
+v 0.109042 0.177623 -0.586362
+v 0.109023 0.177073 -0.559659
+v 0.098523 0.180774 -0.586357
+v 0.098503 0.180224 -0.559653
+v 0.088820 0.185916 -0.586343
+v 0.088800 0.185368 -0.559640
+v 0.080307 0.192853 -0.586322
+v 0.080287 0.192304 -0.559618
+v 0.073311 0.201317 -0.586293
+v 0.073291 0.200769 -0.559589
+v 0.068101 0.210983 -0.586258
+v 0.068081 0.210436 -0.559555
+v 0.064909 0.221305 -0.586222
+v 0.064856 0.220938 -0.559516
+v 0.063744 0.231924 -0.586381
+v 0.063742 0.231861 -0.559472
+v 0.062328 0.243790 -0.586381
+v 0.062283 0.243271 -0.522892
+v 0.065657 0.254782 -0.638875
+v 0.065576 0.254264 -0.522838
+v 0.071031 0.264921 -0.638823
+v 0.070950 0.264402 -0.522786
+v 0.078280 0.273816 -0.638777
+v 0.078199 0.273298 -0.522739
+v 0.087125 0.281127 -0.638736
+v 0.087044 0.280609 -0.522699
+v 0.097226 0.286572 -0.638704
+v 0.097145 0.286053 -0.522666
+v 0.108195 0.289941 -0.638680
+v 0.108114 0.289423 -0.522643
+v 0.119611 0.291105 -0.638667
+v 0.119530 0.290587 -0.522629
+v 0.131035 0.290021 -0.638664
+v 0.130953 0.289502 -0.522627
+v 0.142027 0.286728 -0.638672
+v 0.141946 0.286210 -0.522634
+v 0.152166 0.281354 -0.638690
+v 0.152085 0.280836 -0.522652
+v 0.161062 0.274105 -0.638717
+v 0.160981 0.273587 -0.522680
+v 0.168372 0.265261 -0.638754
+v 0.168291 0.264742 -0.522717
+v 0.173817 0.255160 -0.638798
+v 0.173736 0.254641 -0.522760
+v 0.177150 0.244190 -0.586299
+v 0.177105 0.243672 -0.522810
+v 0.178314 0.232775 -0.586298
+v 0.178270 0.232256 -0.522862
+v 0.177229 0.221351 -0.586149
+v 0.177185 0.220833 -0.522917
+v 0.173937 0.210359 -0.586203
+v 0.173893 0.209840 -0.522971
+v 0.168563 0.200220 -0.586254
+v 0.168519 0.199702 -0.523022
+v 0.161314 0.191324 -0.586301
+v 0.161270 0.190806 -0.523069
+v 0.152469 0.184014 -0.586342
+v 0.152425 0.183495 -0.523109
+v 0.142368 0.178569 -0.586374
+v 0.142324 0.178051 -0.523142
+v 0.131399 0.175200 -0.586398
+v 0.131355 0.174682 -0.523166
+v 0.119983 0.174035 -0.586411
+v 0.119939 0.173517 -0.523179
+v 0.108559 0.175120 -0.586414
+v 0.108515 0.174602 -0.523182
+v 0.097567 0.178413 -0.586406
+v 0.097523 0.177894 -0.523174
+v 0.087428 0.183787 -0.586388
+v 0.087384 0.183268 -0.523156
+v 0.078532 0.191035 -0.586360
+v 0.078488 0.190517 -0.523128
+v 0.071222 0.199880 -0.586324
+v 0.071177 0.199362 -0.523092
+v 0.065777 0.209981 -0.586280
+v 0.065733 0.209463 -0.523048
+v 0.062408 0.220950 -0.586231
+v 0.062363 0.220432 -0.522999
+v 0.061243 0.232366 -0.586381
+v 0.061199 0.231848 -0.522946
+v 0.095523 -0.005892 -0.522922
+v 0.095567 -0.005677 -0.586357
+v 0.096005 -0.010613 -0.522975
+v 0.096049 -0.010399 -0.586208
+v 0.097398 -0.015150 -0.523026
+v 0.097442 -0.014936 -0.586258
+v 0.099650 -0.019328 -0.523072
+v 0.099694 -0.019114 -0.586304
+v 0.102674 -0.022987 -0.523111
+v 0.102718 -0.022772 -0.586344
+v 0.106354 -0.025985 -0.523143
+v 0.106398 -0.025771 -0.586375
+v 0.110547 -0.028208 -0.523165
+v 0.110591 -0.027993 -0.586397
+v 0.115094 -0.029570 -0.523177
+v 0.115138 -0.029355 -0.586410
+v 0.119819 -0.030018 -0.523179
+v 0.119863 -0.029804 -0.586412
+v 0.124541 -0.029537 -0.523170
+v 0.124585 -0.029322 -0.586403
+v 0.129078 -0.028143 -0.523151
+v 0.129122 -0.027929 -0.586384
+v 0.133256 -0.025891 -0.523123
+v 0.133300 -0.025677 -0.586355
+v 0.136914 -0.022867 -0.523086
+v 0.136958 -0.022653 -0.586318
+v 0.139912 -0.019188 -0.523042
+v 0.139957 -0.018973 -0.586274
+v 0.142135 -0.014994 -0.522993
+v 0.142179 -0.014780 -0.586225
+v 0.143497 -0.010448 -0.522940
+v 0.143541 -0.010233 -0.586173
+v 0.143946 -0.005723 -0.522886
+v 0.143990 -0.005508 -0.586322
+v 0.143464 -0.001001 -0.522833
+v 0.143508 -0.000787 -0.586322
+v 0.142070 0.003536 -0.522783
+v 0.142151 0.003751 -0.638820
+v 0.139818 0.007714 -0.522737
+v 0.139899 0.007929 -0.638774
+v 0.136795 0.011373 -0.522697
+v 0.136876 0.011587 -0.638734
+v 0.133115 0.014371 -0.522666
+v 0.133196 0.014585 -0.638703
+v 0.128921 0.016593 -0.522643
+v 0.129002 0.016808 -0.638681
+v 0.124375 0.017955 -0.522631
+v 0.124456 0.018170 -0.638668
+v 0.119650 0.018404 -0.522629
+v 0.119731 0.018618 -0.638666
+v 0.114928 0.017922 -0.522638
+v 0.115009 0.018137 -0.638675
+v 0.110391 0.016529 -0.522657
+v 0.110472 0.016743 -0.638694
+v 0.106213 0.014277 -0.522686
+v 0.106294 0.014491 -0.638723
+v 0.102554 0.011253 -0.522722
+v 0.102635 0.011467 -0.638760
+v 0.099556 0.007574 -0.522766
+v 0.099637 0.007788 -0.638803
+v 0.097333 0.003380 -0.522815
+v 0.097414 0.003594 -0.638853
+v 0.095972 -0.001167 -0.522868
+v 0.096016 -0.000952 -0.586357
+v 0.096590 -0.005886 -0.559449
+v 0.096602 -0.005860 -0.586358
+v 0.097050 -0.010404 -0.559494
+v 0.097083 -0.010252 -0.586199
+v 0.098384 -0.014748 -0.559533
+v 0.098404 -0.014522 -0.586237
+v 0.100539 -0.018746 -0.559570
+v 0.100559 -0.018520 -0.586274
+v 0.103433 -0.022247 -0.559602
+v 0.103453 -0.022021 -0.586305
+v 0.106954 -0.025117 -0.559627
+v 0.106974 -0.024890 -0.586331
+v 0.110968 -0.027244 -0.559645
+v 0.110987 -0.027017 -0.586348
+v 0.115319 -0.028547 -0.559654
+v 0.115338 -0.028320 -0.586358
+v 0.119841 -0.028977 -0.559655
+v 0.119860 -0.028749 -0.586358
+v 0.124360 -0.028516 -0.559647
+v 0.124378 -0.028288 -0.586351
+v 0.128702 -0.027182 -0.559632
+v 0.128720 -0.026955 -0.586335
+v 0.132700 -0.025027 -0.559608
+v 0.132718 -0.024800 -0.586312
+v 0.136201 -0.022133 -0.559578
+v 0.136219 -0.021906 -0.586282
+v 0.139070 -0.018612 -0.559542
+v 0.139088 -0.018385 -0.586246
+v 0.141197 -0.014598 -0.559502
+v 0.141215 -0.014372 -0.586206
+v 0.142501 -0.010245 -0.559461
+v 0.142506 -0.010094 -0.586166
+v 0.142930 -0.005724 -0.559416
+v 0.142957 -0.005698 -0.586324
+v 0.142469 -0.001208 -0.559367
+v 0.142487 -0.000980 -0.586328
+v 0.141135 0.003134 -0.559322
+v 0.141190 0.003362 -0.638830
+v 0.138980 0.007132 -0.559280
+v 0.139035 0.007360 -0.638788
+v 0.136086 0.010633 -0.559244
+v 0.136141 0.010861 -0.638753
+v 0.132565 0.013503 -0.559216
+v 0.132620 0.013730 -0.638724
+v 0.128552 0.015630 -0.559196
+v 0.128607 0.015857 -0.638704
+v 0.124201 0.016933 -0.559185
+v 0.124256 0.017161 -0.638693
+v 0.119679 0.017362 -0.559183
+v 0.119734 0.017590 -0.638692
+v 0.115160 0.016901 -0.559191
+v 0.115216 0.017129 -0.638700
+v 0.110818 0.015568 -0.559209
+v 0.110874 0.015795 -0.638717
+v 0.106820 0.013413 -0.559235
+v 0.106875 0.013640 -0.638743
+v 0.103319 0.010519 -0.559268
+v 0.103374 0.010747 -0.638777
+v 0.100450 0.006998 -0.559308
+v 0.100505 0.007226 -0.638817
+v 0.098323 0.002985 -0.559353
+v 0.098378 0.003212 -0.638861
+v 0.097019 -0.001366 -0.559401
+v 0.097038 -0.001139 -0.586361
+v -0.035201 0.400585 -0.586453
+v -0.035219 0.400035 -0.559493
+v -0.032013 0.411104 -0.638952
+v -0.032068 0.410554 -0.559444
+v -0.026870 0.420807 -0.638906
+v -0.026926 0.420257 -0.559397
+v -0.019933 0.429320 -0.638863
+v -0.019989 0.428770 -0.559354
+v -0.011469 0.436316 -0.638826
+v -0.011524 0.435766 -0.559317
+v -0.001802 0.441526 -0.638796
+v -0.001858 0.440976 -0.559287
+v 0.008695 0.444750 -0.638774
+v 0.008639 0.444201 -0.559266
+v 0.019620 0.445865 -0.638761
+v 0.019564 0.445315 -0.559253
+v 0.030552 0.444827 -0.638758
+v 0.030496 0.444276 -0.559250
+v 0.041071 0.441676 -0.638765
+v 0.041016 0.441126 -0.559257
+v 0.050774 0.436533 -0.638781
+v 0.050719 0.435983 -0.559273
+v 0.059287 0.429597 -0.638806
+v 0.059232 0.429046 -0.559298
+v 0.066283 0.421132 -0.638839
+v 0.066228 0.420582 -0.559331
+v 0.071494 0.411466 -0.638879
+v 0.071438 0.410915 -0.559370
+v 0.074682 0.400968 -0.586375
+v 0.074663 0.400418 -0.559415
+v 0.075817 0.389562 -0.586371
+v 0.075777 0.389498 -0.559463
+v 0.074726 0.378934 -0.586213
+v 0.074740 0.378568 -0.559508
+v 0.071606 0.368590 -0.586254
+v 0.071589 0.368043 -0.559551
+v 0.066463 0.358888 -0.586296
+v 0.066446 0.358340 -0.559593
+v 0.059526 0.350376 -0.586335
+v 0.059509 0.349827 -0.559632
+v 0.051062 0.343380 -0.586369
+v 0.051045 0.342831 -0.559665
+v 0.041396 0.338170 -0.586396
+v 0.041378 0.337620 -0.559693
+v 0.030899 0.334946 -0.586416
+v 0.030881 0.334396 -0.559713
+v 0.019974 0.333831 -0.586428
+v 0.019956 0.333281 -0.559725
+v 0.009042 0.334869 -0.586432
+v 0.009023 0.334319 -0.559728
+v -0.001477 0.338020 -0.586427
+v -0.001497 0.337471 -0.559723
+v -0.011180 0.343162 -0.586413
+v -0.011200 0.342614 -0.559709
+v -0.019693 0.350099 -0.586391
+v -0.019713 0.349550 -0.559688
+v -0.026689 0.358563 -0.586363
+v -0.026709 0.358015 -0.559659
+v -0.031899 0.368229 -0.586328
+v -0.031919 0.367682 -0.559624
+v -0.035091 0.378551 -0.586292
+v -0.035144 0.378184 -0.559586
+v -0.036256 0.389171 -0.586451
+v -0.036258 0.389107 -0.559542
+v -0.037672 0.401036 -0.586450
+v -0.037717 0.400517 -0.522961
+v -0.034343 0.412028 -0.638945
+v -0.034424 0.411510 -0.522907
+v -0.028969 0.422167 -0.638893
+v -0.029050 0.421649 -0.522856
+v -0.021720 0.431063 -0.638846
+v -0.021801 0.430544 -0.522809
+v -0.012875 0.438373 -0.638806
+v -0.012956 0.437855 -0.522769
+v -0.002774 0.443818 -0.638773
+v -0.002855 0.443299 -0.522736
+v 0.008195 0.447187 -0.638750
+v 0.008114 0.446669 -0.522713
+v 0.019611 0.448351 -0.638736
+v 0.019530 0.447833 -0.522699
+v 0.031035 0.447267 -0.638734
+v 0.030953 0.446748 -0.522696
+v 0.042027 0.443974 -0.638741
+v 0.041946 0.443456 -0.522704
+v 0.052166 0.438600 -0.638759
+v 0.052085 0.438082 -0.522722
+v 0.061062 0.431351 -0.638787
+v 0.060981 0.430833 -0.522750
+v 0.068372 0.422507 -0.638824
+v 0.068291 0.421988 -0.522787
+v 0.073817 0.412406 -0.638867
+v 0.073736 0.411887 -0.522830
+v 0.077150 0.401436 -0.586368
+v 0.077105 0.400918 -0.522879
+v 0.078314 0.390021 -0.586367
+v 0.078270 0.389503 -0.522932
+v 0.077229 0.378597 -0.586219
+v 0.077185 0.378079 -0.522987
+v 0.073937 0.367605 -0.586273
+v 0.073893 0.367086 -0.523041
+v 0.068563 0.357466 -0.586324
+v 0.068519 0.356948 -0.523092
+v 0.061314 0.348570 -0.586371
+v 0.061270 0.348052 -0.523139
+v 0.052469 0.341260 -0.586412
+v 0.052425 0.340741 -0.523179
+v 0.042368 0.335815 -0.586444
+v 0.042324 0.335297 -0.523212
+v 0.031399 0.332446 -0.586468
+v 0.031355 0.331928 -0.523235
+v 0.019983 0.331281 -0.586481
+v 0.019939 0.330763 -0.523249
+v 0.008559 0.332366 -0.586484
+v 0.008515 0.331848 -0.523252
+v -0.002433 0.335659 -0.586476
+v -0.002477 0.335141 -0.523244
+v -0.012572 0.341033 -0.586458
+v -0.012616 0.340515 -0.523226
+v -0.021468 0.348281 -0.586430
+v -0.021512 0.347763 -0.523198
+v -0.028778 0.357126 -0.586394
+v -0.028823 0.356608 -0.523161
+v -0.034223 0.367227 -0.586350
+v -0.034267 0.366709 -0.523118
+v -0.037592 0.378196 -0.586301
+v -0.037637 0.377678 -0.523069
+v -0.038757 0.389612 -0.586451
+v -0.038801 0.389094 -0.523016
+v -0.004477 0.094108 -0.522992
+v -0.004433 0.094323 -0.586427
+v -0.003995 0.089387 -0.523045
+v -0.003951 0.089601 -0.586277
+v -0.002602 0.084850 -0.523096
+v -0.002558 0.085064 -0.586328
+v -0.000350 0.080672 -0.523142
+v -0.000306 0.080886 -0.586374
+v 0.002674 0.077013 -0.523181
+v 0.002718 0.077228 -0.586413
+v 0.006354 0.074015 -0.523213
+v 0.006398 0.074229 -0.586445
+v 0.010547 0.071792 -0.523235
+v 0.010591 0.072007 -0.586467
+v 0.015094 0.070430 -0.523247
+v 0.015138 0.070645 -0.586479
+v 0.019819 0.069982 -0.523249
+v 0.019863 0.070196 -0.586481
+v 0.024541 0.070463 -0.523240
+v 0.024585 0.070678 -0.586473
+v 0.029078 0.071857 -0.523221
+v 0.029122 0.072071 -0.586453
+v 0.033256 0.074109 -0.523193
+v 0.033300 0.074323 -0.586425
+v 0.036914 0.077133 -0.523156
+v 0.036958 0.077347 -0.586388
+v 0.039912 0.080812 -0.523112
+v 0.039957 0.081027 -0.586344
+v 0.042135 0.085006 -0.523063
+v 0.042179 0.085220 -0.586295
+v 0.043497 0.089552 -0.523010
+v 0.043541 0.089767 -0.586242
+v 0.043946 0.094278 -0.522956
+v 0.043990 0.094492 -0.586391
+v 0.043464 0.098999 -0.522903
+v 0.043508 0.099214 -0.586392
+v 0.042070 0.103536 -0.522852
+v 0.042151 0.103751 -0.638889
+v 0.039818 0.107714 -0.522806
+v 0.039899 0.107929 -0.638844
+v 0.036795 0.111373 -0.522767
+v 0.036876 0.111587 -0.638804
+v 0.033115 0.114371 -0.522735
+v 0.033196 0.114585 -0.638773
+v 0.028921 0.116594 -0.522713
+v 0.029002 0.116808 -0.638750
+v 0.024375 0.117955 -0.522701
+v 0.024456 0.118170 -0.638738
+v 0.019650 0.118404 -0.522699
+v 0.019731 0.118618 -0.638736
+v 0.014928 0.117922 -0.522708
+v 0.015009 0.118137 -0.638745
+v 0.010391 0.116529 -0.522727
+v 0.010472 0.116743 -0.638764
+v 0.006213 0.114277 -0.522755
+v 0.006294 0.114491 -0.638793
+v 0.002554 0.111253 -0.522792
+v 0.002635 0.111467 -0.638829
+v -0.000444 0.107574 -0.522836
+v -0.000363 0.107788 -0.638873
+v -0.002667 0.103380 -0.522885
+v -0.002586 0.103594 -0.638922
+v -0.004028 0.098833 -0.522938
+v -0.003984 0.099048 -0.586427
+v -0.003410 0.094114 -0.559519
+v -0.003398 0.094140 -0.586428
+v -0.002950 0.089596 -0.559564
+v -0.002917 0.089748 -0.586269
+v -0.001616 0.085252 -0.559603
+v -0.001596 0.085478 -0.586307
+v 0.000540 0.081254 -0.559640
+v 0.000559 0.081480 -0.586344
+v 0.003433 0.077753 -0.559672
+v 0.003453 0.077979 -0.586375
+v 0.006954 0.074883 -0.559697
+v 0.006974 0.075110 -0.586400
+v 0.010968 0.072756 -0.559714
+v 0.010987 0.072983 -0.586418
+v 0.015319 0.071453 -0.559724
+v 0.015338 0.071680 -0.586427
+v 0.019841 0.071023 -0.559725
+v 0.019860 0.071251 -0.586428
+v 0.024360 0.071484 -0.559717
+v 0.024378 0.071712 -0.586421
+v 0.028702 0.072818 -0.559701
+v 0.028720 0.073045 -0.586405
+v 0.032700 0.074973 -0.559678
+v 0.032718 0.075200 -0.586382
+v 0.036201 0.077867 -0.559648
+v 0.036219 0.078094 -0.586351
+v 0.039070 0.081388 -0.559612
+v 0.039088 0.081615 -0.586316
+v 0.041197 0.085402 -0.559572
+v 0.041215 0.085628 -0.586276
+v 0.042501 0.089755 -0.559530
+v 0.042506 0.089906 -0.586236
+v 0.042930 0.094276 -0.559486
+v 0.042957 0.094302 -0.586394
+v 0.042469 0.098792 -0.559437
+v 0.042487 0.099020 -0.586397
+v 0.041135 0.103134 -0.559391
+v 0.041190 0.103362 -0.638900
+v 0.038980 0.107132 -0.559350
+v 0.039035 0.107360 -0.638858
+v 0.036086 0.110633 -0.559314
+v 0.036141 0.110861 -0.638822
+v 0.032565 0.113503 -0.559286
+v 0.032620 0.113730 -0.638794
+v 0.028552 0.115630 -0.559266
+v 0.028607 0.115857 -0.638774
+v 0.024201 0.116933 -0.559254
+v 0.024256 0.117161 -0.638763
+v 0.019679 0.117363 -0.559253
+v 0.019734 0.117590 -0.638761
+v 0.015160 0.116902 -0.559261
+v 0.015216 0.117129 -0.638769
+v 0.010818 0.115568 -0.559278
+v 0.010874 0.115795 -0.638787
+v 0.006820 0.113413 -0.559305
+v 0.006875 0.113640 -0.638813
+v 0.003319 0.110519 -0.559338
+v 0.003374 0.110747 -0.638847
+v 0.000450 0.106998 -0.559378
+v 0.000505 0.107226 -0.638886
+v -0.001677 0.102985 -0.559423
+v -0.001622 0.103212 -0.638931
+v -0.002981 0.098634 -0.559471
+v -0.002962 0.098861 -0.586431
+v 0.028888 -0.168051 -0.439591
+v -0.028274 -0.168051 -0.439631
+v -0.028235 -0.168051 -0.496794
+v 0.028928 -0.168051 -0.496754
+v 0.028809 -0.168051 -0.325555
+v 0.028769 -0.168051 -0.268392
+v -0.028394 -0.168051 -0.268432
+v -0.028354 -0.168051 -0.325595
+v -0.028394 -0.168051 -0.268432
+v 0.028769 -0.168051 -0.268392
+v 0.028928 -0.168051 -0.496754
+v -0.028235 -0.168051 -0.496794
+v -0.028354 -0.168051 -0.325595
+v -0.028274 -0.168051 -0.439631
+v 0.028809 -0.168051 -0.325555
+v 0.028888 -0.168051 -0.439591
+v 0.028888 0.037812 -0.439591
+v 0.028888 0.165702 -0.439591
+v -0.028274 0.165702 -0.439631
+v -0.028274 0.037812 -0.439631
+v -0.028235 0.037812 -0.496794
+v -0.028235 0.165702 -0.496794
+v 0.028928 0.165702 -0.496754
+v 0.028928 0.037812 -0.496754
+v 0.028809 0.037812 -0.325555
+v 0.028809 0.165702 -0.325555
+v 0.028769 0.165702 -0.268392
+v 0.028769 0.037812 -0.268392
+v -0.028394 0.037812 -0.268432
+v -0.028394 0.165702 -0.268432
+v -0.028354 0.165702 -0.325595
+v -0.028354 0.037812 -0.325595
+v 0.028888 0.166622 -0.439591
+v -0.028274 0.166622 -0.439631
+v -0.028235 0.166622 -0.496794
+v 0.028928 0.166622 -0.496754
+v 0.028809 0.166622 -0.325555
+v 0.028769 0.166622 -0.268392
+v -0.028394 0.166622 -0.268432
+v -0.028354 0.166622 -0.325595
+v -0.028394 0.166622 -0.268432
+v 0.028769 0.166622 -0.268392
+v 0.028928 0.166622 -0.496754
+v -0.028235 0.166622 -0.496794
+v -0.028354 0.166622 -0.325595
+v -0.028274 0.166622 -0.439631
+v 0.028809 0.166622 -0.325555
+v 0.028888 0.166622 -0.439591
+v 0.028888 0.370885 -0.439591
+v 0.028888 0.497782 -0.439591
+v -0.028274 0.497782 -0.439631
+v -0.028274 0.370885 -0.439631
+v -0.028235 0.370885 -0.496794
+v -0.028235 0.497782 -0.496794
+v 0.028928 0.497782 -0.496754
+v 0.028928 0.370885 -0.496754
+v 0.028809 0.370885 -0.325555
+v 0.028809 0.497782 -0.325555
+v 0.028769 0.497782 -0.268392
+v 0.028769 0.370885 -0.268392
+v -0.028394 0.370885 -0.268432
+v -0.028394 0.497782 -0.268432
+v -0.028354 0.497782 -0.325595
+v -0.028354 0.370885 -0.325595
+v 0.269752 -0.145166 -0.548298
+v -0.230248 -0.145166 -0.548647
+v 0.269752 0.603749 -0.548297
+v -0.230248 0.603749 -0.548646
+v 0.269719 0.603749 -0.500879
+v 0.269719 -0.145166 -0.500879
+v -0.230281 -0.145166 -0.501228
+v -0.230281 0.603749 -0.501228
+vt 0.285559 0.095797
+vt 0.214079 0.095797
+vt 0.214079 0.000000
+vt 0.285559 0.000000
+vt 0.357039 0.095797
+vt 0.285559 0.095797
+vt 0.285559 0.000000
+vt 0.357039 0.000000
+vt 0.642599 0.095797
+vt 0.571118 0.095797
+vt 0.571118 0.000000
+vt 0.642598 0.000000
+vt 0.714079 0.904203
+vt 0.785559 0.904203
+vt 0.785559 1.000000
+vt 0.714079 1.000000
+vt 0.642599 0.904203
+vt 0.714079 0.904203
+vt 0.714079 1.000000
+vt 0.642599 1.000000
+vt 0.071480 0.095797
+vt 0.000000 0.095797
+vt 0.000000 0.000000
+vt 0.071480 0.000000
+vt 0.571118 0.095797
+vt 0.499638 0.095797
+vt 0.499638 0.000000
+vt 0.571118 0.000000
+vt 0.857040 0.394495
+vt 0.928520 0.394495
+vt 0.928520 0.480583
+vt 0.857040 0.480583
+vt 0.857040 0.129242
+vt 0.785559 0.129242
+vt 0.785559 0.043154
+vt 0.857040 0.043154
+vt 0.785559 0.172396
+vt 0.857040 0.172396
+vt 0.785559 0.000000
+vt 0.857040 0.000000
+vt 0.285559 0.250000
+vt 0.214079 0.250000
+vt 0.357039 0.250000
+vt 0.285559 0.250000
+vt 0.642599 0.250000
+vt 0.571118 0.250000
+vt 0.714079 0.750000
+vt 0.785559 0.750000
+vt 0.642599 0.750000
+vt 0.714079 0.750000
+vt 0.928520 0.154203
+vt 0.857040 0.154203
+vt 0.857040 0.000000
+vt 0.928520 0.000000
+vt 0.071480 0.250000
+vt 0.000000 0.250000
+vt 0.571118 0.250000
+vt 0.499638 0.250000
+vt 0.000000 0.000000
+vt 0.000000 0.000000
+vt 0.000000 0.000000
+vt 0.000000 0.000000
+vt 0.615085 0.501950
+vt 0.538102 0.501950
+vt 0.538102 0.192341
+vt 0.615085 0.192341
+vt 0.538102 0.000000
+vt 0.615085 0.000000
+vt 0.076983 0.501950
+vt 0.000000 0.501950
+vt 0.000000 0.192341
+vt 0.076983 0.192341
+vt 0.000000 0.000000
+vt 0.076983 0.000000
+vt 0.692068 0.501950
+vt 0.692068 0.192341
+vt 0.692068 0.000000
+vt 0.769051 0.501950
+vt 0.692068 0.501950
+vt 0.692068 0.192341
+vt 0.769051 0.192341
+vt 0.692068 0.000000
+vt 0.769051 0.000000
+vt 0.846034 0.501950
+vt 0.769051 0.501950
+vt 0.769051 0.192341
+vt 0.846034 0.192341
+vt 0.769051 0.000000
+vt 0.846034 0.000000
+vt 0.923017 0.996502
+vt 0.846034 0.996502
+vt 0.846034 0.686893
+vt 0.923017 0.686893
+vt 0.384526 0.501950
+vt 0.307543 0.501950
+vt 0.307542 0.192341
+vt 0.384525 0.192341
+vt 0.307542 0.000000
+vt 0.384525 0.000000
+vt 0.307542 0.501950
+vt 0.230559 0.501950
+vt 0.230559 0.192341
+vt 0.307542 0.192341
+vt 0.230559 0.000000
+vt 0.307542 0.000000
+vt 0.923017 0.478709
+vt 1.000000 0.478709
+vt 1.000000 0.650215
+vt 0.923017 0.650215
+vt 0.923017 0.600923
+vt 0.846034 0.600923
+vt 0.846034 0.429417
+vt 0.923017 0.429417
+vt 0.846034 0.686893
+vt 0.923017 0.686893
+vt 0.846034 0.343447
+vt 0.923017 0.343447
+vt 0.000000 0.000000
+vt 0.000000 0.000000
+vt 0.000000 0.000000
+vt 0.000000 0.000000
+vt 0.615085 1.000000
+vt 0.538102 1.000000
+vt 0.538102 0.692796
+vt 0.615085 0.692796
+vt 0.538102 0.501950
+vt 0.615085 0.501950
+vt 0.076983 1.000000
+vt 0.000000 1.000000
+vt 0.000000 0.692797
+vt 0.076983 0.692797
+vt 0.000000 0.501950
+vt 0.076983 0.501950
+vt 0.769051 1.000000
+vt 0.692068 1.000000
+vt 0.692068 0.692796
+vt 0.769051 0.692796
+vt 0.692068 0.501950
+vt 0.769051 0.501950
+vt 0.615085 0.501950
+vt 0.692068 0.501950
+vt 0.692068 0.809153
+vt 0.615085 0.809153
+vt 0.692068 1.000000
+vt 0.615085 1.000000
+vt 0.846034 1.000000
+vt 0.769051 1.000000
+vt 0.769051 0.692796
+vt 0.846034 0.692796
+vt 0.769051 0.501950
+vt 0.846034 0.501950
+vt 1.000000 0.307203
+vt 0.923017 0.307203
+vt 0.923017 0.000000
+vt 1.000000 0.000000
+vt 0.384526 1.000000
+vt 0.307543 1.000000
+vt 0.307542 0.692797
+vt 0.384525 0.692797
+vt 0.307542 0.501950
+vt 0.384525 0.501950
+vt 0.307542 1.000000
+vt 0.230559 1.000000
+vt 0.230559 0.692797
+vt 0.307542 0.692796
+vt 0.230559 0.501950
+vt 0.307542 0.501950
+vt 0.923017 0.307203
+vt 1.000000 0.307203
+vt 1.000000 0.478709
+vt 0.923017 0.478709
+vt 0.923017 0.257476
+vt 0.846034 0.257476
+vt 0.846034 0.085970
+vt 0.923017 0.085970
+vt 0.846034 0.343447
+vt 0.923017 0.343447
+vt 0.846034 0.000000
+vt 0.923017 0.000000
+vt 0.875462 0.748915
+vt 0.437731 0.748915
+vt 0.437731 0.000000
+vt 0.875462 0.000000
+vt 0.437731 0.000000
+vt 0.437731 0.748915
+vt 0.000000 0.748915
+vt 0.000000 0.000000
+vt 0.958487 0.748915
+vt 0.916975 0.748915
+vt 0.916975 0.000000
+vt 0.958487 0.000000
+vt 0.958487 0.000000
+vt 1.000000 0.000000
+vt 1.000000 0.500000
+vt 0.958487 0.500000
+vt 1.000000 1.000000
+vt 0.958487 1.000000
+vt 0.958487 0.500000
+vt 1.000000 0.500000
+vt 0.875462 0.000000
+vt 0.916974 0.000000
+vt 0.916975 0.748915
+vt 0.875462 0.748915
+vt 0.442670 0.517822
+vt 0.228883 0.517823
+vt 0.228889 0.488295
+vt 0.442971 0.724510
+vt 0.443060 0.754024
+vt 0.370472 0.723575
+vt 0.442967 0.311134
+vt 0.370467 0.312068
+vt 0.443056 0.281620
+vt 0.443160 0.252098
+vt 0.371348 0.252525
+vt 0.443163 0.783546
+vt 0.371352 0.783117
+vt 0.006929 0.253167
+vt 0.177644 0.253134
+vt 0.006828 0.284020
+vt 0.007055 0.808541
+vt 0.006941 0.777687
+vt 0.177771 0.808498
+vt 0.006827 0.746834
+vt 0.176852 0.746796
+vt 0.006727 0.314875
+vt 0.176753 0.314837
+vt 0.371492 0.871219
+vt 0.371495 0.841694
+vt 0.443305 0.842613
+vt 0.615392 0.436018
+vt 0.610260 0.440534
+vt 0.592437 0.415287
+vt 0.816609 0.103895
+vt 0.836176 0.125250
+vt 0.831035 0.128981
+vt 0.706468 0.066881
+vt 0.736753 0.067631
+vt 0.735929 0.074111
+vt 0.647824 0.083609
+vt 0.650942 0.089526
+vt 0.626230 0.105756
+vt 0.765981 0.074365
+vt 0.763884 0.080481
+vt 0.579817 0.387126
+vt 0.586362 0.385333
+vt 0.621946 0.100560
+vt 0.605204 0.126737
+vt 0.706979 0.073452
+vt 0.678244 0.078632
+vt 0.792953 0.086670
+vt 0.812355 0.108585
+vt 0.676401 0.072253
+vt 0.789700 0.092175
+vt 0.599888 0.122511
+vt 0.589057 0.151745
+vt 0.582798 0.148853
+vt 0.579868 0.178984
+vt 0.850517 0.149568
+vt 0.844628 0.151667
+vt 0.572791 0.357181
+vt 0.571207 0.326153
+vt 0.578089 0.326242
+vt 0.579568 0.357437
+vt 0.892437 0.349226
+vt 0.885423 0.348954
+vt 0.885704 0.319257
+vt 0.886223 0.285996
+vt 0.879631 0.287703
+vt 0.636826 0.456466
+vt 0.632640 0.461897
+vt 0.874138 0.409852
+vt 0.856681 0.436209
+vt 0.851292 0.431762
+vt 0.661830 0.472412
+vt 0.658752 0.478560
+vt 0.689480 0.483245
+vt 0.687628 0.489885
+vt 0.718747 0.488548
+vt 0.718195 0.495436
+vt 0.779839 0.488518
+vt 0.749318 0.494983
+vt 0.748545 0.488099
+vt 0.808610 0.476251
+vt 0.777761 0.481894
+vt 0.834553 0.458608
+vt 0.805300 0.470133
+vt 0.830124 0.453224
+vt 0.573209 0.178195
+vt 0.886228 0.380492
+vt 0.867982 0.406513
+vt 0.879533 0.378395
+vt 0.370709 0.754396
+vt 0.319322 0.130795
+vt 0.319224 0.161649
+vt 0.007220 0.160604
+vt 0.007387 0.901104
+vt 0.319390 0.899923
+vt 0.319502 0.930776
+vt 0.442778 0.399714
+vt 0.228990 0.399716
+vt 0.229046 0.370189
+vt 0.007499 0.931958
+vt 0.319616 0.961631
+vt 0.006361 0.469146
+vt 0.176387 0.469108
+vt 0.176362 0.499962
+vt 0.442678 0.488295
+vt 0.228910 0.458769
+vt 0.007727 0.006334
+vt 0.319730 0.007378
+vt 0.319626 0.038233
+vt 0.228890 0.547350
+vt 0.007613 0.962812
+vt 0.319730 0.992485
+vt 0.228946 0.606403
+vt 0.228912 0.576877
+vt 0.442700 0.576876
+vt 0.228992 0.635930
+vt 0.442734 0.606402
+vt 0.442833 0.370188
+vt 0.229109 0.340661
+vt 0.229113 0.694984
+vt 0.229049 0.665457
+vt 0.442837 0.665456
+vt 0.442901 0.694984
+vt 0.370705 0.281246
+vt 0.371443 0.812167
+vt 0.443254 0.813086
+vt 0.892437 0.317355
+vt 0.371421 0.900745
+vt 0.443302 0.872141
+vt 0.371269 0.930272
+vt 0.443231 0.901668
+vt 0.007276 0.870250
+vt 0.319278 0.869069
+vt 0.006405 0.438291
+vt 0.176430 0.438254
+vt 0.443090 0.104449
+vt 0.371280 0.105372
+vt 0.371043 0.075847
+vt 0.443237 0.133976
+vt 0.371427 0.134897
+vt 0.443305 0.163503
+vt 0.371495 0.164423
+vt 0.443305 0.193031
+vt 0.371495 0.193949
+vt 0.443252 0.222558
+vt 0.371442 0.223476
+vt 0.177399 0.283987
+vt 0.006543 0.376583
+vt 0.176568 0.376545
+vt 0.176492 0.407399
+vt 0.006467 0.407437
+vt 0.007165 0.839396
+vt 0.319168 0.838215
+vt 0.370694 0.989321
+vt 0.371029 0.959797
+vt 0.442838 0.960722
+vt 0.442780 0.635930
+vt 0.442698 0.458768
+vt 0.228944 0.429242
+vt 0.006337 0.500000
+vt 0.176359 0.530816
+vt 0.319524 0.069087
+vt 0.007520 0.068042
+vt 0.319423 0.099941
+vt 0.007419 0.098896
+vt 0.007319 0.129750
+vt 0.442897 0.340661
+vt 0.319126 0.192504
+vt 0.007122 0.191458
+vt 0.319029 0.223358
+vt 0.007025 0.222313
+vt 0.177512 0.777645
+vt 0.443079 0.931196
+vt 0.176656 0.345691
+vt 0.006631 0.345729
+vt 0.442853 0.074922
+vt 0.370712 0.046322
+vt 0.442732 0.429241
+vt 0.442678 0.547349
+vt 0.176377 0.561671
+vt 0.006351 0.561708
+vt 0.176415 0.592525
+vt 0.006390 0.592562
+vt 0.176474 0.623379
+vt 0.006448 0.623417
+vt 0.176549 0.654233
+vt 0.006524 0.654271
+vt 0.176640 0.685087
+vt 0.006614 0.685125
+vt 0.176742 0.715941
+vt 0.006716 0.715979
+vt 0.615392 0.436018
+vt 0.610260 0.440534
+vt 0.592437 0.415287
+vt 0.006631 0.345729
+vt 0.176656 0.345691
+vt 0.176568 0.376545
+vt 0.371443 0.812167
+vt 0.371352 0.783117
+vt 0.443163 0.783546
+vt 0.176852 0.746796
+vt 0.177512 0.777645
+vt 0.006941 0.777687
+vt 0.007165 0.839396
+vt 0.319168 0.838215
+vt 0.319278 0.869069
+vt 0.006467 0.407437
+vt 0.176492 0.407399
+vt 0.176430 0.438254
+vt 0.442897 0.340661
+vt 0.229109 0.340661
+vt 0.370467 0.312068
+vt 0.319524 0.069087
+vt 0.319423 0.099941
+vt 0.007419 0.098896
+vt 0.319322 0.130795
+vt 0.319224 0.161649
+vt 0.007220 0.160604
+vt 0.856681 0.436209
+vt 0.834553 0.458608
+vt 0.830124 0.453224
+vt 0.007727 0.006334
+vt 0.319730 0.007378
+vt 0.319626 0.038233
+vt 0.229049 0.665457
+vt 0.228992 0.635930
+vt 0.442780 0.635930
+vt 0.442967 0.311134
+vt 0.443056 0.281620
+vt 0.228890 0.547350
+vt 0.228883 0.517823
+vt 0.442670 0.517822
+vt 0.443060 0.754024
+vt 0.319126 0.192504
+vt 0.319029 0.223358
+vt 0.007025 0.222313
+vt 0.370709 0.754396
+vt 0.370472 0.723575
+vt 0.647824 0.083609
+vt 0.650942 0.089526
+vt 0.626230 0.105756
+vt 0.765981 0.074365
+vt 0.792953 0.086670
+vt 0.789700 0.092175
+vt 0.718747 0.488548
+vt 0.718195 0.495436
+vt 0.687628 0.489885
+vt 0.779839 0.488518
+vt 0.749318 0.494983
+vt 0.748545 0.488099
+vt 0.370705 0.281246
+vt 0.371348 0.252525
+vt 0.228946 0.606403
+vt 0.442734 0.606402
+vt 0.228889 0.488295
+vt 0.579817 0.387126
+vt 0.586362 0.385333
+vt 0.006337 0.500000
+vt 0.176362 0.499962
+vt 0.176359 0.530816
+vt 0.892437 0.349226
+vt 0.885423 0.348954
+vt 0.885704 0.319257
+vt 0.706468 0.066881
+vt 0.736753 0.067631
+vt 0.735929 0.074111
+vt 0.443305 0.193031
+vt 0.371495 0.193949
+vt 0.371495 0.164423
+vt 0.177644 0.253134
+vt 0.177399 0.283987
+vt 0.006828 0.284020
+vt 0.176549 0.654233
+vt 0.176640 0.685087
+vt 0.006614 0.685125
+vt 0.443160 0.252098
+vt 0.371269 0.930272
+vt 0.371421 0.900745
+vt 0.443231 0.901668
+vt 0.816609 0.103895
+vt 0.836176 0.125250
+vt 0.831035 0.128981
+vt 0.621946 0.100560
+vt 0.605204 0.126737
+vt 0.442698 0.458768
+vt 0.228910 0.458769
+vt 0.228944 0.429242
+vt 0.442732 0.429241
+vt 0.228990 0.399716
+vt 0.874138 0.409852
+vt 0.851292 0.431762
+vt 0.228912 0.576877
+vt 0.442678 0.547349
+vt 0.176377 0.561671
+vt 0.006351 0.561708
+vt 0.850517 0.149568
+vt 0.844628 0.151667
+vt 0.371029 0.959797
+vt 0.443079 0.931196
+vt 0.442853 0.074922
+vt 0.371043 0.075847
+vt 0.370712 0.046322
+vt 0.371495 0.841694
+vt 0.443254 0.813086
+vt 0.443252 0.222558
+vt 0.371442 0.223476
+vt 0.763884 0.080481
+vt 0.443090 0.104449
+vt 0.371280 0.105372
+vt 0.808610 0.476251
+vt 0.805300 0.470133
+vt 0.006727 0.314875
+vt 0.176753 0.314837
+vt 0.007613 0.962812
+vt 0.319616 0.961631
+vt 0.319730 0.992485
+vt 0.006827 0.746834
+vt 0.176742 0.715941
+vt 0.006716 0.715979
+vt 0.661830 0.472412
+vt 0.658752 0.478560
+vt 0.632640 0.461897
+vt 0.442971 0.724510
+vt 0.006929 0.253167
+vt 0.572791 0.357181
+vt 0.571207 0.326153
+vt 0.578089 0.326242
+vt 0.442778 0.399714
+vt 0.229046 0.370189
+vt 0.442700 0.576876
+vt 0.176474 0.623379
+vt 0.006524 0.654271
+vt 0.006543 0.376583
+vt 0.229113 0.694984
+vt 0.442837 0.665456
+vt 0.007520 0.068042
+vt 0.371492 0.871219
+vt 0.443302 0.872141
+vt 0.689480 0.483245
+vt 0.443305 0.163503
+vt 0.371427 0.134897
+vt 0.007055 0.808541
+vt 0.177771 0.808498
+vt 0.442678 0.488295
+vt 0.777761 0.481894
+vt 0.573209 0.178195
+vt 0.579868 0.178984
+vt 0.636826 0.456466
+vt 0.579568 0.357437
+vt 0.007387 0.901104
+vt 0.319390 0.899923
+vt 0.319502 0.930776
+vt 0.176415 0.592525
+vt 0.006390 0.592562
+vt 0.007122 0.191458
+vt 0.812355 0.108585
+vt 0.582798 0.148853
+vt 0.589057 0.151745
+vt 0.007276 0.870250
+vt 0.007319 0.129750
+vt 0.006448 0.623417
+vt 0.886228 0.380492
+vt 0.879533 0.378395
+vt 0.442833 0.370188
+vt 0.370694 0.989321
+vt 0.442838 0.960722
+vt 0.886223 0.285996
+vt 0.879631 0.287703
+vt 0.599888 0.122511
+vt 0.676401 0.072253
+vt 0.443237 0.133976
+vt 0.443305 0.842613
+vt 0.867982 0.406513
+vt 0.006405 0.438291
+vt 0.176387 0.469108
+vt 0.892437 0.317355
+vt 0.442901 0.694984
+vt 0.006361 0.469146
+vt 0.007499 0.931958
+vt 0.706979 0.073452
+vt 0.678244 0.078632
+vt 0.598317 0.411848
+vt 0.007623 0.037188
+vt 0.007728 0.993666
+vt 0.442504 0.990249
+vt 0.006334 0.530854
+vt 0.442522 0.045396
+vt 0.442670 0.517822
+vt 0.228883 0.517823
+vt 0.228889 0.488295
+vt 0.442971 0.724510
+vt 0.443060 0.754024
+vt 0.370472 0.723575
+vt 0.442967 0.311134
+vt 0.370467 0.312068
+vt 0.443056 0.281620
+vt 0.443160 0.252098
+vt 0.371348 0.252525
+vt 0.443163 0.783546
+vt 0.371352 0.783117
+vt 0.006929 0.253167
+vt 0.177644 0.253134
+vt 0.006828 0.284020
+vt 0.007055 0.808541
+vt 0.006941 0.777687
+vt 0.177771 0.808498
+vt 0.006827 0.746834
+vt 0.176852 0.746796
+vt 0.006727 0.314875
+vt 0.176753 0.314837
+vt 0.371492 0.871219
+vt 0.371495 0.841694
+vt 0.443305 0.842613
+vt 0.615392 0.436018
+vt 0.610260 0.440534
+vt 0.592437 0.415287
+vt 0.816609 0.103895
+vt 0.836176 0.125250
+vt 0.831035 0.128981
+vt 0.706468 0.066881
+vt 0.736753 0.067631
+vt 0.735929 0.074111
+vt 0.647824 0.083609
+vt 0.650942 0.089526
+vt 0.626230 0.105756
+vt 0.765981 0.074365
+vt 0.763884 0.080481
+vt 0.579817 0.387126
+vt 0.586362 0.385333
+vt 0.621946 0.100560
+vt 0.605204 0.126737
+vt 0.706979 0.073452
+vt 0.678244 0.078632
+vt 0.792953 0.086670
+vt 0.812355 0.108585
+vt 0.676401 0.072253
+vt 0.789700 0.092175
+vt 0.599888 0.122511
+vt 0.589057 0.151745
+vt 0.582798 0.148853
+vt 0.579868 0.178984
+vt 0.850517 0.149568
+vt 0.844628 0.151667
+vt 0.572791 0.357181
+vt 0.571207 0.326153
+vt 0.578089 0.326242
+vt 0.579568 0.357437
+vt 0.892437 0.349226
+vt 0.885423 0.348954
+vt 0.885704 0.319257
+vt 0.886223 0.285996
+vt 0.879631 0.287703
+vt 0.636826 0.456466
+vt 0.632640 0.461897
+vt 0.874138 0.409852
+vt 0.856681 0.436209
+vt 0.851292 0.431762
+vt 0.661830 0.472412
+vt 0.658752 0.478560
+vt 0.689480 0.483245
+vt 0.687628 0.489885
+vt 0.718747 0.488548
+vt 0.718195 0.495436
+vt 0.779839 0.488518
+vt 0.749318 0.494983
+vt 0.748545 0.488099
+vt 0.808610 0.476251
+vt 0.777761 0.481894
+vt 0.834553 0.458608
+vt 0.805300 0.470133
+vt 0.830124 0.453224
+vt 0.573209 0.178195
+vt 0.886228 0.380492
+vt 0.867982 0.406513
+vt 0.879533 0.378395
+vt 0.370709 0.754396
+vt 0.319322 0.130795
+vt 0.319224 0.161649
+vt 0.007220 0.160604
+vt 0.007387 0.901104
+vt 0.319390 0.899923
+vt 0.319502 0.930776
+vt 0.442778 0.399714
+vt 0.228990 0.399716
+vt 0.229046 0.370189
+vt 0.007499 0.931958
+vt 0.319616 0.961631
+vt 0.006361 0.469146
+vt 0.176387 0.469108
+vt 0.176362 0.499962
+vt 0.442678 0.488295
+vt 0.228910 0.458769
+vt 0.007727 0.006334
+vt 0.319730 0.007378
+vt 0.319626 0.038233
+vt 0.228890 0.547350
+vt 0.007613 0.962812
+vt 0.319730 0.992485
+vt 0.228946 0.606403
+vt 0.228912 0.576877
+vt 0.442700 0.576876
+vt 0.228992 0.635930
+vt 0.442734 0.606402
+vt 0.442833 0.370188
+vt 0.229109 0.340661
+vt 0.229113 0.694984
+vt 0.229049 0.665457
+vt 0.442837 0.665456
+vt 0.442901 0.694984
+vt 0.370705 0.281246
+vt 0.371443 0.812167
+vt 0.443254 0.813086
+vt 0.892437 0.317355
+vt 0.371421 0.900745
+vt 0.443302 0.872141
+vt 0.371269 0.930272
+vt 0.443231 0.901668
+vt 0.007276 0.870250
+vt 0.319278 0.869069
+vt 0.006405 0.438291
+vt 0.176430 0.438254
+vt 0.443090 0.104449
+vt 0.371280 0.105372
+vt 0.371043 0.075847
+vt 0.443237 0.133976
+vt 0.371427 0.134897
+vt 0.443305 0.163503
+vt 0.371495 0.164423
+vt 0.443305 0.193031
+vt 0.371495 0.193949
+vt 0.443252 0.222558
+vt 0.371442 0.223476
+vt 0.177399 0.283987
+vt 0.006543 0.376583
+vt 0.176568 0.376545
+vt 0.176492 0.407399
+vt 0.006467 0.407437
+vt 0.007165 0.839396
+vt 0.319168 0.838215
+vt 0.370694 0.989321
+vt 0.371029 0.959797
+vt 0.442838 0.960722
+vt 0.442780 0.635930
+vt 0.442698 0.458768
+vt 0.228944 0.429242
+vt 0.006337 0.500000
+vt 0.176359 0.530816
+vt 0.319524 0.069087
+vt 0.007520 0.068042
+vt 0.319423 0.099941
+vt 0.007419 0.098896
+vt 0.007319 0.129750
+vt 0.442897 0.340661
+vt 0.319126 0.192504
+vt 0.007122 0.191458
+vt 0.319029 0.223358
+vt 0.007025 0.222313
+vt 0.177512 0.777645
+vt 0.443079 0.931196
+vt 0.176656 0.345691
+vt 0.006631 0.345729
+vt 0.442853 0.074922
+vt 0.370712 0.046322
+vt 0.442732 0.429241
+vt 0.442678 0.547349
+vt 0.176377 0.561671
+vt 0.006351 0.561708
+vt 0.176415 0.592525
+vt 0.006390 0.592562
+vt 0.176474 0.623379
+vt 0.006448 0.623417
+vt 0.176549 0.654233
+vt 0.006524 0.654271
+vt 0.176640 0.685087
+vt 0.006614 0.685125
+vt 0.176742 0.715941
+vt 0.006716 0.715979
+vt 0.598317 0.411848
+vt 0.007623 0.037188
+vt 0.007728 0.993666
+vt 0.442504 0.990249
+vt 0.006334 0.530854
+vt 0.442522 0.045396
+vt 0.598317 0.411848
+vt 0.007623 0.037188
+vt 0.007728 0.993666
+vt 0.442504 0.990249
+vt 0.006334 0.530854
+vt 0.442522 0.045396
+vt 0.006929 0.253167
+vt 0.007025 0.222313
+vt 0.177644 0.253134
+vt 0.442678 0.488295
+vt 0.228889 0.488295
+vt 0.228910 0.458769
+vt 0.442670 0.517822
+vt 0.006631 0.345729
+vt 0.176656 0.345691
+vt 0.176568 0.376545
+vt 0.689480 0.483245
+vt 0.718747 0.488548
+vt 0.687628 0.489885
+vt 0.371352 0.783117
+vt 0.370709 0.754396
+vt 0.443060 0.754024
+vt 0.442971 0.724510
+vt 0.370472 0.723575
+vt 0.228883 0.517823
+vt 0.176852 0.746796
+vt 0.177512 0.777645
+vt 0.006941 0.777687
+vt 0.892437 0.317355
+vt 0.885704 0.319257
+vt 0.879631 0.287703
+vt 0.586362 0.385333
+vt 0.579817 0.387126
+vt 0.579568 0.357437
+vt 0.370694 0.989321
+vt 0.371029 0.959797
+vt 0.442838 0.960722
+vt 0.748545 0.488099
+vt 0.749318 0.494983
+vt 0.718195 0.495436
+vt 0.836176 0.125250
+vt 0.850517 0.149568
+vt 0.844628 0.151667
+vt 0.319423 0.099941
+vt 0.319322 0.130795
+vt 0.007319 0.129750
+vt 0.371269 0.930272
+vt 0.371421 0.900745
+vt 0.443231 0.901668
+vt 0.007419 0.098896
+vt 0.763884 0.080481
+vt 0.765981 0.074365
+vt 0.789700 0.092175
+vt 0.443302 0.872141
+vt 0.442833 0.370188
+vt 0.442778 0.399714
+vt 0.229046 0.370189
+vt 0.319626 0.038233
+vt 0.319524 0.069087
+vt 0.007520 0.068042
+vt 0.808610 0.476251
+vt 0.779839 0.488518
+vt 0.777761 0.481894
+vt 0.176640 0.685087
+vt 0.176742 0.715941
+vt 0.006716 0.715979
+vt 0.371495 0.841694
+vt 0.371443 0.812167
+vt 0.443254 0.813086
+vt 0.006614 0.685125
+vt 0.006467 0.407437
+vt 0.006543 0.376583
+vt 0.176492 0.407399
+vt 0.892437 0.349226
+vt 0.886228 0.380492
+vt 0.885423 0.348954
+vt 0.599888 0.122511
+vt 0.605204 0.126737
+vt 0.589057 0.151745
+vt 0.443305 0.193031
+vt 0.443252 0.222558
+vt 0.371495 0.193949
+vt 0.636826 0.456466
+vt 0.632640 0.461897
+vt 0.610260 0.440534
+vt 0.735929 0.074111
+vt 0.736753 0.067631
+vt 0.442837 0.665456
+vt 0.229049 0.665457
+vt 0.442780 0.635930
+vt 0.006361 0.469146
+vt 0.006405 0.438291
+vt 0.176387 0.469108
+vt 0.007613 0.962812
+vt 0.319616 0.961631
+vt 0.319730 0.992485
+vt 0.598317 0.411848
+vt 0.592437 0.415287
+vt 0.442678 0.547349
+vt 0.228890 0.547350
+vt 0.443160 0.252098
+vt 0.371348 0.252525
+vt 0.371442 0.223476
+vt 0.442504 0.990249
+vt 0.319126 0.192504
+vt 0.319029 0.223358
+vt 0.621946 0.100560
+vt 0.647824 0.083609
+vt 0.626230 0.105756
+vt 0.371492 0.871219
+vt 0.615392 0.436018
+vt 0.442732 0.429241
+vt 0.442698 0.458768
+vt 0.228944 0.429242
+vt 0.007499 0.931958
+vt 0.879533 0.378395
+vt 0.867982 0.406513
+vt 0.572791 0.357181
+vt 0.443237 0.133976
+vt 0.371427 0.134897
+vt 0.371280 0.105372
+vt 0.442853 0.074922
+vt 0.443090 0.104449
+vt 0.371043 0.075847
+vt 0.007727 0.006334
+vt 0.319730 0.007378
+vt 0.578089 0.326242
+vt 0.443305 0.163503
+vt 0.371495 0.164423
+vt 0.006727 0.314875
+vt 0.176753 0.314837
+vt 0.319502 0.930776
+vt 0.006337 0.500000
+vt 0.176362 0.499962
+vt 0.792953 0.086670
+vt 0.816609 0.103895
+vt 0.812355 0.108585
+vt 0.176549 0.654233
+vt 0.650942 0.089526
+vt 0.006828 0.284020
+vt 0.177399 0.283987
+vt 0.661830 0.472412
+vt 0.658752 0.478560
+vt 0.571207 0.326153
+vt 0.006524 0.654271
+vt 0.442901 0.694984
+vt 0.229113 0.694984
+vt 0.007122 0.191458
+vt 0.831035 0.128981
+vt 0.006390 0.592562
+vt 0.176415 0.592525
+vt 0.006448 0.623417
+vt 0.805300 0.470133
+vt 0.228990 0.399716
+vt 0.582798 0.148853
+vt 0.176430 0.438254
+vt 0.886223 0.285996
+vt 0.706979 0.073452
+vt 0.706468 0.066881
+vt 0.176474 0.623379
+vt 0.229109 0.340661
+vt 0.834553 0.458608
+vt 0.676401 0.072253
+vt 0.228992 0.635930
+vt 0.228946 0.606403
+vt 0.442734 0.606402
+vt 0.443079 0.931196
+vt 0.442700 0.576876
+vt 0.176377 0.561671
+vt 0.228912 0.576877
+vt 0.442967 0.311134
+vt 0.370467 0.312068
+vt 0.443056 0.281620
+vt 0.370712 0.046322
+vt 0.830124 0.453224
+vt 0.007220 0.160604
+vt 0.370705 0.281246
+vt 0.176359 0.530816
+vt 0.443305 0.842613
+vt 0.874138 0.409852
+vt 0.851292 0.431762
+vt 0.442897 0.340661
+vt 0.007276 0.870250
+vt 0.319278 0.869069
+vt 0.319390 0.899923
+vt 0.678244 0.078632
+vt 0.006334 0.530854
+vt 0.006351 0.561708
+vt 0.856681 0.436209
+vt 0.443163 0.783546
+vt 0.007728 0.993666
+vt 0.007623 0.037188
+vt 0.007387 0.901104
+vt 0.319224 0.161649
+vt 0.442522 0.045396
+vt 0.006827 0.746834
+vt 0.007165 0.839396
+vt 0.007055 0.808541
+vt 0.177771 0.808498
+vt 0.319168 0.838215
+vt 0.573209 0.178195
+vt 0.579868 0.178984
+vt 0.442670 0.517822
+vt 0.228883 0.517823
+vt 0.228889 0.488295
+vt 0.442971 0.724510
+vt 0.443060 0.754024
+vt 0.370472 0.723575
+vt 0.442967 0.311134
+vt 0.370467 0.312068
+vt 0.443056 0.281620
+vt 0.443160 0.252098
+vt 0.371348 0.252525
+vt 0.443163 0.783546
+vt 0.371352 0.783117
+vt 0.006929 0.253167
+vt 0.177644 0.253134
+vt 0.006828 0.284020
+vt 0.007055 0.808541
+vt 0.006941 0.777687
+vt 0.177771 0.808498
+vt 0.006827 0.746834
+vt 0.176852 0.746796
+vt 0.006727 0.314875
+vt 0.176753 0.314837
+vt 0.371492 0.871219
+vt 0.371495 0.841694
+vt 0.443305 0.842613
+vt 0.615392 0.436018
+vt 0.610260 0.440534
+vt 0.592437 0.415287
+vt 0.816609 0.103895
+vt 0.836176 0.125250
+vt 0.831035 0.128981
+vt 0.706468 0.066881
+vt 0.736753 0.067631
+vt 0.735929 0.074111
+vt 0.647824 0.083609
+vt 0.650942 0.089526
+vt 0.626230 0.105756
+vt 0.765981 0.074365
+vt 0.763884 0.080481
+vt 0.579817 0.387126
+vt 0.586362 0.385333
+vt 0.621946 0.100560
+vt 0.605204 0.126737
+vt 0.706979 0.073452
+vt 0.678244 0.078632
+vt 0.792953 0.086670
+vt 0.812355 0.108585
+vt 0.676401 0.072253
+vt 0.789700 0.092175
+vt 0.599888 0.122511
+vt 0.589057 0.151745
+vt 0.582798 0.148853
+vt 0.579868 0.178984
+vt 0.850517 0.149568
+vt 0.844628 0.151667
+vt 0.572791 0.357181
+vt 0.571207 0.326153
+vt 0.578089 0.326242
+vt 0.579568 0.357437
+vt 0.892437 0.349226
+vt 0.885423 0.348954
+vt 0.885704 0.319257
+vt 0.886223 0.285996
+vt 0.879631 0.287703
+vt 0.636826 0.456466
+vt 0.632640 0.461897
+vt 0.874138 0.409852
+vt 0.856681 0.436209
+vt 0.851292 0.431762
+vt 0.661830 0.472412
+vt 0.658752 0.478560
+vt 0.689480 0.483245
+vt 0.687628 0.489885
+vt 0.718747 0.488548
+vt 0.718195 0.495436
+vt 0.779839 0.488518
+vt 0.749318 0.494983
+vt 0.748545 0.488099
+vt 0.808610 0.476251
+vt 0.777761 0.481894
+vt 0.834553 0.458608
+vt 0.805300 0.470133
+vt 0.830124 0.453224
+vt 0.573209 0.178195
+vt 0.886228 0.380492
+vt 0.867982 0.406513
+vt 0.879533 0.378395
+vt 0.370709 0.754396
+vt 0.319322 0.130795
+vt 0.319224 0.161649
+vt 0.007220 0.160604
+vt 0.007387 0.901104
+vt 0.319390 0.899923
+vt 0.319502 0.930776
+vt 0.442778 0.399714
+vt 0.228990 0.399716
+vt 0.229046 0.370189
+vt 0.007499 0.931958
+vt 0.319616 0.961631
+vt 0.006361 0.469146
+vt 0.176387 0.469108
+vt 0.176362 0.499962
+vt 0.442678 0.488295
+vt 0.228910 0.458769
+vt 0.007727 0.006334
+vt 0.319730 0.007378
+vt 0.319626 0.038233
+vt 0.228890 0.547350
+vt 0.007613 0.962812
+vt 0.319730 0.992485
+vt 0.228946 0.606403
+vt 0.228912 0.576877
+vt 0.442700 0.576876
+vt 0.228992 0.635930
+vt 0.442734 0.606402
+vt 0.442833 0.370188
+vt 0.229109 0.340661
+vt 0.229113 0.694984
+vt 0.229049 0.665457
+vt 0.442837 0.665456
+vt 0.442901 0.694984
+vt 0.370705 0.281246
+vt 0.371443 0.812167
+vt 0.443254 0.813086
+vt 0.892437 0.317355
+vt 0.371421 0.900745
+vt 0.443302 0.872141
+vt 0.371269 0.930272
+vt 0.443231 0.901668
+vt 0.007276 0.870250
+vt 0.319278 0.869069
+vt 0.006405 0.438291
+vt 0.176430 0.438254
+vt 0.443090 0.104449
+vt 0.371280 0.105372
+vt 0.371043 0.075847
+vt 0.443237 0.133976
+vt 0.371427 0.134897
+vt 0.443305 0.163503
+vt 0.371495 0.164423
+vt 0.443305 0.193031
+vt 0.371495 0.193949
+vt 0.443252 0.222558
+vt 0.371442 0.223476
+vt 0.177399 0.283987
+vt 0.006543 0.376583
+vt 0.176568 0.376545
+vt 0.176492 0.407399
+vt 0.006467 0.407437
+vt 0.007165 0.839396
+vt 0.319168 0.838215
+vt 0.370694 0.989321
+vt 0.371029 0.959797
+vt 0.442838 0.960722
+vt 0.442780 0.635930
+vt 0.442698 0.458768
+vt 0.228944 0.429242
+vt 0.006337 0.500000
+vt 0.176359 0.530816
+vt 0.319524 0.069087
+vt 0.007520 0.068042
+vt 0.319423 0.099941
+vt 0.007419 0.098896
+vt 0.007319 0.129750
+vt 0.442897 0.340661
+vt 0.319126 0.192504
+vt 0.007122 0.191458
+vt 0.319029 0.223358
+vt 0.007025 0.222313
+vt 0.177512 0.777645
+vt 0.443079 0.931196
+vt 0.176656 0.345691
+vt 0.006631 0.345729
+vt 0.442853 0.074922
+vt 0.370712 0.046322
+vt 0.442732 0.429241
+vt 0.442678 0.547349
+vt 0.176377 0.561671
+vt 0.006351 0.561708
+vt 0.176415 0.592525
+vt 0.006390 0.592562
+vt 0.176474 0.623379
+vt 0.006448 0.623417
+vt 0.176549 0.654233
+vt 0.006524 0.654271
+vt 0.176640 0.685087
+vt 0.006614 0.685125
+vt 0.176742 0.715941
+vt 0.006716 0.715979
+vt 0.598317 0.411848
+vt 0.007623 0.037188
+vt 0.007728 0.993666
+vt 0.442504 0.990249
+vt 0.006334 0.530854
+vt 0.442522 0.045396
+vt 0.006929 0.253167
+vt 0.007025 0.222313
+vt 0.177644 0.253134
+vt 0.442678 0.488295
+vt 0.228889 0.488295
+vt 0.228910 0.458769
+vt 0.442670 0.517822
+vt 0.006631 0.345729
+vt 0.176656 0.345691
+vt 0.176568 0.376545
+vt 0.689480 0.483245
+vt 0.718747 0.488548
+vt 0.687628 0.489885
+vt 0.371352 0.783117
+vt 0.370709 0.754396
+vt 0.443060 0.754024
+vt 0.442971 0.724510
+vt 0.370472 0.723575
+vt 0.228883 0.517823
+vt 0.176852 0.746796
+vt 0.177512 0.777645
+vt 0.006941 0.777687
+vt 0.892437 0.317355
+vt 0.885704 0.319257
+vt 0.879631 0.287703
+vt 0.586362 0.385333
+vt 0.579817 0.387126
+vt 0.579568 0.357437
+vt 0.370694 0.989321
+vt 0.371029 0.959797
+vt 0.442838 0.960722
+vt 0.748545 0.488099
+vt 0.749318 0.494983
+vt 0.718195 0.495436
+vt 0.836176 0.125250
+vt 0.850517 0.149568
+vt 0.844628 0.151667
+vt 0.319423 0.099941
+vt 0.319322 0.130795
+vt 0.007319 0.129750
+vt 0.371269 0.930272
+vt 0.371421 0.900745
+vt 0.443231 0.901668
+vt 0.007419 0.098896
+vt 0.763884 0.080481
+vt 0.765981 0.074365
+vt 0.789700 0.092175
+vt 0.443302 0.872141
+vt 0.442833 0.370188
+vt 0.442778 0.399714
+vt 0.229046 0.370189
+vt 0.319626 0.038233
+vt 0.319524 0.069087
+vt 0.007520 0.068042
+vt 0.808610 0.476251
+vt 0.779839 0.488518
+vt 0.777761 0.481894
+vt 0.176640 0.685087
+vt 0.176742 0.715941
+vt 0.006716 0.715979
+vt 0.371495 0.841694
+vt 0.371443 0.812167
+vt 0.443254 0.813086
+vt 0.006614 0.685125
+vt 0.006467 0.407437
+vt 0.006543 0.376583
+vt 0.176492 0.407399
+vt 0.892437 0.349226
+vt 0.886228 0.380492
+vt 0.885423 0.348954
+vt 0.599888 0.122511
+vt 0.605204 0.126737
+vt 0.589057 0.151745
+vt 0.443305 0.193031
+vt 0.443252 0.222558
+vt 0.371495 0.193949
+vt 0.636826 0.456466
+vt 0.632640 0.461897
+vt 0.610260 0.440534
+vt 0.735929 0.074111
+vt 0.736753 0.067631
+vt 0.442837 0.665456
+vt 0.229049 0.665457
+vt 0.442780 0.635930
+vt 0.006361 0.469146
+vt 0.006405 0.438291
+vt 0.176387 0.469108
+vt 0.007613 0.962812
+vt 0.319616 0.961631
+vt 0.319730 0.992485
+vt 0.598317 0.411848
+vt 0.592437 0.415287
+vt 0.442678 0.547349
+vt 0.228890 0.547350
+vt 0.443160 0.252098
+vt 0.371348 0.252525
+vt 0.371442 0.223476
+vt 0.442504 0.990249
+vt 0.319126 0.192504
+vt 0.319029 0.223358
+vt 0.621946 0.100560
+vt 0.647824 0.083609
+vt 0.626230 0.105756
+vt 0.371492 0.871219
+vt 0.615392 0.436018
+vt 0.442732 0.429241
+vt 0.442698 0.458768
+vt 0.228944 0.429242
+vt 0.007499 0.931958
+vt 0.879533 0.378395
+vt 0.867982 0.406513
+vt 0.572791 0.357181
+vt 0.443237 0.133976
+vt 0.371427 0.134897
+vt 0.371280 0.105372
+vt 0.442853 0.074922
+vt 0.443090 0.104449
+vt 0.371043 0.075847
+vt 0.007727 0.006334
+vt 0.319730 0.007378
+vt 0.578089 0.326242
+vt 0.443305 0.163503
+vt 0.371495 0.164423
+vt 0.006727 0.314875
+vt 0.176753 0.314837
+vt 0.319502 0.930776
+vt 0.006337 0.500000
+vt 0.176362 0.499962
+vt 0.792953 0.086670
+vt 0.816609 0.103895
+vt 0.812355 0.108585
+vt 0.176549 0.654233
+vt 0.650942 0.089526
+vt 0.006828 0.284020
+vt 0.177399 0.283987
+vt 0.661830 0.472412
+vt 0.658752 0.478560
+vt 0.571207 0.326153
+vt 0.006524 0.654271
+vt 0.442901 0.694984
+vt 0.229113 0.694984
+vt 0.007122 0.191458
+vt 0.831035 0.128981
+vt 0.006390 0.592562
+vt 0.176415 0.592525
+vt 0.006448 0.623417
+vt 0.805300 0.470133
+vt 0.228990 0.399716
+vt 0.582798 0.148853
+vt 0.176430 0.438254
+vt 0.886223 0.285996
+vt 0.706979 0.073452
+vt 0.706468 0.066881
+vt 0.176474 0.623379
+vt 0.229109 0.340661
+vt 0.834553 0.458608
+vt 0.676401 0.072253
+vt 0.228992 0.635930
+vt 0.228946 0.606403
+vt 0.442734 0.606402
+vt 0.443079 0.931196
+vt 0.442700 0.576876
+vt 0.176377 0.561671
+vt 0.228912 0.576877
+vt 0.442967 0.311134
+vt 0.370467 0.312068
+vt 0.443056 0.281620
+vt 0.370712 0.046322
+vt 0.830124 0.453224
+vt 0.007220 0.160604
+vt 0.370705 0.281246
+vt 0.176359 0.530816
+vt 0.443305 0.842613
+vt 0.874138 0.409852
+vt 0.851292 0.431762
+vt 0.442897 0.340661
+vt 0.007276 0.870250
+vt 0.319278 0.869069
+vt 0.319390 0.899923
+vt 0.678244 0.078632
+vt 0.006334 0.530854
+vt 0.006351 0.561708
+vt 0.856681 0.436209
+vt 0.443163 0.783546
+vt 0.007728 0.993666
+vt 0.007623 0.037188
+vt 0.007387 0.901104
+vt 0.319224 0.161649
+vt 0.442522 0.045396
+vt 0.006827 0.746834
+vt 0.007165 0.839396
+vt 0.007055 0.808541
+vt 0.177771 0.808498
+vt 0.319168 0.838215
+vt 0.573209 0.178195
+vt 0.579868 0.178984
+vt 0.874125 0.609201
+vt 0.817898 0.626255
+vt 0.670298 0.547363
+vt 0.653238 0.491123
+vt 0.732120 0.343530
+vt 0.846854 0.332224
+vt 0.935969 0.405357
+vt 0.953029 0.461597
+vt 0.759412 0.620495
+vt 0.732132 0.609195
+vt 0.658998 0.432637
+vt 0.686702 0.380807
+vt 0.759394 0.332230
+vt 0.898684 0.359926
+vt 0.919564 0.380805
+vt 0.947269 0.520085
+vt 0.919563 0.571916
+vt 0.846857 0.620495
+vt 0.788371 0.626255
+vt 0.707581 0.592792
+vt 0.686702 0.571913
+vt 0.658999 0.520082
+vt 0.653238 0.461596
+vt 0.670298 0.405358
+vt 0.707581 0.359928
+vt 0.788366 0.326464
+vt 0.817893 0.326463
+vt 0.874134 0.343522
+vt 0.947270 0.432638
+vt 0.953029 0.491125
+vt 0.935968 0.547365
+vt 0.898673 0.592803
+vt 0.214996 0.906316
+vt 0.198460 0.906317
+vt 0.182243 0.903091
+vt 0.281116 0.782613
+vt 0.290669 0.814108
+vt 0.246483 0.896766
+vt 0.231211 0.741659
+vt 0.182233 0.741662
+vt 0.198458 0.738433
+vt 0.126012 0.797890
+vt 0.141526 0.768865
+vt 0.166960 0.747990
+vt 0.271928 0.875886
+vt 0.260230 0.887583
+vt 0.214993 0.738433
+vt 0.260236 0.757172
+vt 0.271928 0.768865
+vt 0.122786 0.830643
+vt 0.290669 0.830644
+vt 0.287443 0.846861
+vt 0.287444 0.797891
+vt 0.132340 0.862137
+vt 0.166967 0.896763
+vt 0.153218 0.887577
+vt 0.141526 0.875885
+vt 0.132339 0.782614
+vt 0.281115 0.862138
+vt 0.126012 0.846860
+vt 0.153218 0.757173
+vt 0.246487 0.747986
+vt 0.231212 0.903091
+vt 0.122786 0.814107
+vt 0.305766 0.603342
+vt 0.249539 0.620395
+vt 0.101939 0.541503
+vt 0.084879 0.485264
+vt 0.163760 0.337671
+vt 0.278494 0.326364
+vt 0.367610 0.399497
+vt 0.384670 0.455738
+vt 0.191052 0.614636
+vt 0.163773 0.603336
+vt 0.090639 0.426777
+vt 0.118343 0.374948
+vt 0.191035 0.326370
+vt 0.330325 0.354067
+vt 0.351205 0.374946
+vt 0.378909 0.514226
+vt 0.351204 0.566056
+vt 0.278498 0.614635
+vt 0.220011 0.620396
+vt 0.139222 0.586933
+vt 0.118343 0.566054
+vt 0.090640 0.514223
+vt 0.084879 0.455737
+vt 0.101938 0.399499
+vt 0.139222 0.354069
+vt 0.220007 0.320605
+vt 0.249534 0.320604
+vt 0.305774 0.337663
+vt 0.378910 0.426778
+vt 0.384670 0.485266
+vt 0.367609 0.541505
+vt 0.330314 0.586943
+vt 0.103870 0.076834
+vt 0.115562 0.065142
+vt 0.129303 0.055959
+vt 0.094683 0.170106
+vt 0.129310 0.204732
+vt 0.115562 0.195546
+vt 0.208826 0.204735
+vt 0.177339 0.214285
+vt 0.088356 0.154828
+vt 0.085130 0.138611
+vt 0.085130 0.122076
+vt 0.088355 0.105859
+vt 0.160804 0.214285
+vt 0.144587 0.211060
+vt 0.193554 0.049628
+vt 0.208831 0.055955
+vt 0.222579 0.065141
+vt 0.243459 0.090582
+vt 0.249787 0.105860
+vt 0.253013 0.122077
+vt 0.234272 0.183855
+vt 0.222573 0.195552
+vt 0.144577 0.049631
+vt 0.160801 0.046402
+vt 0.193556 0.211059
+vt 0.249787 0.154830
+vt 0.177337 0.046402
+vt 0.234272 0.076833
+vt 0.243459 0.170107
+vt 0.094683 0.090583
+vt 0.103870 0.183854
+vt 0.253013 0.138613
+vt 0.606547 0.945139
+vt 0.550320 0.962192
+vt 0.402720 0.883300
+vt 0.385660 0.827061
+vt 0.464542 0.679467
+vt 0.579275 0.668161
+vt 0.668391 0.741294
+vt 0.685451 0.797535
+vt 0.491833 0.956433
+vt 0.464554 0.945133
+vt 0.391420 0.768574
+vt 0.419124 0.716744
+vt 0.491816 0.668167
+vt 0.631106 0.695864
+vt 0.651986 0.716743
+vt 0.679690 0.856022
+vt 0.651985 0.907853
+vt 0.579279 0.956432
+vt 0.520792 0.962193
+vt 0.440003 0.928729
+vt 0.419124 0.907851
+vt 0.391421 0.856020
+vt 0.385660 0.797533
+vt 0.402719 0.741295
+vt 0.440003 0.695865
+vt 0.520788 0.662401
+vt 0.550315 0.662401
+vt 0.606555 0.679459
+vt 0.679692 0.768575
+vt 0.685451 0.827063
+vt 0.668390 0.883302
+vt 0.631095 0.928740
+vt 0.443713 0.231131
+vt 0.455405 0.219439
+vt 0.469147 0.210256
+vt 0.434527 0.324402
+vt 0.469154 0.359029
+vt 0.455406 0.349843
+vt 0.548670 0.359032
+vt 0.517183 0.368582
+vt 0.428200 0.309125
+vt 0.424973 0.292908
+vt 0.424973 0.276373
+vt 0.428199 0.260156
+vt 0.500648 0.368582
+vt 0.484431 0.365357
+vt 0.533398 0.203925
+vt 0.548675 0.210252
+vt 0.562423 0.219438
+vt 0.583303 0.244879
+vt 0.589631 0.260156
+vt 0.592857 0.276374
+vt 0.574115 0.338152
+vt 0.562417 0.349849
+vt 0.484421 0.203928
+vt 0.500645 0.200699
+vt 0.533400 0.365356
+vt 0.589630 0.309127
+vt 0.517180 0.200699
+vt 0.574116 0.231130
+vt 0.583302 0.324403
+vt 0.434527 0.244880
+vt 0.443713 0.338151
+vt 0.592857 0.292910
+vn -1.0000 0.0000 -0.0007
+vn 1.0000 0.0000 0.0007
+vn 0.0007 0.0000 -1.0000
+vn -0.0007 0.0000 1.0000
+vn 0.0000 -1.0000 -0.0000
+vn 0.0000 1.0000 0.0000
+vn -0.0945 -0.9955 -0.0070
+vn 0.9955 -0.0946 -0.0012
+vn -0.9948 -0.1015 -0.0028
+vn -0.9955 0.0944 0.0018
+vn 0.9948 0.1014 0.0034
+vn -0.9955 0.0945 0.0001
+vn 0.9948 0.1015 0.0015
+vn 0.9955 -0.0945 -0.0001
+vn -0.9948 -0.1015 -0.0015
+vn 0.7707 0.6370 0.0137
+vn 0.0087 0.0090 -0.9999
+vn 0.0030 0.0066 -1.0000
+vn 0.0012 0.0099 -0.9999
+vn -0.0017 0.0090 -1.0000
+vn 0.0021 0.0095 -1.0000
+vn 0.0030 0.0054 -1.0000
+vn -0.0023 0.0081 -1.0000
+vn 0.0001 0.0101 -0.9999
+vn 0.0031 0.0076 -1.0000
+vn -0.0007 0.0094 -1.0000
+vn 0.0028 0.0087 -1.0000
+vn -0.0024 0.0070 -1.0000
+vn -0.0021 0.0059 -1.0000
+vn 0.0025 0.0057 -1.0000
+vn -0.0012 0.0002 -1.0000
+vn -0.0023 -0.0134 -0.9999
+vn -0.0041 -0.0144 -0.9999
+vn 0.1826 -0.9600 -0.2122
+vn 0.0096 0.0120 -0.9999
+vn -0.0081 0.0119 -0.9999
+vn 0.0092 0.0151 -0.9998
+vn 0.0077 0.0179 -0.9998
+vn 0.0052 0.0199 -0.9998
+vn -0.0009 0.0208 -0.9998
+vn -0.0040 0.0198 -0.9998
+vn -0.0064 0.0178 -0.9998
+vn -0.0079 0.0150 -0.9999
+vn -0.3614 -0.9098 -0.2042
+vn -0.0072 0.0089 -0.9999
+vn -0.0056 0.0056 -1.0000
+vn 0.9958 -0.0921 -0.0002
+vn -0.6371 0.7708 0.0030
+vn 0.6317 0.7752 0.0039
+vn -0.7708 -0.6371 -0.0049
+vn 0.4683 0.8835 0.0043
+vn -0.2869 -0.9579 -0.0081
+vn -0.2869 -0.9579 -0.0068
+vn 0.0945 0.9955 0.0045
+vn 0.1015 -0.9948 -0.0068
+vn 0.2869 0.9579 0.0045
+vn 0.4745 -0.8802 -0.0058
+vn 0.6371 -0.7708 -0.0049
+vn -0.8803 -0.4745 -0.0039
+vn 0.8836 -0.4683 -0.0026
+vn 0.9551 -0.2963 -0.0014
+vn -0.9951 -0.0990 -0.0017
+vn -0.9948 0.1021 -0.0012
+vn 0.8802 0.4745 0.0104
+vn 0.0022 0.0208 -0.9998
+vn 0.9554 0.2954 0.0060
+vn 0.0015 -0.0002 -1.0000
+vn 0.6316 0.7751 0.0164
+vn 0.4682 0.8834 0.0185
+vn 0.7708 0.6371 0.0034
+vn -0.4683 -0.8835 -0.0076
+vn -0.2936 0.9557 0.0195
+vn -0.4744 0.8801 0.0178
+vn -0.6370 0.7707 0.0154
+vn -0.7752 0.6316 0.0125
+vn -0.8835 0.4683 0.0090
+vn -0.9574 0.2887 0.0045
+vn 0.9940 0.1091 0.0003
+vn -0.7708 -0.6371 -0.0058
+vn -0.6317 -0.7752 -0.0068
+vn 0.8803 0.4745 0.0027
+vn 0.0945 0.9953 0.0206
+vn 0.7752 -0.6317 -0.0038
+vn -0.4683 -0.8835 -0.0064
+vn -0.0945 -0.9955 -0.0082
+vn -0.1015 0.9948 0.0044
+vn -0.2936 0.9559 0.0041
+vn -0.4745 0.8803 0.0036
+vn -0.9529 -0.3032 -0.0028
+vn -0.7752 0.6317 0.0023
+vn -0.8836 0.4683 0.0015
+vn -0.9562 0.2927 0.0006
+vn 0.9955 -0.0946 -0.0001
+vn 0.2869 0.9578 0.0199
+vn -0.9559 -0.2936 -0.0031
+vn -0.8803 -0.4745 -0.0045
+vn 0.9559 0.2936 0.0031
+vn -0.1015 0.9946 0.0204
+vn -0.6317 -0.7752 -0.0058
+vn 0.2936 -0.9559 -0.0064
+vn 0.1015 -0.9948 -0.0081
+vn 0.2936 -0.9559 -0.0076
+vn 0.4745 -0.8802 -0.0069
+vn 0.6371 -0.7708 -0.0059
+vn 0.7752 -0.6317 -0.0046
+vn 0.8836 -0.4683 -0.0032
+vn 0.9580 -0.2869 -0.0017
+vn 0.0198 0.0217 -0.9996
+vn -0.8803 -0.4745 -0.0022
+vn 0.9554 0.2954 0.0029
+vn 0.9955 -0.0946 0.0004
+vn 0.8803 0.4745 0.0015
+vn -0.6317 -0.7752 -0.0031
+vn -0.9529 -0.3032 -0.0015
+vn -0.2936 0.9559 0.0016
+vn -0.6371 0.7708 0.0010
+vn -0.0199 0.0363 -0.9991
+vn 0.0945 0.9955 0.0019
+vn 0.7752 -0.6317 -0.0013
+vn -0.9948 -0.1015 -0.0016
+vn 0.1015 -0.9948 -0.0028
+vn 0.9948 0.1014 0.0018
+vn -0.8836 0.4683 0.0002
+vn 0.9958 -0.0921 0.0003
+vn -0.0051 0.0218 -0.9998
+vn 0.0058 0.0210 -0.9998
+vn 0.0117 0.0479 -0.9988
+vn -0.0033 0.0503 -0.9987
+vn -0.9948 0.1021 -0.0009
+vn 0.6371 -0.7708 -0.0018
+vn -0.0945 -0.9955 -0.0029
+vn 0.0062 0.0131 -0.9999
+vn -0.0945 -0.9955 -0.0034
+vn -0.0110 -0.0348 -0.9993
+vn 0.0019 0.0241 -0.9997
+vn -0.7752 0.6317 0.0048
+vn -0.9955 0.0945 -0.0004
+vn 0.7752 -0.6317 -0.0016
+vn -0.9955 0.0944 0.0004
+vn 0.4683 0.8835 0.0078
+vn 0.0062 0.0160 -0.9999
+vn -0.0066 0.0195 -0.9998
+vn -0.4683 -0.8836 -0.0029
+vn -0.6317 -0.7752 -0.0027
+vn 0.0044 0.0503 -0.9987
+vn -0.0206 0.0287 -0.9994
+vn 0.2936 -0.9559 -0.0025
+vn 0.1015 -0.9948 -0.0033
+vn 0.0052 0.0138 -0.9999
+vn 0.2870 0.9579 0.0084
+vn -0.1015 0.9948 0.0084
+vn 0.8803 0.4745 0.0047
+vn -0.8836 0.4683 0.0034
+vn 0.0041 0.0230 -0.9997
+vn -0.2936 0.9559 0.0079
+vn -0.0164 0.0430 -0.9989
+vn -0.9948 -0.1015 -0.0010
+vn 0.2870 0.9579 0.0020
+vn 0.9955 -0.0945 0.0004
+vn 0.8836 -0.4683 -0.0010
+vn 0.0213 0.0366 -0.9991
+vn 0.9940 0.1091 0.0005
+vn -0.0037 0.0004 -1.0000
+vn -0.7708 -0.6371 -0.0024
+vn -0.9951 -0.0990 -0.0011
+vn 0.4745 -0.8803 -0.0022
+vn 0.6371 -0.7708 -0.0022
+vn -0.7708 -0.6371 -0.0027
+vn 0.8836 -0.4683 -0.0007
+vn -0.1015 0.9948 0.0018
+vn 0.6317 0.7752 0.0070
+vn -0.9562 0.2927 -0.0001
+vn 0.0176 0.0433 -0.9989
+vn -0.6371 0.7708 0.0061
+vn 0.9559 0.2936 0.0017
+vn -0.2870 -0.9579 -0.0029
+vn -0.0106 0.0479 -0.9988
+vn -0.3679 -0.9259 -0.0861
+vn 0.9580 -0.2869 -0.0003
+vn 0.0222 0.0291 -0.9993
+vn -0.0067 -0.0324 -0.9995
+vn 0.6317 0.7752 0.0019
+vn 0.2936 -0.9559 -0.0030
+vn -0.7752 0.6317 0.0006
+vn -0.9559 -0.2936 -0.0017
+vn 0.9948 0.1015 0.0010
+vn 0.0065 0.0185 -0.9998
+vn -0.0060 0.0143 -0.9999
+vn 0.7708 0.6371 0.0017
+vn -0.4745 0.8803 0.0013
+vn 0.4745 -0.8803 -0.0027
+vn -0.0144 0.0136 -0.9998
+vn -0.8803 -0.4745 -0.0020
+vn 0.0945 0.9955 0.0085
+vn 0.1860 -0.9785 -0.0894
+vn -0.0068 0.0169 -0.9998
+vn -0.0028 0.0228 -0.9997
+vn -0.4745 0.8802 0.0072
+vn 0.7708 0.6370 0.0060
+vn -0.0183 0.0215 -0.9996
+vn -0.4683 -0.8836 -0.0033
+vn -0.9574 0.2887 0.0015
+vn 0.0026 -0.0005 -1.0000
+vn 0.9551 -0.2963 -0.0002
+vn -0.2870 -0.9579 -0.0034
+vn 0.4683 0.8836 0.0020
+vn -0.0007 0.0244 -0.9997
+vn -0.0946 -0.9955 -0.0070
+vn 0.7708 0.6370 0.0137
+vn 0.0064 0.0070 -1.0000
+vn 0.0038 0.0070 -1.0000
+vn 0.0012 0.0101 -0.9999
+vn -0.0015 0.0087 -1.0000
+vn 0.0023 0.0097 -1.0000
+vn 0.0070 0.0057 -1.0000
+vn -0.0017 0.0076 -1.0000
+vn 0.0002 0.0100 -1.0000
+vn 0.0037 0.0081 -1.0000
+vn -0.0009 0.0097 -1.0000
+vn 0.0031 0.0091 -1.0000
+vn -0.0016 0.0066 -1.0000
+vn -0.0011 0.0057 -1.0000
+vn 0.0034 0.0060 -1.0000
+vn 0.0000 -0.0002 -1.0000
+vn 0.0057 -0.0144 -0.9999
+vn 0.0039 -0.0134 -0.9999
+vn 0.3681 -0.9072 -0.2037
+vn 0.0080 0.0100 -0.9999
+vn -0.0065 0.0098 -0.9999
+vn 0.0083 0.0133 -0.9999
+vn 0.0073 0.0164 -0.9998
+vn 0.0052 0.0189 -0.9998
+vn -0.0010 0.0204 -0.9998
+vn -0.0039 0.0188 -0.9998
+vn -0.0059 0.0163 -0.9998
+vn -0.0069 0.0131 -0.9999
+vn -0.1756 -0.9613 -0.2124
+vn -0.0049 0.0070 -1.0000
+vn -0.0015 0.0053 -1.0000
+vn 0.4683 0.8836 0.0043
+vn 0.9579 -0.2869 -0.0052
+vn 0.8803 0.4744 0.0104
+vn 0.0023 0.0204 -0.9998
+vn 0.9559 0.2935 0.0067
+vn 0.0026 0.0002 -1.0000
+vn 0.4683 0.8834 0.0185
+vn -0.6371 0.7706 0.0154
+vn -0.8836 0.4682 0.0090
+vn -0.9580 0.2868 0.0053
+vn -0.9559 -0.2936 -0.0067
+vn -0.9579 0.2869 0.0017
+vn 0.2869 0.9577 0.0199
+vn 0.9541 0.2995 0.0020
+vn 0.0086 0.0090 -0.9999
+vn -0.0018 0.0090 -1.0000
+vn -0.0020 0.0059 -1.0000
+vn -0.0011 0.0002 -1.0000
+vn 0.1825 -0.9600 -0.2122
+vn -0.0039 0.0198 -0.9998
+vn -0.0078 0.0150 -0.9999
+vn 0.0014 -0.0002 -1.0000
+vn 0.0037 0.0070 -1.0000
+vn -0.0014 0.0086 -1.0000
+vn -0.0010 0.0097 -1.0000
+vn -0.0012 0.0057 -1.0000
+vn 0.0035 0.0060 -1.0000
+vn 0.0058 -0.0144 -0.9999
+vn -0.0065 0.0099 -0.9999
+vn -0.0060 0.0163 -0.9998
+vn -0.0050 0.0070 -1.0000
+vn 0.8802 0.4744 0.0104
+vn -0.0946 -0.9955 -0.0029
+vn 0.0144 0.0170 -0.9998
+vn 0.0082 0.0169 -0.9998
+vn 0.0020 0.0244 -0.9997
+vn -0.0045 0.0210 -0.9998
+vn 0.0046 0.0236 -0.9997
+vn 0.0159 0.0138 -0.9998
+vn -0.0052 0.0185 -0.9998
+vn -0.0006 0.0241 -0.9997
+vn 0.0080 0.0196 -0.9998
+vn -0.0033 0.0236 -0.9997
+vn 0.0067 0.0219 -0.9997
+vn -0.0049 0.0159 -0.9999
+vn -0.0037 0.0137 -0.9999
+vn 0.0073 0.0144 -0.9999
+vn -0.0009 -0.0005 -1.0000
+vn 0.0130 -0.0347 -0.9993
+vn 0.0083 -0.0323 -0.9994
+vn 0.3745 -0.9232 -0.0856
+vn 0.0183 0.0241 -0.9995
+vn -0.0168 0.0238 -0.9996
+vn 0.0190 0.0321 -0.9993
+vn 0.0166 0.0396 -0.9991
+vn 0.0115 0.0458 -0.9989
+vn -0.0034 0.0494 -0.9988
+vn -0.0103 0.0455 -0.9989
+vn -0.0153 0.0394 -0.9991
+vn -0.0176 0.0317 -0.9993
+vn -0.1790 -0.9798 -0.0896
+vn -0.0130 0.0169 -0.9998
+vn -0.0046 0.0129 -0.9999
+vn -0.2869 -0.9579 -0.0029
+vn 0.2869 0.9579 0.0020
+vn 0.9580 -0.2869 -0.0018
+vn 0.8803 0.4744 0.0047
+vn 0.0045 0.0493 -0.9988
+vn 0.9559 0.2935 0.0032
+vn 0.0053 0.0005 -1.0000
+vn 0.4683 0.8835 0.0079
+vn -0.2937 0.9559 0.0079
+vn -0.6371 0.7707 0.0061
+vn -0.7752 0.6316 0.0048
+vn -0.9580 0.2868 0.0018
+vn 0.0946 0.9955 0.0085
+vn -0.9580 0.2869 0.0003
+vn 0.9541 0.2995 0.0012
+vn -0.9579 0.2869 0.0003
+vn 0.0115 0.0457 -0.9989
+vn 0.9940 0.1090 0.0005
+vn 0.0129 -0.0347 -0.9993
+vn 0.0221 0.0291 -0.9993
+vn 0.0182 0.0241 -0.9995
+vn 0.0074 0.0144 -0.9999
+vn 0.0199 0.0217 -0.9996
+vn -0.4683 -0.8835 -0.0029
+vn 0.1859 -0.9785 -0.0894
+vn 0.4745 -0.8802 -0.0022
+vn 0.7708 0.6371 0.0060
+vn 0.0081 0.0169 -0.9998
+vn 0.3745 -0.9233 -0.0856
+vn 0.0061 0.0131 -0.9999
+vn 0.0029 0.0054 -1.0000
+vn -0.0008 0.0094 -1.0000
+vn -0.0024 -0.0134 -0.9999
+vn -0.0055 0.0056 -1.0000
+vn 0.0013 0.0101 -0.9999
+vn -0.0014 0.0087 -1.0000
+vn 0.0022 0.0097 -1.0000
+vn 0.0001 0.0100 -1.0000
+vn 0.0032 0.0091 -1.0000
+vn -0.2870 -0.9579 -0.0081
+vn 0.0025 -0.0005 -1.0000
+vn 0.0051 0.0138 -0.9999
+vn 0.0066 0.0219 -0.9997
+vn -0.0105 0.0479 -0.9988
+vn 0.0220 0.0291 -0.9993
+vn 0.0045 0.0236 -0.9997
+vn 0.0045 0.0494 -0.9988
+vn 0.0158 0.0138 -0.9998
+vn 0.0042 0.0230 -0.9997
+vn -0.0045 0.0209 -0.9998
+vn -0.0131 0.0169 -0.9998
+vn -0.0066 -0.0324 -0.9995
+vn -0.0010 -0.0005 -1.0000
+vn 0.0117 0.0480 -0.9988
+vn -0.0052 0.0218 -0.9997
+vn -0.0038 0.0004 -1.0000
+vn -0.0051 0.0159 -0.9999
+vn -0.0154 0.0394 -0.9991
+vn 0.0079 0.0196 -0.9998
+vn 0.0145 0.0170 -0.9997
+vn 0.0084 -0.0323 -0.9994
+vn 0.0080 0.0169 -0.9998
+vn 0.0063 0.0160 -0.9999
+vn 0.0054 0.0005 -1.0000
+vn -0.3678 -0.9259 -0.0861
+vn -0.0032 0.0236 -0.9997
+vn -0.0185 0.0215 -0.9996
+vn -0.0065 0.0195 -0.9998
+vn 0.0059 0.0210 -0.9998
+vn 0.0007 0.0044 -1.0000
+vn 0.0007 0.0045 -1.0000
+vn 0.0007 0.0040 -1.0000
+vn 0.0004 0.0041 -1.0000
+vn 0.0008 0.0044 -1.0000
+vn 0.0006 0.0045 -1.0000
+vn 0.0007 0.0046 -1.0000
+vn 0.0008 0.0045 -1.0000
+vn 0.0010 0.0038 -1.0000
+vn 0.0006 0.0040 -1.0000
+vn 0.0007 0.0039 -1.0000
+vn 0.0007 0.0041 -1.0000
+vn 0.0019 0.0042 -1.0000
+vn 0.0008 0.0043 -1.0000
+vn 0.0005 0.0109 -0.9999
+vn 0.0007 0.0096 -1.0000
+vn 0.0013 0.0092 -1.0000
+vn 0.0006 0.0107 -0.9999
+vn 0.0036 0.0102 -0.9999
+vn 0.0007 0.0097 -1.0000
+vn 0.0007 0.0108 -0.9999
+vn 0.0008 0.0099 -1.0000
+vn 0.0007 0.0109 -0.9999
+vn 0.0007 0.0107 -0.9999
+vn 0.0009 0.0108 -0.9999
+vn 0.0007 0.0111 -0.9999
+vn 0.0008 0.0108 -0.9999
+vn 0.0000 0.0099 -1.0000
+vn 0.0007 0.0095 -1.0000
+vn 0.0010 0.0107 -0.9999
+vn 0.0010 0.0104 -0.9999
+vn 0.0018 0.0042 -1.0000
+vn -0.0001 0.0099 -1.0000
+vn 0.0008 0.0096 -1.0000
+vn 0.0035 0.0102 -0.9999
+vn 0.0006 0.0097 -1.0000
+vn 0.0006 0.0096 -1.0000
+vn 0.0006 0.0044 -1.0000
+vn 0.0009 0.0038 -1.0000
+vn 0.0008 0.0040 -1.0000
+vn 0.0008 0.0111 -0.9999
+vn 0.0006 0.0109 -0.9999
+vn 0.0037 0.0102 -0.9999
+vn 0.0009 0.0107 -0.9999
+vn 0.0005 0.0108 -0.9999
+vn 0.0009 0.0096 -1.0000
+g KsHauptsignal_Plane.006_Mast
+usemtl Mast
+s off
+f 13/1/1 12/2/1 11/3/1 14/4/1
+f 9/5/2 16/6/2 15/7/2 10/8/2
+f 16/9/3 13/10/3 14/11/3 15/12/3
+f 12/13/4 9/14/4 10/15/4 11/16/4
+f 21/17/4 20/18/4 19/19/4 22/20/4
+f 24/21/1 21/22/1 22/23/1 23/24/1
+f 20/25/2 17/26/2 18/27/2 19/28/2
+f 24/21/1 23/24/1 11/3/1 12/2/1
+f 17/29/5 24/30/5 12/31/5 9/32/5
+f 18/27/2 17/26/2 9/5/2 10/8/2
+f 23/33/6 18/34/6 10/35/6 11/36/6
+f 19/37/6 18/34/6 23/33/6 22/38/6
+f 11/36/6 10/35/6 15/39/6 14/40/6
+f 3/41/1 2/42/1 12/2/1 13/1/1
+f 1/43/2 4/44/2 16/6/2 9/5/2
+f 4/45/3 3/46/3 13/10/3 16/9/3
+f 2/47/4 1/48/4 9/14/4 12/13/4
+f 7/49/4 6/50/4 20/18/4 21/17/4
+f 5/51/3 8/52/3 24/53/3 17/54/3
+f 8/55/1 7/56/1 21/22/1 24/21/1
+f 6/57/2 5/58/2 17/26/2 20/25/2
+f 800/59/6 797/60/6 793/61/6 794/62/6
+f 804/63/1 806/64/1 812/65/1 813/66/1
+f 813/66/1 812/65/1 811/67/1 814/68/1
+f 808/69/2 803/70/2 816/71/2 809/72/2
+f 809/72/2 816/71/2 815/73/2 810/74/2
+f 803/75/3 804/63/3 813/66/3 816/76/3
+f 816/76/3 813/66/3 814/68/3 815/77/3
+f 806/78/4 808/79/4 809/80/4 812/81/4
+f 812/81/4 809/80/4 810/82/4 811/83/4
+f 801/84/4 802/85/4 820/86/4 821/87/4
+f 821/87/4 820/86/4 819/88/4 822/89/4
+f 807/90/3 805/91/3 824/92/3 817/93/3
+f 805/94/1 801/95/1 821/96/1 824/97/1
+f 824/97/1 821/96/1 822/98/1 823/99/1
+f 802/100/2 807/101/2 817/102/2 820/103/2
+f 820/103/2 817/102/2 818/104/2 819/105/2
+f 824/97/1 823/99/1 811/67/1 812/65/1
+f 817/106/5 824/107/5 812/108/5 809/109/5
+f 818/104/2 817/102/2 809/72/2 810/74/2
+f 823/110/6 818/111/6 810/112/6 811/113/6
+f 819/114/6 818/111/6 823/110/6 822/115/6
+f 811/113/6 810/112/6 815/116/6 814/117/6
+f 832/118/6 829/119/6 825/120/6 826/121/6
+f 836/122/1 838/123/1 844/124/1 845/125/1
+f 845/125/1 844/124/1 843/126/1 846/127/1
+f 840/128/2 835/129/2 848/130/2 841/131/2
+f 841/131/2 848/130/2 847/132/2 842/133/2
+f 835/134/3 836/135/3 845/136/3 848/137/3
+f 848/137/3 845/136/3 846/138/3 847/139/3
+f 838/140/4 840/141/4 841/142/4 844/143/4
+f 844/143/4 841/142/4 842/144/4 843/145/4
+f 833/146/4 834/147/4 852/148/4 853/149/4
+f 853/149/4 852/148/4 851/150/4 854/151/4
+f 839/152/3 837/153/3 856/154/3 849/155/3
+f 837/156/1 833/157/1 853/158/1 856/159/1
+f 856/159/1 853/158/1 854/160/1 855/161/1
+f 834/162/2 839/163/2 849/164/2 852/165/2
+f 852/165/2 849/164/2 850/166/2 851/167/2
+f 856/159/1 855/161/1 843/126/1 844/124/1
+f 849/168/5 856/169/5 844/170/5 841/171/5
+f 850/166/2 849/164/2 841/131/2 842/133/2
+f 855/172/6 850/173/6 842/174/6 843/175/6
+f 851/176/6 850/173/6 855/172/6 854/177/6
+f 843/175/6 842/174/6 847/178/6 846/179/6
+g KsHauptsignal_Plane.006_Schirm
+usemtl Schirm
+f 857/180/3 858/181/3 860/182/3 859/183/3
+f 862/184/4 861/185/4 864/186/4 863/187/4
+f 859/188/2 861/189/2 862/190/2 857/191/2
+f 860/192/6 864/193/6 861/194/6 859/195/6
+f 857/196/5 862/197/5 863/198/5 858/199/5
+f 858/200/1 863/201/1 864/202/1 860/203/1
+g KsHauptsignal_Plane.006_Lampenrahmen
+usemtl Lampenrahmen
+f 40/204/7 39/205/7 41/206/7
+f 26/207/8 88/208/8 25/209/8
+f 54/210/9 53/211/9 56/212/9
+f 58/213/10 56/212/10 57/214/10
+f 86/215/11 85/216/11 88/208/11
+f 90/217/12 89/218/12 152/219/12
+f 118/220/13 120/221/13 117/222/13
+f 122/223/14 121/224/14 120/221/14
+f 150/225/15 152/219/15 149/226/15
+f 79/227/16 81/228/16 82/229/16
+f 81/230/17 145/231/17 147/232/17
+f 111/233/18 113/234/18 49/235/18
+f 103/236/19 105/237/19 41/238/19
+f 99/239/20 35/240/20 33/241/20
+f 105/237/21 107/242/21 43/243/21
+f 147/232/22 149/244/22 85/245/22
+f 97/246/23 33/241/23 31/247/23
+f 103/236/24 39/248/24 37/249/24
+f 109/250/25 111/233/25 47/251/25
+f 35/240/26 99/239/26 101/252/26
+f 107/242/27 109/250/27 45/253/27
+f 95/254/28 31/247/28 29/255/28
+f 93/256/29 29/255/29 27/257/29
+f 113/234/30 115/258/30 51/259/30
+f 151/260/31 89/261/31 25/262/31
+f 149/244/32 151/260/32 87/263/32
+f 121/264/33 57/265/33 55/266/33
+f 115/258/34 117/267/34 53/268/34
+f 79/269/35 143/270/35 145/231/35
+f 125/271/36 127/272/36 63/273/36
+f 77/274/37 141/275/37 143/270/37
+f 75/276/38 139/277/38 141/275/38
+f 73/278/39 137/279/39 139/277/39
+f 133/280/40 135/281/40 71/282/40
+f 131/283/41 133/280/41 69/284/41
+f 129/285/42 131/283/42 67/286/42
+f 127/272/43 129/285/43 65/287/43
+f 91/288/44 27/257/44 25/262/44
+f 123/289/45 125/271/45 61/290/45
+f 123/289/46 59/291/46 57/265/46
+f 88/208/47 87/292/47 25/209/47
+f 97/293/48 95/294/48 96/295/48
+f 112/296/49 111/297/49 109/298/49
+f 48/299/50 47/300/50 49/301/50
+f 110/302/51 109/298/51 107/303/51
+f 140/304/52 139/305/52 137/306/52
+f 42/307/53 41/206/53 43/308/53
+f 106/309/54 105/310/54 103/311/54
+f 37/312/55 39/205/55 40/204/55
+f 108/313/56 107/303/56 105/314/56
+f 33/315/57 35/316/57 36/317/57
+f 31/318/58 33/315/58 34/319/58
+f 50/320/59 49/301/59 51/321/59
+f 27/322/60 29/323/60 30/324/60
+f 25/209/61 27/322/61 28/325/61
+f 53/211/62 55/326/62 56/212/62
+f 56/212/63 55/326/63 57/214/63
+f 81/228/64 83/327/64 84/328/64
+f 71/282/65 135/281/65 137/279/65
+f 83/327/66 85/216/66 86/215/66
+f 119/329/67 55/266/67 53/268/67
+f 77/330/68 79/227/68 80/331/68
+f 75/332/69 77/330/69 78/333/69
+f 114/334/70 113/335/70 111/297/70
+f 142/336/71 141/337/71 139/305/71
+f 68/338/72 67/339/72 69/340/72
+f 66/341/73 65/342/73 67/339/73
+f 64/343/74 63/344/74 65/342/74
+f 62/345/75 61/346/75 63/344/75
+f 60/347/76 59/348/76 61/346/76
+f 58/213/77 57/214/77 59/348/77
+f 85/216/78 87/292/78 88/208/78
+f 89/218/12 151/349/12 152/219/12
+f 146/350/79 145/351/79 143/352/79
+f 144/353/80 143/352/80 141/337/80
+f 116/354/81 115/355/81 113/335/81
+f 71/356/82 73/357/82 74/358/82
+f 29/323/83 31/318/83 32/359/83
+f 44/360/84 43/308/84 45/361/84
+f 138/362/85 137/306/85 135/363/85
+f 103/311/86 101/364/86 102/365/86
+f 101/364/87 99/366/87 100/367/87
+f 99/366/88 97/293/88 98/368/88
+f 52/369/89 51/321/89 53/211/89
+f 95/294/90 93/370/90 94/371/90
+f 93/370/91 91/372/91 92/373/91
+f 92/373/92 91/372/92 89/218/92
+f 120/221/13 119/374/13 117/222/13
+f 121/224/93 119/374/93 120/221/93
+f 73/357/94 75/332/94 76/375/94
+f 150/225/95 149/226/95 147/376/95
+f 148/377/96 147/376/96 145/351/96
+f 116/354/97 118/220/97 117/222/97
+f 70/378/98 69/340/98 71/379/98
+f 46/380/99 45/361/99 47/300/99
+f 35/316/100 37/312/100 38/381/100
+f 135/363/101 133/382/101 134/383/101
+f 133/382/102 131/384/102 132/385/102
+f 131/384/103 129/386/103 130/387/103
+f 129/386/104 127/388/104 128/389/104
+f 127/388/105 125/390/105 126/391/105
+f 125/390/106 123/392/106 124/393/106
+f 123/392/107 121/224/107 122/223/107
+f 152/219/15 151/349/15 149/226/15
+f 209/394/108 273/395/108 275/396/108
+f 276/397/109 275/398/109 273/399/109
+f 211/400/110 213/401/110 214/402/110
+f 249/403/111 247/404/111 248/405/111
+f 244/406/112 243/407/112 241/408/112
+f 272/409/113 271/410/113 269/411/113
+f 180/412/114 179/413/114 181/414/114
+f 229/415/115 227/416/115 228/417/115
+f 225/418/116 223/419/116 224/420/116
+f 255/421/117 257/422/117 193/423/117
+f 234/424/118 233/425/118 231/426/118
+f 157/427/119 159/428/119 160/429/119
+f 182/430/120 181/414/120 184/431/120
+f 165/432/121 167/433/121 168/434/121
+f 214/402/122 213/401/122 216/435/122
+f 221/436/123 219/437/123 220/438/123
+f 216/435/124 215/439/124 153/440/124
+f 227/441/125 163/442/125 161/443/125
+f 235/444/126 237/445/126 173/446/126
+f 201/447/127 265/448/127 267/449/127
+f 261/450/128 263/451/128 199/452/128
+f 184/431/129 183/453/129 185/454/129
+f 159/428/130 161/455/130 162/456/130
+f 168/434/131 167/433/131 169/457/131
+f 275/396/132 277/458/132 213/459/132
+f 266/460/133 265/461/133 263/462/133
+f 249/463/134 185/464/134 183/465/134
+f 231/466/135 233/467/135 169/468/135
+f 190/469/136 189/470/136 191/471/136
+f 217/472/137 279/473/137 280/474/137
+f 255/475/138 253/476/138 254/477/138
+f 186/478/139 184/431/139 185/454/139
+f 203/479/140 205/480/140 206/481/140
+f 239/482/141 241/483/141 177/484/141
+f 225/485/142 161/443/142 159/486/142
+f 172/487/143 171/488/143 173/489/143
+f 174/490/144 173/489/144 175/491/144
+f 199/452/145 263/451/145 265/448/145
+f 253/492/146 255/421/146 191/493/146
+f 163/494/147 165/432/147 166/495/147
+f 263/462/148 261/496/148 262/497/148
+f 241/483/149 243/498/149 179/499/149
+f 201/500/150 203/479/150 204/501/150
+f 198/502/151 197/503/151 199/504/151
+f 209/505/152 211/400/152 212/506/152
+f 188/507/153 187/508/153 189/470/153
+f 233/467/154 235/444/154 171/509/154
+f 196/510/155 195/511/155 197/503/155
+f 257/422/156 259/512/156 195/513/156
+f 278/514/157 280/474/157 277/515/157
+f 236/516/158 235/517/158 233/518/158
+f 250/519/159 249/403/159 248/405/159
+f 253/476/160 251/520/160 252/521/160
+f 205/522/161 269/523/161 271/524/161
+f 213/401/162 215/439/162 216/435/162
+f 154/525/93 216/435/93 153/440/93
+f 218/526/137 217/472/137 280/474/137
+f 279/527/163 217/528/163 153/529/163
+f 176/530/164 175/491/164 177/531/164
+f 181/414/165 183/453/165 184/431/165
+f 161/455/166 163/494/166 164/532/166
+f 280/474/157 279/473/157 277/515/157
+f 257/533/167 255/475/167 256/534/167
+f 274/535/168 273/399/168 271/410/168
+f 155/536/169 157/427/169 158/537/169
+f 231/426/170 229/415/170 230/538/170
+f 205/480/171 207/539/171 208/540/171
+f 220/438/172 219/437/172 217/472/172
+f 203/541/173 267/449/173 269/523/173
+f 192/542/174 191/471/174 193/543/174
+f 244/406/175 246/544/175 245/545/175
+f 170/546/176 169/457/176 171/488/176
+f 259/512/177 261/450/177 197/547/177
+f 219/548/178 155/549/178 153/529/178
+f 251/520/179 249/403/179 250/519/179
+f 207/550/180 271/524/180 273/395/180
+f 277/458/181 279/527/181 215/551/181
+f 240/552/182 239/553/182 237/554/182
+f 261/496/183 259/555/183 260/556/183
+f 223/419/184 221/436/184 222/557/184
+f 278/514/185 277/515/185 275/398/185
+f 248/405/186 247/404/186 245/545/186
+f 237/445/187 239/482/187 175/558/187
+f 246/544/186 248/405/186 245/545/186
+f 221/559/188 157/560/188 155/549/188
+f 242/561/189 241/408/189 239/553/189
+f 227/416/190 225/418/190 226/562/190
+f 259/555/191 257/533/191 258/563/191
+f 251/564/192 187/565/192 185/464/192
+f 178/566/193 177/531/193 179/413/193
+f 199/567/194 201/500/194 202/568/194
+f 243/498/195 245/569/195 181/570/195
+f 223/571/196 159/486/196 157/560/196
+f 163/442/197 227/441/197 229/572/197
+f 194/573/198 193/543/198 195/511/198
+f 207/539/199 209/505/199 210/574/199
+f 251/564/200 253/492/200 189/575/200
+f 270/576/201 269/411/201 267/577/201
+f 186/478/202 185/454/202 187/508/202
+f 247/578/203 183/465/203 181/570/203
+f 153/440/204 155/536/204 156/579/204
+f 268/580/205 267/577/205 265/461/205
+f 238/581/206 237/554/206 235/517/206
+f 231/466/207 167/582/207 165/583/207
+f 42/307/208 40/204/208 41/206/208
+f 80/331/209 79/227/209 82/229/209
+f 83/584/210 81/230/210 147/232/210
+f 47/251/211 111/233/211 49/235/211
+f 39/248/212 103/236/212 41/238/212
+f 97/246/213 99/239/213 33/241/213
+f 41/238/214 105/237/214 43/243/214
+f 83/584/215 147/232/215 85/245/215
+f 95/254/216 97/246/216 31/247/216
+f 101/252/217 103/236/217 37/249/217
+f 45/253/218 109/250/218 47/251/218
+f 37/249/219 35/240/219 101/252/219
+f 43/243/220 107/242/220 45/253/220
+f 93/256/221 95/254/221 29/255/221
+f 91/288/222 93/256/222 27/257/222
+f 49/235/223 113/234/223 51/259/223
+f 87/263/224 151/260/224 25/262/224
+f 85/245/225 149/244/225 87/263/225
+f 119/329/226 121/264/226 55/266/226
+f 51/259/227 115/258/227 53/268/227
+f 81/230/228 79/269/228 145/231/228
+f 61/290/229 125/271/229 63/273/229
+f 79/269/230 77/274/230 143/270/230
+f 77/274/231 75/276/231 141/275/231
+f 75/276/232 73/278/232 139/277/232
+f 69/284/233 133/280/233 71/282/233
+f 67/286/234 131/283/234 69/284/234
+f 65/287/235 129/285/235 67/286/235
+f 63/273/236 127/272/236 65/287/236
+f 89/261/237 91/288/237 25/262/237
+f 59/291/238 123/289/238 61/290/238
+f 121/264/239 123/289/239 57/265/239
+f 98/368/48 97/293/48 96/295/48
+f 110/302/49 112/296/49 109/298/49
+f 50/320/50 48/299/50 49/301/50
+f 108/313/240 110/302/240 107/303/240
+f 138/362/52 140/304/52 137/306/52
+f 44/360/53 42/307/53 43/308/53
+f 104/585/54 106/309/54 103/311/54
+f 38/381/55 37/312/55 40/204/55
+f 106/586/56 108/313/56 105/314/56
+f 34/319/57 33/315/57 36/317/57
+f 32/359/58 31/318/58 34/319/58
+f 52/369/59 50/320/59 51/321/59
+f 28/325/60 27/322/60 30/324/60
+f 26/207/241 25/209/241 28/325/241
+f 82/229/242 81/228/242 84/328/242
+f 73/278/243 71/282/243 137/279/243
+f 84/328/244 83/327/244 86/215/244
+f 117/267/245 119/329/245 53/268/245
+f 78/333/68 77/330/68 80/331/68
+f 76/375/246 75/332/246 78/333/246
+f 112/296/70 114/334/70 111/297/70
+f 140/304/71 142/336/71 139/305/71
+f 70/378/72 68/338/72 69/340/72
+f 68/338/73 66/341/73 67/339/73
+f 66/341/247 64/343/247 65/342/247
+f 64/343/75 62/345/75 63/344/75
+f 62/345/248 60/347/248 61/346/248
+f 60/347/249 58/213/249 59/348/249
+f 144/353/79 146/350/79 143/352/79
+f 142/336/80 144/353/80 141/337/80
+f 114/334/81 116/354/81 113/335/81
+f 72/587/82 71/356/82 74/358/82
+f 30/324/83 29/323/83 32/359/83
+f 46/380/84 44/360/84 45/361/84
+f 136/588/85 138/362/85 135/363/85
+f 104/585/86 103/311/86 102/365/86
+f 102/365/87 101/364/87 100/367/87
+f 100/367/88 99/366/88 98/368/88
+f 54/210/250 52/369/250 53/211/250
+f 96/295/90 95/294/90 94/371/90
+f 94/371/91 93/370/91 92/373/91
+f 90/217/251 92/373/251 89/218/251
+f 74/358/252 73/357/252 76/375/252
+f 148/377/95 150/225/95 147/376/95
+f 146/350/96 148/377/96 145/351/96
+f 115/355/253 116/354/253 117/222/253
+f 72/589/98 70/378/98 71/379/98
+f 48/299/99 46/380/99 47/300/99
+f 36/317/100 35/316/100 38/381/100
+f 136/588/101 135/363/101 134/383/101
+f 134/383/102 133/382/102 132/385/102
+f 132/385/103 131/384/103 130/387/103
+f 130/387/104 129/386/104 128/389/104
+f 128/389/105 127/388/105 126/391/105
+f 126/391/106 125/390/106 124/393/106
+f 124/393/107 123/392/107 122/223/107
+f 296/590/7 295/591/7 297/592/7
+f 282/593/8 344/594/8 281/595/8
+f 310/596/9 309/597/9 312/598/9
+f 314/599/10 312/598/10 313/600/10
+f 342/601/11 341/602/11 344/594/11
+f 346/603/12 345/604/12 408/605/12
+f 374/606/13 376/607/13 373/608/13
+f 378/609/14 377/610/14 376/607/14
+f 406/611/15 408/605/15 405/612/15
+f 335/613/16 337/614/16 338/615/16
+f 337/616/254 401/617/254 403/618/254
+f 367/619/18 369/620/18 305/621/18
+f 359/622/19 361/623/19 297/624/19
+f 355/625/255 291/626/255 289/627/255
+f 361/623/21 363/628/21 299/629/21
+f 403/618/22 405/630/22 341/631/22
+f 353/632/23 289/627/23 287/633/23
+f 359/622/24 295/634/24 293/635/24
+f 365/636/25 367/619/25 303/637/25
+f 291/626/26 355/625/26 357/638/26
+f 363/628/27 365/636/27 301/639/27
+f 351/640/28 287/633/28 285/641/28
+f 349/642/256 285/641/256 283/643/256
+f 369/620/30 371/644/30 307/645/30
+f 407/646/257 345/647/257 281/648/257
+f 405/630/32 407/646/32 343/649/32
+f 377/650/33 313/651/33 311/652/33
+f 371/644/258 373/653/258 309/654/258
+f 335/655/35 399/656/35 401/617/35
+f 381/657/36 383/658/36 319/659/36
+f 333/660/37 397/661/37 399/656/37
+f 331/662/38 395/663/38 397/661/38
+f 329/664/39 393/665/39 395/663/39
+f 389/666/40 391/667/40 327/668/40
+f 387/669/259 389/666/259 325/670/259
+f 385/671/42 387/669/42 323/672/42
+f 383/658/260 385/671/260 321/673/260
+f 347/674/44 283/643/44 281/648/44
+f 379/675/45 381/657/45 317/676/45
+f 379/675/46 315/677/46 313/651/46
+f 344/594/47 343/678/47 281/595/47
+f 353/679/48 351/680/48 352/681/48
+f 368/682/49 367/683/49 365/684/49
+f 304/685/50 303/686/50 305/687/50
+f 366/688/51 365/684/51 363/689/51
+f 396/690/52 395/691/52 393/692/52
+f 298/693/53 297/592/53 299/694/53
+f 362/695/54 361/696/54 359/697/54
+f 293/698/55 295/591/55 296/590/55
+f 364/699/56 363/689/56 361/700/56
+f 289/701/57 291/702/57 292/703/57
+f 287/704/58 289/701/58 290/705/58
+f 306/706/59 305/687/59 307/707/59
+f 283/708/60 285/709/60 286/710/60
+f 281/595/61 283/708/61 284/711/61
+f 309/597/62 311/712/62 312/598/62
+f 312/598/63 311/712/63 313/600/63
+f 337/614/64 339/713/64 340/714/64
+f 327/668/65 391/667/65 393/665/65
+f 339/713/66 341/602/66 342/601/66
+f 375/715/261 311/652/261 309/654/261
+f 333/716/68 335/613/68 336/717/68
+f 331/718/69 333/716/69 334/719/69
+f 370/720/70 369/721/70 367/683/70
+f 398/722/71 397/723/71 395/691/71
+f 324/724/72 323/725/72 325/726/72
+f 322/727/73 321/728/73 323/725/73
+f 320/729/74 319/730/74 321/728/74
+f 318/731/75 317/732/75 319/730/75
+f 316/733/76 315/734/76 317/732/76
+f 314/599/77 313/600/77 315/734/77
+f 341/602/78 343/678/78 344/594/78
+f 345/604/12 407/735/12 408/605/12
+f 402/736/79 401/737/79 399/738/79
+f 400/739/80 399/738/80 397/723/80
+f 372/740/81 371/741/81 369/721/81
+f 327/742/82 329/743/82 330/744/82
+f 285/709/83 287/704/83 288/745/83
+f 300/746/84 299/694/84 301/747/84
+f 394/748/85 393/692/85 391/749/85
+f 359/697/86 357/750/86 358/751/86
+f 357/750/87 355/752/87 356/753/87
+f 355/752/88 353/679/88 354/754/88
+f 308/755/89 307/707/89 309/597/89
+f 351/680/90 349/756/90 350/757/90
+f 349/756/91 347/758/91 348/759/91
+f 348/759/92 347/758/92 345/604/92
+f 376/607/13 375/760/13 373/608/13
+f 377/610/93 375/760/93 376/607/93
+f 329/743/94 331/718/94 332/761/94
+f 406/611/95 405/612/95 403/762/95
+f 404/763/96 403/762/96 401/737/96
+f 372/740/97 374/606/97 373/608/97
+f 326/764/98 325/726/98 327/765/98
+f 302/766/99 301/747/99 303/686/99
+f 291/702/100 293/698/100 294/767/100
+f 391/749/101 389/768/101 390/769/101
+f 389/768/102 387/770/102 388/771/102
+f 387/770/103 385/772/103 386/773/103
+f 385/772/104 383/774/104 384/775/104
+f 383/774/105 381/776/105 382/777/105
+f 381/776/106 379/778/106 380/779/106
+f 379/778/107 377/610/107 378/609/107
+f 408/605/15 407/735/15 405/612/15
+f 298/693/208 296/590/208 297/592/208
+f 336/717/209 335/613/209 338/615/209
+f 339/780/210 337/616/210 403/618/210
+f 303/637/262 367/619/262 305/621/262
+f 295/634/212 359/622/212 297/624/212
+f 353/632/263 355/625/263 289/627/263
+f 297/624/214 361/623/214 299/629/214
+f 339/780/215 403/618/215 341/631/215
+f 351/640/216 353/632/216 287/633/216
+f 357/638/217 359/622/217 293/635/217
+f 301/639/218 365/636/218 303/637/218
+f 293/635/264 291/626/264 357/638/264
+f 299/629/220 363/628/220 301/639/220
+f 349/642/221 351/640/221 285/641/221
+f 347/674/265 349/642/265 283/643/265
+f 305/621/266 369/620/266 307/645/266
+f 343/649/224 407/646/224 281/648/224
+f 341/631/267 405/630/267 343/649/267
+f 375/715/226 377/650/226 311/652/226
+f 307/645/227 371/644/227 309/654/227
+f 337/616/228 335/655/228 401/617/228
+f 317/676/268 381/657/268 319/659/268
+f 335/655/230 333/660/230 399/656/230
+f 333/660/231 331/662/231 397/661/231
+f 331/662/232 329/664/232 395/663/232
+f 325/670/233 389/666/233 327/668/233
+f 323/672/234 387/669/234 325/670/234
+f 321/673/269 385/671/269 323/672/269
+f 319/659/236 383/658/236 321/673/236
+f 345/647/237 347/674/237 281/648/237
+f 315/677/270 379/675/270 317/676/270
+f 377/650/239 379/675/239 313/651/239
+f 354/754/48 353/679/48 352/681/48
+f 366/688/49 368/682/49 365/684/49
+f 306/706/50 304/685/50 305/687/50
+f 364/699/240 366/688/240 363/689/240
+f 394/748/52 396/690/52 393/692/52
+f 300/746/53 298/693/53 299/694/53
+f 360/781/54 362/695/54 359/697/54
+f 294/767/55 293/698/55 296/590/55
+f 362/782/56 364/699/56 361/700/56
+f 290/705/57 289/701/57 292/703/57
+f 288/745/58 287/704/58 290/705/58
+f 308/755/59 306/706/59 307/707/59
+f 284/711/60 283/708/60 286/710/60
+f 282/593/241 281/595/241 284/711/241
+f 338/615/271 337/614/271 340/714/271
+f 329/664/243 327/668/243 393/665/243
+f 340/714/244 339/713/244 342/601/244
+f 373/653/245 375/715/245 309/654/245
+f 334/719/68 333/716/68 336/717/68
+f 332/761/246 331/718/246 334/719/246
+f 368/682/70 370/720/70 367/683/70
+f 396/690/71 398/722/71 395/691/71
+f 326/764/72 324/724/72 325/726/72
+f 324/724/73 322/727/73 323/725/73
+f 322/727/247 320/729/247 321/728/247
+f 320/729/75 318/731/75 319/730/75
+f 318/731/248 316/733/248 317/732/248
+f 316/733/249 314/599/249 315/734/249
+f 400/739/79 402/736/79 399/738/79
+f 398/722/80 400/739/80 397/723/80
+f 370/720/81 372/740/81 369/721/81
+f 328/783/82 327/742/82 330/744/82
+f 286/710/83 285/709/83 288/745/83
+f 302/766/84 300/746/84 301/747/84
+f 392/784/85 394/748/85 391/749/85
+f 360/781/86 359/697/86 358/751/86
+f 358/751/87 357/750/87 356/753/87
+f 356/753/88 355/752/88 354/754/88
+f 310/596/250 308/755/250 309/597/250
+f 352/681/90 351/680/90 350/757/90
+f 350/757/91 349/756/91 348/759/91
+f 346/603/251 348/759/251 345/604/251
+f 330/744/252 329/743/252 332/761/252
+f 404/763/95 406/611/95 403/762/95
+f 402/736/96 404/763/96 401/737/96
+f 371/741/253 372/740/253 373/608/253
+f 328/785/98 326/764/98 327/765/98
+f 304/685/99 302/766/99 303/686/99
+f 292/703/100 291/702/100 294/767/100
+f 392/784/101 391/749/101 390/769/101
+f 390/769/102 389/768/102 388/771/102
+f 388/771/103 387/770/103 386/773/103
+f 386/773/104 385/772/104 384/775/104
+f 384/775/105 383/774/105 382/777/105
+f 382/777/106 381/776/106 380/779/106
+f 380/779/107 379/778/107 378/609/107
+f 170/546/272 168/434/272 169/457/272
+f 208/540/199 207/539/199 210/574/199
+f 211/786/273 209/394/273 275/396/273
+f 175/558/274 239/482/274 177/484/274
+f 167/582/275 231/466/275 169/468/275
+f 225/485/276 227/441/276 161/443/276
+f 169/468/277 233/467/277 171/509/277
+f 211/786/278 275/396/278 213/459/278
+f 223/571/279 225/485/279 159/486/279
+f 229/572/280 231/466/280 165/583/280
+f 173/446/281 237/445/281 175/558/281
+f 165/583/282 163/442/282 229/572/282
+f 171/509/283 235/444/283 173/446/283
+f 221/559/284 223/571/284 157/560/284
+f 219/548/285 221/559/285 155/549/285
+f 177/484/286 241/483/286 179/499/286
+f 215/551/287 279/527/287 153/529/287
+f 213/459/288 277/458/288 215/551/288
+f 247/578/289 249/463/289 183/465/289
+f 179/499/290 243/498/290 181/570/290
+f 209/394/291 207/550/291 273/395/291
+f 189/575/292 253/492/292 191/493/292
+f 207/550/293 205/522/293 271/524/293
+f 205/522/294 203/541/294 269/523/294
+f 203/541/295 201/447/295 267/449/295
+f 197/547/296 261/450/296 199/452/296
+f 195/513/297 259/512/297 197/547/297
+f 193/423/298 257/422/298 195/513/298
+f 191/493/299 255/421/299 193/423/299
+f 217/528/300 219/548/300 153/529/300
+f 187/565/301 251/564/301 189/575/301
+f 249/463/302 251/564/302 185/464/302
+f 226/562/116 225/418/116 224/420/116
+f 238/581/182 240/552/182 237/554/182
+f 178/566/164 176/530/164 177/531/164
+f 236/516/206 238/581/206 235/517/206
+f 266/460/205 268/580/205 265/461/205
+f 172/487/303 170/546/303 171/488/303
+f 232/787/118 234/424/118 231/426/118
+f 166/495/121 165/432/121 168/434/121
+f 234/788/304 236/516/304 233/518/304
+f 162/456/166 161/455/166 164/532/166
+f 160/429/130 159/428/130 162/456/130
+f 180/412/193 178/566/193 179/413/193
+f 156/579/169 155/536/169 158/537/169
+f 154/525/305 153/440/305 156/579/305
+f 210/574/306 209/505/306 212/506/306
+f 201/447/307 199/452/307 265/448/307
+f 212/506/308 211/400/308 214/402/308
+f 245/569/309 247/578/309 181/570/309
+f 206/481/171 205/480/171 208/540/171
+f 204/501/310 203/479/310 206/481/310
+f 240/552/189 242/561/189 239/553/189
+f 268/580/201 270/576/201 267/577/201
+f 198/502/311 196/510/311 197/503/311
+f 196/510/198 194/573/198 195/511/198
+f 194/573/312 192/542/312 193/543/312
+f 192/542/313 190/469/313 191/471/313
+f 190/469/153 188/507/153 189/470/153
+f 188/507/314 186/478/314 187/508/314
+f 272/409/168 274/535/168 271/410/168
+f 270/576/113 272/409/113 269/411/113
+f 242/561/112 244/406/112 241/408/112
+f 200/789/315 199/567/315 202/568/315
+f 158/537/119 157/427/119 160/429/119
+f 174/490/143 172/487/143 173/489/143
+f 264/790/133 266/460/133 263/462/133
+f 232/787/170 231/426/170 230/538/170
+f 230/538/115 229/415/115 228/417/115
+f 228/417/190 227/416/190 226/562/190
+f 182/430/95 180/412/95 181/414/95
+f 224/420/184 223/419/184 222/557/184
+f 222/557/123 221/436/123 220/438/123
+f 218/526/316 220/438/316 217/472/316
+f 202/568/150 201/500/150 204/501/150
+f 276/397/185 278/514/185 275/398/185
+f 274/535/109 276/397/109 273/399/109
+f 243/407/317 244/406/317 245/545/317
+f 200/791/151 198/502/151 199/504/151
+f 176/530/144 174/490/144 175/491/144
+f 164/532/147 163/494/147 166/495/147
+f 264/790/148 263/462/148 262/497/148
+f 262/497/183 261/496/183 260/556/183
+f 260/556/191 259/555/191 258/563/191
+f 258/563/167 257/533/167 256/534/167
+f 256/534/138 255/475/138 254/477/138
+f 254/477/160 253/476/160 252/521/160
+f 252/521/179 251/520/179 250/519/179
+f 471/792/318 469/793/318 472/794/318
+f 519/795/303 520/796/303 518/797/303
+f 519/795/272 521/798/272 520/796/272
+f 413/799/109 414/800/109 416/801/109
+f 486/802/319 488/803/319 422/804/319
+f 476/805/320 474/806/320 473/807/320
+f 535/808/93 473/807/93 536/809/93
+f 521/798/131 522/810/131 520/796/131
+f 440/811/111 442/812/111 441/813/111
+f 442/814/203 506/815/203 508/816/203
+f 476/817/321 412/818/321 474/819/321
+f 490/820/194 488/821/194 487/822/194
+f 490/823/145 426/824/145 424/825/145
+f 448/826/149 446/827/149 510/828/149
+f 462/829/190 464/830/190 463/831/190
+f 486/832/140 484/833/140 483/834/140
+f 461/835/190 462/829/190 463/831/190
+f 518/836/283 454/837/283 516/838/283
+f 483/834/171 484/833/171 481/839/171
+f 511/840/164 513/841/164 512/842/164
+f 458/843/170 460/844/170 459/845/170
+f 430/846/177 428/847/177 492/848/177
+f 436/849/160 438/850/160 437/851/160
+f 480/852/152 478/853/152 477/854/152
+f 435/855/160 436/849/160 437/851/160
+f 417/856/168 415/857/168 418/858/168
+f 440/859/302 438/860/302 504/861/302
+f 466/862/196 530/863/196 532/864/196
+f 499/865/153 501/866/153 500/867/153
+f 482/868/322 418/869/322 416/870/322
+f 520/871/277 456/872/277 518/836/277
+f 531/873/119 532/874/119 529/875/119
+f 421/876/201 419/877/201 422/878/201
+f 488/803/307 490/823/307 424/825/307
+f 453/879/304 454/880/304 456/881/304
+f 460/844/115 462/829/115 461/835/115
+f 478/882/278 414/883/278 476/817/278
+f 523/884/121 524/885/121 521/798/121
+f 503/886/202 504/887/202 502/888/202
+f 456/872/154 454/837/154 518/836/154
+f 489/889/194 490/820/194 487/822/194
+f 468/890/123 470/891/123 469/793/123
+f 464/892/276 462/893/276 528/894/276
+f 484/833/171 482/895/171 481/839/171
+f 480/896/323 482/868/323 416/870/323
+f 515/897/143 517/898/143 516/899/143
+f 453/879/206 451/900/206 454/880/206
+f 502/901/301 438/860/301 500/902/301
+f 412/818/181 410/903/181 474/819/181
+f 495/904/198 496/905/198 494/906/198
+f 491/907/155 493/908/155 492/909/155
+f 455/910/118 456/911/118 458/843/118
+f 474/819/287 410/903/287 536/912/287
+f 497/913/174 498/914/174 496/905/174
+f 411/915/185 412/916/185 414/800/185
+f 492/848/296 428/847/296 490/823/296
+f 451/900/206 452/917/206 454/880/206
+f 423/918/205 421/876/205 424/919/205
+f 452/920/187 450/921/187 514/922/187
+f 434/923/138 436/849/138 435/855/138
+f 488/803/127 424/825/127 422/804/127
+f 462/893/125 526/924/125 528/894/125
+f 409/925/157 410/926/157 412/916/157
+f 484/927/161 420/928/161 418/869/161
+f 410/903/163 472/929/163 536/912/163
+f 433/930/138 434/923/138 435/855/138
+f 493/908/155 494/906/155 492/909/155
+f 533/931/169 534/932/169 531/873/169
+f 535/808/305 536/809/305 533/931/305
+f 467/933/123 468/890/123 469/793/123
+f 512/934/324 448/826/324 510/828/324
+f 429/935/191 430/936/191 431/937/191
+f 494/938/297 430/846/297 492/848/297
+f 513/841/164 514/939/164 512/842/164
+f 468/940/284 466/862/284 532/864/284
+f 419/877/113 417/856/113 420/941/113
+f 480/896/325 416/870/325 414/883/325
+f 413/799/185 411/915/185 414/800/185
+f 517/898/326 518/797/326 516/899/326
+f 446/827/327 444/942/327 508/816/327
+f 522/943/275 458/944/275 520/871/275
+f 432/945/167 434/923/167 433/930/167
+f 511/840/193 512/842/193 510/946/193
+f 432/947/156 430/846/156 494/938/156
+f 469/793/172 470/891/172 472/794/172
+f 526/924/197 462/893/197 460/948/197
+f 530/949/130 528/950/130 527/951/130
+f 487/822/150 488/821/150 485/952/150
+f 527/951/328 528/950/328 525/953/328
+f 428/954/183 430/936/183 429/935/183
+f 513/841/144 515/897/144 514/939/144
+f 525/953/147 526/955/147 523/884/147
+f 528/950/166 526/955/166 525/953/166
+f 411/915/157 409/925/157 412/916/157
+f 458/944/135 456/872/135 520/871/135
+f 507/956/120 508/957/120 505/958/120
+f 491/907/151 492/909/151 490/959/151
+f 428/847/128 426/824/128 490/823/128
+f 496/960/298 432/947/298 494/938/298
+f 463/831/116 464/830/116 465/961/116
+f 505/958/129 506/962/129 504/887/129
+f 415/857/109 413/799/109 416/801/109
+f 423/918/133 424/919/133 426/963/133
+f 526/955/147 524/885/147 523/884/147
+f 481/839/199 482/895/199 479/964/199
+f 500/902/292 436/965/292 498/966/292
+f 516/838/281 452/920/281 514/922/281
+f 507/956/95 509/967/95 508/957/95
+f 497/913/136 499/865/136 498/914/136
+f 447/968/189 448/969/189 450/970/189
+f 529/875/130 530/949/130 527/951/130
+f 478/882/273 480/896/273 414/883/273
+f 460/948/280 458/944/280 524/971/280
+f 425/972/148 426/963/148 427/973/148
+f 472/794/137 410/926/137 409/925/137
+f 485/952/310 486/832/310 483/834/310
+f 509/967/193 511/840/193 510/946/193
+f 508/957/165 506/962/165 505/958/165
+f 498/966/299 434/974/299 496/960/299
+f 477/854/308 478/853/308 475/975/308
+f 501/866/314 503/886/314 502/888/314
+f 455/976/158 453/879/158 456/881/158
+f 471/792/137 472/794/137 409/925/137
+f 457/977/170 458/843/170 459/845/170
+f 449/978/189 447/968/189 450/970/189
+f 493/908/198 495/904/198 494/906/198
+f 517/898/303 519/795/303 518/797/303
+f 465/961/184 466/979/184 467/933/184
+f 489/980/151 491/907/151 490/959/151
+f 482/868/293 484/927/293 418/869/293
+f 437/851/179 438/850/179 439/981/179
+f 439/981/159 440/811/159 441/813/159
+f 466/862/279 464/892/279 530/863/279
+f 442/814/289 440/859/289 506/815/289
+f 419/877/201 420/941/201 422/878/201
+f 415/857/168 416/801/168 418/858/168
+f 445/982/175 443/983/175 444/984/175
+f 466/979/184 468/890/184 467/933/184
+f 443/983/186 441/813/186 444/984/186
+f 430/936/191 432/945/191 431/937/191
+f 482/895/329 480/852/329 479/964/329
+f 431/937/167 432/945/167 433/930/167
+f 421/876/205 422/878/205 424/919/205
+f 514/922/330 450/921/330 512/934/330
+f 479/964/306 480/852/306 477/854/306
+f 426/963/148 428/954/148 427/973/148
+f 499/865/136 500/867/136 498/914/136
+f 484/927/294 486/802/294 420/928/294
+f 509/967/114 510/946/114 508/957/114
+f 457/977/118 455/910/118 458/843/118
+f 450/921/141 448/826/141 512/934/141
+f 444/942/309 442/814/309 508/816/309
+f 503/886/139 505/958/139 504/887/139
+f 447/968/112 445/982/112 448/969/112
+f 425/972/133 423/918/133 426/963/133
+f 510/828/331 446/827/331 508/816/331
+f 446/985/317 445/982/317 444/984/317
+f 427/973/183 428/954/183 429/935/183
+f 470/986/178 534/987/178 536/912/178
+f 524/971/282 526/924/282 460/948/282
+f 534/932/169 532/874/169 531/873/169
+f 440/859/134 504/861/134 506/815/134
+f 417/856/113 418/858/113 420/941/113
+f 441/813/186 442/812/186 444/984/186
+f 468/940/188 532/864/188 534/987/188
+f 438/860/192 502/901/192 504/861/192
+f 438/860/200 436/965/200 500/902/200
+f 536/809/204 534/932/204 533/931/204
+f 458/944/207 522/943/207 524/971/207
+f 478/853/110 476/805/110 475/975/110
+f 445/982/112 446/985/112 448/969/112
+f 414/883/332 412/818/332 476/817/332
+f 438/850/179 440/811/179 439/981/179
+f 459/845/115 460/844/115 461/835/115
+f 451/900/182 449/978/182 452/917/182
+f 464/830/116 466/979/116 465/961/116
+f 464/892/142 528/894/142 530/863/142
+f 515/897/144 516/899/144 514/939/144
+f 436/965/146 434/974/146 498/966/146
+f 470/986/285 468/940/285 534/987/285
+f 488/821/150 486/832/150 485/952/150
+f 501/866/153 502/888/153 500/867/153
+f 486/802/173 422/804/173 420/928/173
+f 449/978/182 450/970/182 452/917/182
+f 472/929/300 470/986/300 536/912/300
+f 495/904/312 497/913/312 496/905/312
+f 434/974/117 432/947/117 496/960/117
+f 532/874/119 530/949/119 529/875/119
+f 524/885/121 522/810/121 521/798/121
+f 475/975/122 476/805/122 473/807/122
+f 473/807/124 474/806/124 536/809/124
+f 454/837/126 452/920/126 516/838/126
+f 552/988/7 551/989/7 553/990/7
+f 538/991/8 600/992/8 537/993/8
+f 566/994/9 565/995/9 568/996/9
+f 570/997/10 568/996/10 569/998/10
+f 598/999/11 597/1000/11 600/992/11
+f 602/1001/12 601/1002/12 664/1003/12
+f 630/1004/13 632/1005/13 629/1006/13
+f 634/1007/14 633/1008/14 632/1005/14
+f 662/1009/15 664/1003/15 661/1010/15
+f 591/1011/16 593/1012/16 594/1013/16
+f 593/1014/17 657/1015/17 659/1016/17
+f 623/1017/18 625/1018/18 561/1019/18
+f 615/1020/19 617/1021/19 553/1022/19
+f 611/1023/20 547/1024/20 545/1025/20
+f 617/1021/21 619/1026/21 555/1027/21
+f 659/1016/333 661/1028/333 597/1029/333
+f 609/1030/23 545/1025/23 543/1031/23
+f 615/1020/24 551/1032/24 549/1033/24
+f 621/1034/25 623/1017/25 559/1035/25
+f 547/1024/334 611/1023/334 613/1036/334
+f 619/1026/27 621/1034/27 557/1037/27
+f 607/1038/28 543/1031/28 541/1039/28
+f 605/1040/29 541/1039/29 539/1041/29
+f 625/1018/30 627/1042/30 563/1043/30
+f 663/1044/31 601/1045/31 537/1046/31
+f 661/1028/335 663/1044/335 599/1047/335
+f 633/1048/33 569/1049/33 567/1050/33
+f 627/1042/34 629/1051/34 565/1052/34
+f 591/1053/35 655/1054/35 657/1015/35
+f 637/1055/36 639/1056/36 575/1057/36
+f 589/1058/37 653/1059/37 655/1054/37
+f 587/1060/38 651/1061/38 653/1059/38
+f 585/1062/39 649/1063/39 651/1061/39
+f 645/1064/40 647/1065/40 583/1066/40
+f 643/1067/259 645/1064/259 581/1068/259
+f 641/1069/42 643/1067/42 579/1070/42
+f 639/1056/43 641/1069/43 577/1071/43
+f 603/1072/44 539/1041/44 537/1046/44
+f 635/1073/45 637/1055/45 573/1074/45
+f 635/1073/336 571/1075/336 569/1049/336
+f 600/992/47 599/1076/47 537/993/47
+f 609/1077/48 607/1078/48 608/1079/48
+f 624/1080/49 623/1081/49 621/1082/49
+f 560/1083/50 559/1084/50 561/1085/50
+f 622/1086/51 621/1082/51 619/1087/51
+f 652/1088/52 651/1089/52 649/1090/52
+f 554/1091/53 553/990/53 555/1092/53
+f 618/1093/54 617/1094/54 615/1095/54
+f 549/1096/55 551/989/55 552/988/55
+f 620/1097/56 619/1087/56 617/1098/56
+f 545/1099/57 547/1100/57 548/1101/57
+f 543/1102/58 545/1099/58 546/1103/58
+f 562/1104/59 561/1085/59 563/1105/59
+f 539/1106/60 541/1107/60 542/1108/60
+f 537/993/61 539/1106/61 540/1109/61
+f 565/995/62 567/1110/62 568/996/62
+f 568/996/63 567/1110/63 569/998/63
+f 593/1012/64 595/1111/64 596/1112/64
+f 583/1066/65 647/1065/65 649/1063/65
+f 595/1111/66 597/1000/66 598/999/66
+f 631/1113/261 567/1050/261 565/1052/261
+f 589/1114/68 591/1011/68 592/1115/68
+f 587/1116/69 589/1114/69 590/1117/69
+f 626/1118/70 625/1119/70 623/1081/70
+f 654/1120/71 653/1121/71 651/1089/71
+f 580/1122/72 579/1123/72 581/1124/72
+f 578/1125/73 577/1126/73 579/1123/73
+f 576/1127/74 575/1128/74 577/1126/74
+f 574/1129/75 573/1130/75 575/1128/75
+f 572/1131/76 571/1132/76 573/1130/76
+f 570/997/77 569/998/77 571/1132/77
+f 597/1000/78 599/1076/78 600/992/78
+f 601/1002/12 663/1133/12 664/1003/12
+f 658/1134/79 657/1135/79 655/1136/79
+f 656/1137/80 655/1136/80 653/1121/80
+f 628/1138/81 627/1139/81 625/1119/81
+f 583/1140/82 585/1141/82 586/1142/82
+f 541/1107/83 543/1102/83 544/1143/83
+f 556/1144/84 555/1092/84 557/1145/84
+f 650/1146/85 649/1090/85 647/1147/85
+f 615/1095/86 613/1148/86 614/1149/86
+f 613/1148/87 611/1150/87 612/1151/87
+f 611/1150/88 609/1077/88 610/1152/88
+f 564/1153/89 563/1105/89 565/995/89
+f 607/1078/90 605/1154/90 606/1155/90
+f 605/1154/91 603/1156/91 604/1157/91
+f 604/1157/92 603/1156/92 601/1002/92
+f 632/1005/13 631/1158/13 629/1006/13
+f 633/1008/93 631/1158/93 632/1005/93
+f 585/1141/94 587/1116/94 588/1159/94
+f 662/1009/95 661/1010/95 659/1160/95
+f 660/1161/96 659/1160/96 657/1135/96
+f 628/1138/97 630/1004/97 629/1006/97
+f 582/1162/98 581/1124/98 583/1163/98
+f 558/1164/99 557/1145/99 559/1084/99
+f 547/1100/100 549/1096/100 550/1165/100
+f 647/1147/101 645/1166/101 646/1167/101
+f 645/1166/102 643/1168/102 644/1169/102
+f 643/1168/103 641/1170/103 642/1171/103
+f 641/1170/104 639/1172/104 640/1173/104
+f 639/1172/105 637/1174/105 638/1175/105
+f 637/1174/106 635/1176/106 636/1177/106
+f 635/1176/107 633/1008/107 634/1007/107
+f 664/1003/15 663/1133/15 661/1010/15
+f 554/1091/208 552/988/208 553/990/208
+f 592/1115/209 591/1011/209 594/1013/209
+f 595/1178/210 593/1014/210 659/1016/210
+f 559/1035/211 623/1017/211 561/1019/211
+f 551/1032/337 615/1020/337 553/1022/337
+f 609/1030/338 611/1023/338 545/1025/338
+f 553/1022/339 617/1021/339 555/1027/339
+f 595/1178/215 659/1016/215 597/1029/215
+f 607/1038/216 609/1030/216 543/1031/216
+f 613/1036/340 615/1020/340 549/1033/340
+f 557/1037/218 621/1034/218 559/1035/218
+f 549/1033/219 547/1024/219 613/1036/219
+f 555/1027/341 619/1026/341 557/1037/341
+f 605/1040/221 607/1038/221 541/1039/221
+f 603/1072/222 605/1040/222 539/1041/222
+f 561/1019/266 625/1018/266 563/1043/266
+f 599/1047/224 663/1044/224 537/1046/224
+f 597/1029/267 661/1028/267 599/1047/267
+f 631/1113/226 633/1048/226 567/1050/226
+f 563/1043/227 627/1042/227 565/1052/227
+f 593/1014/228 591/1053/228 657/1015/228
+f 573/1074/268 637/1055/268 575/1057/268
+f 591/1053/230 589/1058/230 655/1054/230
+f 589/1058/231 587/1060/231 653/1059/231
+f 587/1060/232 585/1062/232 651/1061/232
+f 581/1068/233 645/1064/233 583/1066/233
+f 579/1070/234 643/1067/234 581/1068/234
+f 577/1071/235 641/1069/235 579/1070/235
+f 575/1057/236 639/1056/236 577/1071/236
+f 601/1045/237 603/1072/237 537/1046/237
+f 571/1075/238 635/1073/238 573/1074/238
+f 633/1048/239 635/1073/239 569/1049/239
+f 610/1152/48 609/1077/48 608/1079/48
+f 622/1086/49 624/1080/49 621/1082/49
+f 562/1104/50 560/1083/50 561/1085/50
+f 620/1097/240 622/1086/240 619/1087/240
+f 650/1146/342 652/1088/342 649/1090/342
+f 556/1144/53 554/1091/53 555/1092/53
+f 616/1179/54 618/1093/54 615/1095/54
+f 550/1165/55 549/1096/55 552/988/55
+f 618/1180/56 620/1097/56 617/1098/56
+f 546/1103/57 545/1099/57 548/1101/57
+f 544/1143/58 543/1102/58 546/1103/58
+f 564/1153/59 562/1104/59 563/1105/59
+f 540/1109/60 539/1106/60 542/1108/60
+f 538/991/241 537/993/241 540/1109/241
+f 594/1013/271 593/1012/271 596/1112/271
+f 585/1062/243 583/1066/243 649/1063/243
+f 596/1112/244 595/1111/244 598/999/244
+f 629/1051/245 631/1113/245 565/1052/245
+f 590/1117/68 589/1114/68 592/1115/68
+f 588/1159/246 587/1116/246 590/1117/246
+f 624/1080/70 626/1118/70 623/1081/70
+f 652/1088/71 654/1120/71 651/1089/71
+f 582/1162/72 580/1122/72 581/1124/72
+f 580/1122/73 578/1125/73 579/1123/73
+f 578/1125/247 576/1127/247 577/1126/247
+f 576/1127/75 574/1129/75 575/1128/75
+f 574/1129/76 572/1131/76 573/1130/76
+f 572/1131/249 570/997/249 571/1132/249
+f 656/1137/79 658/1134/79 655/1136/79
+f 654/1120/80 656/1137/80 653/1121/80
+f 626/1118/81 628/1138/81 625/1119/81
+f 584/1181/82 583/1140/82 586/1142/82
+f 542/1108/83 541/1107/83 544/1143/83
+f 558/1164/84 556/1144/84 557/1145/84
+f 648/1182/85 650/1146/85 647/1147/85
+f 616/1179/86 615/1095/86 614/1149/86
+f 614/1149/87 613/1148/87 612/1151/87
+f 612/1151/88 611/1150/88 610/1152/88
+f 566/994/250 564/1153/250 565/995/250
+f 608/1079/90 607/1078/90 606/1155/90
+f 606/1155/91 605/1154/91 604/1157/91
+f 602/1001/251 604/1157/251 601/1002/251
+f 586/1142/94 585/1141/94 588/1159/94
+f 660/1161/95 662/1009/95 659/1160/95
+f 658/1134/96 660/1161/96 657/1135/96
+f 627/1139/253 628/1138/253 629/1006/253
+f 584/1183/98 582/1162/98 583/1163/98
+f 560/1083/99 558/1164/99 559/1084/99
+f 548/1101/100 547/1100/100 550/1165/100
+f 648/1182/101 647/1147/101 646/1167/101
+f 646/1167/102 645/1166/102 644/1169/102
+f 644/1169/103 643/1168/103 642/1171/103
+f 642/1171/104 641/1170/104 640/1173/104
+f 640/1173/105 639/1172/105 638/1175/105
+f 638/1175/106 637/1174/106 636/1177/106
+f 636/1177/107 635/1176/107 634/1007/107
+f 727/1184/318 725/1185/318 728/1186/318
+f 775/1187/303 776/1188/303 774/1189/303
+f 775/1187/272 777/1190/272 776/1188/272
+f 669/1191/109 670/1192/109 672/1193/109
+f 742/1194/319 744/1195/319 678/1196/319
+f 732/1197/162 730/1198/162 729/1199/162
+f 791/1200/93 729/1199/93 792/1201/93
+f 777/1190/131 778/1202/131 776/1188/131
+f 696/1203/111 698/1204/111 697/1205/111
+f 698/1206/343 762/1207/343 764/1208/343
+f 732/1209/288 668/1210/288 730/1211/288
+f 746/1212/194 744/1213/194 743/1214/194
+f 746/1215/145 682/1216/145 680/1217/145
+f 704/1218/344 702/1219/344 766/1220/344
+f 718/1221/190 720/1222/190 719/1223/190
+f 742/1224/140 740/1225/140 739/1226/140
+f 717/1227/190 718/1221/190 719/1223/190
+f 774/1228/345 710/1229/345 772/1230/345
+f 739/1226/171 740/1225/171 737/1231/171
+f 767/1232/164 769/1233/164 768/1234/164
+f 714/1235/170 716/1236/170 715/1237/170
+f 686/1238/346 684/1239/346 748/1240/346
+f 692/1241/160 694/1242/160 693/1243/160
+f 736/1244/152 734/1245/152 733/1246/152
+f 691/1247/160 692/1241/160 693/1243/160
+f 673/1248/168 671/1249/168 674/1250/168
+f 696/1251/302 694/1252/302 760/1253/302
+f 722/1254/196 786/1255/196 788/1256/196
+f 755/1257/153 757/1258/153 756/1259/153
+f 738/1260/347 674/1261/347 672/1262/347
+f 776/1263/348 712/1264/348 774/1228/348
+f 787/1265/119 788/1266/119 785/1267/119
+f 677/1268/201 675/1269/201 678/1270/201
+f 744/1195/349 746/1215/349 680/1217/349
+f 709/1271/304 710/1272/304 712/1273/304
+f 716/1236/115 718/1221/115 717/1227/115
+f 734/1274/350 670/1275/350 732/1209/350
+f 779/1276/121 780/1277/121 777/1190/121
+f 759/1278/202 760/1279/202 758/1280/202
+f 712/1264/351 710/1229/351 774/1228/351
+f 745/1281/194 746/1212/194 743/1214/194
+f 724/1282/123 726/1283/123 725/1185/123
+f 720/1284/352 718/1285/352 784/1286/352
+f 740/1225/171 738/1287/171 737/1231/171
+f 736/1288/291 738/1260/291 672/1262/291
+f 771/1289/143 773/1290/143 772/1291/143
+f 709/1271/206 707/1292/206 710/1272/206
+f 758/1293/353 694/1252/353 756/1294/353
+f 668/1210/354 666/1295/354 730/1211/354
+f 751/1296/198 752/1297/198 750/1298/198
+f 747/1299/155 749/1300/155 748/1301/155
+f 711/1302/118 712/1303/118 714/1235/118
+f 730/1211/355 666/1295/355 792/1304/355
+f 753/1305/174 754/1306/174 752/1297/174
+f 667/1307/185 668/1308/185 670/1192/185
+f 748/1240/296 684/1239/296 746/1215/296
+f 707/1292/206 708/1309/206 710/1272/206
+f 679/1310/205 677/1268/205 680/1311/205
+f 708/1312/187 706/1313/187 770/1314/187
+f 690/1315/138 692/1241/138 691/1247/138
+f 744/1195/356 680/1217/356 678/1196/356
+f 718/1285/357 782/1316/357 784/1286/357
+f 665/1317/157 666/1318/157 668/1308/157
+f 740/1319/161 676/1320/161 674/1261/161
+f 666/1295/358 728/1321/358 792/1304/358
+f 689/1322/138 690/1315/138 691/1247/138
+f 749/1300/155 750/1298/155 748/1301/155
+f 789/1323/169 790/1324/169 787/1265/169
+f 791/1200/305 792/1201/305 789/1323/305
+f 723/1325/123 724/1282/123 725/1185/123
+f 768/1326/324 704/1218/324 766/1220/324
+f 685/1327/191 686/1328/191 687/1329/191
+f 750/1330/297 686/1238/297 748/1240/297
+f 769/1233/164 770/1331/164 768/1234/164
+f 724/1332/359 722/1254/359 788/1256/359
+f 675/1269/113 673/1248/113 676/1333/113
+f 736/1288/108 672/1262/108 670/1275/108
+f 669/1191/185 667/1307/185 670/1192/185
+f 773/1290/326 774/1189/326 772/1291/326
+f 702/1219/195 700/1334/195 764/1208/195
+f 778/1335/275 714/1336/275 776/1263/275
+f 688/1337/167 690/1315/167 689/1322/167
+f 767/1232/193 768/1234/193 766/1338/193
+f 688/1339/156 686/1238/156 750/1330/156
+f 725/1185/172 726/1283/172 728/1186/172
+f 782/1316/197 718/1285/197 716/1340/197
+f 786/1341/130 784/1342/130 783/1343/130
+f 743/1214/150 744/1213/150 741/1344/150
+f 783/1343/166 784/1342/166 781/1345/166
+f 684/1346/183 686/1328/183 685/1327/183
+f 769/1233/144 771/1289/144 770/1331/144
+f 781/1345/147 782/1347/147 779/1276/147
+f 784/1342/166 782/1347/166 781/1345/166
+f 667/1307/157 665/1317/157 668/1308/157
+f 714/1336/135 712/1264/135 776/1263/135
+f 763/1348/120 764/1349/120 761/1350/120
+f 747/1299/151 748/1301/151 746/1351/151
+f 684/1239/128 682/1216/128 746/1215/128
+f 752/1352/360 688/1339/360 750/1330/360
+f 719/1223/116 720/1222/116 721/1353/116
+f 761/1350/129 762/1354/129 760/1279/129
+f 671/1249/109 669/1191/109 672/1193/109
+f 679/1310/133 680/1311/133 682/1355/133
+f 782/1347/147 780/1277/147 779/1276/147
+f 737/1231/199 738/1287/199 735/1356/199
+f 756/1294/292 692/1357/292 754/1358/292
+f 772/1230/361 708/1312/361 770/1314/361
+f 763/1348/95 765/1359/95 764/1349/95
+f 753/1305/136 755/1257/136 754/1306/136
+f 703/1360/189 704/1361/189 706/1362/189
+f 785/1267/130 786/1341/130 783/1343/130
+f 734/1274/362 736/1288/362 670/1275/362
+f 716/1340/280 714/1336/280 780/1363/280
+f 681/1364/148 682/1355/148 683/1365/148
+f 728/1186/137 666/1318/137 665/1317/137
+f 741/1344/310 742/1224/310 739/1226/310
+f 765/1359/193 767/1232/193 766/1338/193
+f 764/1349/165 762/1354/165 761/1350/165
+f 754/1358/299 690/1366/299 752/1352/299
+f 733/1246/308 734/1245/308 731/1367/308
+f 757/1258/314 759/1278/314 758/1280/314
+f 711/1368/304 709/1271/304 712/1273/304
+f 727/1184/137 728/1186/137 665/1317/137
+f 713/1369/170 714/1235/170 715/1237/170
+f 705/1370/189 703/1360/189 706/1362/189
+f 749/1300/198 751/1296/198 750/1298/198
+f 773/1290/303 775/1187/303 774/1189/303
+f 721/1353/184 722/1371/184 723/1325/184
+f 745/1372/151 747/1299/151 746/1351/151
+f 738/1260/293 740/1319/293 674/1261/293
+f 693/1243/179 694/1242/179 695/1373/179
+f 695/1373/159 696/1203/159 697/1205/159
+f 722/1254/279 720/1284/279 786/1255/279
+f 698/1206/363 696/1251/363 762/1207/363
+f 675/1269/201 676/1333/201 678/1270/201
+f 671/1249/168 672/1193/168 674/1250/168
+f 701/1374/175 699/1375/175 700/1376/175
+f 722/1371/184 724/1282/184 723/1325/184
+f 699/1375/186 697/1205/186 700/1376/186
+f 686/1328/191 688/1337/191 687/1329/191
+f 738/1287/329 736/1244/329 735/1356/329
+f 687/1329/167 688/1337/167 689/1322/167
+f 677/1268/205 678/1270/205 680/1311/205
+f 770/1314/364 706/1313/364 768/1326/364
+f 735/1356/306 736/1244/306 733/1246/306
+f 682/1355/148 684/1346/148 683/1365/148
+f 755/1257/136 756/1259/136 754/1306/136
+f 740/1319/294 742/1194/294 676/1320/294
+f 765/1359/114 766/1338/114 764/1349/114
+f 713/1369/118 711/1302/118 714/1235/118
+f 706/1313/365 704/1218/365 768/1326/365
+f 700/1334/366 698/1206/366 764/1208/366
+f 759/1278/139 761/1350/139 760/1279/139
+f 703/1360/112 701/1374/112 704/1361/112
+f 681/1364/133 679/1310/133 682/1355/133
+f 766/1220/331 702/1219/331 764/1208/331
+f 702/1377/317 701/1374/317 700/1376/317
+f 683/1365/183 684/1346/183 685/1327/183
+f 726/1378/367 790/1379/367 792/1304/367
+f 780/1363/368 782/1316/368 716/1340/368
+f 790/1324/169 788/1266/169 787/1265/169
+f 696/1251/134 760/1253/134 762/1207/134
+f 673/1248/113 674/1250/113 676/1333/113
+f 697/1205/186 698/1204/186 700/1376/186
+f 724/1332/188 788/1256/188 790/1379/188
+f 694/1252/192 758/1293/192 760/1253/192
+f 694/1252/369 692/1357/369 756/1294/369
+f 792/1201/204 790/1324/204 789/1323/204
+f 714/1336/207 778/1335/207 780/1363/207
+f 734/1245/110 732/1197/110 731/1367/110
+f 701/1374/112 702/1377/112 704/1361/112
+f 670/1275/132 668/1210/132 732/1209/132
+f 694/1242/179 696/1203/179 695/1373/179
+f 715/1237/115 716/1236/115 717/1227/115
+f 707/1292/182 705/1370/182 708/1309/182
+f 720/1222/116 722/1371/116 721/1353/116
+f 720/1284/370 784/1286/370 786/1255/370
+f 771/1289/144 772/1291/144 770/1331/144
+f 692/1357/146 690/1366/146 754/1358/146
+f 726/1378/285 724/1332/285 790/1379/285
+f 744/1213/150 742/1224/150 741/1344/150
+f 757/1258/153 758/1280/153 756/1259/153
+f 742/1194/173 678/1196/173 676/1320/173
+f 705/1370/182 706/1362/182 708/1309/182
+f 728/1321/300 726/1378/300 792/1304/300
+f 751/1296/312 753/1305/312 752/1297/312
+f 690/1366/117 688/1339/117 752/1352/117
+f 788/1266/119 786/1341/119 785/1267/119
+f 780/1277/121 778/1202/121 777/1190/121
+f 731/1367/122 732/1197/122 729/1199/122
+f 729/1199/124 730/1198/124 792/1201/124
+f 710/1229/371 708/1312/371 772/1230/371
+g KsHauptsignal_Plane.006_Lights
+usemtl Lights
+f 88/1380/372 28/1381/372 40/1382/372
+f 40/1382/373 44/1383/373 56/1384/373
+f 88/1380/374 64/1385/374 72/1386/374
+f 72/1386/374 76/1387/374 88/1380/374
+f 40/1382/373 28/1381/373 32/1388/373
+f 32/1388/373 34/1389/373 40/1382/373
+f 56/1384/373 44/1383/373 48/1390/373
+f 48/1390/372 52/1391/372 56/1384/372
+f 56/1384/375 58/1392/375 64/1385/375
+f 64/1385/374 68/1393/374 70/1394/374
+f 88/1380/374 76/1387/374 80/1395/374
+f 80/1395/374 84/1396/374 88/1380/374
+f 88/1380/376 26/1397/376 28/1381/376
+f 28/1381/377 30/1398/377 32/1388/377
+f 40/1382/373 34/1389/373 36/1399/373
+f 36/1399/373 38/1400/373 40/1382/373
+f 40/1382/378 42/1401/378 44/1383/378
+f 44/1383/372 46/1402/372 48/1390/372
+f 48/1390/377 50/1403/377 52/1391/377
+f 52/1391/379 54/1404/379 56/1384/379
+f 64/1385/380 58/1392/380 60/1405/380
+f 60/1405/381 62/1406/381 64/1385/381
+f 64/1385/382 66/1407/382 68/1393/382
+f 64/1385/382 70/1394/382 72/1386/382
+f 72/1386/383 74/1408/383 76/1387/383
+f 76/1387/374 78/1409/374 80/1395/374
+f 80/1395/381 82/1410/381 84/1396/381
+f 84/1396/384 86/1411/384 88/1380/384
+f 64/1385/385 88/1380/385 40/1382/385
+f 156/1412/386 158/1413/386 160/1414/386
+f 200/1415/387 204/1416/387 216/1417/387
+f 192/1418/388 186/1419/388 188/1420/388
+f 176/1421/389 180/1422/389 184/1423/389
+f 212/1424/390 214/1425/390 216/1417/390
+f 188/1420/391 190/1426/391 192/1418/391
+f 192/1418/387 196/1427/387 198/1428/387
+f 184/1423/392 172/1429/392 176/1421/392
+f 204/1416/387 206/1430/387 208/1431/387
+f 200/1415/393 202/1432/393 204/1416/393
+f 216/1417/387 192/1418/387 200/1415/387
+f 168/1433/394 162/1434/394 164/1435/394
+f 164/1435/395 166/1436/395 168/1433/395
+f 160/1414/392 162/1434/392 168/1433/392
+f 176/1421/396 178/1437/396 180/1422/396
+f 208/1431/387 210/1438/387 212/1424/387
+f 168/1433/397 170/1439/397 172/1429/397
+f 168/1433/392 172/1429/392 184/1423/392
+f 168/1433/392 156/1412/392 160/1414/392
+f 180/1422/398 182/1440/398 184/1423/398
+f 208/1431/387 212/1424/387 216/1417/387
+f 216/1417/387 204/1416/387 208/1431/387
+f 192/1418/387 194/1441/387 196/1427/387
+f 184/1423/399 186/1419/399 192/1418/399
+f 192/1418/400 198/1428/400 200/1415/400
+f 216/1417/395 156/1412/395 168/1433/395
+f 216/1417/401 154/1442/401 156/1412/401
+f 172/1429/392 174/1443/392 176/1421/392
+f 192/1418/402 216/1417/402 168/1433/402
+f 56/1384/375 64/1385/375 40/1382/375
+f 344/1444/372 284/1445/372 296/1446/372
+f 296/1446/373 300/1447/373 312/1448/373
+f 344/1444/374 320/1449/374 328/1450/374
+f 328/1450/374 332/1451/374 344/1444/374
+f 296/1446/373 284/1445/373 288/1452/373
+f 288/1452/373 290/1453/373 296/1446/373
+f 312/1448/373 300/1447/373 304/1454/373
+f 304/1454/372 308/1455/372 312/1448/372
+f 312/1448/375 314/1456/375 320/1449/375
+f 320/1449/374 324/1457/374 326/1458/374
+f 344/1444/374 332/1451/374 336/1459/374
+f 336/1459/374 340/1460/374 344/1444/374
+f 344/1444/376 282/1461/376 284/1445/376
+f 284/1445/377 286/1462/377 288/1452/377
+f 296/1446/373 290/1453/373 292/1463/373
+f 292/1463/372 294/1464/372 296/1446/372
+f 296/1446/378 298/1465/378 300/1447/378
+f 300/1447/372 302/1466/372 304/1454/372
+f 304/1454/373 306/1467/373 308/1455/373
+f 308/1455/379 310/1468/379 312/1448/379
+f 320/1449/380 314/1456/380 316/1469/380
+f 316/1469/381 318/1470/381 320/1449/381
+f 320/1449/382 322/1471/382 324/1457/382
+f 320/1449/382 326/1458/382 328/1450/382
+f 328/1450/383 330/1472/383 332/1451/383
+f 332/1451/374 334/1473/374 336/1459/374
+f 336/1459/374 338/1474/374 340/1460/374
+f 340/1460/403 342/1475/403 344/1444/403
+f 320/1449/385 344/1444/385 296/1446/385
+f 312/1448/375 320/1449/375 296/1446/375
+f 184/1423/404 192/1418/404 168/1433/404
+f 509/1476/398 507/1477/398 505/1478/398
+f 521/1479/394 527/1480/394 525/1481/394
+f 473/1482/395 533/1483/395 521/1479/395
+f 521/1479/397 519/1484/397 517/1485/397
+f 517/1485/398 515/1486/398 513/1487/398
+f 533/1483/386 531/1488/386 529/1489/386
+f 497/1490/405 495/1491/405 493/1492/405
+f 489/1493/393 487/1494/393 485/1495/393
+f 477/1496/406 475/1497/406 473/1482/406
+f 473/1482/387 497/1490/387 489/1493/387
+f 497/1490/388 503/1498/388 501/1499/388
+f 505/1478/392 517/1485/392 513/1487/392
+f 473/1482/401 535/1500/401 533/1483/401
+f 481/1501/405 477/1496/405 473/1482/405
+f 497/1490/402 473/1482/402 521/1479/402
+f 501/1499/407 499/1502/407 497/1490/407
+f 497/1490/387 493/1492/387 491/1503/387
+f 521/1479/392 517/1485/392 505/1478/392
+f 505/1478/404 497/1490/404 521/1479/404
+f 473/1482/387 485/1495/387 481/1501/387
+f 497/1490/400 491/1503/400 489/1493/400
+f 529/1489/392 527/1480/392 521/1479/392
+f 521/1479/392 533/1483/392 529/1489/392
+f 481/1501/387 479/1504/387 477/1496/387
+f 505/1478/404 503/1498/404 497/1490/404
+f 513/1487/392 511/1505/392 509/1476/392
+f 489/1493/387 485/1495/387 473/1482/387
+f 513/1487/395 509/1476/395 505/1478/395
+f 525/1481/395 523/1506/395 521/1479/395
+f 485/1495/408 483/1507/408 481/1501/408
+f 600/1508/372 540/1509/372 552/1510/372
+f 552/1510/373 556/1511/373 568/1512/373
+f 600/1508/374 576/1513/374 584/1514/374
+f 584/1514/374 588/1515/374 600/1508/374
+f 552/1510/373 540/1509/373 544/1516/373
+f 544/1516/372 546/1517/372 552/1510/372
+f 568/1512/373 556/1511/373 560/1518/373
+f 560/1518/372 564/1519/372 568/1512/372
+f 568/1512/375 570/1520/375 576/1513/375
+f 576/1513/374 580/1521/374 582/1522/374
+f 600/1508/374 588/1515/374 592/1523/374
+f 592/1523/374 596/1524/374 600/1508/374
+f 600/1508/376 538/1525/376 540/1509/376
+f 540/1509/373 542/1526/373 544/1516/373
+f 552/1510/373 546/1517/373 548/1527/373
+f 548/1527/372 550/1528/372 552/1510/372
+f 552/1510/378 554/1529/378 556/1511/378
+f 556/1511/409 558/1530/409 560/1518/409
+f 560/1518/373 562/1531/373 564/1519/373
+f 564/1519/373 566/1532/373 568/1512/373
+f 576/1513/410 570/1520/410 572/1533/410
+f 572/1533/374 574/1534/374 576/1513/374
+f 576/1513/382 578/1535/382 580/1521/382
+f 576/1513/382 582/1522/382 584/1514/382
+f 584/1514/383 586/1536/383 588/1515/383
+f 588/1515/374 590/1537/374 592/1523/374
+f 592/1523/411 594/1538/411 596/1524/411
+f 596/1524/384 598/1539/384 600/1508/384
+f 576/1513/385 600/1508/385 552/1510/385
+f 568/1512/375 576/1513/375 552/1510/375
+f 765/1540/398 763/1541/398 761/1542/398
+f 777/1543/394 783/1544/394 781/1545/394
+f 729/1546/395 789/1547/395 777/1543/395
+f 777/1543/412 775/1548/412 773/1549/412
+f 773/1549/392 771/1550/392 769/1551/392
+f 789/1547/413 787/1552/413 785/1553/413
+f 753/1554/408 751/1555/408 749/1556/408
+f 745/1557/393 743/1558/393 741/1559/393
+f 733/1560/414 731/1561/414 729/1546/414
+f 729/1546/387 753/1554/387 745/1557/387
+f 753/1554/388 759/1562/388 757/1563/388
+f 761/1542/392 773/1549/392 769/1551/392
+f 729/1546/415 791/1564/415 789/1547/415
+f 737/1565/405 733/1560/405 729/1546/405
+f 753/1554/402 729/1546/402 777/1543/402
+f 757/1563/407 755/1566/407 753/1554/407
+f 753/1554/387 749/1556/387 747/1567/387
+f 777/1543/392 773/1549/392 761/1542/392
+f 761/1542/404 753/1554/404 777/1543/404
+f 729/1546/387 741/1559/387 737/1565/387
+f 753/1554/400 747/1567/400 745/1557/400
+f 785/1553/392 783/1544/392 777/1543/392
+f 777/1543/392 789/1547/392 785/1553/392
+f 737/1565/408 735/1568/408 733/1560/408
+f 761/1542/399 759/1562/399 753/1554/399
+f 769/1551/416 767/1569/416 765/1540/416
+f 745/1557/387 741/1559/387 729/1546/387
+f 769/1551/389 765/1540/389 761/1542/389
+f 781/1545/395 779/1570/395 777/1543/395
+f 741/1559/417 739/1571/417 737/1565/417
+l 794 795
+l 796 793
+l 795 796
+l 798 799
+l 799 800
+l 797 798
+l 826 827
+l 828 825
+l 827 828
+l 830 831
+l 831 832
+l 829 830
diff --git a/advtrains/advtrains_signals_ks/models/advtrains_signals_ks_main_smr30.obj b/advtrains/advtrains_signals_ks/models/advtrains_signals_ks_main_smr30.obj
new file mode 100644
index 0000000..e75292f
--- /dev/null
+++ b/advtrains/advtrains_signals_ks/models/advtrains_signals_ks_main_smr30.obj
@@ -0,0 +1,4293 @@
+# Blender v2.79 (sub 0) OBJ File: 'signal_ks_singlemesh_final.blend'
+# www.blender.org
+mtllib advtrains_signals_ks_main_smr30.mtl
+o KsHauptsignal_Plane.006
+v 0.221998 -0.503378 -0.380515
+v 0.170859 -0.503378 -0.406057
+v 0.196400 -0.503378 -0.457196
+v 0.247539 -0.503378 -0.431654
+v 0.171044 -0.503378 -0.278496
+v 0.145502 -0.503378 -0.227357
+v 0.094363 -0.503378 -0.252898
+v 0.119905 -0.503378 -0.304038
+v 0.221998 -0.299114 -0.380515
+v 0.221998 -0.172218 -0.380515
+v 0.170859 -0.172218 -0.406057
+v 0.170859 -0.299114 -0.406057
+v 0.196400 -0.299114 -0.457196
+v 0.196400 -0.172218 -0.457196
+v 0.247539 -0.172218 -0.431654
+v 0.247539 -0.299114 -0.431654
+v 0.171044 -0.299114 -0.278496
+v 0.171044 -0.172218 -0.278496
+v 0.145502 -0.172218 -0.227357
+v 0.145502 -0.299114 -0.227357
+v 0.094363 -0.299114 -0.252898
+v 0.094363 -0.172218 -0.252898
+v 0.119905 -0.172218 -0.304038
+v 0.119905 -0.299114 -0.304038
+v 0.140710 0.243339 -0.585226
+v 0.128663 0.242789 -0.561107
+v 0.166987 0.253858 -0.630787
+v 0.131461 0.253308 -0.559657
+v 0.171569 0.263561 -0.628450
+v 0.136043 0.263011 -0.557320
+v 0.177758 0.272074 -0.625317
+v 0.142232 0.271524 -0.554187
+v 0.185316 0.279070 -0.621507
+v 0.149790 0.278520 -0.550377
+v 0.193954 0.284280 -0.617167
+v 0.158428 0.283730 -0.546037
+v 0.203339 0.287504 -0.612463
+v 0.167812 0.286954 -0.541333
+v 0.213110 0.288619 -0.607578
+v 0.177584 0.288069 -0.536448
+v 0.222892 0.287581 -0.602697
+v 0.187366 0.287030 -0.531567
+v 0.232310 0.284430 -0.598009
+v 0.196784 0.283880 -0.526879
+v 0.241000 0.279287 -0.593694
+v 0.205474 0.278737 -0.522564
+v 0.248630 0.272350 -0.589918
+v 0.213104 0.271800 -0.518788
+v 0.254905 0.263886 -0.586826
+v 0.219379 0.263336 -0.515696
+v 0.259586 0.254219 -0.584536
+v 0.224060 0.253669 -0.513406
+v 0.239012 0.243722 -0.536127
+v 0.226966 0.243172 -0.512007
+v 0.240026 0.232316 -0.535617
+v 0.227984 0.232252 -0.511553
+v 0.238979 0.221688 -0.535962
+v 0.227076 0.221322 -0.512056
+v 0.236206 0.211344 -0.537391
+v 0.224275 0.210797 -0.513501
+v 0.231622 0.201642 -0.539723
+v 0.219692 0.201094 -0.515833
+v 0.225431 0.193129 -0.542853
+v 0.213501 0.192581 -0.518963
+v 0.217871 0.186134 -0.546660
+v 0.205941 0.185585 -0.522770
+v 0.209233 0.180924 -0.550998
+v 0.197302 0.180374 -0.527107
+v 0.199848 0.177700 -0.555699
+v 0.187916 0.177150 -0.531809
+v 0.190076 0.176585 -0.560584
+v 0.178145 0.176035 -0.536695
+v 0.180294 0.177623 -0.565466
+v 0.168362 0.177073 -0.541576
+v 0.170878 0.180774 -0.570155
+v 0.158945 0.180224 -0.546265
+v 0.162189 0.185916 -0.574472
+v 0.150256 0.185367 -0.550583
+v 0.154561 0.192853 -0.578251
+v 0.142628 0.192304 -0.554362
+v 0.148287 0.201317 -0.581347
+v 0.136354 0.200769 -0.557458
+v 0.143608 0.210983 -0.583641
+v 0.131675 0.210436 -0.559752
+v 0.140735 0.221305 -0.585032
+v 0.128772 0.220938 -0.561157
+v 0.139764 0.231924 -0.585695
+v 0.127756 0.231861 -0.561614
+v 0.138496 0.243790 -0.586326
+v 0.110128 0.243271 -0.529527
+v 0.164899 0.254782 -0.631819
+v 0.113051 0.254264 -0.528010
+v 0.169685 0.264921 -0.629376
+v 0.117837 0.264402 -0.525566
+v 0.176151 0.273816 -0.626099
+v 0.124303 0.273298 -0.522290
+v 0.184049 0.281127 -0.622117
+v 0.132201 0.280609 -0.518307
+v 0.193074 0.286572 -0.617580
+v 0.141226 0.286053 -0.513771
+v 0.202880 0.289941 -0.612665
+v 0.151032 0.289423 -0.508855
+v 0.213091 0.291105 -0.607559
+v 0.161243 0.290587 -0.503750
+v 0.223313 0.290021 -0.602459
+v 0.171465 0.289502 -0.498650
+v 0.233154 0.286728 -0.597561
+v 0.181306 0.286210 -0.493752
+v 0.242236 0.281354 -0.593054
+v 0.190388 0.280836 -0.489244
+v 0.250209 0.274105 -0.589109
+v 0.198361 0.273587 -0.485300
+v 0.256768 0.265261 -0.585880
+v 0.204920 0.264742 -0.482070
+v 0.261660 0.255160 -0.583490
+v 0.209812 0.254641 -0.479680
+v 0.241218 0.244190 -0.535019
+v 0.212850 0.243672 -0.478221
+v 0.242260 0.232775 -0.534499
+v 0.213915 0.232256 -0.477748
+v 0.241222 0.221351 -0.534850
+v 0.212969 0.220833 -0.478281
+v 0.238300 0.210359 -0.536368
+v 0.210046 0.209840 -0.479798
+v 0.233513 0.200220 -0.538811
+v 0.205260 0.199702 -0.482242
+v 0.227047 0.191324 -0.542088
+v 0.198794 0.190806 -0.485519
+v 0.219150 0.184013 -0.546071
+v 0.190896 0.183495 -0.489501
+v 0.210124 0.178569 -0.550607
+v 0.181871 0.178051 -0.494038
+v 0.200318 0.175200 -0.555522
+v 0.172065 0.174682 -0.498953
+v 0.190108 0.174035 -0.560628
+v 0.161854 0.173517 -0.504059
+v 0.179886 0.175120 -0.565728
+v 0.151632 0.174602 -0.509159
+v 0.170045 0.178413 -0.570626
+v 0.141791 0.177894 -0.514057
+v 0.160963 0.183787 -0.575133
+v 0.132709 0.183268 -0.518564
+v 0.152989 0.191035 -0.579078
+v 0.124736 0.190517 -0.522509
+v 0.146430 0.199880 -0.582307
+v 0.118177 0.199362 -0.525738
+v 0.141538 0.209981 -0.584697
+v 0.113285 0.209463 -0.528128
+v 0.138501 0.220950 -0.586157
+v 0.110247 0.220432 -0.529588
+v 0.137526 0.232366 -0.586811
+v 0.109182 0.231848 -0.530060
+v 0.348476 0.506097 -0.481456
+v 0.336429 0.505869 -0.457337
+v 0.373101 0.510448 -0.527843
+v 0.337574 0.510220 -0.456713
+v 0.374984 0.514461 -0.526854
+v 0.339458 0.514233 -0.455724
+v 0.377534 0.517982 -0.525538
+v 0.342008 0.517755 -0.454408
+v 0.380652 0.520876 -0.523946
+v 0.345126 0.520648 -0.452816
+v 0.384219 0.523031 -0.522138
+v 0.348693 0.522803 -0.451008
+v 0.388097 0.524364 -0.520185
+v 0.352571 0.524137 -0.449055
+v 0.392137 0.524825 -0.518162
+v 0.356611 0.524598 -0.447032
+v 0.396185 0.524396 -0.516145
+v 0.360658 0.524168 -0.445015
+v 0.400083 0.523093 -0.514214
+v 0.364557 0.522865 -0.443084
+v 0.403684 0.520966 -0.512441
+v 0.368158 0.520738 -0.441311
+v 0.406848 0.518097 -0.510896
+v 0.371322 0.517869 -0.439765
+v 0.409453 0.514596 -0.509636
+v 0.373927 0.514368 -0.438506
+v 0.411401 0.510597 -0.508712
+v 0.375875 0.510370 -0.437582
+v 0.389135 0.506255 -0.461147
+v 0.377089 0.506028 -0.437028
+v 0.389554 0.501537 -0.460935
+v 0.377523 0.501511 -0.436866
+v 0.389079 0.497142 -0.460994
+v 0.377159 0.496990 -0.437097
+v 0.387942 0.492863 -0.461606
+v 0.376011 0.492637 -0.437716
+v 0.386056 0.488850 -0.462591
+v 0.374125 0.488624 -0.438701
+v 0.383505 0.485329 -0.463903
+v 0.371573 0.485102 -0.440013
+v 0.380385 0.482436 -0.465492
+v 0.368454 0.482209 -0.441602
+v 0.376817 0.480281 -0.467297
+v 0.364886 0.480054 -0.443407
+v 0.372939 0.478947 -0.469248
+v 0.361007 0.478720 -0.445359
+v 0.368898 0.478486 -0.471271
+v 0.356967 0.478259 -0.447382
+v 0.364851 0.478915 -0.473288
+v 0.352919 0.478688 -0.449399
+v 0.360953 0.480219 -0.475221
+v 0.349021 0.479992 -0.451332
+v 0.357354 0.482346 -0.476996
+v 0.345421 0.482119 -0.453107
+v 0.354191 0.485215 -0.478545
+v 0.342259 0.484988 -0.454655
+v 0.351588 0.488716 -0.479808
+v 0.339655 0.488489 -0.455918
+v 0.349643 0.492714 -0.480736
+v 0.337710 0.492488 -0.456847
+v 0.348444 0.496983 -0.481291
+v 0.336499 0.496832 -0.457407
+v 0.348084 0.501376 -0.481649
+v 0.336067 0.501349 -0.457572
+v 0.347559 0.506283 -0.481909
+v 0.319191 0.506069 -0.425110
+v 0.372234 0.510830 -0.528265
+v 0.320386 0.510615 -0.424456
+v 0.374201 0.515023 -0.527229
+v 0.322353 0.514809 -0.423420
+v 0.376865 0.518703 -0.525852
+v 0.325017 0.518489 -0.422043
+v 0.380123 0.521727 -0.524187
+v 0.328275 0.521512 -0.420377
+v 0.383849 0.523979 -0.522297
+v 0.332001 0.523764 -0.418488
+v 0.387901 0.525372 -0.520256
+v 0.336053 0.525158 -0.416446
+v 0.392123 0.525854 -0.518141
+v 0.340275 0.525640 -0.414331
+v 0.396352 0.525405 -0.516034
+v 0.344504 0.525191 -0.412225
+v 0.400427 0.524043 -0.514017
+v 0.348578 0.523829 -0.410207
+v 0.404190 0.521821 -0.512165
+v 0.352342 0.521606 -0.408356
+v 0.407496 0.518822 -0.510552
+v 0.355648 0.518608 -0.406742
+v 0.410220 0.515164 -0.509238
+v 0.358372 0.514950 -0.405428
+v 0.412256 0.510986 -0.508274
+v 0.360408 0.510772 -0.404465
+v 0.390046 0.506449 -0.460687
+v 0.361678 0.506235 -0.403888
+v 0.390477 0.501727 -0.460471
+v 0.362133 0.501513 -0.403721
+v 0.390009 0.497002 -0.460538
+v 0.361755 0.496788 -0.403969
+v 0.388814 0.492455 -0.461193
+v 0.360560 0.492241 -0.404624
+v 0.386846 0.488262 -0.462229
+v 0.358593 0.488048 -0.405660
+v 0.384183 0.484583 -0.463606
+v 0.355929 0.484368 -0.407037
+v 0.380925 0.481559 -0.465271
+v 0.352672 0.481344 -0.408702
+v 0.377199 0.479307 -0.467161
+v 0.348945 0.479092 -0.410592
+v 0.373147 0.477913 -0.469202
+v 0.344893 0.477699 -0.412633
+v 0.368925 0.477432 -0.471317
+v 0.340672 0.477217 -0.414748
+v 0.364696 0.477880 -0.473424
+v 0.336442 0.477666 -0.416855
+v 0.360621 0.479242 -0.475442
+v 0.332368 0.479028 -0.418872
+v 0.356858 0.481465 -0.477293
+v 0.328605 0.481251 -0.420724
+v 0.353551 0.484463 -0.478906
+v 0.325298 0.484249 -0.422337
+v 0.350828 0.488121 -0.480220
+v 0.322574 0.487907 -0.423651
+v 0.348792 0.492299 -0.481184
+v 0.320538 0.492085 -0.424615
+v 0.347522 0.496836 -0.481761
+v 0.319268 0.496622 -0.425192
+v 0.347158 0.501558 -0.482109
+v 0.318813 0.501344 -0.425359
+v 0.319634 0.243339 -0.495861
+v 0.307588 0.242789 -0.471742
+v 0.345912 0.253858 -0.541422
+v 0.310386 0.253308 -0.470292
+v 0.350494 0.263561 -0.539086
+v 0.314967 0.263011 -0.467956
+v 0.356682 0.272074 -0.535952
+v 0.321156 0.271524 -0.464822
+v 0.364241 0.279070 -0.532142
+v 0.328715 0.278520 -0.461012
+v 0.372878 0.284280 -0.527802
+v 0.337352 0.283730 -0.456672
+v 0.382263 0.287504 -0.523099
+v 0.346737 0.286954 -0.451969
+v 0.392034 0.288619 -0.518213
+v 0.356508 0.288069 -0.447083
+v 0.401817 0.287581 -0.513332
+v 0.366291 0.287030 -0.442202
+v 0.411234 0.284430 -0.508645
+v 0.375708 0.283880 -0.437515
+v 0.419925 0.279287 -0.504330
+v 0.384399 0.278737 -0.433200
+v 0.427554 0.272350 -0.500554
+v 0.392028 0.271800 -0.429423
+v 0.433830 0.263886 -0.497461
+v 0.398304 0.263336 -0.426331
+v 0.438511 0.254219 -0.495172
+v 0.402985 0.253669 -0.424042
+v 0.417937 0.243722 -0.446762
+v 0.405890 0.243172 -0.422643
+v 0.418951 0.232316 -0.446252
+v 0.406909 0.232252 -0.422188
+v 0.417904 0.221688 -0.446598
+v 0.406001 0.221322 -0.422692
+v 0.415131 0.211344 -0.448026
+v 0.403200 0.210797 -0.424136
+v 0.410547 0.201642 -0.450359
+v 0.398616 0.201094 -0.426469
+v 0.404356 0.193129 -0.453489
+v 0.392425 0.192581 -0.429598
+v 0.396796 0.186134 -0.457296
+v 0.384866 0.185585 -0.433405
+v 0.388157 0.180924 -0.461633
+v 0.376227 0.180374 -0.437743
+v 0.378772 0.177700 -0.466335
+v 0.366841 0.177150 -0.442445
+v 0.369001 0.176585 -0.471220
+v 0.357069 0.176035 -0.447330
+v 0.359219 0.177623 -0.476101
+v 0.347287 0.177073 -0.452212
+v 0.349803 0.180774 -0.480790
+v 0.337870 0.180224 -0.456901
+v 0.341113 0.185916 -0.485107
+v 0.329180 0.185368 -0.461218
+v 0.333485 0.192853 -0.488886
+v 0.321552 0.192304 -0.464997
+v 0.327211 0.201317 -0.491982
+v 0.315278 0.200769 -0.468093
+v 0.322533 0.210983 -0.494276
+v 0.310600 0.210436 -0.470387
+v 0.319660 0.221305 -0.495668
+v 0.307696 0.220938 -0.471792
+v 0.318689 0.231924 -0.496330
+v 0.306681 0.231861 -0.472249
+v 0.317421 0.243790 -0.496962
+v 0.289053 0.243271 -0.440163
+v 0.343823 0.254782 -0.542455
+v 0.291975 0.254264 -0.438645
+v 0.348610 0.264921 -0.540011
+v 0.296762 0.264402 -0.436202
+v 0.355076 0.273816 -0.536735
+v 0.303228 0.273298 -0.432925
+v 0.362973 0.281127 -0.532752
+v 0.311125 0.280609 -0.428943
+v 0.371999 0.286572 -0.528216
+v 0.320151 0.286053 -0.424406
+v 0.381805 0.289941 -0.523300
+v 0.329957 0.289423 -0.419491
+v 0.392015 0.291105 -0.518195
+v 0.340167 0.290587 -0.414385
+v 0.402238 0.290021 -0.513095
+v 0.350390 0.289502 -0.409285
+v 0.412079 0.286728 -0.508197
+v 0.360231 0.286210 -0.404387
+v 0.421161 0.281354 -0.503689
+v 0.369312 0.280836 -0.399880
+v 0.429134 0.274105 -0.499745
+v 0.377286 0.273587 -0.395935
+v 0.435693 0.265261 -0.496515
+v 0.383845 0.264742 -0.392706
+v 0.440585 0.255160 -0.494125
+v 0.388737 0.254641 -0.390316
+v 0.420143 0.244190 -0.445655
+v 0.391774 0.243672 -0.388856
+v 0.421184 0.232775 -0.445134
+v 0.392840 0.232256 -0.388384
+v 0.420147 0.221351 -0.445486
+v 0.391894 0.220833 -0.388917
+v 0.417225 0.210359 -0.447003
+v 0.388971 0.209840 -0.390434
+v 0.412438 0.200220 -0.449447
+v 0.384184 0.199702 -0.392878
+v 0.405972 0.191324 -0.452723
+v 0.377718 0.190806 -0.396154
+v 0.398074 0.184014 -0.456706
+v 0.369821 0.183495 -0.400137
+v 0.389049 0.178569 -0.461242
+v 0.360795 0.178051 -0.404673
+v 0.379243 0.175200 -0.466158
+v 0.350989 0.174682 -0.409589
+v 0.369032 0.174035 -0.471264
+v 0.340779 0.173517 -0.414694
+v 0.358810 0.175120 -0.476363
+v 0.330557 0.174602 -0.419794
+v 0.348969 0.178413 -0.481261
+v 0.320716 0.177894 -0.424692
+v 0.339887 0.183787 -0.485769
+v 0.311634 0.183268 -0.429200
+v 0.331914 0.191035 -0.489713
+v 0.303660 0.190517 -0.433144
+v 0.325355 0.199880 -0.492943
+v 0.297101 0.199362 -0.436374
+v 0.320463 0.209981 -0.495333
+v 0.292209 0.209463 -0.438764
+v 0.317426 0.220950 -0.496792
+v 0.289172 0.220432 -0.440223
+v 0.316450 0.232366 -0.497446
+v 0.288106 0.231848 -0.440696
+v 0.318813 -0.005892 -0.425359
+v 0.347158 -0.005677 -0.482109
+v 0.319268 -0.010613 -0.425192
+v 0.347522 -0.010399 -0.481761
+v 0.320538 -0.015150 -0.424615
+v 0.348792 -0.014936 -0.481184
+v 0.322574 -0.019328 -0.423651
+v 0.350828 -0.019114 -0.480220
+v 0.325298 -0.022987 -0.422337
+v 0.353551 -0.022772 -0.478906
+v 0.328605 -0.025985 -0.420724
+v 0.356858 -0.025771 -0.477293
+v 0.332368 -0.028208 -0.418872
+v 0.360621 -0.027993 -0.475442
+v 0.336442 -0.029570 -0.416855
+v 0.364696 -0.029355 -0.473424
+v 0.340672 -0.030018 -0.414748
+v 0.368925 -0.029804 -0.471317
+v 0.344893 -0.029537 -0.412633
+v 0.373147 -0.029322 -0.469202
+v 0.348945 -0.028143 -0.410592
+v 0.377199 -0.027929 -0.467161
+v 0.352672 -0.025891 -0.408702
+v 0.380925 -0.025677 -0.465271
+v 0.355929 -0.022867 -0.407037
+v 0.384183 -0.022653 -0.463606
+v 0.358593 -0.019188 -0.405660
+v 0.386846 -0.018973 -0.462229
+v 0.360560 -0.014994 -0.404624
+v 0.388814 -0.014780 -0.461193
+v 0.361755 -0.010448 -0.403969
+v 0.390009 -0.010233 -0.460538
+v 0.362133 -0.005723 -0.403721
+v 0.390477 -0.005508 -0.460471
+v 0.361678 -0.001001 -0.403888
+v 0.390046 -0.000787 -0.460687
+v 0.360408 0.003536 -0.404465
+v 0.412256 0.003751 -0.508274
+v 0.358372 0.007714 -0.405428
+v 0.410220 0.007929 -0.509238
+v 0.355648 0.011373 -0.406742
+v 0.407496 0.011587 -0.510552
+v 0.352342 0.014371 -0.408356
+v 0.404190 0.014585 -0.512165
+v 0.348578 0.016593 -0.410207
+v 0.400427 0.016808 -0.514017
+v 0.344504 0.017955 -0.412225
+v 0.396352 0.018170 -0.516034
+v 0.340275 0.018404 -0.414331
+v 0.392123 0.018618 -0.518141
+v 0.336053 0.017922 -0.416446
+v 0.387901 0.018137 -0.520256
+v 0.332001 0.016529 -0.418488
+v 0.383849 0.016743 -0.522297
+v 0.328275 0.014277 -0.420377
+v 0.380123 0.014491 -0.524187
+v 0.325017 0.011253 -0.422043
+v 0.376865 0.011467 -0.525852
+v 0.322353 0.007574 -0.423420
+v 0.374201 0.007788 -0.527229
+v 0.320386 0.003380 -0.424456
+v 0.372234 0.003594 -0.528265
+v 0.319191 -0.001167 -0.425110
+v 0.347559 -0.000952 -0.481909
+v 0.336067 -0.005886 -0.457572
+v 0.348084 -0.005860 -0.481649
+v 0.336499 -0.010404 -0.457407
+v 0.348444 -0.010252 -0.481291
+v 0.337710 -0.014748 -0.456847
+v 0.349643 -0.014522 -0.480736
+v 0.339655 -0.018746 -0.455918
+v 0.351588 -0.018520 -0.479808
+v 0.342259 -0.022247 -0.454655
+v 0.354191 -0.022021 -0.478545
+v 0.345421 -0.025117 -0.453107
+v 0.357354 -0.024890 -0.476996
+v 0.349021 -0.027244 -0.451332
+v 0.360953 -0.027017 -0.475221
+v 0.352919 -0.028547 -0.449399
+v 0.364851 -0.028320 -0.473288
+v 0.356967 -0.028977 -0.447382
+v 0.368898 -0.028749 -0.471271
+v 0.361007 -0.028516 -0.445359
+v 0.372939 -0.028288 -0.469248
+v 0.364886 -0.027182 -0.443407
+v 0.376817 -0.026955 -0.467297
+v 0.368454 -0.025027 -0.441602
+v 0.380385 -0.024800 -0.465492
+v 0.371573 -0.022133 -0.440013
+v 0.383505 -0.021906 -0.463903
+v 0.374125 -0.018612 -0.438701
+v 0.386056 -0.018385 -0.462591
+v 0.376011 -0.014598 -0.437716
+v 0.387942 -0.014372 -0.461606
+v 0.377159 -0.010245 -0.437097
+v 0.389079 -0.010094 -0.460994
+v 0.377523 -0.005724 -0.436866
+v 0.389554 -0.005698 -0.460935
+v 0.377089 -0.001208 -0.437028
+v 0.389135 -0.000980 -0.461147
+v 0.375875 0.003134 -0.437582
+v 0.411401 0.003362 -0.508712
+v 0.373927 0.007132 -0.438506
+v 0.409453 0.007360 -0.509636
+v 0.371322 0.010633 -0.439765
+v 0.406848 0.010861 -0.510896
+v 0.368158 0.013503 -0.441311
+v 0.403684 0.013730 -0.512441
+v 0.364557 0.015630 -0.443084
+v 0.400083 0.015857 -0.514214
+v 0.360658 0.016933 -0.445015
+v 0.396185 0.017161 -0.516145
+v 0.356611 0.017362 -0.447032
+v 0.392137 0.017590 -0.518162
+v 0.352571 0.016901 -0.449055
+v 0.388097 0.017129 -0.520185
+v 0.348693 0.015568 -0.451008
+v 0.384219 0.015795 -0.522138
+v 0.345126 0.013413 -0.452816
+v 0.380652 0.013640 -0.523946
+v 0.342008 0.010519 -0.454408
+v 0.377534 0.010747 -0.525538
+v 0.339458 0.006998 -0.455724
+v 0.374984 0.007226 -0.526854
+v 0.337574 0.002985 -0.456713
+v 0.373101 0.003212 -0.527843
+v 0.336429 -0.001366 -0.457337
+v 0.348476 -0.001139 -0.481456
+v 0.230172 0.400585 -0.540544
+v 0.218126 0.400035 -0.516424
+v 0.256450 0.411104 -0.586105
+v 0.220924 0.410554 -0.514975
+v 0.261031 0.420807 -0.583768
+v 0.225505 0.420257 -0.512638
+v 0.267220 0.429320 -0.580635
+v 0.231694 0.428770 -0.509505
+v 0.274779 0.436316 -0.576825
+v 0.239253 0.435766 -0.505695
+v 0.283416 0.441526 -0.572484
+v 0.247890 0.440976 -0.501354
+v 0.292801 0.444750 -0.567781
+v 0.257275 0.444201 -0.496651
+v 0.302572 0.445865 -0.562895
+v 0.267046 0.445315 -0.491765
+v 0.312355 0.444827 -0.558015
+v 0.276828 0.444276 -0.486885
+v 0.321772 0.441676 -0.553327
+v 0.286246 0.441126 -0.482197
+v 0.330462 0.436533 -0.549012
+v 0.294936 0.435983 -0.477882
+v 0.338092 0.429597 -0.545236
+v 0.302566 0.429046 -0.474106
+v 0.344368 0.421132 -0.542144
+v 0.308842 0.420582 -0.471014
+v 0.349049 0.411466 -0.539854
+v 0.313522 0.410915 -0.468724
+v 0.328474 0.400968 -0.491444
+v 0.316428 0.400418 -0.467325
+v 0.329489 0.389562 -0.490934
+v 0.317447 0.389498 -0.466871
+v 0.328442 0.378934 -0.491280
+v 0.316539 0.378568 -0.467374
+v 0.325668 0.368590 -0.492709
+v 0.313738 0.368043 -0.468819
+v 0.321084 0.358888 -0.495041
+v 0.309154 0.358340 -0.471151
+v 0.314894 0.350376 -0.498171
+v 0.302963 0.349827 -0.474281
+v 0.307334 0.343380 -0.501978
+v 0.295403 0.342831 -0.478087
+v 0.298695 0.338170 -0.506315
+v 0.286764 0.337620 -0.482425
+v 0.289310 0.334946 -0.511017
+v 0.277379 0.334396 -0.487127
+v 0.279539 0.333831 -0.515902
+v 0.267607 0.333281 -0.492013
+v 0.269757 0.334869 -0.520783
+v 0.257824 0.334319 -0.496894
+v 0.260340 0.338020 -0.525472
+v 0.248408 0.337471 -0.501583
+v 0.251651 0.343162 -0.529790
+v 0.239718 0.342614 -0.505901
+v 0.244023 0.350099 -0.533569
+v 0.232090 0.349550 -0.509680
+v 0.237749 0.358563 -0.536665
+v 0.225816 0.358015 -0.512776
+v 0.233071 0.368229 -0.538959
+v 0.221138 0.367682 -0.515069
+v 0.230198 0.378551 -0.540350
+v 0.218234 0.378184 -0.516474
+v 0.229226 0.389171 -0.541012
+v 0.217218 0.389107 -0.516932
+v 0.227959 0.401036 -0.541644
+v 0.199590 0.400517 -0.484845
+v 0.254361 0.412028 -0.587137
+v 0.202513 0.411510 -0.483328
+v 0.259148 0.422167 -0.584693
+v 0.207300 0.421649 -0.480884
+v 0.265614 0.431063 -0.581417
+v 0.213765 0.430544 -0.477608
+v 0.273511 0.438373 -0.577434
+v 0.221663 0.437855 -0.473625
+v 0.282536 0.443818 -0.572898
+v 0.230688 0.443299 -0.469089
+v 0.292343 0.447187 -0.567983
+v 0.240495 0.446669 -0.464173
+v 0.302553 0.448351 -0.562877
+v 0.250705 0.447833 -0.459067
+v 0.312775 0.447267 -0.557777
+v 0.260927 0.446748 -0.453968
+v 0.322616 0.443974 -0.552879
+v 0.270768 0.443456 -0.449070
+v 0.331698 0.438600 -0.548371
+v 0.279850 0.438082 -0.444562
+v 0.339672 0.431351 -0.544427
+v 0.287824 0.430833 -0.440618
+v 0.346230 0.422507 -0.541198
+v 0.294382 0.421988 -0.437388
+v 0.351123 0.412406 -0.538807
+v 0.299275 0.411887 -0.434998
+v 0.330680 0.401436 -0.490337
+v 0.302312 0.400918 -0.433538
+v 0.331722 0.390021 -0.489817
+v 0.303378 0.389503 -0.433066
+v 0.330685 0.378597 -0.490168
+v 0.302431 0.378079 -0.433599
+v 0.327762 0.367605 -0.491685
+v 0.299509 0.367086 -0.435116
+v 0.322976 0.357466 -0.494129
+v 0.294722 0.356948 -0.437560
+v 0.316510 0.348570 -0.497405
+v 0.288256 0.348052 -0.440836
+v 0.308612 0.341260 -0.501388
+v 0.280358 0.340741 -0.444819
+v 0.299587 0.335815 -0.505925
+v 0.271333 0.335297 -0.449355
+v 0.289781 0.332446 -0.510840
+v 0.261527 0.331928 -0.454271
+v 0.279570 0.331281 -0.515946
+v 0.251316 0.330763 -0.459377
+v 0.269348 0.332366 -0.521046
+v 0.241094 0.331848 -0.464477
+v 0.259507 0.335659 -0.525943
+v 0.231253 0.335141 -0.469374
+v 0.250425 0.341033 -0.530451
+v 0.222171 0.340515 -0.473882
+v 0.242451 0.348281 -0.534396
+v 0.214198 0.347763 -0.477826
+v 0.235893 0.357126 -0.537625
+v 0.207639 0.356608 -0.481056
+v 0.231001 0.367227 -0.540015
+v 0.202747 0.366709 -0.483446
+v 0.227963 0.378196 -0.541474
+v 0.199710 0.377678 -0.484906
+v 0.226988 0.389612 -0.542129
+v 0.198644 0.389094 -0.485378
+v 0.229351 0.094108 -0.470041
+v 0.257695 0.094323 -0.526792
+v 0.229806 0.089387 -0.469874
+v 0.258060 0.089601 -0.526443
+v 0.231076 0.084850 -0.469297
+v 0.259329 0.085064 -0.525866
+v 0.233112 0.080672 -0.468333
+v 0.261365 0.080886 -0.524903
+v 0.235835 0.077013 -0.467019
+v 0.264089 0.077228 -0.523589
+v 0.239142 0.074015 -0.465406
+v 0.267396 0.074229 -0.521975
+v 0.242905 0.071792 -0.463555
+v 0.271159 0.072007 -0.520124
+v 0.246980 0.070430 -0.461537
+v 0.275234 0.070645 -0.518106
+v 0.251209 0.069982 -0.459430
+v 0.279463 0.070196 -0.515999
+v 0.255431 0.070463 -0.457316
+v 0.283685 0.070678 -0.513885
+v 0.259483 0.071857 -0.455274
+v 0.287737 0.072071 -0.511843
+v 0.263209 0.074109 -0.453384
+v 0.291463 0.074323 -0.509953
+v 0.266467 0.077133 -0.451719
+v 0.294721 0.077347 -0.508288
+v 0.269130 0.080812 -0.450342
+v 0.297384 0.081027 -0.506911
+v 0.271098 0.085006 -0.449306
+v 0.299351 0.085220 -0.505875
+v 0.272293 0.089552 -0.448651
+v 0.300547 0.089767 -0.505221
+v 0.272670 0.094278 -0.448403
+v 0.301015 0.094492 -0.505154
+v 0.272216 0.098999 -0.448570
+v 0.300584 0.099214 -0.505369
+v 0.270946 0.103536 -0.449147
+v 0.322794 0.103751 -0.552956
+v 0.268910 0.107714 -0.450111
+v 0.320758 0.107929 -0.553920
+v 0.266186 0.111373 -0.451424
+v 0.318034 0.111587 -0.555234
+v 0.262879 0.114371 -0.453038
+v 0.314727 0.114585 -0.556848
+v 0.259116 0.116594 -0.454889
+v 0.310964 0.116808 -0.558699
+v 0.255042 0.117955 -0.456907
+v 0.306890 0.118170 -0.560717
+v 0.250812 0.118404 -0.459014
+v 0.302660 0.118618 -0.562823
+v 0.246590 0.117922 -0.461128
+v 0.298439 0.118137 -0.564938
+v 0.242539 0.116529 -0.463170
+v 0.294387 0.116743 -0.566979
+v 0.238812 0.114277 -0.465060
+v 0.290660 0.114491 -0.568869
+v 0.235555 0.111253 -0.466725
+v 0.287403 0.111467 -0.570535
+v 0.232891 0.107574 -0.468102
+v 0.284739 0.107788 -0.571911
+v 0.230924 0.103380 -0.469138
+v 0.282772 0.103594 -0.572947
+v 0.229729 0.098833 -0.469793
+v 0.258097 0.099048 -0.526591
+v 0.246605 0.094114 -0.502255
+v 0.258622 0.094140 -0.526331
+v 0.247036 0.089596 -0.502089
+v 0.258982 0.089748 -0.525974
+v 0.248248 0.085252 -0.501529
+v 0.260180 0.085478 -0.525419
+v 0.250193 0.081254 -0.500600
+v 0.262125 0.081480 -0.524490
+v 0.252797 0.077753 -0.499338
+v 0.264729 0.077979 -0.523227
+v 0.255959 0.074883 -0.497789
+v 0.267891 0.075110 -0.521678
+v 0.259559 0.072756 -0.496014
+v 0.271491 0.072983 -0.519903
+v 0.263457 0.071453 -0.494081
+v 0.275389 0.071680 -0.517970
+v 0.267504 0.071023 -0.492064
+v 0.279436 0.071251 -0.515953
+v 0.271545 0.071484 -0.490041
+v 0.283476 0.071712 -0.513931
+v 0.275424 0.072818 -0.488089
+v 0.287355 0.073045 -0.511979
+v 0.278991 0.074973 -0.486284
+v 0.290923 0.075200 -0.510174
+v 0.282111 0.077867 -0.484695
+v 0.294042 0.078094 -0.508585
+v 0.284663 0.081388 -0.483383
+v 0.296594 0.081615 -0.507273
+v 0.286549 0.085402 -0.482398
+v 0.298480 0.085628 -0.506288
+v 0.287697 0.089755 -0.481779
+v 0.299617 0.089906 -0.505677
+v 0.288060 0.094276 -0.481548
+v 0.300091 0.094302 -0.505617
+v 0.287626 0.098792 -0.481710
+v 0.299673 0.099020 -0.505829
+v 0.286412 0.103134 -0.482264
+v 0.321938 0.103362 -0.553394
+v 0.284465 0.107132 -0.483189
+v 0.319991 0.107360 -0.554319
+v 0.281859 0.110633 -0.484448
+v 0.317385 0.110861 -0.555578
+v 0.278695 0.113503 -0.485993
+v 0.314222 0.113730 -0.557124
+v 0.275095 0.115630 -0.487766
+v 0.310621 0.115857 -0.558896
+v 0.271196 0.116933 -0.489698
+v 0.306722 0.117161 -0.560828
+v 0.267149 0.117363 -0.491714
+v 0.302675 0.117590 -0.562844
+v 0.263108 0.116902 -0.493738
+v 0.298634 0.117129 -0.564868
+v 0.259230 0.115568 -0.495690
+v 0.294757 0.115795 -0.566820
+v 0.255664 0.113413 -0.497498
+v 0.291190 0.113640 -0.568628
+v 0.252546 0.110519 -0.499090
+v 0.288072 0.110747 -0.570220
+v 0.249996 0.106998 -0.500406
+v 0.285522 0.107226 -0.571536
+v 0.248112 0.102985 -0.501395
+v 0.283638 0.103212 -0.572525
+v 0.246967 0.098634 -0.502019
+v 0.259014 0.098861 -0.526139
+v 0.221998 -0.168051 -0.380515
+v 0.170859 -0.168051 -0.406057
+v 0.196400 -0.168051 -0.457196
+v 0.247539 -0.168051 -0.431654
+v 0.171044 -0.168051 -0.278496
+v 0.145502 -0.168051 -0.227357
+v 0.094363 -0.168051 -0.252898
+v 0.119905 -0.168051 -0.304038
+v 0.094363 -0.168051 -0.252898
+v 0.145502 -0.168051 -0.227357
+v 0.247539 -0.168051 -0.431654
+v 0.196400 -0.168051 -0.457196
+v 0.119905 -0.168051 -0.304038
+v 0.170859 -0.168051 -0.406057
+v 0.171044 -0.168051 -0.278496
+v 0.221998 -0.168051 -0.380515
+v 0.221998 0.037812 -0.380515
+v 0.221998 0.165702 -0.380515
+v 0.170859 0.165702 -0.406057
+v 0.170859 0.037812 -0.406057
+v 0.196400 0.037812 -0.457196
+v 0.196400 0.165702 -0.457196
+v 0.247539 0.165702 -0.431654
+v 0.247539 0.037812 -0.431654
+v 0.171044 0.037812 -0.278496
+v 0.171044 0.165702 -0.278496
+v 0.145502 0.165702 -0.227357
+v 0.145502 0.037812 -0.227357
+v 0.094363 0.037812 -0.252898
+v 0.094363 0.165702 -0.252898
+v 0.119905 0.165702 -0.304038
+v 0.119905 0.037812 -0.304038
+v 0.221998 0.166622 -0.380515
+v 0.170859 0.166622 -0.406057
+v 0.196400 0.166622 -0.457196
+v 0.247539 0.166622 -0.431654
+v 0.171044 0.166622 -0.278496
+v 0.145502 0.166622 -0.227357
+v 0.094363 0.166622 -0.252898
+v 0.119905 0.166622 -0.304038
+v 0.094363 0.166622 -0.252898
+v 0.145502 0.166622 -0.227357
+v 0.247539 0.166622 -0.431654
+v 0.196400 0.166622 -0.457196
+v 0.119905 0.166622 -0.304038
+v 0.170859 0.166622 -0.406057
+v 0.171044 0.166622 -0.278496
+v 0.221998 0.166622 -0.380515
+v 0.221998 0.370885 -0.380515
+v 0.221998 0.497782 -0.380515
+v 0.170859 0.497782 -0.406057
+v 0.170859 0.370885 -0.406057
+v 0.196400 0.370885 -0.457196
+v 0.196400 0.497782 -0.457196
+v 0.247539 0.497782 -0.431654
+v 0.247539 0.370885 -0.431654
+v 0.171044 0.370885 -0.278496
+v 0.171044 0.497782 -0.278496
+v 0.145502 0.497782 -0.227357
+v 0.145502 0.370885 -0.227357
+v 0.094363 0.370885 -0.252898
+v 0.094363 0.497782 -0.252898
+v 0.119905 0.497782 -0.304038
+v 0.119905 0.370885 -0.304038
+v 0.486059 -0.145166 -0.370328
+v 0.038748 -0.145166 -0.593739
+v 0.486059 0.603749 -0.370327
+v 0.038748 0.603749 -0.593739
+v 0.464872 0.603749 -0.327906
+v 0.464872 -0.145166 -0.327906
+v 0.017561 -0.145166 -0.551317
+v 0.017560 0.603749 -0.551317
+vt 0.285559 0.095797
+vt 0.214079 0.095797
+vt 0.214079 0.000000
+vt 0.285559 0.000000
+vt 0.357039 0.095797
+vt 0.285559 0.095797
+vt 0.285559 0.000000
+vt 0.357039 0.000000
+vt 0.642599 0.095797
+vt 0.571118 0.095797
+vt 0.571118 0.000000
+vt 0.642598 0.000000
+vt 0.714079 0.904203
+vt 0.785559 0.904203
+vt 0.785559 1.000000
+vt 0.714079 1.000000
+vt 0.642599 0.904203
+vt 0.714079 0.904203
+vt 0.714079 1.000000
+vt 0.642599 1.000000
+vt 0.071480 0.095797
+vt 0.000000 0.095797
+vt 0.000000 0.000000
+vt 0.071480 0.000000
+vt 0.571118 0.095797
+vt 0.499638 0.095797
+vt 0.499638 0.000000
+vt 0.571118 0.000000
+vt 0.857040 0.394495
+vt 0.928520 0.394495
+vt 0.928520 0.480583
+vt 0.857040 0.480583
+vt 0.857040 0.129242
+vt 0.785559 0.129242
+vt 0.785559 0.043154
+vt 0.857040 0.043154
+vt 0.785559 0.172396
+vt 0.857040 0.172396
+vt 0.785559 0.000000
+vt 0.857040 0.000000
+vt 0.285559 0.250000
+vt 0.214079 0.250000
+vt 0.357039 0.250000
+vt 0.285559 0.250000
+vt 0.642599 0.250000
+vt 0.571118 0.250000
+vt 0.714079 0.750000
+vt 0.785559 0.750000
+vt 0.642599 0.750000
+vt 0.714079 0.750000
+vt 0.928520 0.154203
+vt 0.857040 0.154203
+vt 0.857040 0.000000
+vt 0.928520 0.000000
+vt 0.071480 0.250000
+vt 0.000000 0.250000
+vt 0.571118 0.250000
+vt 0.499638 0.250000
+vt 0.000000 0.000000
+vt 0.000000 0.000000
+vt 0.000000 0.000000
+vt 0.000000 0.000000
+vt 0.615085 0.501950
+vt 0.538102 0.501950
+vt 0.538102 0.192341
+vt 0.615085 0.192341
+vt 0.538102 0.000000
+vt 0.615085 0.000000
+vt 0.076983 0.501950
+vt 0.000000 0.501950
+vt 0.000000 0.192341
+vt 0.076983 0.192341
+vt 0.000000 0.000000
+vt 0.076983 0.000000
+vt 0.692068 0.501950
+vt 0.692068 0.192341
+vt 0.692068 0.000000
+vt 0.769051 0.501950
+vt 0.692068 0.501950
+vt 0.692068 0.192341
+vt 0.769051 0.192341
+vt 0.692068 0.000000
+vt 0.769051 0.000000
+vt 0.846034 0.501950
+vt 0.769051 0.501950
+vt 0.769051 0.192341
+vt 0.846034 0.192341
+vt 0.769051 0.000000
+vt 0.846034 0.000000
+vt 0.923017 0.996502
+vt 0.846034 0.996502
+vt 0.846034 0.686893
+vt 0.923017 0.686893
+vt 0.384526 0.501950
+vt 0.307543 0.501950
+vt 0.307542 0.192341
+vt 0.384525 0.192341
+vt 0.307542 0.000000
+vt 0.384525 0.000000
+vt 0.307542 0.501950
+vt 0.230559 0.501950
+vt 0.230559 0.192341
+vt 0.307542 0.192341
+vt 0.230559 0.000000
+vt 0.307542 0.000000
+vt 0.923017 0.478709
+vt 1.000000 0.478709
+vt 1.000000 0.650215
+vt 0.923017 0.650215
+vt 0.923017 0.600923
+vt 0.846034 0.600923
+vt 0.846034 0.429417
+vt 0.923017 0.429417
+vt 0.846034 0.686893
+vt 0.923017 0.686893
+vt 0.846034 0.343447
+vt 0.923017 0.343447
+vt 0.000000 0.000000
+vt 0.000000 0.000000
+vt 0.000000 0.000000
+vt 0.000000 0.000000
+vt 0.615085 1.000000
+vt 0.538102 1.000000
+vt 0.538102 0.692796
+vt 0.615085 0.692796
+vt 0.538102 0.501950
+vt 0.615085 0.501950
+vt 0.076983 1.000000
+vt 0.000000 1.000000
+vt 0.000000 0.692797
+vt 0.076983 0.692797
+vt 0.000000 0.501950
+vt 0.076983 0.501950
+vt 0.769051 1.000000
+vt 0.692068 1.000000
+vt 0.692068 0.692796
+vt 0.769051 0.692796
+vt 0.692068 0.501950
+vt 0.769051 0.501950
+vt 0.615085 0.501950
+vt 0.692068 0.501950
+vt 0.692068 0.809153
+vt 0.615085 0.809153
+vt 0.692068 1.000000
+vt 0.615085 1.000000
+vt 0.846034 1.000000
+vt 0.769051 1.000000
+vt 0.769051 0.692796
+vt 0.846034 0.692796
+vt 0.769051 0.501950
+vt 0.846034 0.501950
+vt 1.000000 0.307203
+vt 0.923017 0.307203
+vt 0.923017 0.000000
+vt 1.000000 0.000000
+vt 0.384526 1.000000
+vt 0.307543 1.000000
+vt 0.307542 0.692797
+vt 0.384525 0.692797
+vt 0.307542 0.501950
+vt 0.384525 0.501950
+vt 0.307542 1.000000
+vt 0.230559 1.000000
+vt 0.230559 0.692797
+vt 0.307542 0.692796
+vt 0.230559 0.501950
+vt 0.307542 0.501950
+vt 0.923017 0.307203
+vt 1.000000 0.307203
+vt 1.000000 0.478709
+vt 0.923017 0.478709
+vt 0.923017 0.257476
+vt 0.846034 0.257476
+vt 0.846034 0.085970
+vt 0.923017 0.085970
+vt 0.846034 0.343447
+vt 0.923017 0.343447
+vt 0.846034 0.000000
+vt 0.923017 0.000000
+vt 0.875462 0.748915
+vt 0.437731 0.748915
+vt 0.437731 0.000000
+vt 0.875462 0.000000
+vt 0.437731 0.000000
+vt 0.437731 0.748915
+vt 0.000000 0.748915
+vt 0.000000 0.000000
+vt 0.958487 0.748915
+vt 0.916975 0.748915
+vt 0.916975 0.000000
+vt 0.958487 0.000000
+vt 0.958487 0.000000
+vt 1.000000 0.000000
+vt 1.000000 0.500000
+vt 0.958487 0.500000
+vt 1.000000 1.000000
+vt 0.958487 1.000000
+vt 0.958487 0.500000
+vt 1.000000 0.500000
+vt 0.875462 0.000000
+vt 0.916974 0.000000
+vt 0.916975 0.748915
+vt 0.875462 0.748915
+vt 0.442670 0.517822
+vt 0.228883 0.517823
+vt 0.228889 0.488295
+vt 0.442971 0.724510
+vt 0.443060 0.754024
+vt 0.370472 0.723575
+vt 0.442967 0.311134
+vt 0.370467 0.312068
+vt 0.443056 0.281620
+vt 0.443160 0.252098
+vt 0.371348 0.252525
+vt 0.443163 0.783546
+vt 0.371352 0.783117
+vt 0.006929 0.253167
+vt 0.177644 0.253134
+vt 0.006828 0.284020
+vt 0.007055 0.808541
+vt 0.006941 0.777687
+vt 0.177771 0.808498
+vt 0.006827 0.746834
+vt 0.176852 0.746796
+vt 0.006727 0.314875
+vt 0.176753 0.314837
+vt 0.371492 0.871219
+vt 0.371495 0.841694
+vt 0.443305 0.842613
+vt 0.615392 0.436018
+vt 0.610260 0.440534
+vt 0.592437 0.415287
+vt 0.816609 0.103895
+vt 0.836176 0.125250
+vt 0.831035 0.128981
+vt 0.706468 0.066881
+vt 0.736753 0.067631
+vt 0.735929 0.074111
+vt 0.647824 0.083609
+vt 0.650942 0.089526
+vt 0.626230 0.105756
+vt 0.765981 0.074365
+vt 0.763884 0.080481
+vt 0.579817 0.387126
+vt 0.586362 0.385333
+vt 0.621946 0.100560
+vt 0.605204 0.126737
+vt 0.706979 0.073452
+vt 0.678244 0.078632
+vt 0.792953 0.086670
+vt 0.812355 0.108585
+vt 0.676401 0.072253
+vt 0.789700 0.092175
+vt 0.599888 0.122511
+vt 0.589057 0.151745
+vt 0.582798 0.148853
+vt 0.579868 0.178984
+vt 0.850517 0.149568
+vt 0.844628 0.151667
+vt 0.572791 0.357181
+vt 0.571207 0.326153
+vt 0.578089 0.326242
+vt 0.579568 0.357437
+vt 0.892437 0.349226
+vt 0.885423 0.348954
+vt 0.885704 0.319257
+vt 0.886223 0.285996
+vt 0.879631 0.287703
+vt 0.636826 0.456466
+vt 0.632640 0.461897
+vt 0.874138 0.409852
+vt 0.856681 0.436209
+vt 0.851292 0.431762
+vt 0.661830 0.472412
+vt 0.658752 0.478560
+vt 0.689480 0.483245
+vt 0.687628 0.489885
+vt 0.718747 0.488548
+vt 0.718195 0.495436
+vt 0.779839 0.488518
+vt 0.749318 0.494983
+vt 0.748545 0.488099
+vt 0.808610 0.476251
+vt 0.777761 0.481894
+vt 0.834553 0.458608
+vt 0.805300 0.470133
+vt 0.830124 0.453224
+vt 0.573209 0.178195
+vt 0.886228 0.380492
+vt 0.867982 0.406513
+vt 0.879533 0.378395
+vt 0.370709 0.754396
+vt 0.319322 0.130795
+vt 0.319224 0.161649
+vt 0.007220 0.160604
+vt 0.007387 0.901104
+vt 0.319390 0.899923
+vt 0.319502 0.930776
+vt 0.442778 0.399714
+vt 0.228990 0.399716
+vt 0.229046 0.370189
+vt 0.007499 0.931958
+vt 0.319616 0.961631
+vt 0.006361 0.469146
+vt 0.176387 0.469108
+vt 0.176362 0.499962
+vt 0.442678 0.488295
+vt 0.228910 0.458769
+vt 0.007727 0.006334
+vt 0.319730 0.007378
+vt 0.319626 0.038233
+vt 0.228890 0.547350
+vt 0.007613 0.962812
+vt 0.319730 0.992485
+vt 0.228946 0.606403
+vt 0.228912 0.576877
+vt 0.442700 0.576876
+vt 0.228992 0.635930
+vt 0.442734 0.606402
+vt 0.442833 0.370188
+vt 0.229109 0.340661
+vt 0.229113 0.694984
+vt 0.229049 0.665457
+vt 0.442837 0.665456
+vt 0.442901 0.694984
+vt 0.370705 0.281246
+vt 0.371443 0.812167
+vt 0.443254 0.813086
+vt 0.892437 0.317355
+vt 0.371421 0.900745
+vt 0.443302 0.872141
+vt 0.371269 0.930272
+vt 0.443231 0.901668
+vt 0.007276 0.870250
+vt 0.319278 0.869069
+vt 0.006405 0.438291
+vt 0.176430 0.438254
+vt 0.443090 0.104449
+vt 0.371280 0.105372
+vt 0.371043 0.075847
+vt 0.443237 0.133976
+vt 0.371427 0.134897
+vt 0.443305 0.163503
+vt 0.371495 0.164423
+vt 0.443305 0.193031
+vt 0.371495 0.193949
+vt 0.443252 0.222558
+vt 0.371442 0.223476
+vt 0.177399 0.283987
+vt 0.006543 0.376583
+vt 0.176568 0.376545
+vt 0.176492 0.407399
+vt 0.006467 0.407437
+vt 0.007165 0.839396
+vt 0.319168 0.838215
+vt 0.370694 0.989321
+vt 0.371029 0.959797
+vt 0.442838 0.960722
+vt 0.442780 0.635930
+vt 0.442698 0.458768
+vt 0.228944 0.429242
+vt 0.006337 0.500000
+vt 0.176359 0.530816
+vt 0.319524 0.069087
+vt 0.007520 0.068042
+vt 0.319423 0.099941
+vt 0.007419 0.098896
+vt 0.007319 0.129750
+vt 0.442897 0.340661
+vt 0.319126 0.192504
+vt 0.007122 0.191458
+vt 0.319029 0.223358
+vt 0.007025 0.222313
+vt 0.177512 0.777645
+vt 0.443079 0.931196
+vt 0.176656 0.345691
+vt 0.006631 0.345729
+vt 0.442853 0.074922
+vt 0.370712 0.046322
+vt 0.442732 0.429241
+vt 0.442678 0.547349
+vt 0.176377 0.561671
+vt 0.006351 0.561708
+vt 0.176415 0.592525
+vt 0.006390 0.592562
+vt 0.176474 0.623379
+vt 0.006448 0.623417
+vt 0.176549 0.654233
+vt 0.006524 0.654271
+vt 0.176640 0.685087
+vt 0.006614 0.685125
+vt 0.176742 0.715941
+vt 0.006716 0.715979
+vt 0.615392 0.436018
+vt 0.610260 0.440534
+vt 0.592437 0.415287
+vt 0.006631 0.345729
+vt 0.176656 0.345691
+vt 0.176568 0.376545
+vt 0.371443 0.812167
+vt 0.371352 0.783117
+vt 0.443163 0.783546
+vt 0.176852 0.746796
+vt 0.177512 0.777645
+vt 0.006941 0.777687
+vt 0.007165 0.839396
+vt 0.319168 0.838215
+vt 0.319278 0.869069
+vt 0.006467 0.407437
+vt 0.176492 0.407399
+vt 0.176430 0.438254
+vt 0.442897 0.340661
+vt 0.229109 0.340661
+vt 0.370467 0.312068
+vt 0.319524 0.069087
+vt 0.319423 0.099941
+vt 0.007419 0.098896
+vt 0.319322 0.130795
+vt 0.319224 0.161649
+vt 0.007220 0.160604
+vt 0.856681 0.436209
+vt 0.834553 0.458608
+vt 0.830124 0.453224
+vt 0.007727 0.006334
+vt 0.319730 0.007378
+vt 0.319626 0.038233
+vt 0.229049 0.665457
+vt 0.228992 0.635930
+vt 0.442780 0.635930
+vt 0.442967 0.311134
+vt 0.443056 0.281620
+vt 0.228890 0.547350
+vt 0.228883 0.517823
+vt 0.442670 0.517822
+vt 0.443060 0.754024
+vt 0.319126 0.192504
+vt 0.319029 0.223358
+vt 0.007025 0.222313
+vt 0.370709 0.754396
+vt 0.370472 0.723575
+vt 0.647824 0.083609
+vt 0.650942 0.089526
+vt 0.626230 0.105756
+vt 0.765981 0.074365
+vt 0.792953 0.086670
+vt 0.789700 0.092175
+vt 0.718747 0.488548
+vt 0.718195 0.495436
+vt 0.687628 0.489885
+vt 0.779839 0.488518
+vt 0.749318 0.494983
+vt 0.748545 0.488099
+vt 0.370705 0.281246
+vt 0.371348 0.252525
+vt 0.228946 0.606403
+vt 0.442734 0.606402
+vt 0.228889 0.488295
+vt 0.579817 0.387126
+vt 0.586362 0.385333
+vt 0.006337 0.500000
+vt 0.176362 0.499962
+vt 0.176359 0.530816
+vt 0.892437 0.349226
+vt 0.885423 0.348954
+vt 0.885704 0.319257
+vt 0.706468 0.066881
+vt 0.736753 0.067631
+vt 0.735929 0.074111
+vt 0.443305 0.193031
+vt 0.371495 0.193949
+vt 0.371495 0.164423
+vt 0.177644 0.253134
+vt 0.177399 0.283987
+vt 0.006828 0.284020
+vt 0.176549 0.654233
+vt 0.176640 0.685087
+vt 0.006614 0.685125
+vt 0.443160 0.252098
+vt 0.371269 0.930272
+vt 0.371421 0.900745
+vt 0.443231 0.901668
+vt 0.816609 0.103895
+vt 0.836176 0.125250
+vt 0.831035 0.128981
+vt 0.621946 0.100560
+vt 0.605204 0.126737
+vt 0.442698 0.458768
+vt 0.228910 0.458769
+vt 0.228944 0.429242
+vt 0.442732 0.429241
+vt 0.228990 0.399716
+vt 0.874138 0.409852
+vt 0.851292 0.431762
+vt 0.228912 0.576877
+vt 0.442678 0.547349
+vt 0.176377 0.561671
+vt 0.006351 0.561708
+vt 0.850517 0.149568
+vt 0.844628 0.151667
+vt 0.371029 0.959797
+vt 0.443079 0.931196
+vt 0.442853 0.074922
+vt 0.371043 0.075847
+vt 0.370712 0.046322
+vt 0.371495 0.841694
+vt 0.443254 0.813086
+vt 0.443252 0.222558
+vt 0.371442 0.223476
+vt 0.763884 0.080481
+vt 0.443090 0.104449
+vt 0.371280 0.105372
+vt 0.808610 0.476251
+vt 0.805300 0.470133
+vt 0.006727 0.314875
+vt 0.176753 0.314837
+vt 0.007613 0.962812
+vt 0.319616 0.961631
+vt 0.319730 0.992485
+vt 0.006827 0.746834
+vt 0.176742 0.715941
+vt 0.006716 0.715979
+vt 0.661830 0.472412
+vt 0.658752 0.478560
+vt 0.632640 0.461897
+vt 0.442971 0.724510
+vt 0.006929 0.253167
+vt 0.572791 0.357181
+vt 0.571207 0.326153
+vt 0.578089 0.326242
+vt 0.442778 0.399714
+vt 0.229046 0.370189
+vt 0.442700 0.576876
+vt 0.176474 0.623379
+vt 0.006524 0.654271
+vt 0.006543 0.376583
+vt 0.229113 0.694984
+vt 0.442837 0.665456
+vt 0.007520 0.068042
+vt 0.371492 0.871219
+vt 0.443302 0.872141
+vt 0.689480 0.483245
+vt 0.443305 0.163503
+vt 0.371427 0.134897
+vt 0.007055 0.808541
+vt 0.177771 0.808498
+vt 0.442678 0.488295
+vt 0.777761 0.481894
+vt 0.573209 0.178195
+vt 0.579868 0.178984
+vt 0.636826 0.456466
+vt 0.579568 0.357437
+vt 0.007387 0.901104
+vt 0.319390 0.899923
+vt 0.319502 0.930776
+vt 0.176415 0.592525
+vt 0.006390 0.592562
+vt 0.007122 0.191458
+vt 0.812355 0.108585
+vt 0.582798 0.148853
+vt 0.589057 0.151745
+vt 0.007276 0.870250
+vt 0.007319 0.129750
+vt 0.006448 0.623417
+vt 0.886228 0.380492
+vt 0.879533 0.378395
+vt 0.442833 0.370188
+vt 0.370694 0.989321
+vt 0.442838 0.960722
+vt 0.886223 0.285996
+vt 0.879631 0.287703
+vt 0.599888 0.122511
+vt 0.676401 0.072253
+vt 0.443237 0.133976
+vt 0.443305 0.842613
+vt 0.867982 0.406513
+vt 0.006405 0.438291
+vt 0.176387 0.469108
+vt 0.892437 0.317355
+vt 0.442901 0.694984
+vt 0.006361 0.469146
+vt 0.007499 0.931958
+vt 0.706979 0.073452
+vt 0.678244 0.078632
+vt 0.598317 0.411848
+vt 0.007623 0.037188
+vt 0.007728 0.993666
+vt 0.442504 0.990249
+vt 0.006334 0.530854
+vt 0.442522 0.045396
+vt 0.442670 0.517822
+vt 0.228883 0.517823
+vt 0.228889 0.488295
+vt 0.442971 0.724510
+vt 0.443060 0.754024
+vt 0.370472 0.723575
+vt 0.442967 0.311134
+vt 0.370467 0.312068
+vt 0.443056 0.281620
+vt 0.443160 0.252098
+vt 0.371348 0.252525
+vt 0.443163 0.783546
+vt 0.371352 0.783117
+vt 0.006929 0.253167
+vt 0.177644 0.253134
+vt 0.006828 0.284020
+vt 0.007055 0.808541
+vt 0.006941 0.777687
+vt 0.177771 0.808498
+vt 0.006827 0.746834
+vt 0.176852 0.746796
+vt 0.006727 0.314875
+vt 0.176753 0.314837
+vt 0.371492 0.871219
+vt 0.371495 0.841694
+vt 0.443305 0.842613
+vt 0.615392 0.436018
+vt 0.610260 0.440534
+vt 0.592437 0.415287
+vt 0.816609 0.103895
+vt 0.836176 0.125250
+vt 0.831035 0.128981
+vt 0.706468 0.066881
+vt 0.736753 0.067631
+vt 0.735929 0.074111
+vt 0.647824 0.083609
+vt 0.650942 0.089526
+vt 0.626230 0.105756
+vt 0.765981 0.074365
+vt 0.763884 0.080481
+vt 0.579817 0.387126
+vt 0.586362 0.385333
+vt 0.621946 0.100560
+vt 0.605204 0.126737
+vt 0.706979 0.073452
+vt 0.678244 0.078632
+vt 0.792953 0.086670
+vt 0.812355 0.108585
+vt 0.676401 0.072253
+vt 0.789700 0.092175
+vt 0.599888 0.122511
+vt 0.589057 0.151745
+vt 0.582798 0.148853
+vt 0.579868 0.178984
+vt 0.850517 0.149568
+vt 0.844628 0.151667
+vt 0.572791 0.357181
+vt 0.571207 0.326153
+vt 0.578089 0.326242
+vt 0.579568 0.357437
+vt 0.892437 0.349226
+vt 0.885423 0.348954
+vt 0.885704 0.319257
+vt 0.886223 0.285996
+vt 0.879631 0.287703
+vt 0.636826 0.456466
+vt 0.632640 0.461897
+vt 0.874138 0.409852
+vt 0.856681 0.436209
+vt 0.851292 0.431762
+vt 0.661830 0.472412
+vt 0.658752 0.478560
+vt 0.689480 0.483245
+vt 0.687628 0.489885
+vt 0.718747 0.488548
+vt 0.718195 0.495436
+vt 0.779839 0.488518
+vt 0.749318 0.494983
+vt 0.748545 0.488099
+vt 0.808610 0.476251
+vt 0.777761 0.481894
+vt 0.834553 0.458608
+vt 0.805300 0.470133
+vt 0.830124 0.453224
+vt 0.573209 0.178195
+vt 0.886228 0.380492
+vt 0.867982 0.406513
+vt 0.879533 0.378395
+vt 0.370709 0.754396
+vt 0.319322 0.130795
+vt 0.319224 0.161649
+vt 0.007220 0.160604
+vt 0.007387 0.901104
+vt 0.319390 0.899923
+vt 0.319502 0.930776
+vt 0.442778 0.399714
+vt 0.228990 0.399716
+vt 0.229046 0.370189
+vt 0.007499 0.931958
+vt 0.319616 0.961631
+vt 0.006361 0.469146
+vt 0.176387 0.469108
+vt 0.176362 0.499962
+vt 0.442678 0.488295
+vt 0.228910 0.458769
+vt 0.007727 0.006334
+vt 0.319730 0.007378
+vt 0.319626 0.038233
+vt 0.228890 0.547350
+vt 0.007613 0.962812
+vt 0.319730 0.992485
+vt 0.228946 0.606403
+vt 0.228912 0.576877
+vt 0.442700 0.576876
+vt 0.228992 0.635930
+vt 0.442734 0.606402
+vt 0.442833 0.370188
+vt 0.229109 0.340661
+vt 0.229113 0.694984
+vt 0.229049 0.665457
+vt 0.442837 0.665456
+vt 0.442901 0.694984
+vt 0.370705 0.281246
+vt 0.371443 0.812167
+vt 0.443254 0.813086
+vt 0.892437 0.317355
+vt 0.371421 0.900745
+vt 0.443302 0.872141
+vt 0.371269 0.930272
+vt 0.443231 0.901668
+vt 0.007276 0.870250
+vt 0.319278 0.869069
+vt 0.006405 0.438291
+vt 0.176430 0.438254
+vt 0.443090 0.104449
+vt 0.371280 0.105372
+vt 0.371043 0.075847
+vt 0.443237 0.133976
+vt 0.371427 0.134897
+vt 0.443305 0.163503
+vt 0.371495 0.164423
+vt 0.443305 0.193031
+vt 0.371495 0.193949
+vt 0.443252 0.222558
+vt 0.371442 0.223476
+vt 0.177399 0.283987
+vt 0.006543 0.376583
+vt 0.176568 0.376545
+vt 0.176492 0.407399
+vt 0.006467 0.407437
+vt 0.007165 0.839396
+vt 0.319168 0.838215
+vt 0.370694 0.989321
+vt 0.371029 0.959797
+vt 0.442838 0.960722
+vt 0.442780 0.635930
+vt 0.442698 0.458768
+vt 0.228944 0.429242
+vt 0.006337 0.500000
+vt 0.176359 0.530816
+vt 0.319524 0.069087
+vt 0.007520 0.068042
+vt 0.319423 0.099941
+vt 0.007419 0.098896
+vt 0.007319 0.129750
+vt 0.442897 0.340661
+vt 0.319126 0.192504
+vt 0.007122 0.191458
+vt 0.319029 0.223358
+vt 0.007025 0.222313
+vt 0.177512 0.777645
+vt 0.443079 0.931196
+vt 0.176656 0.345691
+vt 0.006631 0.345729
+vt 0.442853 0.074922
+vt 0.370712 0.046322
+vt 0.442732 0.429241
+vt 0.442678 0.547349
+vt 0.176377 0.561671
+vt 0.006351 0.561708
+vt 0.176415 0.592525
+vt 0.006390 0.592562
+vt 0.176474 0.623379
+vt 0.006448 0.623417
+vt 0.176549 0.654233
+vt 0.006524 0.654271
+vt 0.176640 0.685087
+vt 0.006614 0.685125
+vt 0.176742 0.715941
+vt 0.006716 0.715979
+vt 0.598317 0.411848
+vt 0.007623 0.037188
+vt 0.007728 0.993666
+vt 0.442504 0.990249
+vt 0.006334 0.530854
+vt 0.442522 0.045396
+vt 0.598317 0.411848
+vt 0.007623 0.037188
+vt 0.007728 0.993666
+vt 0.442504 0.990249
+vt 0.006334 0.530854
+vt 0.442522 0.045396
+vt 0.006929 0.253167
+vt 0.007025 0.222313
+vt 0.177644 0.253134
+vt 0.442678 0.488295
+vt 0.228889 0.488295
+vt 0.228910 0.458769
+vt 0.442670 0.517822
+vt 0.006631 0.345729
+vt 0.176656 0.345691
+vt 0.176568 0.376545
+vt 0.689480 0.483245
+vt 0.718747 0.488548
+vt 0.687628 0.489885
+vt 0.371352 0.783117
+vt 0.370709 0.754396
+vt 0.443060 0.754024
+vt 0.442971 0.724510
+vt 0.370472 0.723575
+vt 0.228883 0.517823
+vt 0.176852 0.746796
+vt 0.177512 0.777645
+vt 0.006941 0.777687
+vt 0.892437 0.317355
+vt 0.885704 0.319257
+vt 0.879631 0.287703
+vt 0.586362 0.385333
+vt 0.579817 0.387126
+vt 0.579568 0.357437
+vt 0.370694 0.989321
+vt 0.371029 0.959797
+vt 0.442838 0.960722
+vt 0.748545 0.488099
+vt 0.749318 0.494983
+vt 0.718195 0.495436
+vt 0.836176 0.125250
+vt 0.850517 0.149568
+vt 0.844628 0.151667
+vt 0.319423 0.099941
+vt 0.319322 0.130795
+vt 0.007319 0.129750
+vt 0.371269 0.930272
+vt 0.371421 0.900745
+vt 0.443231 0.901668
+vt 0.007419 0.098896
+vt 0.763884 0.080481
+vt 0.765981 0.074365
+vt 0.789700 0.092175
+vt 0.443302 0.872141
+vt 0.442833 0.370188
+vt 0.442778 0.399714
+vt 0.229046 0.370189
+vt 0.319626 0.038233
+vt 0.319524 0.069087
+vt 0.007520 0.068042
+vt 0.808610 0.476251
+vt 0.779839 0.488518
+vt 0.777761 0.481894
+vt 0.176640 0.685087
+vt 0.176742 0.715941
+vt 0.006716 0.715979
+vt 0.371495 0.841694
+vt 0.371443 0.812167
+vt 0.443254 0.813086
+vt 0.006614 0.685125
+vt 0.006467 0.407437
+vt 0.006543 0.376583
+vt 0.176492 0.407399
+vt 0.892437 0.349226
+vt 0.886228 0.380492
+vt 0.885423 0.348954
+vt 0.599888 0.122511
+vt 0.605204 0.126737
+vt 0.589057 0.151745
+vt 0.443305 0.193031
+vt 0.443252 0.222558
+vt 0.371495 0.193949
+vt 0.636826 0.456466
+vt 0.632640 0.461897
+vt 0.610260 0.440534
+vt 0.735929 0.074111
+vt 0.736753 0.067631
+vt 0.442837 0.665456
+vt 0.229049 0.665457
+vt 0.442780 0.635930
+vt 0.006361 0.469146
+vt 0.006405 0.438291
+vt 0.176387 0.469108
+vt 0.007613 0.962812
+vt 0.319616 0.961631
+vt 0.319730 0.992485
+vt 0.598317 0.411848
+vt 0.592437 0.415287
+vt 0.442678 0.547349
+vt 0.228890 0.547350
+vt 0.443160 0.252098
+vt 0.371348 0.252525
+vt 0.371442 0.223476
+vt 0.442504 0.990249
+vt 0.319126 0.192504
+vt 0.319029 0.223358
+vt 0.621946 0.100560
+vt 0.647824 0.083609
+vt 0.626230 0.105756
+vt 0.371492 0.871219
+vt 0.615392 0.436018
+vt 0.442732 0.429241
+vt 0.442698 0.458768
+vt 0.228944 0.429242
+vt 0.007499 0.931958
+vt 0.879533 0.378395
+vt 0.867982 0.406513
+vt 0.572791 0.357181
+vt 0.443237 0.133976
+vt 0.371427 0.134897
+vt 0.371280 0.105372
+vt 0.442853 0.074922
+vt 0.443090 0.104449
+vt 0.371043 0.075847
+vt 0.007727 0.006334
+vt 0.319730 0.007378
+vt 0.578089 0.326242
+vt 0.443305 0.163503
+vt 0.371495 0.164423
+vt 0.006727 0.314875
+vt 0.176753 0.314837
+vt 0.319502 0.930776
+vt 0.006337 0.500000
+vt 0.176362 0.499962
+vt 0.792953 0.086670
+vt 0.816609 0.103895
+vt 0.812355 0.108585
+vt 0.176549 0.654233
+vt 0.650942 0.089526
+vt 0.006828 0.284020
+vt 0.177399 0.283987
+vt 0.661830 0.472412
+vt 0.658752 0.478560
+vt 0.571207 0.326153
+vt 0.006524 0.654271
+vt 0.442901 0.694984
+vt 0.229113 0.694984
+vt 0.007122 0.191458
+vt 0.831035 0.128981
+vt 0.006390 0.592562
+vt 0.176415 0.592525
+vt 0.006448 0.623417
+vt 0.805300 0.470133
+vt 0.228990 0.399716
+vt 0.582798 0.148853
+vt 0.176430 0.438254
+vt 0.886223 0.285996
+vt 0.706979 0.073452
+vt 0.706468 0.066881
+vt 0.176474 0.623379
+vt 0.229109 0.340661
+vt 0.834553 0.458608
+vt 0.676401 0.072253
+vt 0.228992 0.635930
+vt 0.228946 0.606403
+vt 0.442734 0.606402
+vt 0.443079 0.931196
+vt 0.442700 0.576876
+vt 0.176377 0.561671
+vt 0.228912 0.576877
+vt 0.442967 0.311134
+vt 0.370467 0.312068
+vt 0.443056 0.281620
+vt 0.370712 0.046322
+vt 0.830124 0.453224
+vt 0.007220 0.160604
+vt 0.370705 0.281246
+vt 0.176359 0.530816
+vt 0.443305 0.842613
+vt 0.874138 0.409852
+vt 0.851292 0.431762
+vt 0.442897 0.340661
+vt 0.007276 0.870250
+vt 0.319278 0.869069
+vt 0.319390 0.899923
+vt 0.678244 0.078632
+vt 0.006334 0.530854
+vt 0.006351 0.561708
+vt 0.856681 0.436209
+vt 0.443163 0.783546
+vt 0.007728 0.993666
+vt 0.007623 0.037188
+vt 0.007387 0.901104
+vt 0.319224 0.161649
+vt 0.442522 0.045396
+vt 0.006827 0.746834
+vt 0.007165 0.839396
+vt 0.007055 0.808541
+vt 0.177771 0.808498
+vt 0.319168 0.838215
+vt 0.573209 0.178195
+vt 0.579868 0.178984
+vt 0.442670 0.517822
+vt 0.228883 0.517823
+vt 0.228889 0.488295
+vt 0.442971 0.724510
+vt 0.443060 0.754024
+vt 0.370472 0.723575
+vt 0.442967 0.311134
+vt 0.370467 0.312068
+vt 0.443056 0.281620
+vt 0.443160 0.252098
+vt 0.371348 0.252525
+vt 0.443163 0.783546
+vt 0.371352 0.783117
+vt 0.006929 0.253167
+vt 0.177644 0.253134
+vt 0.006828 0.284020
+vt 0.007055 0.808541
+vt 0.006941 0.777687
+vt 0.177771 0.808498
+vt 0.006827 0.746834
+vt 0.176852 0.746796
+vt 0.006727 0.314875
+vt 0.176753 0.314837
+vt 0.371492 0.871219
+vt 0.371495 0.841694
+vt 0.443305 0.842613
+vt 0.615392 0.436018
+vt 0.610260 0.440534
+vt 0.592437 0.415287
+vt 0.816609 0.103895
+vt 0.836176 0.125250
+vt 0.831035 0.128981
+vt 0.706468 0.066881
+vt 0.736753 0.067631
+vt 0.735929 0.074111
+vt 0.647824 0.083609
+vt 0.650942 0.089526
+vt 0.626230 0.105756
+vt 0.765981 0.074365
+vt 0.763884 0.080481
+vt 0.579817 0.387126
+vt 0.586362 0.385333
+vt 0.621946 0.100560
+vt 0.605204 0.126737
+vt 0.706979 0.073452
+vt 0.678244 0.078632
+vt 0.792953 0.086670
+vt 0.812355 0.108585
+vt 0.676401 0.072253
+vt 0.789700 0.092175
+vt 0.599888 0.122511
+vt 0.589057 0.151745
+vt 0.582798 0.148853
+vt 0.579868 0.178984
+vt 0.850517 0.149568
+vt 0.844628 0.151667
+vt 0.572791 0.357181
+vt 0.571207 0.326153
+vt 0.578089 0.326242
+vt 0.579568 0.357437
+vt 0.892437 0.349226
+vt 0.885423 0.348954
+vt 0.885704 0.319257
+vt 0.886223 0.285996
+vt 0.879631 0.287703
+vt 0.636826 0.456466
+vt 0.632640 0.461897
+vt 0.874138 0.409852
+vt 0.856681 0.436209
+vt 0.851292 0.431762
+vt 0.661830 0.472412
+vt 0.658752 0.478560
+vt 0.689480 0.483245
+vt 0.687628 0.489885
+vt 0.718747 0.488548
+vt 0.718195 0.495436
+vt 0.779839 0.488518
+vt 0.749318 0.494983
+vt 0.748545 0.488099
+vt 0.808610 0.476251
+vt 0.777761 0.481894
+vt 0.834553 0.458608
+vt 0.805300 0.470133
+vt 0.830124 0.453224
+vt 0.573209 0.178195
+vt 0.886228 0.380492
+vt 0.867982 0.406513
+vt 0.879533 0.378395
+vt 0.370709 0.754396
+vt 0.319322 0.130795
+vt 0.319224 0.161649
+vt 0.007220 0.160604
+vt 0.007387 0.901104
+vt 0.319390 0.899923
+vt 0.319502 0.930776
+vt 0.442778 0.399714
+vt 0.228990 0.399716
+vt 0.229046 0.370189
+vt 0.007499 0.931958
+vt 0.319616 0.961631
+vt 0.006361 0.469146
+vt 0.176387 0.469108
+vt 0.176362 0.499962
+vt 0.442678 0.488295
+vt 0.228910 0.458769
+vt 0.007727 0.006334
+vt 0.319730 0.007378
+vt 0.319626 0.038233
+vt 0.228890 0.547350
+vt 0.007613 0.962812
+vt 0.319730 0.992485
+vt 0.228946 0.606403
+vt 0.228912 0.576877
+vt 0.442700 0.576876
+vt 0.228992 0.635930
+vt 0.442734 0.606402
+vt 0.442833 0.370188
+vt 0.229109 0.340661
+vt 0.229113 0.694984
+vt 0.229049 0.665457
+vt 0.442837 0.665456
+vt 0.442901 0.694984
+vt 0.370705 0.281246
+vt 0.371443 0.812167
+vt 0.443254 0.813086
+vt 0.892437 0.317355
+vt 0.371421 0.900745
+vt 0.443302 0.872141
+vt 0.371269 0.930272
+vt 0.443231 0.901668
+vt 0.007276 0.870250
+vt 0.319278 0.869069
+vt 0.006405 0.438291
+vt 0.176430 0.438254
+vt 0.443090 0.104449
+vt 0.371280 0.105372
+vt 0.371043 0.075847
+vt 0.443237 0.133976
+vt 0.371427 0.134897
+vt 0.443305 0.163503
+vt 0.371495 0.164423
+vt 0.443305 0.193031
+vt 0.371495 0.193949
+vt 0.443252 0.222558
+vt 0.371442 0.223476
+vt 0.177399 0.283987
+vt 0.006543 0.376583
+vt 0.176568 0.376545
+vt 0.176492 0.407399
+vt 0.006467 0.407437
+vt 0.007165 0.839396
+vt 0.319168 0.838215
+vt 0.370694 0.989321
+vt 0.371029 0.959797
+vt 0.442838 0.960722
+vt 0.442780 0.635930
+vt 0.442698 0.458768
+vt 0.228944 0.429242
+vt 0.006337 0.500000
+vt 0.176359 0.530816
+vt 0.319524 0.069087
+vt 0.007520 0.068042
+vt 0.319423 0.099941
+vt 0.007419 0.098896
+vt 0.007319 0.129750
+vt 0.442897 0.340661
+vt 0.319126 0.192504
+vt 0.007122 0.191458
+vt 0.319029 0.223358
+vt 0.007025 0.222313
+vt 0.177512 0.777645
+vt 0.443079 0.931196
+vt 0.176656 0.345691
+vt 0.006631 0.345729
+vt 0.442853 0.074922
+vt 0.370712 0.046322
+vt 0.442732 0.429241
+vt 0.442678 0.547349
+vt 0.176377 0.561671
+vt 0.006351 0.561708
+vt 0.176415 0.592525
+vt 0.006390 0.592562
+vt 0.176474 0.623379
+vt 0.006448 0.623417
+vt 0.176549 0.654233
+vt 0.006524 0.654271
+vt 0.176640 0.685087
+vt 0.006614 0.685125
+vt 0.176742 0.715941
+vt 0.006716 0.715979
+vt 0.598317 0.411848
+vt 0.007623 0.037188
+vt 0.007728 0.993666
+vt 0.442504 0.990249
+vt 0.006334 0.530854
+vt 0.442522 0.045396
+vt 0.006929 0.253167
+vt 0.007025 0.222313
+vt 0.177644 0.253134
+vt 0.442678 0.488295
+vt 0.228889 0.488295
+vt 0.228910 0.458769
+vt 0.442670 0.517822
+vt 0.006631 0.345729
+vt 0.176656 0.345691
+vt 0.176568 0.376545
+vt 0.689480 0.483245
+vt 0.718747 0.488548
+vt 0.687628 0.489885
+vt 0.371352 0.783117
+vt 0.370709 0.754396
+vt 0.443060 0.754024
+vt 0.442971 0.724510
+vt 0.370472 0.723575
+vt 0.228883 0.517823
+vt 0.176852 0.746796
+vt 0.177512 0.777645
+vt 0.006941 0.777687
+vt 0.892437 0.317355
+vt 0.885704 0.319257
+vt 0.879631 0.287703
+vt 0.586362 0.385333
+vt 0.579817 0.387126
+vt 0.579568 0.357437
+vt 0.370694 0.989321
+vt 0.371029 0.959797
+vt 0.442838 0.960722
+vt 0.748545 0.488099
+vt 0.749318 0.494983
+vt 0.718195 0.495436
+vt 0.836176 0.125250
+vt 0.850517 0.149568
+vt 0.844628 0.151667
+vt 0.319423 0.099941
+vt 0.319322 0.130795
+vt 0.007319 0.129750
+vt 0.371269 0.930272
+vt 0.371421 0.900745
+vt 0.443231 0.901668
+vt 0.007419 0.098896
+vt 0.763884 0.080481
+vt 0.765981 0.074365
+vt 0.789700 0.092175
+vt 0.443302 0.872141
+vt 0.442833 0.370188
+vt 0.442778 0.399714
+vt 0.229046 0.370189
+vt 0.319626 0.038233
+vt 0.319524 0.069087
+vt 0.007520 0.068042
+vt 0.808610 0.476251
+vt 0.779839 0.488518
+vt 0.777761 0.481894
+vt 0.176640 0.685087
+vt 0.176742 0.715941
+vt 0.006716 0.715979
+vt 0.371495 0.841694
+vt 0.371443 0.812167
+vt 0.443254 0.813086
+vt 0.006614 0.685125
+vt 0.006467 0.407437
+vt 0.006543 0.376583
+vt 0.176492 0.407399
+vt 0.892437 0.349226
+vt 0.886228 0.380492
+vt 0.885423 0.348954
+vt 0.599888 0.122511
+vt 0.605204 0.126737
+vt 0.589057 0.151745
+vt 0.443305 0.193031
+vt 0.443252 0.222558
+vt 0.371495 0.193949
+vt 0.636826 0.456466
+vt 0.632640 0.461897
+vt 0.610260 0.440534
+vt 0.735929 0.074111
+vt 0.736753 0.067631
+vt 0.442837 0.665456
+vt 0.229049 0.665457
+vt 0.442780 0.635930
+vt 0.006361 0.469146
+vt 0.006405 0.438291
+vt 0.176387 0.469108
+vt 0.007613 0.962812
+vt 0.319616 0.961631
+vt 0.319730 0.992485
+vt 0.598317 0.411848
+vt 0.592437 0.415287
+vt 0.442678 0.547349
+vt 0.228890 0.547350
+vt 0.443160 0.252098
+vt 0.371348 0.252525
+vt 0.371442 0.223476
+vt 0.442504 0.990249
+vt 0.319126 0.192504
+vt 0.319029 0.223358
+vt 0.621946 0.100560
+vt 0.647824 0.083609
+vt 0.626230 0.105756
+vt 0.371492 0.871219
+vt 0.615392 0.436018
+vt 0.442732 0.429241
+vt 0.442698 0.458768
+vt 0.228944 0.429242
+vt 0.007499 0.931958
+vt 0.879533 0.378395
+vt 0.867982 0.406513
+vt 0.572791 0.357181
+vt 0.443237 0.133976
+vt 0.371427 0.134897
+vt 0.371280 0.105372
+vt 0.442853 0.074922
+vt 0.443090 0.104449
+vt 0.371043 0.075847
+vt 0.007727 0.006334
+vt 0.319730 0.007378
+vt 0.578089 0.326242
+vt 0.443305 0.163503
+vt 0.371495 0.164423
+vt 0.006727 0.314875
+vt 0.176753 0.314837
+vt 0.319502 0.930776
+vt 0.006337 0.500000
+vt 0.176362 0.499962
+vt 0.792953 0.086670
+vt 0.816609 0.103895
+vt 0.812355 0.108585
+vt 0.176549 0.654233
+vt 0.650942 0.089526
+vt 0.006828 0.284020
+vt 0.177399 0.283987
+vt 0.661830 0.472412
+vt 0.658752 0.478560
+vt 0.571207 0.326153
+vt 0.006524 0.654271
+vt 0.442901 0.694984
+vt 0.229113 0.694984
+vt 0.007122 0.191458
+vt 0.831035 0.128981
+vt 0.006390 0.592562
+vt 0.176415 0.592525
+vt 0.006448 0.623417
+vt 0.805300 0.470133
+vt 0.228990 0.399716
+vt 0.582798 0.148853
+vt 0.176430 0.438254
+vt 0.886223 0.285996
+vt 0.706979 0.073452
+vt 0.706468 0.066881
+vt 0.176474 0.623379
+vt 0.229109 0.340661
+vt 0.834553 0.458608
+vt 0.676401 0.072253
+vt 0.228992 0.635930
+vt 0.228946 0.606403
+vt 0.442734 0.606402
+vt 0.443079 0.931196
+vt 0.442700 0.576876
+vt 0.176377 0.561671
+vt 0.228912 0.576877
+vt 0.442967 0.311134
+vt 0.370467 0.312068
+vt 0.443056 0.281620
+vt 0.370712 0.046322
+vt 0.830124 0.453224
+vt 0.007220 0.160604
+vt 0.370705 0.281246
+vt 0.176359 0.530816
+vt 0.443305 0.842613
+vt 0.874138 0.409852
+vt 0.851292 0.431762
+vt 0.442897 0.340661
+vt 0.007276 0.870250
+vt 0.319278 0.869069
+vt 0.319390 0.899923
+vt 0.678244 0.078632
+vt 0.006334 0.530854
+vt 0.006351 0.561708
+vt 0.856681 0.436209
+vt 0.443163 0.783546
+vt 0.007728 0.993666
+vt 0.007623 0.037188
+vt 0.007387 0.901104
+vt 0.319224 0.161649
+vt 0.442522 0.045396
+vt 0.006827 0.746834
+vt 0.007165 0.839396
+vt 0.007055 0.808541
+vt 0.177771 0.808498
+vt 0.319168 0.838215
+vt 0.573209 0.178195
+vt 0.579868 0.178984
+vt 0.874125 0.609201
+vt 0.817898 0.626255
+vt 0.670298 0.547363
+vt 0.653238 0.491123
+vt 0.732120 0.343530
+vt 0.846854 0.332224
+vt 0.935969 0.405357
+vt 0.953029 0.461597
+vt 0.759412 0.620495
+vt 0.732132 0.609195
+vt 0.658998 0.432637
+vt 0.686702 0.380807
+vt 0.759394 0.332230
+vt 0.898684 0.359926
+vt 0.919564 0.380805
+vt 0.947269 0.520085
+vt 0.919563 0.571916
+vt 0.846857 0.620495
+vt 0.788371 0.626255
+vt 0.707581 0.592792
+vt 0.686702 0.571913
+vt 0.658999 0.520082
+vt 0.653238 0.461596
+vt 0.670298 0.405358
+vt 0.707581 0.359928
+vt 0.788366 0.326464
+vt 0.817893 0.326463
+vt 0.874134 0.343522
+vt 0.947270 0.432638
+vt 0.953029 0.491125
+vt 0.935968 0.547365
+vt 0.898673 0.592803
+vt 0.214996 0.906316
+vt 0.198460 0.906317
+vt 0.182243 0.903091
+vt 0.281116 0.782613
+vt 0.290669 0.814108
+vt 0.246483 0.896766
+vt 0.231211 0.741659
+vt 0.182233 0.741662
+vt 0.198458 0.738433
+vt 0.126012 0.797890
+vt 0.141526 0.768865
+vt 0.166960 0.747990
+vt 0.271928 0.875886
+vt 0.260230 0.887583
+vt 0.214993 0.738433
+vt 0.260236 0.757172
+vt 0.271928 0.768865
+vt 0.122786 0.830643
+vt 0.290669 0.830644
+vt 0.287443 0.846861
+vt 0.287444 0.797891
+vt 0.132340 0.862137
+vt 0.166967 0.896763
+vt 0.153218 0.887577
+vt 0.141526 0.875885
+vt 0.132339 0.782614
+vt 0.281115 0.862138
+vt 0.126012 0.846860
+vt 0.153218 0.757173
+vt 0.246487 0.747986
+vt 0.231212 0.903091
+vt 0.122786 0.814107
+vt 0.305766 0.603342
+vt 0.249539 0.620395
+vt 0.101939 0.541503
+vt 0.084879 0.485264
+vt 0.163760 0.337671
+vt 0.278494 0.326364
+vt 0.367610 0.399497
+vt 0.384670 0.455738
+vt 0.191052 0.614636
+vt 0.163773 0.603336
+vt 0.090639 0.426777
+vt 0.118343 0.374948
+vt 0.191035 0.326370
+vt 0.330325 0.354067
+vt 0.351205 0.374946
+vt 0.378909 0.514226
+vt 0.351204 0.566056
+vt 0.278498 0.614635
+vt 0.220011 0.620396
+vt 0.139222 0.586933
+vt 0.118343 0.566054
+vt 0.090640 0.514223
+vt 0.084879 0.455737
+vt 0.101938 0.399499
+vt 0.139222 0.354069
+vt 0.220007 0.320605
+vt 0.249534 0.320604
+vt 0.305774 0.337663
+vt 0.378910 0.426778
+vt 0.384670 0.485266
+vt 0.367609 0.541505
+vt 0.330314 0.586943
+vt 0.103870 0.076834
+vt 0.115562 0.065142
+vt 0.129303 0.055959
+vt 0.094683 0.170106
+vt 0.129310 0.204732
+vt 0.115562 0.195546
+vt 0.208826 0.204735
+vt 0.177339 0.214285
+vt 0.088356 0.154828
+vt 0.085130 0.138611
+vt 0.085130 0.122076
+vt 0.088355 0.105859
+vt 0.160804 0.214285
+vt 0.144587 0.211060
+vt 0.193554 0.049628
+vt 0.208831 0.055955
+vt 0.222579 0.065141
+vt 0.243459 0.090582
+vt 0.249787 0.105860
+vt 0.253013 0.122077
+vt 0.234272 0.183855
+vt 0.222573 0.195552
+vt 0.144577 0.049631
+vt 0.160801 0.046402
+vt 0.193556 0.211059
+vt 0.249787 0.154830
+vt 0.177337 0.046402
+vt 0.234272 0.076833
+vt 0.243459 0.170107
+vt 0.094683 0.090583
+vt 0.103870 0.183854
+vt 0.253013 0.138613
+vt 0.606547 0.945139
+vt 0.550320 0.962192
+vt 0.402720 0.883300
+vt 0.385660 0.827061
+vt 0.464542 0.679467
+vt 0.579275 0.668161
+vt 0.668391 0.741294
+vt 0.685451 0.797535
+vt 0.491833 0.956433
+vt 0.464554 0.945133
+vt 0.391420 0.768574
+vt 0.419124 0.716744
+vt 0.491816 0.668167
+vt 0.631106 0.695864
+vt 0.651986 0.716743
+vt 0.679690 0.856022
+vt 0.651985 0.907853
+vt 0.579279 0.956432
+vt 0.520792 0.962193
+vt 0.440003 0.928729
+vt 0.419124 0.907851
+vt 0.391421 0.856020
+vt 0.385660 0.797533
+vt 0.402719 0.741295
+vt 0.440003 0.695865
+vt 0.520788 0.662401
+vt 0.550315 0.662401
+vt 0.606555 0.679459
+vt 0.679692 0.768575
+vt 0.685451 0.827063
+vt 0.668390 0.883302
+vt 0.631095 0.928740
+vt 0.443713 0.231131
+vt 0.455405 0.219439
+vt 0.469147 0.210256
+vt 0.434527 0.324402
+vt 0.469154 0.359029
+vt 0.455406 0.349843
+vt 0.548670 0.359032
+vt 0.517183 0.368582
+vt 0.428200 0.309125
+vt 0.424973 0.292908
+vt 0.424973 0.276373
+vt 0.428199 0.260156
+vt 0.500648 0.368582
+vt 0.484431 0.365357
+vt 0.533398 0.203925
+vt 0.548675 0.210252
+vt 0.562423 0.219438
+vt 0.583303 0.244879
+vt 0.589631 0.260156
+vt 0.592857 0.276374
+vt 0.574115 0.338152
+vt 0.562417 0.349849
+vt 0.484421 0.203928
+vt 0.500645 0.200699
+vt 0.533400 0.365356
+vt 0.589630 0.309127
+vt 0.517180 0.200699
+vt 0.574116 0.231130
+vt 0.583302 0.324403
+vt 0.434527 0.244880
+vt 0.443713 0.338151
+vt 0.592857 0.292910
+vn -0.8946 0.0000 -0.4468
+vn 0.8946 0.0000 0.4468
+vn 0.4468 0.0000 -0.8946
+vn -0.4468 0.0000 0.8946
+vn 0.0000 -1.0000 0.0000
+vn 0.0000 1.0000 0.0000
+vn -0.0815 -0.9955 -0.0484
+vn 0.8915 -0.0946 0.4431
+vn -0.8891 -0.1015 -0.4464
+vn -0.8918 0.0944 -0.4426
+vn 0.8888 0.1014 0.4469
+vn -0.8910 0.0945 -0.4441
+vn 0.8896 0.1015 0.4453
+vn 0.8910 -0.0945 0.4441
+vn -0.8896 -0.1015 -0.4453
+vn 0.6837 0.6370 0.3561
+vn 0.4539 0.0090 -0.8910
+vn 0.4489 0.0066 -0.8935
+vn 0.4472 0.0100 -0.8944
+vn 0.4446 0.0090 -0.8957
+vn 0.4481 0.0095 -0.8939
+vn 0.4488 0.0054 -0.8936
+vn 0.4442 0.0081 -0.8959
+vn 0.4463 0.0101 -0.8948
+vn 0.4489 0.0076 -0.8935
+vn 0.4455 0.0094 -0.8952
+vn 0.4487 0.0087 -0.8936
+vn 0.4440 0.0070 -0.8960
+vn 0.4443 0.0059 -0.8958
+vn 0.4484 0.0057 -0.8938
+vn 0.4452 0.0002 -0.8954
+vn 0.4441 -0.0134 -0.8959
+vn 0.4424 -0.0144 -0.8967
+vn 0.2580 -0.9600 -0.1084
+vn 0.4547 0.0120 -0.8906
+vn 0.4389 0.0119 -0.8985
+vn 0.4544 0.0151 -0.8907
+vn 0.4530 0.0179 -0.8913
+vn 0.4508 0.0199 -0.8924
+vn 0.4453 0.0208 -0.8952
+vn 0.4426 0.0198 -0.8965
+vn 0.4404 0.0178 -0.8976
+vn 0.4391 0.0150 -0.8983
+vn -0.2323 -0.9098 -0.3440
+vn 0.4397 0.0089 -0.8981
+vn 0.4412 0.0056 -0.8974
+vn 0.8912 -0.0921 0.4442
+vn -0.5715 0.7708 -0.2816
+vn 0.5636 0.7752 0.2854
+vn -0.6876 -0.6371 -0.3484
+vn 0.4172 0.8835 0.2128
+vn -0.2532 -0.9579 -0.1352
+vn -0.2537 -0.9579 -0.1341
+vn 0.0826 0.9955 0.0462
+vn 0.0938 -0.9948 0.0392
+vn 0.2548 0.9579 0.1320
+vn 0.4272 -0.8802 0.2066
+vn 0.5723 -0.7708 0.2799
+vn -0.7860 -0.4745 -0.3963
+vn 0.7919 -0.4683 0.3919
+vn 0.8554 -0.2963 0.4249
+vn -0.8898 -0.0990 -0.4455
+vn -0.8897 0.1021 -0.4450
+vn 0.7831 0.4745 0.4020
+vn 0.4481 0.0208 -0.8937
+vn 0.8523 0.2954 0.4316
+vn 0.4475 -0.0002 -0.8943
+vn 0.5579 0.7751 0.2965
+vn 0.4108 0.8834 0.2255
+vn 0.6883 0.6371 0.3470
+vn -0.4157 -0.8835 -0.2157
+vn -0.2714 0.9557 -0.1136
+vn -0.4325 0.8801 -0.1958
+vn -0.5770 0.7707 -0.2705
+vn -0.6993 0.6316 -0.3347
+vn -0.7947 0.4683 -0.3862
+vn -0.8588 0.2887 -0.4232
+vn 0.8895 0.1091 0.4438
+vn -0.6872 -0.6371 -0.3491
+vn -0.5623 -0.7752 -0.2879
+vn 0.7866 0.4745 0.3952
+vn 0.0754 0.9953 0.0606
+vn 0.6955 -0.6317 0.3425
+vn -0.4162 -0.8835 -0.2147
+vn -0.0809 -0.9955 -0.0495
+vn -0.0928 0.9948 -0.0414
+vn -0.2646 0.9559 -0.1274
+vn -0.4262 0.8803 -0.2085
+vn -0.8516 -0.3032 -0.4277
+vn -0.6948 0.6317 -0.3439
+vn -0.7914 0.4683 -0.3929
+vn -0.8560 0.2927 -0.4261
+vn 0.8910 -0.0946 0.4441
+vn 0.2479 0.9578 0.1458
+vn -0.8541 -0.2936 -0.4293
+vn -0.7858 -0.4745 -0.3968
+vn 0.8541 0.2936 0.4293
+vn -0.0999 0.9946 -0.0270
+vn -0.5627 -0.7752 -0.2870
+vn 0.2656 -0.9559 0.1253
+vn 0.0944 -0.9948 0.0381
+vn 0.2662 -0.9559 0.1242
+vn 0.4277 -0.8802 0.2055
+vn 0.5728 -0.7708 0.2790
+vn 0.6958 -0.6317 0.3418
+vn 0.7922 -0.4683 0.3914
+vn 0.8581 -0.2869 0.4259
+vn 0.4639 0.0217 -0.8856
+vn -0.7868 -0.4745 -0.3948
+vn 0.8537 0.2954 0.4288
+vn 0.8908 -0.0946 0.4445
+vn 0.7871 0.4745 0.3941
+vn -0.5640 -0.7752 -0.2846
+vn -0.8521 -0.3032 -0.4266
+vn -0.2635 0.9559 -0.1296
+vn -0.5706 0.7708 -0.2834
+vn 0.4280 0.0363 -0.9031
+vn 0.0837 0.9955 0.0439
+vn 0.6943 -0.6317 0.3448
+vn 0.0920 -0.9948 0.0428
+vn 0.8895 0.1014 0.4455
+vn -0.7908 0.4683 -0.3940
+vn 0.8910 -0.0921 0.4446
+vn 0.4414 0.0218 -0.8970
+vn 0.4513 0.0210 -0.8921
+vn 0.4561 0.0480 -0.8886
+vn 0.4427 0.0503 -0.8952
+vn -0.8898 0.1021 -0.4447
+vn 0.5709 -0.7708 0.2827
+vn -0.0833 -0.9955 -0.0448
+vn 0.4517 0.0131 -0.8921
+vn -0.0830 -0.9955 -0.0453
+vn 0.4361 -0.0348 -0.8992
+vn 0.4478 0.0240 -0.8938
+vn -0.6959 0.6317 -0.3416
+vn -0.8908 0.0945 -0.4445
+vn 0.6945 -0.6317 0.3445
+vn -0.8911 0.0944 -0.4439
+vn 0.4156 0.8835 0.2160
+vn 0.4517 0.0160 -0.8920
+vn 0.4403 0.0195 -0.8976
+vn -0.4178 -0.8836 -0.2115
+vn -0.5641 -0.7752 -0.2842
+vn 0.4496 0.0503 -0.8918
+vn 0.4274 0.0287 -0.9036
+vn 0.2639 -0.9559 0.1288
+vn 0.0923 -0.9948 0.0423
+vn 0.4508 0.0138 -0.8925
+vn 0.2531 0.9579 0.1355
+vn -0.0946 0.9948 -0.0378
+vn 0.7857 0.4745 0.3969
+vn -0.7922 0.4683 -0.3912
+vn 0.4498 0.0230 -0.8928
+vn -0.2663 0.9559 -0.1239
+vn 0.4311 0.0430 -0.9013
+vn -0.8899 -0.1015 -0.4448
+vn 0.2559 0.9579 0.1298
+vn 0.8908 -0.0945 0.4445
+vn 0.7912 -0.4683 0.3934
+vn 0.4649 0.0366 -0.8846
+vn 0.8894 0.1091 0.4440
+vn 0.4427 0.0004 -0.8967
+vn -0.6888 -0.6371 -0.3461
+vn -0.8900 -0.0990 -0.4450
+vn 0.4256 -0.8803 0.2098
+vn -0.8898 -0.1015 -0.4448
+vn 0.5711 -0.7708 0.2823
+vn -0.6886 -0.6371 -0.3463
+vn 0.7911 -0.4683 0.3936
+vn -0.0916 0.9948 -0.0437
+vn 0.5622 0.7752 0.2882
+vn -0.8557 0.2927 -0.4268
+vn 0.4615 0.0433 -0.8861
+vn -0.5729 0.7708 -0.2788
+vn 0.8547 0.2936 0.4280
+vn -0.2555 -0.9579 -0.1307
+vn 0.4362 0.0479 -0.8986
+vn -0.2908 -0.9259 -0.2412
+vn 0.8574 -0.2869 0.4272
+vn 0.4657 0.0291 -0.8844
+vn 0.4400 -0.0324 -0.8974
+vn 0.5645 0.7752 0.2835
+vn 0.2641 -0.9559 0.1283
+vn -0.6941 0.6317 -0.3453
+vn -0.8547 -0.2936 -0.4280
+vn 0.8899 0.1015 0.4448
+vn 0.4518 0.0185 -0.8919
+vn 0.4408 0.0143 -0.8975
+vn 0.6891 0.6371 0.3455
+vn -0.4252 0.8803 -0.2106
+vn 0.4258 -0.8803 0.2093
+vn 0.4332 0.0136 -0.9012
+vn -0.7869 -0.4745 -0.3945
+vn 0.0808 0.9955 0.0498
+vn 0.2064 -0.9785 0.0030
+vn 0.4401 0.0169 -0.8978
+vn 0.4436 0.0228 -0.8959
+vn -0.4278 0.8802 -0.2053
+vn 0.6872 0.6370 0.3493
+vn 0.4296 0.0215 -0.9028
+vn -0.4176 -0.8836 -0.2119
+vn -0.8575 0.2887 -0.4259
+vn 0.4485 -0.0005 -0.8938
+vn 0.8548 -0.2963 0.4260
+vn -0.2553 -0.9579 -0.1311
+vn 0.4182 0.8836 0.2107
+vn 0.4455 0.0244 -0.8950
+vn 0.4519 0.0070 -0.8921
+vn 0.4495 0.0070 -0.8932
+vn 0.4473 0.0101 -0.8943
+vn 0.4449 0.0087 -0.8955
+vn 0.4482 0.0097 -0.8939
+vn 0.4524 0.0057 -0.8918
+vn 0.4446 0.0076 -0.8957
+vn 0.4463 0.0100 -0.8948
+vn 0.4495 0.0081 -0.8933
+vn 0.4453 0.0097 -0.8953
+vn 0.4490 0.0091 -0.8935
+vn 0.4448 0.0066 -0.8956
+vn 0.4451 0.0057 -0.8954
+vn 0.4493 0.0060 -0.8933
+vn 0.4462 -0.0002 -0.8949
+vn 0.4513 -0.0144 -0.8923
+vn 0.4497 -0.0134 -0.8931
+vn 0.4203 -0.9072 -0.0181
+vn 0.4533 0.0100 -0.8913
+vn 0.4403 0.0099 -0.8978
+vn 0.4536 0.0132 -0.8911
+vn 0.4526 0.0164 -0.8915
+vn 0.4508 0.0189 -0.8924
+vn 0.4452 0.0204 -0.8952
+vn 0.4427 0.0188 -0.8965
+vn 0.4408 0.0163 -0.8974
+vn 0.4400 0.0131 -0.8979
+vn -0.0624 -0.9613 -0.2685
+vn 0.4417 0.0070 -0.8971
+vn 0.4449 0.0053 -0.8956
+vn 0.5636 0.7752 0.2853
+vn 0.4172 0.8836 0.2128
+vn 0.0939 -0.9948 0.0392
+vn 0.8596 -0.2869 0.4228
+vn 0.7831 0.4744 0.4021
+vn 0.4481 0.0204 -0.8937
+vn 0.8525 0.2935 0.4326
+vn 0.4485 0.0002 -0.8938
+vn 0.5580 0.7751 0.2965
+vn -0.2715 0.9557 -0.1136
+vn -0.5770 0.7706 -0.2704
+vn -0.7948 0.4682 -0.3861
+vn -0.8597 0.2868 -0.4227
+vn -0.8525 -0.2936 -0.4325
+vn -0.8580 0.2869 -0.4259
+vn 0.2479 0.9577 0.1458
+vn 0.8530 0.2995 0.4275
+vn -0.1000 0.9946 -0.0270
+vn 0.0945 -0.9948 0.0381
+vn 0.4489 0.0066 -0.8936
+vn 0.4472 0.0099 -0.8944
+vn 0.4442 0.0080 -0.8959
+vn 0.4441 0.0070 -0.8960
+vn 0.4444 0.0059 -0.8958
+vn 0.4485 0.0057 -0.8938
+vn -0.5770 0.7707 -0.2704
+vn 0.8895 0.1090 0.4438
+vn 0.4519 0.0070 -0.8920
+vn 0.4449 0.0086 -0.8955
+vn 0.4495 0.0081 -0.8932
+vn 0.4447 0.0066 -0.8957
+vn 0.4452 0.0057 -0.8954
+vn 0.4493 0.0060 -0.8934
+vn 0.4462 -0.0002 -0.8950
+vn 0.4496 -0.0134 -0.8931
+vn 0.4535 0.0133 -0.8911
+vn 0.4426 0.0188 -0.8965
+vn 0.4408 0.0163 -0.8975
+vn 0.4449 0.0054 -0.8956
+vn 0.8525 0.2935 0.4325
+vn 0.2479 0.9577 0.1459
+vn 0.4590 0.0170 -0.8883
+vn 0.4533 0.0168 -0.8912
+vn 0.4478 0.0244 -0.8938
+vn 0.4421 0.0209 -0.8967
+vn 0.4501 0.0235 -0.8927
+vn 0.4603 0.0138 -0.8877
+vn 0.4414 0.0185 -0.8971
+vn 0.4455 0.0241 -0.8949
+vn 0.4532 0.0196 -0.8912
+vn 0.4431 0.0236 -0.8962
+vn 0.4520 0.0220 -0.8917
+vn 0.4417 0.0159 -0.8970
+vn 0.4428 0.0137 -0.8965
+vn 0.4527 0.0144 -0.8915
+vn 0.4453 -0.0005 -0.8954
+vn 0.4575 -0.0347 -0.8885
+vn 0.4536 -0.0323 -0.8906
+vn 0.3734 -0.9233 0.0905
+vn 0.4624 0.0241 -0.8863
+vn 0.4309 0.0238 -0.9021
+vn 0.4629 0.0321 -0.8858
+vn 0.4607 0.0396 -0.8867
+vn 0.4560 0.0457 -0.8888
+vn 0.4426 0.0493 -0.8954
+vn 0.4365 0.0455 -0.8986
+vn 0.4320 0.0394 -0.9010
+vn 0.4302 0.0317 -0.9022
+vn -0.1202 -0.9798 -0.1601
+vn 0.4344 0.0169 -0.9005
+vn 0.4420 0.0129 -0.8969
+vn -0.6888 -0.6371 -0.3460
+vn 0.0838 0.9955 0.0439
+vn 0.0921 -0.9948 0.0428
+vn 0.7857 0.4744 0.3970
+vn 0.4497 0.0493 -0.8918
+vn 0.8541 0.2935 0.4294
+vn 0.4510 0.0005 -0.8925
+vn -0.2664 0.9559 -0.1239
+vn -0.5729 0.7707 -0.2788
+vn -0.6959 0.6316 -0.3416
+vn -0.7923 0.4683 -0.3912
+vn -0.8581 0.2868 -0.4259
+vn -0.0831 -0.9955 -0.0453
+vn -0.4252 0.8803 -0.2105
+vn -0.8574 0.2869 -0.4272
+vn 0.8533 0.2995 0.4268
+vn 0.8894 0.1090 0.4440
+vn 0.4576 -0.0347 -0.8885
+vn 0.4507 0.0138 -0.8925
+vn -0.7923 0.4682 -0.3912
+vn 0.4183 0.8836 0.2107
+vn 0.4528 0.0144 -0.8915
+vn -0.4179 -0.8835 -0.2115
+vn 0.2063 -0.9785 0.0030
+vn 0.4436 0.0228 -0.8960
+vn 0.4256 -0.8802 0.2098
+vn 0.2642 -0.9559 0.1283
+vn 0.2639 -0.9559 0.1287
+vn 0.4533 0.0196 -0.8912
+vn 0.6890 0.6371 0.3455
+vn 0.4301 0.0317 -0.9022
+vn 0.4432 0.0236 -0.8961
+vn 0.4275 0.0287 -0.9036
+vn 0.4489 0.0054 -0.8936
+vn 0.4441 0.0081 -0.8959
+vn 0.4425 -0.0144 -0.8967
+vn -0.6876 -0.6371 -0.3483
+vn 0.4453 0.0098 -0.8953
+vn 0.4447 0.0066 -0.8956
+vn 0.4492 0.0060 -0.8934
+vn 0.4527 0.0164 -0.8915
+vn -0.0624 -0.9613 -0.2684
+vn 0.4486 0.0002 -0.8937
+vn 0.4486 -0.0005 -0.8938
+vn 0.4421 0.0129 -0.8969
+vn 0.4401 0.0168 -0.8978
+vn 0.4657 0.0290 -0.8845
+vn 0.6944 -0.6317 0.3448
+vn 0.4604 0.0138 -0.8876
+vn 0.4624 0.0241 -0.8864
+vn -0.4178 -0.8835 -0.2115
+vn 0.4345 0.0169 -0.9005
+vn 0.4400 -0.0323 -0.8974
+vn 0.4454 -0.0005 -0.8953
+vn 0.4426 0.0493 -0.8953
+vn 0.4518 0.0184 -0.8919
+vn 0.4414 0.0217 -0.8970
+vn 0.4648 0.0366 -0.8846
+vn 0.4479 0.0244 -0.8938
+vn 0.4436 0.0227 -0.8960
+vn 0.4427 0.0503 -0.8953
+vn 0.4592 0.0170 -0.8882
+vn 0.4455 0.0241 -0.8950
+vn 0.4415 0.0184 -0.8971
+vn 0.4535 -0.0323 -0.8907
+vn -0.6941 0.6317 -0.3454
+vn 0.8898 0.1015 0.4448
+vn 0.4518 0.0160 -0.8920
+vn 0.3733 -0.9233 0.0905
+vn 0.4432 0.0235 -0.8961
+vn 0.7910 -0.4683 0.3936
+vn 0.4360 -0.0348 -0.8993
+vn 0.4407 0.0144 -0.8975
+vn 0.4331 0.0136 -0.9012
+vn 0.4295 0.0215 -0.9028
+vn 0.4516 0.0131 -0.8921
+vn 0.4429 0.0137 -0.8965
+vn 0.4468 0.0044 -0.8946
+vn 0.4468 0.0045 -0.8946
+vn 0.4468 0.0040 -0.8946
+vn 0.4465 0.0041 -0.8948
+vn 0.4470 0.0044 -0.8945
+vn 0.4467 0.0045 -0.8947
+vn 0.4468 0.0046 -0.8946
+vn 0.4470 0.0038 -0.8945
+vn 0.4467 0.0040 -0.8947
+vn 0.4468 0.0041 -0.8946
+vn 0.4468 0.0039 -0.8946
+vn 0.4469 0.0040 -0.8946
+vn 0.4479 0.0042 -0.8941
+vn 0.4469 0.0043 -0.8946
+vn 0.4467 0.0108 -0.8946
+vn 0.4468 0.0096 -0.8946
+vn 0.4473 0.0092 -0.8943
+vn 0.4495 0.0102 -0.8932
+vn 0.4468 0.0108 -0.8945
+vn 0.4469 0.0099 -0.8945
+vn 0.4468 0.0109 -0.8946
+vn 0.4468 0.0107 -0.8946
+vn 0.4468 0.0108 -0.8946
+vn 0.4467 0.0096 -0.8946
+vn 0.4469 0.0111 -0.8945
+vn 0.4462 0.0099 -0.8949
+vn 0.4468 0.0095 -0.8946
+vn 0.4470 0.0107 -0.8945
+vn 0.4467 0.0106 -0.8946
+vn 0.4471 0.0104 -0.8944
+vn 0.4469 0.0045 -0.8946
+vn 0.4471 0.0038 -0.8945
+vn 0.4461 0.0099 -0.8949
+vn 0.4468 0.0111 -0.8945
+vn 0.4468 0.0106 -0.8946
+vn 0.4494 0.0102 -0.8933
+vn 0.4469 0.0096 -0.8945
+vn 0.4469 0.0107 -0.8945
+vn 0.4466 0.0041 -0.8947
+vn 0.4469 0.0044 -0.8946
+vn 0.4478 0.0042 -0.8941
+vn 0.4468 0.0111 -0.8946
+vn 0.4493 0.0102 -0.8933
+vn 0.4472 0.0107 -0.8944
+vn 0.4469 0.0096 -0.8946
+g KsHauptsignal_Plane.006_Mast
+usemtl Mast
+s off
+f 13/1/1 12/2/1 11/3/1 14/4/1
+f 9/5/2 16/6/2 15/7/2 10/8/2
+f 16/9/3 13/10/3 14/11/3 15/12/3
+f 12/13/4 9/14/4 10/15/4 11/16/4
+f 21/17/4 20/18/4 19/19/4 22/20/4
+f 24/21/1 21/22/1 22/23/1 23/24/1
+f 20/25/2 17/26/2 18/27/2 19/28/2
+f 24/21/1 23/24/1 11/3/1 12/2/1
+f 17/29/5 24/30/5 12/31/5 9/32/5
+f 18/27/2 17/26/2 9/5/2 10/8/2
+f 23/33/6 18/34/6 10/35/6 11/36/6
+f 19/37/6 18/34/6 23/33/6 22/38/6
+f 11/36/6 10/35/6 15/39/6 14/40/6
+f 3/41/1 2/42/1 12/2/1 13/1/1
+f 1/43/2 4/44/2 16/6/2 9/5/2
+f 4/45/3 3/46/3 13/10/3 16/9/3
+f 2/47/4 1/48/4 9/14/4 12/13/4
+f 7/49/4 6/50/4 20/18/4 21/17/4
+f 5/51/3 8/52/3 24/53/3 17/54/3
+f 8/55/1 7/56/1 21/22/1 24/21/1
+f 6/57/2 5/58/2 17/26/2 20/25/2
+f 800/59/6 797/60/6 793/61/6 794/62/6
+f 804/63/1 806/64/1 812/65/1 813/66/1
+f 813/66/1 812/65/1 811/67/1 814/68/1
+f 808/69/2 803/70/2 816/71/2 809/72/2
+f 809/72/2 816/71/2 815/73/2 810/74/2
+f 803/75/3 804/63/3 813/66/3 816/76/3
+f 816/76/3 813/66/3 814/68/3 815/77/3
+f 806/78/4 808/79/4 809/80/4 812/81/4
+f 812/81/4 809/80/4 810/82/4 811/83/4
+f 801/84/4 802/85/4 820/86/4 821/87/4
+f 821/87/4 820/86/4 819/88/4 822/89/4
+f 807/90/3 805/91/3 824/92/3 817/93/3
+f 805/94/1 801/95/1 821/96/1 824/97/1
+f 824/97/1 821/96/1 822/98/1 823/99/1
+f 802/100/2 807/101/2 817/102/2 820/103/2
+f 820/103/2 817/102/2 818/104/2 819/105/2
+f 824/97/1 823/99/1 811/67/1 812/65/1
+f 817/106/5 824/107/5 812/108/5 809/109/5
+f 818/104/2 817/102/2 809/72/2 810/74/2
+f 823/110/6 818/111/6 810/112/6 811/113/6
+f 819/114/6 818/111/6 823/110/6 822/115/6
+f 811/113/6 810/112/6 815/116/6 814/117/6
+f 832/118/6 829/119/6 825/120/6 826/121/6
+f 836/122/1 838/123/1 844/124/1 845/125/1
+f 845/125/1 844/124/1 843/126/1 846/127/1
+f 840/128/2 835/129/2 848/130/2 841/131/2
+f 841/131/2 848/130/2 847/132/2 842/133/2
+f 835/134/3 836/135/3 845/136/3 848/137/3
+f 848/137/3 845/136/3 846/138/3 847/139/3
+f 838/140/4 840/141/4 841/142/4 844/143/4
+f 844/143/4 841/142/4 842/144/4 843/145/4
+f 833/146/4 834/147/4 852/148/4 853/149/4
+f 853/149/4 852/148/4 851/150/4 854/151/4
+f 839/152/3 837/153/3 856/154/3 849/155/3
+f 837/156/1 833/157/1 853/158/1 856/159/1
+f 856/159/1 853/158/1 854/160/1 855/161/1
+f 834/162/2 839/163/2 849/164/2 852/165/2
+f 852/165/2 849/164/2 850/166/2 851/167/2
+f 856/159/1 855/161/1 843/126/1 844/124/1
+f 849/168/5 856/169/5 844/170/5 841/171/5
+f 850/166/2 849/164/2 841/131/2 842/133/2
+f 855/172/6 850/173/6 842/174/6 843/175/6
+f 851/176/6 850/173/6 855/172/6 854/177/6
+f 843/175/6 842/174/6 847/178/6 846/179/6
+g KsHauptsignal_Plane.006_Schirm
+usemtl Schirm
+f 857/180/3 858/181/3 860/182/3 859/183/3
+f 862/184/4 861/185/4 864/186/4 863/187/4
+f 859/188/2 861/189/2 862/190/2 857/191/2
+f 860/192/6 864/193/6 861/194/6 859/195/6
+f 857/196/5 862/197/5 863/198/5 858/199/5
+f 858/200/1 863/201/1 864/202/1 860/203/1
+g KsHauptsignal_Plane.006_Lampenrahmen
+usemtl Lampenrahmen
+f 40/204/7 39/205/7 41/206/7
+f 26/207/8 88/208/8 25/209/8
+f 54/210/9 53/211/9 56/212/9
+f 58/213/10 56/212/10 57/214/10
+f 86/215/11 85/216/11 88/208/11
+f 90/217/12 89/218/12 152/219/12
+f 118/220/13 120/221/13 117/222/13
+f 122/223/14 121/224/14 120/221/14
+f 150/225/15 152/219/15 149/226/15
+f 79/227/16 81/228/16 82/229/16
+f 81/230/17 145/231/17 147/232/17
+f 111/233/18 113/234/18 49/235/18
+f 103/236/19 105/237/19 41/238/19
+f 99/239/20 35/240/20 33/241/20
+f 105/237/21 107/242/21 43/243/21
+f 147/232/22 149/244/22 85/245/22
+f 97/246/23 33/241/23 31/247/23
+f 103/236/24 39/248/24 37/249/24
+f 109/250/25 111/233/25 47/251/25
+f 35/240/26 99/239/26 101/252/26
+f 107/242/27 109/250/27 45/253/27
+f 95/254/28 31/247/28 29/255/28
+f 93/256/29 29/255/29 27/257/29
+f 113/234/30 115/258/30 51/259/30
+f 151/260/31 89/261/31 25/262/31
+f 149/244/32 151/260/32 87/263/32
+f 121/264/33 57/265/33 55/266/33
+f 115/258/34 117/267/34 53/268/34
+f 79/269/35 143/270/35 145/231/35
+f 125/271/36 127/272/36 63/273/36
+f 77/274/37 141/275/37 143/270/37
+f 75/276/38 139/277/38 141/275/38
+f 73/278/39 137/279/39 139/277/39
+f 133/280/40 135/281/40 71/282/40
+f 131/283/41 133/280/41 69/284/41
+f 129/285/42 131/283/42 67/286/42
+f 127/272/43 129/285/43 65/287/43
+f 91/288/44 27/257/44 25/262/44
+f 123/289/45 125/271/45 61/290/45
+f 123/289/46 59/291/46 57/265/46
+f 88/208/47 87/292/47 25/209/47
+f 97/293/48 95/294/48 96/295/48
+f 112/296/49 111/297/49 109/298/49
+f 48/299/50 47/300/50 49/301/50
+f 110/302/51 109/298/51 107/303/51
+f 140/304/52 139/305/52 137/306/52
+f 42/307/53 41/206/53 43/308/53
+f 106/309/54 105/310/54 103/311/54
+f 37/312/55 39/205/55 40/204/55
+f 108/313/56 107/303/56 105/314/56
+f 33/315/57 35/316/57 36/317/57
+f 31/318/58 33/315/58 34/319/58
+f 50/320/59 49/301/59 51/321/59
+f 27/322/60 29/323/60 30/324/60
+f 25/209/61 27/322/61 28/325/61
+f 53/211/62 55/326/62 56/212/62
+f 56/212/63 55/326/63 57/214/63
+f 81/228/64 83/327/64 84/328/64
+f 71/282/65 135/281/65 137/279/65
+f 83/327/66 85/216/66 86/215/66
+f 119/329/67 55/266/67 53/268/67
+f 77/330/68 79/227/68 80/331/68
+f 75/332/69 77/330/69 78/333/69
+f 114/334/70 113/335/70 111/297/70
+f 142/336/71 141/337/71 139/305/71
+f 68/338/72 67/339/72 69/340/72
+f 66/341/73 65/342/73 67/339/73
+f 64/343/74 63/344/74 65/342/74
+f 62/345/75 61/346/75 63/344/75
+f 60/347/76 59/348/76 61/346/76
+f 58/213/77 57/214/77 59/348/77
+f 85/216/78 87/292/78 88/208/78
+f 89/218/12 151/349/12 152/219/12
+f 146/350/79 145/351/79 143/352/79
+f 144/353/80 143/352/80 141/337/80
+f 116/354/81 115/355/81 113/335/81
+f 71/356/82 73/357/82 74/358/82
+f 29/323/83 31/318/83 32/359/83
+f 44/360/84 43/308/84 45/361/84
+f 138/362/85 137/306/85 135/363/85
+f 103/311/86 101/364/86 102/365/86
+f 101/364/87 99/366/87 100/367/87
+f 99/366/88 97/293/88 98/368/88
+f 52/369/89 51/321/89 53/211/89
+f 95/294/90 93/370/90 94/371/90
+f 93/370/91 91/372/91 92/373/91
+f 92/373/92 91/372/92 89/218/92
+f 120/221/13 119/374/13 117/222/13
+f 121/224/93 119/374/93 120/221/93
+f 73/357/94 75/332/94 76/375/94
+f 150/225/95 149/226/95 147/376/95
+f 148/377/96 147/376/96 145/351/96
+f 116/354/97 118/220/97 117/222/97
+f 70/378/98 69/340/98 71/379/98
+f 46/380/99 45/361/99 47/300/99
+f 35/316/100 37/312/100 38/381/100
+f 135/363/101 133/382/101 134/383/101
+f 133/382/102 131/384/102 132/385/102
+f 131/384/103 129/386/103 130/387/103
+f 129/386/104 127/388/104 128/389/104
+f 127/388/105 125/390/105 126/391/105
+f 125/390/106 123/392/106 124/393/106
+f 123/392/107 121/224/107 122/223/107
+f 152/219/15 151/349/15 149/226/15
+f 209/394/108 273/395/108 275/396/108
+f 276/397/109 275/398/109 273/399/109
+f 211/400/110 213/401/110 214/402/110
+f 249/403/111 247/404/111 248/405/111
+f 244/406/112 243/407/112 241/408/112
+f 272/409/113 271/410/113 269/411/113
+f 180/412/114 179/413/114 181/414/114
+f 229/415/115 227/416/115 228/417/115
+f 225/418/116 223/419/116 224/420/116
+f 255/421/117 257/422/117 193/423/117
+f 234/424/118 233/425/118 231/426/118
+f 157/427/119 159/428/119 160/429/119
+f 182/430/15 181/414/15 184/431/15
+f 165/432/120 167/433/120 168/434/120
+f 214/402/121 213/401/121 216/435/121
+f 221/436/122 219/437/122 220/438/122
+f 216/435/123 215/439/123 153/440/123
+f 227/441/124 163/442/124 161/443/124
+f 235/444/125 237/445/125 173/446/125
+f 201/447/126 265/448/126 267/449/126
+f 261/450/127 263/451/127 199/452/127
+f 184/431/128 183/453/128 185/454/128
+f 159/428/129 161/455/129 162/456/129
+f 168/434/130 167/433/130 169/457/130
+f 275/396/131 277/458/131 213/459/131
+f 266/460/132 265/461/132 263/462/132
+f 249/463/133 185/464/133 183/465/133
+f 231/466/134 233/467/134 169/468/134
+f 190/469/135 189/470/135 191/471/135
+f 217/472/136 279/473/136 280/474/136
+f 255/475/137 253/476/137 254/477/137
+f 186/478/138 184/431/138 185/454/138
+f 203/479/139 205/480/139 206/481/139
+f 239/482/140 241/483/140 177/484/140
+f 225/485/141 161/443/141 159/486/141
+f 172/487/142 171/488/142 173/489/142
+f 174/490/143 173/489/143 175/491/143
+f 199/452/144 263/451/144 265/448/144
+f 253/492/145 255/421/145 191/493/145
+f 163/494/146 165/432/146 166/495/146
+f 263/462/147 261/496/147 262/497/147
+f 241/483/148 243/498/148 179/499/148
+f 201/500/149 203/479/149 204/501/149
+f 198/502/150 197/503/150 199/504/150
+f 209/505/151 211/400/151 212/506/151
+f 188/507/152 187/508/152 189/470/152
+f 233/467/153 235/444/153 171/509/153
+f 196/510/154 195/511/154 197/503/154
+f 257/422/155 259/512/155 195/513/155
+f 278/514/156 280/474/156 277/515/156
+f 236/516/157 235/517/157 233/518/157
+f 250/519/158 249/403/158 248/405/158
+f 253/476/159 251/520/159 252/521/159
+f 205/522/160 269/523/160 271/524/160
+f 213/401/161 215/439/161 216/435/161
+f 154/525/93 216/435/93 153/440/93
+f 218/526/136 217/472/136 280/474/136
+f 279/527/162 217/528/162 153/529/162
+f 176/530/163 175/491/163 177/531/163
+f 181/414/164 183/453/164 184/431/164
+f 161/455/165 163/494/165 164/532/165
+f 280/474/166 279/473/166 277/515/166
+f 257/533/167 255/475/167 256/534/167
+f 274/535/168 273/399/168 271/410/168
+f 155/536/169 157/427/169 158/537/169
+f 231/426/170 229/415/170 230/538/170
+f 205/480/171 207/539/171 208/540/171
+f 220/438/172 219/437/172 217/472/172
+f 203/541/173 267/449/173 269/523/173
+f 192/542/174 191/471/174 193/543/174
+f 244/406/175 246/544/175 245/545/175
+f 170/546/176 169/457/176 171/488/176
+f 259/512/177 261/450/177 197/547/177
+f 219/548/178 155/549/178 153/529/178
+f 251/520/179 249/403/179 250/519/179
+f 207/550/180 271/524/180 273/395/180
+f 277/458/181 279/527/181 215/551/181
+f 240/552/182 239/553/182 237/554/182
+f 261/496/183 259/555/183 260/556/183
+f 223/419/184 221/436/184 222/557/184
+f 278/514/185 277/515/185 275/398/185
+f 248/405/186 247/404/186 245/545/186
+f 237/445/187 239/482/187 175/558/187
+f 246/544/186 248/405/186 245/545/186
+f 221/559/188 157/560/188 155/549/188
+f 242/561/189 241/408/189 239/553/189
+f 227/416/190 225/418/190 226/562/190
+f 259/555/191 257/533/191 258/563/191
+f 251/564/192 187/565/192 185/464/192
+f 178/566/193 177/531/193 179/413/193
+f 199/567/194 201/500/194 202/568/194
+f 243/498/195 245/569/195 181/570/195
+f 223/571/196 159/486/196 157/560/196
+f 163/442/197 227/441/197 229/572/197
+f 194/573/198 193/543/198 195/511/198
+f 207/539/199 209/505/199 210/574/199
+f 251/564/200 253/492/200 189/575/200
+f 270/576/201 269/411/201 267/577/201
+f 186/478/202 185/454/202 187/508/202
+f 247/578/203 183/465/203 181/570/203
+f 153/440/204 155/536/204 156/579/204
+f 268/580/205 267/577/205 265/461/205
+f 238/581/206 237/554/206 235/517/206
+f 231/466/207 167/582/207 165/583/207
+f 42/307/7 40/204/7 41/206/7
+f 80/331/16 79/227/16 82/229/16
+f 83/584/208 81/230/208 147/232/208
+f 47/251/209 111/233/209 49/235/209
+f 39/248/210 103/236/210 41/238/210
+f 97/246/211 99/239/211 33/241/211
+f 41/238/212 105/237/212 43/243/212
+f 83/584/213 147/232/213 85/245/213
+f 95/254/214 97/246/214 31/247/214
+f 101/252/215 103/236/215 37/249/215
+f 45/253/216 109/250/216 47/251/216
+f 37/249/217 35/240/217 101/252/217
+f 43/243/218 107/242/218 45/253/218
+f 93/256/219 95/254/219 29/255/219
+f 91/288/220 93/256/220 27/257/220
+f 49/235/221 113/234/221 51/259/221
+f 87/263/222 151/260/222 25/262/222
+f 85/245/223 149/244/223 87/263/223
+f 119/329/224 121/264/224 55/266/224
+f 51/259/225 115/258/225 53/268/225
+f 81/230/226 79/269/226 145/231/226
+f 61/290/227 125/271/227 63/273/227
+f 79/269/228 77/274/228 143/270/228
+f 77/274/229 75/276/229 141/275/229
+f 75/276/230 73/278/230 139/277/230
+f 69/284/231 133/280/231 71/282/231
+f 67/286/232 131/283/232 69/284/232
+f 65/287/233 129/285/233 67/286/233
+f 63/273/234 127/272/234 65/287/234
+f 89/261/235 91/288/235 25/262/235
+f 59/291/236 123/289/236 61/290/236
+f 121/264/237 123/289/237 57/265/237
+f 98/368/48 97/293/48 96/295/48
+f 110/302/238 112/296/238 109/298/238
+f 50/320/50 48/299/50 49/301/50
+f 108/313/239 110/302/239 107/303/239
+f 138/362/52 140/304/52 137/306/52
+f 44/360/53 42/307/53 43/308/53
+f 104/585/54 106/309/54 103/311/54
+f 38/381/240 37/312/240 40/204/240
+f 106/586/56 108/313/56 105/314/56
+f 34/319/57 33/315/57 36/317/57
+f 32/359/58 31/318/58 34/319/58
+f 52/369/59 50/320/59 51/321/59
+f 28/325/60 27/322/60 30/324/60
+f 26/207/241 25/209/241 28/325/241
+f 82/229/242 81/228/242 84/328/242
+f 73/278/243 71/282/243 137/279/243
+f 84/328/244 83/327/244 86/215/244
+f 117/267/245 119/329/245 53/268/245
+f 78/333/246 77/330/246 80/331/246
+f 76/375/69 75/332/69 78/333/69
+f 112/296/70 114/334/70 111/297/70
+f 140/304/71 142/336/71 139/305/71
+f 70/378/247 68/338/247 69/340/247
+f 68/338/73 66/341/73 67/339/73
+f 66/341/248 64/343/248 65/342/248
+f 64/343/75 62/345/75 63/344/75
+f 62/345/249 60/347/249 61/346/249
+f 60/347/250 58/213/250 59/348/250
+f 144/353/79 146/350/79 143/352/79
+f 142/336/80 144/353/80 141/337/80
+f 114/334/81 116/354/81 113/335/81
+f 72/587/82 71/356/82 74/358/82
+f 30/324/83 29/323/83 32/359/83
+f 46/380/84 44/360/84 45/361/84
+f 136/588/85 138/362/85 135/363/85
+f 104/585/86 103/311/86 102/365/86
+f 102/365/87 101/364/87 100/367/87
+f 100/367/88 99/366/88 98/368/88
+f 54/210/251 52/369/251 53/211/251
+f 96/295/90 95/294/90 94/371/90
+f 94/371/91 93/370/91 92/373/91
+f 90/217/252 92/373/252 89/218/252
+f 74/358/253 73/357/253 76/375/253
+f 148/377/95 150/225/95 147/376/95
+f 146/350/96 148/377/96 145/351/96
+f 115/355/254 116/354/254 117/222/254
+f 72/589/255 70/378/255 71/379/255
+f 48/299/99 46/380/99 47/300/99
+f 36/317/100 35/316/100 38/381/100
+f 136/588/256 135/363/256 134/383/256
+f 134/383/102 133/382/102 132/385/102
+f 132/385/103 131/384/103 130/387/103
+f 130/387/104 129/386/104 128/389/104
+f 128/389/105 127/388/105 126/391/105
+f 126/391/106 125/390/106 124/393/106
+f 124/393/107 123/392/107 122/223/107
+f 296/590/7 295/591/7 297/592/7
+f 282/593/8 344/594/8 281/595/8
+f 310/596/9 309/597/9 312/598/9
+f 314/599/10 312/598/10 313/600/10
+f 342/601/11 341/602/11 344/594/11
+f 346/603/12 345/604/12 408/605/12
+f 374/606/13 376/607/13 373/608/13
+f 378/609/14 377/610/14 376/607/14
+f 406/611/15 408/605/15 405/612/15
+f 335/613/16 337/614/16 338/615/16
+f 337/616/17 401/617/17 403/618/17
+f 367/619/257 369/620/257 305/621/257
+f 359/622/258 361/623/258 297/624/258
+f 355/625/20 291/626/20 289/627/20
+f 361/623/21 363/628/21 299/629/21
+f 403/618/22 405/630/22 341/631/22
+f 353/632/259 289/627/259 287/633/259
+f 359/622/24 295/634/24 293/635/24
+f 365/636/25 367/619/25 303/637/25
+f 291/626/26 355/625/26 357/638/26
+f 363/628/27 365/636/27 301/639/27
+f 351/640/260 287/633/260 285/641/260
+f 349/642/261 285/641/261 283/643/261
+f 369/620/262 371/644/262 307/645/262
+f 407/646/31 345/647/31 281/648/31
+f 405/630/32 407/646/32 343/649/32
+f 377/650/33 313/651/33 311/652/33
+f 371/644/34 373/653/34 309/654/34
+f 335/655/35 399/656/35 401/617/35
+f 381/657/36 383/658/36 319/659/36
+f 333/660/37 397/661/37 399/656/37
+f 331/662/38 395/663/38 397/661/38
+f 329/664/39 393/665/39 395/663/39
+f 389/666/40 391/667/40 327/668/40
+f 387/669/41 389/666/41 325/670/41
+f 385/671/42 387/669/42 323/672/42
+f 383/658/43 385/671/43 321/673/43
+f 347/674/44 283/643/44 281/648/44
+f 379/675/45 381/657/45 317/676/45
+f 379/675/46 315/677/46 313/651/46
+f 344/594/47 343/678/47 281/595/47
+f 353/679/48 351/680/48 352/681/48
+f 368/682/238 367/683/238 365/684/238
+f 304/685/50 303/686/50 305/687/50
+f 366/688/51 365/684/51 363/689/51
+f 396/690/52 395/691/52 393/692/52
+f 298/693/53 297/592/53 299/694/53
+f 362/695/54 361/696/54 359/697/54
+f 293/698/55 295/591/55 296/590/55
+f 364/699/56 363/689/56 361/700/56
+f 289/701/57 291/702/57 292/703/57
+f 287/704/58 289/701/58 290/705/58
+f 306/706/59 305/687/59 307/707/59
+f 283/708/60 285/709/60 286/710/60
+f 281/595/61 283/708/61 284/711/61
+f 309/597/62 311/712/62 312/598/62
+f 312/598/63 311/712/63 313/600/63
+f 337/614/64 339/713/64 340/714/64
+f 327/668/65 391/667/65 393/665/65
+f 339/713/66 341/602/66 342/601/66
+f 375/715/67 311/652/67 309/654/67
+f 333/716/68 335/613/68 336/717/68
+f 331/718/69 333/716/69 334/719/69
+f 370/720/70 369/721/70 367/683/70
+f 398/722/71 397/723/71 395/691/71
+f 324/724/72 323/725/72 325/726/72
+f 322/727/73 321/728/73 323/725/73
+f 320/729/263 319/730/263 321/728/263
+f 318/731/75 317/732/75 319/730/75
+f 316/733/76 315/734/76 317/732/76
+f 314/599/77 313/600/77 315/734/77
+f 341/602/264 343/678/264 344/594/264
+f 345/604/12 407/735/12 408/605/12
+f 402/736/79 401/737/79 399/738/79
+f 400/739/80 399/738/80 397/723/80
+f 372/740/81 371/741/81 369/721/81
+f 327/742/82 329/743/82 330/744/82
+f 285/709/83 287/704/83 288/745/83
+f 300/746/84 299/694/84 301/747/84
+f 394/748/85 393/692/85 391/749/85
+f 359/697/86 357/750/86 358/751/86
+f 357/750/87 355/752/87 356/753/87
+f 355/752/88 353/679/88 354/754/88
+f 308/755/89 307/707/89 309/597/89
+f 351/680/90 349/756/90 350/757/90
+f 349/756/91 347/758/91 348/759/91
+f 348/759/92 347/758/92 345/604/92
+f 376/607/13 375/760/13 373/608/13
+f 377/610/93 375/760/93 376/607/93
+f 329/743/94 331/718/94 332/761/94
+f 406/611/95 405/612/95 403/762/95
+f 404/763/96 403/762/96 401/737/96
+f 372/740/97 374/606/97 373/608/97
+f 326/764/98 325/726/98 327/765/98
+f 302/766/99 301/747/99 303/686/99
+f 291/702/100 293/698/100 294/767/100
+f 391/749/101 389/768/101 390/769/101
+f 389/768/102 387/770/102 388/771/102
+f 387/770/103 385/772/103 386/773/103
+f 385/772/104 383/774/104 384/775/104
+f 383/774/105 381/776/105 382/777/105
+f 381/776/106 379/778/106 380/779/106
+f 379/778/107 377/610/107 378/609/107
+f 408/605/15 407/735/15 405/612/15
+f 298/693/7 296/590/7 297/592/7
+f 336/717/16 335/613/16 338/615/16
+f 339/780/265 337/616/265 403/618/265
+f 303/637/209 367/619/209 305/621/209
+f 295/634/210 359/622/210 297/624/210
+f 353/632/266 355/625/266 289/627/266
+f 297/624/212 361/623/212 299/629/212
+f 339/780/213 403/618/213 341/631/213
+f 351/640/214 353/632/214 287/633/214
+f 357/638/215 359/622/215 293/635/215
+f 301/639/267 365/636/267 303/637/267
+f 293/635/217 291/626/217 357/638/217
+f 299/629/218 363/628/218 301/639/218
+f 349/642/268 351/640/268 285/641/268
+f 347/674/269 349/642/269 283/643/269
+f 305/621/270 369/620/270 307/645/270
+f 343/649/271 407/646/271 281/648/271
+f 341/631/223 405/630/223 343/649/223
+f 375/715/272 377/650/272 311/652/272
+f 307/645/225 371/644/225 309/654/225
+f 337/616/226 335/655/226 401/617/226
+f 317/676/227 381/657/227 319/659/227
+f 335/655/273 333/660/273 399/656/273
+f 333/660/229 331/662/229 397/661/229
+f 331/662/230 329/664/230 395/663/230
+f 325/670/231 389/666/231 327/668/231
+f 323/672/274 387/669/274 325/670/274
+f 321/673/275 385/671/275 323/672/275
+f 319/659/234 383/658/234 321/673/234
+f 345/647/235 347/674/235 281/648/235
+f 315/677/236 379/675/236 317/676/236
+f 377/650/276 379/675/276 313/651/276
+f 354/754/48 353/679/48 352/681/48
+f 366/688/238 368/682/238 365/684/238
+f 306/706/50 304/685/50 305/687/50
+f 364/699/239 366/688/239 363/689/239
+f 394/748/52 396/690/52 393/692/52
+f 300/746/53 298/693/53 299/694/53
+f 360/781/54 362/695/54 359/697/54
+f 294/767/240 293/698/240 296/590/240
+f 362/782/56 364/699/56 361/700/56
+f 290/705/57 289/701/57 292/703/57
+f 288/745/58 287/704/58 290/705/58
+f 308/755/59 306/706/59 307/707/59
+f 284/711/60 283/708/60 286/710/60
+f 282/593/241 281/595/241 284/711/241
+f 338/615/242 337/614/242 340/714/242
+f 329/664/243 327/668/243 393/665/243
+f 340/714/277 339/713/277 342/601/277
+f 373/653/245 375/715/245 309/654/245
+f 334/719/246 333/716/246 336/717/246
+f 332/761/69 331/718/69 334/719/69
+f 368/682/70 370/720/70 367/683/70
+f 396/690/71 398/722/71 395/691/71
+f 326/764/247 324/724/247 325/726/247
+f 324/724/73 322/727/73 323/725/73
+f 322/727/248 320/729/248 321/728/248
+f 320/729/75 318/731/75 319/730/75
+f 318/731/249 316/733/249 317/732/249
+f 316/733/250 314/599/250 315/734/250
+f 400/739/79 402/736/79 399/738/79
+f 398/722/80 400/739/80 397/723/80
+f 370/720/81 372/740/81 369/721/81
+f 328/783/82 327/742/82 330/744/82
+f 286/710/83 285/709/83 288/745/83
+f 302/766/84 300/746/84 301/747/84
+f 392/784/85 394/748/85 391/749/85
+f 360/781/86 359/697/86 358/751/86
+f 358/751/87 357/750/87 356/753/87
+f 356/753/88 355/752/88 354/754/88
+f 310/596/251 308/755/251 309/597/251
+f 352/681/90 351/680/90 350/757/90
+f 350/757/91 349/756/91 348/759/91
+f 346/603/252 348/759/252 345/604/252
+f 330/744/278 329/743/278 332/761/278
+f 404/763/95 406/611/95 403/762/95
+f 402/736/96 404/763/96 401/737/96
+f 371/741/254 372/740/254 373/608/254
+f 328/785/255 326/764/255 327/765/255
+f 304/685/99 302/766/99 303/686/99
+f 292/703/100 291/702/100 294/767/100
+f 392/784/256 391/749/256 390/769/256
+f 390/769/102 389/768/102 388/771/102
+f 388/771/103 387/770/103 386/773/103
+f 386/773/104 385/772/104 384/775/104
+f 384/775/105 383/774/105 382/777/105
+f 382/777/106 381/776/106 380/779/106
+f 380/779/107 379/778/107 378/609/107
+f 170/546/130 168/434/130 169/457/130
+f 208/540/199 207/539/199 210/574/199
+f 211/786/279 209/394/279 275/396/279
+f 175/558/280 239/482/280 177/484/280
+f 167/582/281 231/466/281 169/468/281
+f 225/485/282 227/441/282 161/443/282
+f 169/468/283 233/467/283 171/509/283
+f 211/786/284 275/396/284 213/459/284
+f 223/571/285 225/485/285 159/486/285
+f 229/572/286 231/466/286 165/583/286
+f 173/446/287 237/445/287 175/558/287
+f 165/583/288 163/442/288 229/572/288
+f 171/509/289 235/444/289 173/446/289
+f 221/559/290 223/571/290 157/560/290
+f 219/548/291 221/559/291 155/549/291
+f 177/484/292 241/483/292 179/499/292
+f 215/551/293 279/527/293 153/529/293
+f 213/459/294 277/458/294 215/551/294
+f 247/578/295 249/463/295 183/465/295
+f 179/499/296 243/498/296 181/570/296
+f 209/394/297 207/550/297 273/395/297
+f 189/575/298 253/492/298 191/493/298
+f 207/550/299 205/522/299 271/524/299
+f 205/522/300 203/541/300 269/523/300
+f 203/541/301 201/447/301 267/449/301
+f 197/547/302 261/450/302 199/452/302
+f 195/513/303 259/512/303 197/547/303
+f 193/423/304 257/422/304 195/513/304
+f 191/493/305 255/421/305 193/423/305
+f 217/528/306 219/548/306 153/529/306
+f 187/565/307 251/564/307 189/575/307
+f 249/463/308 251/564/308 185/464/308
+f 226/562/116 225/418/116 224/420/116
+f 238/581/182 240/552/182 237/554/182
+f 178/566/309 176/530/309 177/531/309
+f 236/516/206 238/581/206 235/517/206
+f 266/460/205 268/580/205 265/461/205
+f 172/487/176 170/546/176 171/488/176
+f 232/787/310 234/424/310 231/426/310
+f 166/495/311 165/432/311 168/434/311
+f 234/788/157 236/516/157 233/518/157
+f 162/456/165 161/455/165 164/532/165
+f 160/429/129 159/428/129 162/456/129
+f 180/412/193 178/566/193 179/413/193
+f 156/579/169 155/536/169 158/537/169
+f 154/525/107 153/440/107 156/579/107
+f 210/574/312 209/505/312 212/506/312
+f 201/447/313 199/452/313 265/448/313
+f 212/506/314 211/400/314 214/402/314
+f 245/569/315 247/578/315 181/570/315
+f 206/481/171 205/480/171 208/540/171
+f 204/501/139 203/479/139 206/481/139
+f 240/552/189 242/561/189 239/553/189
+f 268/580/201 270/576/201 267/577/201
+f 198/502/316 196/510/316 197/503/316
+f 196/510/198 194/573/198 195/511/198
+f 194/573/317 192/542/317 193/543/317
+f 192/542/318 190/469/318 191/471/318
+f 190/469/319 188/507/319 189/470/319
+f 188/507/320 186/478/320 187/508/320
+f 272/409/168 274/535/168 271/410/168
+f 270/576/113 272/409/113 269/411/113
+f 242/561/112 244/406/112 241/408/112
+f 200/789/194 199/567/194 202/568/194
+f 158/537/119 157/427/119 160/429/119
+f 174/490/142 172/487/142 173/489/142
+f 264/790/321 266/460/321 263/462/321
+f 232/787/170 231/426/170 230/538/170
+f 230/538/115 229/415/115 228/417/115
+f 228/417/322 227/416/322 226/562/322
+f 182/430/95 180/412/95 181/414/95
+f 224/420/184 223/419/184 222/557/184
+f 222/557/122 221/436/122 220/438/122
+f 218/526/323 220/438/323 217/472/323
+f 202/568/149 201/500/149 204/501/149
+f 276/397/185 278/514/185 275/398/185
+f 274/535/109 276/397/109 273/399/109
+f 243/407/324 244/406/324 245/545/324
+f 200/791/150 198/502/150 199/504/150
+f 176/530/143 174/490/143 175/491/143
+f 164/532/146 163/494/146 166/495/146
+f 264/790/147 263/462/147 262/497/147
+f 262/497/183 261/496/183 260/556/183
+f 260/556/191 259/555/191 258/563/191
+f 258/563/167 257/533/167 256/534/167
+f 256/534/137 255/475/137 254/477/137
+f 254/477/159 253/476/159 252/521/159
+f 252/521/179 251/520/179 250/519/179
+f 471/792/323 469/793/323 472/794/323
+f 519/795/176 520/796/176 518/797/176
+f 519/795/130 521/798/130 520/796/130
+f 413/799/109 414/800/109 416/801/109
+f 486/802/301 488/803/301 422/804/301
+f 476/805/325 474/806/325 473/807/325
+f 535/808/93 473/807/93 536/809/93
+f 521/798/130 522/810/130 520/796/130
+f 440/811/111 442/812/111 441/813/111
+f 442/814/203 506/815/203 508/816/203
+f 476/817/326 412/818/326 474/819/326
+f 490/820/194 488/821/194 487/822/194
+f 490/823/144 426/824/144 424/825/144
+f 448/826/327 446/827/327 510/828/327
+f 462/829/190 464/830/190 463/831/190
+f 486/832/139 484/833/139 483/834/139
+f 461/835/190 462/829/190 463/831/190
+f 518/836/289 454/837/289 516/838/289
+f 483/834/171 484/833/171 481/839/171
+f 511/840/309 513/841/309 512/842/309
+f 458/843/170 460/844/170 459/845/170
+f 430/846/177 428/847/177 492/848/177
+f 436/849/159 438/850/159 437/851/159
+f 480/852/151 478/853/151 477/854/151
+f 435/855/159 436/849/159 437/851/159
+f 417/856/168 415/857/168 418/858/168
+f 440/859/308 438/860/308 504/861/308
+f 466/862/196 530/863/196 532/864/196
+f 499/865/328 501/866/328 500/867/328
+f 482/868/180 418/869/180 416/870/180
+f 520/871/283 456/872/283 518/836/283
+f 531/873/119 532/874/119 529/875/119
+f 421/876/201 419/877/201 422/878/201
+f 488/803/313 490/823/313 424/825/313
+f 453/879/157 454/880/157 456/881/157
+f 460/844/115 462/829/115 461/835/115
+f 478/882/284 414/883/284 476/817/284
+f 523/884/311 524/885/311 521/798/311
+f 503/886/202 504/887/202 502/888/202
+f 456/872/153 454/837/153 518/836/153
+f 489/889/194 490/820/194 487/822/194
+f 468/890/122 470/891/122 469/793/122
+f 464/892/282 462/893/282 528/894/282
+f 484/833/171 482/895/171 481/839/171
+f 480/896/297 482/868/297 416/870/297
+f 515/897/142 517/898/142 516/899/142
+f 453/879/206 451/900/206 454/880/206
+f 502/901/307 438/860/307 500/902/307
+f 412/818/181 410/903/181 474/819/181
+f 495/904/198 496/905/198 494/906/198
+f 491/907/154 493/908/154 492/909/154
+f 455/910/118 456/911/118 458/843/118
+f 474/819/293 410/903/293 536/912/293
+f 497/913/174 498/914/174 496/905/174
+f 411/915/185 412/916/185 414/800/185
+f 492/848/302 428/847/302 490/823/302
+f 451/900/329 452/917/329 454/880/329
+f 423/918/205 421/876/205 424/919/205
+f 452/920/187 450/921/187 514/922/187
+f 434/923/137 436/849/137 435/855/137
+f 488/803/126 424/825/126 422/804/126
+f 462/893/124 526/924/124 528/894/124
+f 409/925/166 410/926/166 412/916/166
+f 484/927/160 420/928/160 418/869/160
+f 410/903/162 472/929/162 536/912/162
+f 433/930/137 434/923/137 435/855/137
+f 493/908/154 494/906/154 492/909/154
+f 533/931/169 534/932/169 531/873/169
+f 535/808/107 536/809/107 533/931/107
+f 467/933/122 468/890/122 469/793/122
+f 512/934/330 448/826/330 510/828/330
+f 429/935/191 430/936/191 431/937/191
+f 494/938/303 430/846/303 492/848/303
+f 513/841/309 514/939/309 512/842/309
+f 468/940/290 466/862/290 532/864/290
+f 419/877/113 417/856/113 420/941/113
+f 480/896/108 416/870/108 414/883/108
+f 413/799/185 411/915/185 414/800/185
+f 517/898/331 518/797/331 516/899/331
+f 446/827/332 444/942/332 508/816/332
+f 522/943/281 458/944/281 520/871/281
+f 432/945/167 434/923/167 433/930/167
+f 511/840/193 512/842/193 510/946/193
+f 432/947/155 430/846/155 494/938/155
+f 469/793/172 470/891/172 472/794/172
+f 526/924/333 462/893/333 460/948/333
+f 530/949/129 528/950/129 527/951/129
+f 487/822/149 488/821/149 485/952/149
+f 527/951/334 528/950/334 525/953/334
+f 428/954/335 430/936/335 429/935/335
+f 513/841/143 515/897/143 514/939/143
+f 525/953/336 526/955/336 523/884/336
+f 528/950/165 526/955/165 525/953/165
+f 411/915/156 409/925/156 412/916/156
+f 458/944/134 456/872/134 520/871/134
+f 507/956/15 508/957/15 505/958/15
+f 491/907/150 492/909/150 490/959/150
+f 428/847/127 426/824/127 490/823/127
+f 496/960/304 432/947/304 494/938/304
+f 463/831/116 464/830/116 465/961/116
+f 505/958/128 506/962/128 504/887/128
+f 415/857/109 413/799/109 416/801/109
+f 423/918/132 424/919/132 426/963/132
+f 526/955/336 524/885/336 523/884/336
+f 481/839/199 482/895/199 479/964/199
+f 500/902/298 436/965/298 498/966/298
+f 516/838/337 452/920/337 514/922/337
+f 507/956/95 509/967/95 508/957/95
+f 497/913/135 499/865/135 498/914/135
+f 447/968/338 448/969/338 450/970/338
+f 529/875/129 530/949/129 527/951/129
+f 478/882/279 480/896/279 414/883/279
+f 460/948/286 458/944/286 524/971/286
+f 425/972/147 426/963/147 427/973/147
+f 472/794/136 410/926/136 409/925/136
+f 485/952/139 486/832/139 483/834/139
+f 509/967/193 511/840/193 510/946/193
+f 508/957/164 506/962/164 505/958/164
+f 498/966/339 434/974/339 496/960/339
+f 477/854/314 478/853/314 475/975/314
+f 501/866/320 503/886/320 502/888/320
+f 455/976/157 453/879/157 456/881/157
+f 471/792/136 472/794/136 409/925/136
+f 457/977/170 458/843/170 459/845/170
+f 449/978/338 447/968/338 450/970/338
+f 493/908/198 495/904/198 494/906/198
+f 517/898/176 519/795/176 518/797/176
+f 465/961/184 466/979/184 467/933/184
+f 489/980/150 491/907/150 490/959/150
+f 482/868/299 484/927/299 418/869/299
+f 437/851/179 438/850/179 439/981/179
+f 439/981/158 440/811/158 441/813/158
+f 466/862/285 464/892/285 530/863/285
+f 442/814/295 440/859/295 506/815/295
+f 419/877/201 420/941/201 422/878/201
+f 415/857/168 416/801/168 418/858/168
+f 445/982/175 443/983/175 444/984/175
+f 466/979/184 468/890/184 467/933/184
+f 443/983/186 441/813/186 444/984/186
+f 430/936/191 432/945/191 431/937/191
+f 482/895/199 480/852/199 479/964/199
+f 431/937/167 432/945/167 433/930/167
+f 421/876/205 422/878/205 424/919/205
+f 514/922/280 450/921/280 512/934/280
+f 479/964/312 480/852/312 477/854/312
+f 426/963/147 428/954/147 427/973/147
+f 499/865/135 500/867/135 498/914/135
+f 484/927/300 486/802/300 420/928/300
+f 509/967/114 510/946/114 508/957/114
+f 457/977/310 455/910/310 458/843/310
+f 450/921/140 448/826/140 512/934/140
+f 444/942/315 442/814/315 508/816/315
+f 503/886/138 505/958/138 504/887/138
+f 447/968/112 445/982/112 448/969/112
+f 425/972/321 423/918/321 426/963/321
+f 510/828/296 446/827/296 508/816/296
+f 446/985/324 445/982/324 444/984/324
+f 427/973/183 428/954/183 429/935/183
+f 470/986/178 534/987/178 536/912/178
+f 524/971/340 526/924/340 460/948/340
+f 534/932/169 532/874/169 531/873/169
+f 440/859/133 504/861/133 506/815/133
+f 417/856/113 418/858/113 420/941/113
+f 441/813/186 442/812/186 444/984/186
+f 468/940/188 532/864/188 534/987/188
+f 438/860/192 502/901/192 504/861/192
+f 438/860/200 436/965/200 500/902/200
+f 536/809/204 534/932/204 533/931/204
+f 458/944/207 522/943/207 524/971/207
+f 478/853/110 476/805/110 475/975/110
+f 445/982/112 446/985/112 448/969/112
+f 414/883/131 412/818/131 476/817/131
+f 438/850/179 440/811/179 439/981/179
+f 459/845/115 460/844/115 461/835/115
+f 451/900/182 449/978/182 452/917/182
+f 464/830/116 466/979/116 465/961/116
+f 464/892/141 528/894/141 530/863/141
+f 515/897/143 516/899/143 514/939/143
+f 436/965/341 434/974/341 498/966/341
+f 470/986/291 468/940/291 534/987/291
+f 488/821/149 486/832/149 485/952/149
+f 501/866/152 502/888/152 500/867/152
+f 486/802/173 422/804/173 420/928/173
+f 449/978/182 450/970/182 452/917/182
+f 472/929/306 470/986/306 536/912/306
+f 495/904/317 497/913/317 496/905/317
+f 434/974/117 432/947/117 496/960/117
+f 532/874/119 530/949/119 529/875/119
+f 524/885/311 522/810/311 521/798/311
+f 475/975/121 476/805/121 473/807/121
+f 473/807/123 474/806/123 536/809/123
+f 454/837/125 452/920/125 516/838/125
+f 552/988/7 551/989/7 553/990/7
+f 538/991/8 600/992/8 537/993/8
+f 566/994/9 565/995/9 568/996/9
+f 570/997/10 568/996/10 569/998/10
+f 598/999/11 597/1000/11 600/992/11
+f 602/1001/12 601/1002/12 664/1003/12
+f 630/1004/13 632/1005/13 629/1006/13
+f 634/1007/14 633/1008/14 632/1005/14
+f 662/1009/15 664/1003/15 661/1010/15
+f 591/1011/16 593/1012/16 594/1013/16
+f 593/1014/17 657/1015/17 659/1016/17
+f 623/1017/257 625/1018/257 561/1019/257
+f 615/1020/19 617/1021/19 553/1022/19
+f 611/1023/20 547/1024/20 545/1025/20
+f 617/1021/21 619/1026/21 555/1027/21
+f 659/1016/342 661/1028/342 597/1029/342
+f 609/1030/343 545/1025/343 543/1031/343
+f 615/1020/24 551/1032/24 549/1033/24
+f 621/1034/25 623/1017/25 559/1035/25
+f 547/1024/26 611/1023/26 613/1036/26
+f 619/1026/27 621/1034/27 557/1037/27
+f 607/1038/260 543/1031/260 541/1039/260
+f 605/1040/261 541/1039/261 539/1041/261
+f 625/1018/262 627/1042/262 563/1043/262
+f 663/1044/31 601/1045/31 537/1046/31
+f 661/1028/32 663/1044/32 599/1047/32
+f 633/1048/344 569/1049/344 567/1050/344
+f 627/1042/34 629/1051/34 565/1052/34
+f 591/1053/35 655/1054/35 657/1015/35
+f 637/1055/36 639/1056/36 575/1057/36
+f 589/1058/37 653/1059/37 655/1054/37
+f 587/1060/38 651/1061/38 653/1059/38
+f 585/1062/39 649/1063/39 651/1061/39
+f 645/1064/40 647/1065/40 583/1066/40
+f 643/1067/41 645/1064/41 581/1068/41
+f 641/1069/42 643/1067/42 579/1070/42
+f 639/1056/43 641/1069/43 577/1071/43
+f 603/1072/44 539/1041/44 537/1046/44
+f 635/1073/45 637/1055/45 573/1074/45
+f 635/1073/46 571/1075/46 569/1049/46
+f 600/992/47 599/1076/47 537/993/47
+f 609/1077/48 607/1078/48 608/1079/48
+f 624/1080/49 623/1081/49 621/1082/49
+f 560/1083/345 559/1084/345 561/1085/345
+f 622/1086/51 621/1082/51 619/1087/51
+f 652/1088/52 651/1089/52 649/1090/52
+f 554/1091/53 553/990/53 555/1092/53
+f 618/1093/54 617/1094/54 615/1095/54
+f 549/1096/55 551/989/55 552/988/55
+f 620/1097/56 619/1087/56 617/1098/56
+f 545/1099/57 547/1100/57 548/1101/57
+f 543/1102/58 545/1099/58 546/1103/58
+f 562/1104/59 561/1085/59 563/1105/59
+f 539/1106/60 541/1107/60 542/1108/60
+f 537/993/61 539/1106/61 540/1109/61
+f 565/995/62 567/1110/62 568/996/62
+f 568/996/63 567/1110/63 569/998/63
+f 593/1012/64 595/1111/64 596/1112/64
+f 583/1066/65 647/1065/65 649/1063/65
+f 595/1111/66 597/1000/66 598/999/66
+f 631/1113/67 567/1050/67 565/1052/67
+f 589/1114/68 591/1011/68 592/1115/68
+f 587/1116/69 589/1114/69 590/1117/69
+f 626/1118/70 625/1119/70 623/1081/70
+f 654/1120/71 653/1121/71 651/1089/71
+f 580/1122/72 579/1123/72 581/1124/72
+f 578/1125/73 577/1126/73 579/1123/73
+f 576/1127/74 575/1128/74 577/1126/74
+f 574/1129/75 573/1130/75 575/1128/75
+f 572/1131/76 571/1132/76 573/1130/76
+f 570/997/77 569/998/77 571/1132/77
+f 597/1000/264 599/1076/264 600/992/264
+f 601/1002/12 663/1133/12 664/1003/12
+f 658/1134/79 657/1135/79 655/1136/79
+f 656/1137/80 655/1136/80 653/1121/80
+f 628/1138/81 627/1139/81 625/1119/81
+f 583/1140/82 585/1141/82 586/1142/82
+f 541/1107/83 543/1102/83 544/1143/83
+f 556/1144/84 555/1092/84 557/1145/84
+f 650/1146/85 649/1090/85 647/1147/85
+f 615/1095/86 613/1148/86 614/1149/86
+f 613/1148/87 611/1150/87 612/1151/87
+f 611/1150/88 609/1077/88 610/1152/88
+f 564/1153/89 563/1105/89 565/995/89
+f 607/1078/90 605/1154/90 606/1155/90
+f 605/1154/91 603/1156/91 604/1157/91
+f 604/1157/92 603/1156/92 601/1002/92
+f 632/1005/13 631/1158/13 629/1006/13
+f 633/1008/93 631/1158/93 632/1005/93
+f 585/1141/94 587/1116/94 588/1159/94
+f 662/1009/95 661/1010/95 659/1160/95
+f 660/1161/96 659/1160/96 657/1135/96
+f 628/1138/97 630/1004/97 629/1006/97
+f 582/1162/98 581/1124/98 583/1163/98
+f 558/1164/99 557/1145/99 559/1084/99
+f 547/1100/100 549/1096/100 550/1165/100
+f 647/1147/101 645/1166/101 646/1167/101
+f 645/1166/102 643/1168/102 644/1169/102
+f 643/1168/103 641/1170/103 642/1171/103
+f 641/1170/104 639/1172/104 640/1173/104
+f 639/1172/105 637/1174/105 638/1175/105
+f 637/1174/106 635/1176/106 636/1177/106
+f 635/1176/107 633/1008/107 634/1007/107
+f 664/1003/15 663/1133/15 661/1010/15
+f 554/1091/7 552/988/7 553/990/7
+f 592/1115/16 591/1011/16 594/1013/16
+f 595/1178/265 593/1014/265 659/1016/265
+f 559/1035/209 623/1017/209 561/1019/209
+f 551/1032/210 615/1020/210 553/1022/210
+f 609/1030/211 611/1023/211 545/1025/211
+f 553/1022/212 617/1021/212 555/1027/212
+f 595/1178/213 659/1016/213 597/1029/213
+f 607/1038/214 609/1030/214 543/1031/214
+f 613/1036/215 615/1020/215 549/1033/215
+f 557/1037/267 621/1034/267 559/1035/267
+f 549/1033/346 547/1024/346 613/1036/346
+f 555/1027/218 619/1026/218 557/1037/218
+f 605/1040/347 607/1038/347 541/1039/347
+f 603/1072/269 605/1040/269 539/1041/269
+f 561/1019/348 625/1018/348 563/1043/348
+f 599/1047/222 663/1044/222 537/1046/222
+f 597/1029/223 661/1028/223 599/1047/223
+f 631/1113/272 633/1048/272 567/1050/272
+f 563/1043/225 627/1042/225 565/1052/225
+f 593/1014/226 591/1053/226 657/1015/226
+f 573/1074/227 637/1055/227 575/1057/227
+f 591/1053/273 589/1058/273 655/1054/273
+f 589/1058/349 587/1060/349 653/1059/349
+f 587/1060/230 585/1062/230 651/1061/230
+f 581/1068/231 645/1064/231 583/1066/231
+f 579/1070/232 643/1067/232 581/1068/232
+f 577/1071/233 641/1069/233 579/1070/233
+f 575/1057/234 639/1056/234 577/1071/234
+f 601/1045/350 603/1072/350 537/1046/350
+f 571/1075/236 635/1073/236 573/1074/236
+f 633/1048/276 635/1073/276 569/1049/276
+f 610/1152/48 609/1077/48 608/1079/48
+f 622/1086/238 624/1080/238 621/1082/238
+f 562/1104/50 560/1083/50 561/1085/50
+f 620/1097/239 622/1086/239 619/1087/239
+f 650/1146/52 652/1088/52 649/1090/52
+f 556/1144/53 554/1091/53 555/1092/53
+f 616/1179/54 618/1093/54 615/1095/54
+f 550/1165/240 549/1096/240 552/988/240
+f 618/1180/56 620/1097/56 617/1098/56
+f 546/1103/57 545/1099/57 548/1101/57
+f 544/1143/58 543/1102/58 546/1103/58
+f 564/1153/59 562/1104/59 563/1105/59
+f 540/1109/60 539/1106/60 542/1108/60
+f 538/991/241 537/993/241 540/1109/241
+f 594/1013/242 593/1012/242 596/1112/242
+f 585/1062/243 583/1066/243 649/1063/243
+f 596/1112/277 595/1111/277 598/999/277
+f 629/1051/351 631/1113/351 565/1052/351
+f 590/1117/246 589/1114/246 592/1115/246
+f 588/1159/69 587/1116/69 590/1117/69
+f 624/1080/70 626/1118/70 623/1081/70
+f 652/1088/71 654/1120/71 651/1089/71
+f 582/1162/247 580/1122/247 581/1124/247
+f 580/1122/73 578/1125/73 579/1123/73
+f 578/1125/248 576/1127/248 577/1126/248
+f 576/1127/75 574/1129/75 575/1128/75
+f 574/1129/249 572/1131/249 573/1130/249
+f 572/1131/250 570/997/250 571/1132/250
+f 656/1137/79 658/1134/79 655/1136/79
+f 654/1120/80 656/1137/80 653/1121/80
+f 626/1118/81 628/1138/81 625/1119/81
+f 584/1181/82 583/1140/82 586/1142/82
+f 542/1108/83 541/1107/83 544/1143/83
+f 558/1164/84 556/1144/84 557/1145/84
+f 648/1182/85 650/1146/85 647/1147/85
+f 616/1179/86 615/1095/86 614/1149/86
+f 614/1149/87 613/1148/87 612/1151/87
+f 612/1151/88 611/1150/88 610/1152/88
+f 566/994/251 564/1153/251 565/995/251
+f 608/1079/90 607/1078/90 606/1155/90
+f 606/1155/91 605/1154/91 604/1157/91
+f 602/1001/252 604/1157/252 601/1002/252
+f 586/1142/94 585/1141/94 588/1159/94
+f 660/1161/95 662/1009/95 659/1160/95
+f 658/1134/96 660/1161/96 657/1135/96
+f 627/1139/254 628/1138/254 629/1006/254
+f 584/1183/255 582/1162/255 583/1163/255
+f 560/1083/99 558/1164/99 559/1084/99
+f 548/1101/100 547/1100/100 550/1165/100
+f 648/1182/256 647/1147/256 646/1167/256
+f 646/1167/102 645/1166/102 644/1169/102
+f 644/1169/103 643/1168/103 642/1171/103
+f 642/1171/104 641/1170/104 640/1173/104
+f 640/1173/105 639/1172/105 638/1175/105
+f 638/1175/106 637/1174/106 636/1177/106
+f 636/1177/107 635/1176/107 634/1007/107
+f 727/1184/323 725/1185/323 728/1186/323
+f 775/1187/176 776/1188/176 774/1189/176
+f 775/1187/130 777/1190/130 776/1188/130
+f 669/1191/109 670/1192/109 672/1193/109
+f 742/1194/301 744/1195/301 678/1196/301
+f 732/1197/325 730/1198/325 729/1199/325
+f 791/1200/93 729/1199/93 792/1201/93
+f 777/1190/130 778/1202/130 776/1188/130
+f 696/1203/111 698/1204/111 697/1205/111
+f 698/1206/352 762/1207/352 764/1208/352
+f 732/1209/326 668/1210/326 730/1211/326
+f 746/1212/194 744/1213/194 743/1214/194
+f 746/1215/144 682/1216/144 680/1217/144
+f 704/1218/327 702/1219/327 766/1220/327
+f 718/1221/190 720/1222/190 719/1223/190
+f 742/1224/139 740/1225/139 739/1226/139
+f 717/1227/190 718/1221/190 719/1223/190
+f 774/1228/289 710/1229/289 772/1230/289
+f 739/1226/171 740/1225/171 737/1231/171
+f 767/1232/309 769/1233/309 768/1234/309
+f 714/1235/170 716/1236/170 715/1237/170
+f 686/1238/177 684/1239/177 748/1240/177
+f 692/1241/159 694/1242/159 693/1243/159
+f 736/1244/151 734/1245/151 733/1246/151
+f 691/1247/159 692/1241/159 693/1243/159
+f 673/1248/168 671/1249/168 674/1250/168
+f 696/1251/353 694/1252/353 760/1253/353
+f 722/1254/354 786/1255/354 788/1256/354
+f 755/1257/319 757/1258/319 756/1259/319
+f 738/1260/355 674/1261/355 672/1262/355
+f 776/1263/283 712/1264/283 774/1228/283
+f 787/1265/356 788/1266/356 785/1267/356
+f 677/1268/201 675/1269/201 678/1270/201
+f 744/1195/313 746/1215/313 680/1217/313
+f 709/1271/157 710/1272/157 712/1273/157
+f 716/1236/115 718/1221/115 717/1227/115
+f 734/1274/357 670/1275/357 732/1209/357
+f 779/1276/311 780/1277/311 777/1190/311
+f 759/1278/202 760/1279/202 758/1280/202
+f 712/1264/153 710/1229/153 774/1228/153
+f 745/1281/194 746/1212/194 743/1214/194
+f 724/1282/122 726/1283/122 725/1185/122
+f 720/1284/282 718/1285/282 784/1286/282
+f 740/1225/171 738/1287/171 737/1231/171
+f 736/1288/358 738/1260/358 672/1262/358
+f 771/1289/359 773/1290/359 772/1291/359
+f 709/1271/206 707/1292/206 710/1272/206
+f 758/1293/360 694/1252/360 756/1294/360
+f 668/1210/361 666/1295/361 730/1211/361
+f 751/1296/198 752/1297/198 750/1298/198
+f 747/1299/154 749/1300/154 748/1301/154
+f 711/1302/118 712/1303/118 714/1235/118
+f 730/1211/362 666/1295/362 792/1304/362
+f 753/1305/174 754/1306/174 752/1297/174
+f 667/1307/185 668/1308/185 670/1192/185
+f 748/1240/363 684/1239/363 746/1215/363
+f 707/1292/206 708/1309/206 710/1272/206
+f 679/1310/205 677/1268/205 680/1311/205
+f 708/1312/364 706/1313/364 770/1314/364
+f 690/1315/137 692/1241/137 691/1247/137
+f 744/1195/126 680/1217/126 678/1196/126
+f 718/1285/365 782/1316/365 784/1286/365
+f 665/1317/166 666/1318/166 668/1308/166
+f 740/1319/366 676/1320/366 674/1261/366
+f 666/1295/162 728/1321/162 792/1304/162
+f 689/1322/137 690/1315/137 691/1247/137
+f 749/1300/154 750/1298/154 748/1301/154
+f 789/1323/169 790/1324/169 787/1265/169
+f 791/1200/107 792/1201/107 789/1323/107
+f 723/1325/122 724/1282/122 725/1185/122
+f 768/1326/330 704/1218/330 766/1220/330
+f 685/1327/191 686/1328/191 687/1329/191
+f 750/1330/303 686/1238/303 748/1240/303
+f 769/1233/309 770/1331/309 768/1234/309
+f 724/1332/290 722/1254/290 788/1256/290
+f 675/1269/113 673/1248/113 676/1333/113
+f 736/1288/108 672/1262/108 670/1275/108
+f 669/1191/185 667/1307/185 670/1192/185
+f 773/1290/331 774/1189/331 772/1291/331
+f 702/1219/332 700/1334/332 764/1208/332
+f 778/1335/367 714/1336/367 776/1263/367
+f 688/1337/167 690/1315/167 689/1322/167
+f 767/1232/193 768/1234/193 766/1338/193
+f 688/1339/155 686/1238/155 750/1330/155
+f 725/1185/172 726/1283/172 728/1186/172
+f 782/1316/368 718/1285/368 716/1340/368
+f 786/1341/129 784/1342/129 783/1343/129
+f 743/1214/149 744/1213/149 741/1344/149
+f 783/1343/165 784/1342/165 781/1345/165
+f 684/1346/335 686/1328/335 685/1327/335
+f 769/1233/143 771/1289/143 770/1331/143
+f 781/1345/146 782/1347/146 779/1276/146
+f 784/1342/165 782/1347/165 781/1345/165
+f 667/1307/166 665/1317/166 668/1308/166
+f 714/1336/134 712/1264/134 776/1263/134
+f 763/1348/15 764/1349/15 761/1350/15
+f 747/1299/150 748/1301/150 746/1351/150
+f 684/1239/369 682/1216/369 746/1215/369
+f 752/1352/304 688/1339/304 750/1330/304
+f 719/1223/116 720/1222/116 721/1353/116
+f 761/1350/128 762/1354/128 760/1279/128
+f 671/1249/109 669/1191/109 672/1193/109
+f 679/1310/132 680/1311/132 682/1355/132
+f 782/1347/146 780/1277/146 779/1276/146
+f 737/1231/199 738/1287/199 735/1356/199
+f 756/1294/298 692/1357/298 754/1358/298
+f 772/1230/337 708/1312/337 770/1314/337
+f 763/1348/95 765/1359/95 764/1349/95
+f 753/1305/135 755/1257/135 754/1306/135
+f 703/1360/338 704/1361/338 706/1362/338
+f 785/1267/129 786/1341/129 783/1343/129
+f 734/1274/370 736/1288/370 670/1275/370
+f 716/1340/371 714/1336/371 780/1363/371
+f 681/1364/147 682/1355/147 683/1365/147
+f 728/1186/136 666/1318/136 665/1317/136
+f 741/1344/139 742/1224/139 739/1226/139
+f 765/1359/193 767/1232/193 766/1338/193
+f 764/1349/164 762/1354/164 761/1350/164
+f 754/1358/305 690/1366/305 752/1352/305
+f 733/1246/314 734/1245/314 731/1367/314
+f 757/1258/320 759/1278/320 758/1280/320
+f 711/1368/157 709/1271/157 712/1273/157
+f 727/1184/136 728/1186/136 665/1317/136
+f 713/1369/170 714/1235/170 715/1237/170
+f 705/1370/338 703/1360/338 706/1362/338
+f 749/1300/198 751/1296/198 750/1298/198
+f 773/1290/176 775/1187/176 774/1189/176
+f 721/1353/184 722/1371/184 723/1325/184
+f 745/1372/150 747/1299/150 746/1351/150
+f 738/1260/299 740/1319/299 674/1261/299
+f 693/1243/179 694/1242/179 695/1373/179
+f 695/1373/158 696/1203/158 697/1205/158
+f 722/1254/372 720/1284/372 786/1255/372
+f 698/1206/373 696/1251/373 762/1207/373
+f 675/1269/201 676/1333/201 678/1270/201
+f 671/1249/168 672/1193/168 674/1250/168
+f 701/1374/175 699/1375/175 700/1376/175
+f 722/1371/374 724/1282/374 723/1325/374
+f 699/1375/375 697/1205/375 700/1376/375
+f 686/1328/191 688/1337/191 687/1329/191
+f 738/1287/199 736/1244/199 735/1356/199
+f 687/1329/167 688/1337/167 689/1322/167
+f 677/1268/205 678/1270/205 680/1311/205
+f 770/1314/280 706/1313/280 768/1326/280
+f 735/1356/312 736/1244/312 733/1246/312
+f 682/1355/147 684/1346/147 683/1365/147
+f 755/1257/135 756/1259/135 754/1306/135
+f 740/1319/300 742/1194/300 676/1320/300
+f 765/1359/114 766/1338/114 764/1349/114
+f 713/1369/310 711/1302/310 714/1235/310
+f 706/1313/376 704/1218/376 768/1326/376
+f 700/1334/315 698/1206/315 764/1208/315
+f 759/1278/138 761/1350/138 760/1279/138
+f 703/1360/112 701/1374/112 704/1361/112
+f 681/1364/321 679/1310/321 682/1355/321
+f 766/1220/377 702/1219/377 764/1208/377
+f 702/1377/324 701/1374/324 700/1376/324
+f 683/1365/183 684/1346/183 685/1327/183
+f 726/1378/178 790/1379/178 792/1304/178
+f 780/1363/378 782/1316/378 716/1340/378
+f 790/1324/379 788/1266/379 787/1265/379
+f 696/1251/380 760/1253/380 762/1207/380
+f 673/1248/113 674/1250/113 676/1333/113
+f 697/1205/375 698/1204/375 700/1376/375
+f 724/1332/381 788/1256/381 790/1379/381
+f 694/1252/382 758/1293/382 760/1253/382
+f 694/1252/383 692/1357/383 756/1294/383
+f 792/1201/204 790/1324/204 789/1323/204
+f 714/1336/207 778/1335/207 780/1363/207
+f 734/1245/110 732/1197/110 731/1367/110
+f 701/1374/112 702/1377/112 704/1361/112
+f 670/1275/384 668/1210/384 732/1209/384
+f 694/1242/179 696/1203/179 695/1373/179
+f 715/1237/115 716/1236/115 717/1227/115
+f 707/1292/182 705/1370/182 708/1309/182
+f 720/1222/116 722/1371/116 721/1353/116
+f 720/1284/141 784/1286/141 786/1255/141
+f 771/1289/143 772/1291/143 770/1331/143
+f 692/1357/145 690/1366/145 754/1358/145
+f 726/1378/385 724/1332/385 790/1379/385
+f 744/1213/149 742/1224/149 741/1344/149
+f 757/1258/152 758/1280/152 756/1259/152
+f 742/1194/173 678/1196/173 676/1320/173
+f 705/1370/182 706/1362/182 708/1309/182
+f 728/1321/306 726/1378/306 792/1304/306
+f 751/1296/317 753/1305/317 752/1297/317
+f 690/1366/117 688/1339/117 752/1352/117
+f 788/1266/356 786/1341/356 785/1267/356
+f 780/1277/311 778/1202/311 777/1190/311
+f 731/1367/121 732/1197/121 729/1199/121
+f 729/1199/123 730/1198/123 792/1201/123
+f 710/1229/125 708/1312/125 772/1230/125
+g KsHauptsignal_Plane.006_Lights
+usemtl Lights
+f 88/1380/386 28/1381/386 40/1382/386
+f 40/1382/387 44/1383/387 56/1384/387
+f 88/1380/388 64/1385/388 72/1386/388
+f 72/1386/388 76/1387/388 88/1380/388
+f 40/1382/387 28/1381/387 32/1388/387
+f 32/1388/387 34/1389/387 40/1382/387
+f 56/1384/387 44/1383/387 48/1390/387
+f 48/1390/387 52/1391/387 56/1384/387
+f 56/1384/389 58/1392/389 64/1385/389
+f 64/1385/388 68/1393/388 70/1394/388
+f 88/1380/388 76/1387/388 80/1395/388
+f 80/1395/388 84/1396/388 88/1380/388
+f 88/1380/390 26/1397/390 28/1381/390
+f 28/1381/391 30/1398/391 32/1388/391
+f 40/1382/387 34/1389/387 36/1399/387
+f 36/1399/386 38/1400/386 40/1382/386
+f 40/1382/392 42/1401/392 44/1383/392
+f 44/1383/386 46/1402/386 48/1390/386
+f 48/1390/387 50/1403/387 52/1391/387
+f 52/1391/387 54/1404/387 56/1384/387
+f 64/1385/393 58/1392/393 60/1405/393
+f 60/1405/394 62/1406/394 64/1385/394
+f 64/1385/388 66/1407/388 68/1393/388
+f 64/1385/388 70/1394/388 72/1386/388
+f 72/1386/395 74/1408/395 76/1387/395
+f 76/1387/396 78/1409/396 80/1395/396
+f 80/1395/397 82/1410/397 84/1396/397
+f 84/1396/398 86/1411/398 88/1380/398
+f 64/1385/399 88/1380/399 40/1382/399
+f 156/1412/400 158/1413/400 160/1414/400
+f 200/1415/401 204/1416/401 216/1417/401
+f 192/1418/402 186/1419/402 188/1420/402
+f 176/1421/400 180/1422/400 184/1423/400
+f 212/1424/403 214/1425/403 216/1417/403
+f 188/1420/401 190/1426/401 192/1418/401
+f 192/1418/401 196/1427/401 198/1428/401
+f 184/1423/404 172/1429/404 176/1421/404
+f 204/1416/401 206/1430/401 208/1431/401
+f 200/1415/405 202/1432/405 204/1416/405
+f 216/1417/401 192/1418/401 200/1415/401
+f 168/1433/406 162/1434/406 164/1435/406
+f 164/1435/407 166/1436/407 168/1433/407
+f 160/1414/408 162/1434/408 168/1433/408
+f 176/1421/400 178/1437/400 180/1422/400
+f 208/1431/409 210/1438/409 212/1424/409
+f 168/1433/410 170/1439/410 172/1429/410
+f 168/1433/408 172/1429/408 184/1423/408
+f 168/1433/408 156/1412/408 160/1414/408
+f 180/1422/408 182/1440/408 184/1423/408
+f 208/1431/401 212/1424/401 216/1417/401
+f 216/1417/401 204/1416/401 208/1431/401
+f 192/1418/401 194/1441/401 196/1427/401
+f 184/1423/411 186/1419/411 192/1418/411
+f 192/1418/412 198/1428/412 200/1415/412
+f 216/1417/407 156/1412/407 168/1433/407
+f 216/1417/413 154/1442/413 156/1412/413
+f 172/1429/414 174/1443/414 176/1421/414
+f 192/1418/415 216/1417/415 168/1433/415
+f 56/1384/389 64/1385/389 40/1382/389
+f 344/1444/386 284/1445/386 296/1446/386
+f 296/1446/387 300/1447/387 312/1448/387
+f 344/1444/388 320/1449/388 328/1450/388
+f 328/1450/388 332/1451/388 344/1444/388
+f 296/1446/387 284/1445/387 288/1452/387
+f 288/1452/386 290/1453/386 296/1446/386
+f 312/1448/387 300/1447/387 304/1454/387
+f 304/1454/386 308/1455/386 312/1448/386
+f 312/1448/389 314/1456/389 320/1449/389
+f 320/1449/388 324/1457/388 326/1458/388
+f 344/1444/388 332/1451/388 336/1459/388
+f 336/1459/388 340/1460/388 344/1444/388
+f 344/1444/390 282/1461/390 284/1445/390
+f 284/1445/387 286/1462/387 288/1452/387
+f 296/1446/387 290/1453/387 292/1463/387
+f 292/1463/386 294/1464/386 296/1446/386
+f 296/1446/392 298/1465/392 300/1447/392
+f 300/1447/386 302/1466/386 304/1454/386
+f 304/1454/387 306/1467/387 308/1455/387
+f 308/1455/416 310/1468/416 312/1448/416
+f 320/1449/417 314/1456/417 316/1469/417
+f 316/1469/388 318/1470/388 320/1449/388
+f 320/1449/388 322/1471/388 324/1457/388
+f 320/1449/396 326/1458/396 328/1450/396
+f 328/1450/395 330/1472/395 332/1451/395
+f 332/1451/388 334/1473/388 336/1459/388
+f 336/1459/388 338/1474/388 340/1460/388
+f 340/1460/398 342/1475/398 344/1444/398
+f 320/1449/399 344/1444/399 296/1446/399
+f 312/1448/389 320/1449/389 296/1446/389
+f 184/1423/418 192/1418/418 168/1433/418
+f 509/1476/408 507/1477/408 505/1478/408
+f 521/1479/406 527/1480/406 525/1481/406
+f 473/1482/407 533/1483/407 521/1479/407
+f 521/1479/419 519/1484/419 517/1485/419
+f 517/1485/420 515/1486/420 513/1487/420
+f 533/1483/400 531/1488/400 529/1489/400
+f 497/1490/401 495/1491/401 493/1492/401
+f 489/1493/405 487/1494/405 485/1495/405
+f 477/1496/421 475/1497/421 473/1482/421
+f 473/1482/401 497/1490/401 489/1493/401
+f 497/1490/402 503/1498/402 501/1499/402
+f 505/1478/408 517/1485/408 513/1487/408
+f 473/1482/413 535/1500/413 533/1483/413
+f 481/1501/401 477/1496/401 473/1482/401
+f 497/1490/415 473/1482/415 521/1479/415
+f 501/1499/422 499/1502/422 497/1490/422
+f 497/1490/401 493/1492/401 491/1503/401
+f 521/1479/408 517/1485/408 505/1478/408
+f 505/1478/418 497/1490/418 521/1479/418
+f 473/1482/401 485/1495/401 481/1501/401
+f 497/1490/412 491/1503/412 489/1493/412
+f 529/1489/408 527/1480/408 521/1479/408
+f 521/1479/408 533/1483/408 529/1489/408
+f 481/1501/409 479/1504/409 477/1496/409
+f 505/1478/411 503/1498/411 497/1490/411
+f 513/1487/408 511/1505/408 509/1476/408
+f 489/1493/401 485/1495/401 473/1482/401
+f 513/1487/400 509/1476/400 505/1478/400
+f 525/1481/423 523/1506/423 521/1479/423
+f 485/1495/401 483/1507/401 481/1501/401
+f 600/1508/386 540/1509/386 552/1510/386
+f 552/1510/387 556/1511/387 568/1512/387
+f 600/1508/388 576/1513/388 584/1514/388
+f 584/1514/388 588/1515/388 600/1508/388
+f 552/1510/387 540/1509/387 544/1516/387
+f 544/1516/386 546/1517/386 552/1510/386
+f 568/1512/387 556/1511/387 560/1518/387
+f 560/1518/386 564/1519/386 568/1512/386
+f 568/1512/424 570/1520/424 576/1513/424
+f 576/1513/388 580/1521/388 582/1522/388
+f 600/1508/388 588/1515/388 592/1523/388
+f 592/1523/388 596/1524/388 600/1508/388
+f 600/1508/425 538/1525/425 540/1509/425
+f 540/1509/391 542/1526/391 544/1516/391
+f 552/1510/387 546/1517/387 548/1527/387
+f 548/1527/386 550/1528/386 552/1510/386
+f 552/1510/392 554/1529/392 556/1511/392
+f 556/1511/386 558/1530/386 560/1518/386
+f 560/1518/386 562/1531/386 564/1519/386
+f 564/1519/416 566/1532/416 568/1512/416
+f 576/1513/393 570/1520/393 572/1533/393
+f 572/1533/388 574/1534/388 576/1513/388
+f 576/1513/396 578/1535/396 580/1521/396
+f 576/1513/388 582/1522/388 584/1514/388
+f 584/1514/395 586/1536/395 588/1515/395
+f 588/1515/396 590/1537/396 592/1523/396
+f 592/1523/397 594/1538/397 596/1524/397
+f 596/1524/426 598/1539/426 600/1508/426
+f 576/1513/399 600/1508/399 552/1510/399
+f 568/1512/389 576/1513/389 552/1510/389
+f 765/1540/407 763/1541/407 761/1542/407
+f 777/1543/406 783/1544/406 781/1545/406
+f 729/1546/407 789/1547/407 777/1543/407
+f 777/1543/427 775/1548/427 773/1549/427
+f 773/1549/407 771/1550/407 769/1551/407
+f 789/1547/406 787/1552/406 785/1553/406
+f 753/1554/412 751/1555/412 749/1556/412
+f 745/1557/405 743/1558/405 741/1559/405
+f 733/1560/428 731/1561/428 729/1546/428
+f 729/1546/401 753/1554/401 745/1557/401
+f 753/1554/402 759/1562/402 757/1563/402
+f 761/1542/404 773/1549/404 769/1551/404
+f 729/1546/429 791/1564/429 789/1547/429
+f 737/1565/430 733/1560/430 729/1546/430
+f 753/1554/415 729/1546/415 777/1543/415
+f 757/1563/401 755/1566/401 753/1554/401
+f 753/1554/401 749/1556/401 747/1567/401
+f 777/1543/408 773/1549/408 761/1542/408
+f 761/1542/418 753/1554/418 777/1543/418
+f 729/1546/401 741/1559/401 737/1565/401
+f 753/1554/412 747/1567/412 745/1557/412
+f 785/1553/408 783/1544/408 777/1543/408
+f 777/1543/408 789/1547/408 785/1553/408
+f 737/1565/422 735/1568/422 733/1560/422
+f 761/1542/411 759/1562/411 753/1554/411
+f 769/1551/408 767/1569/408 765/1540/408
+f 745/1557/401 741/1559/401 729/1546/401
+f 769/1551/400 765/1540/400 761/1542/400
+f 781/1545/407 779/1570/407 777/1543/407
+f 741/1559/401 739/1571/401 737/1565/401
+l 794 795
+l 796 793
+l 795 796
+l 798 799
+l 799 800
+l 797 798
+l 826 827
+l 828 825
+l 827 828
+l 830 831
+l 831 832
+l 829 830
diff --git a/advtrains/advtrains_signals_ks/models/advtrains_signals_ks_main_smr45.obj b/advtrains/advtrains_signals_ks/models/advtrains_signals_ks_main_smr45.obj
new file mode 100644
index 0000000..50ded48
--- /dev/null
+++ b/advtrains/advtrains_signals_ks/models/advtrains_signals_ks_main_smr45.obj
@@ -0,0 +1,4301 @@
+# Blender v2.79 (sub 0) OBJ File: 'signal_ks_singlemesh_final.blend'
+# www.blender.org
+mtllib advtrains_signals_ks_main_smr45.mtl
+o KsHauptsignal_Plane.006
+v 0.331265 -0.503378 -0.290411
+v 0.290873 -0.503378 -0.330859
+v 0.331321 -0.503378 -0.371251
+v 0.371713 -0.503378 -0.330803
+v 0.250573 -0.503378 -0.209831
+v 0.210124 -0.503378 -0.169439
+v 0.169732 -0.503378 -0.209888
+v 0.210181 -0.503378 -0.250280
+v 0.331265 -0.299114 -0.290411
+v 0.331265 -0.172218 -0.290411
+v 0.290873 -0.172218 -0.330859
+v 0.290873 -0.299114 -0.330859
+v 0.331321 -0.299114 -0.371251
+v 0.331321 -0.172218 -0.371251
+v 0.371713 -0.172218 -0.330803
+v 0.371713 -0.299114 -0.330803
+v 0.250573 -0.299114 -0.209831
+v 0.250573 -0.172218 -0.209831
+v 0.210124 -0.172218 -0.169439
+v 0.210124 -0.299114 -0.169439
+v 0.169732 -0.299114 -0.209888
+v 0.169732 -0.172218 -0.209888
+v 0.210181 -0.172218 -0.250280
+v 0.210181 -0.299114 -0.250280
+v 0.319133 0.243339 -0.510336
+v 0.300056 0.242789 -0.491285
+v 0.358510 0.253858 -0.545204
+v 0.302250 0.253308 -0.489023
+v 0.362113 0.263561 -0.541535
+v 0.305853 0.263011 -0.485353
+v 0.366988 0.272074 -0.536599
+v 0.310728 0.271524 -0.480418
+v 0.372947 0.279070 -0.530588
+v 0.316687 0.278520 -0.474406
+v 0.379761 0.284280 -0.523731
+v 0.323501 0.283730 -0.467550
+v 0.387168 0.287504 -0.516293
+v 0.330908 0.286954 -0.460112
+v 0.394884 0.288619 -0.508560
+v 0.338624 0.288069 -0.452378
+v 0.402613 0.287581 -0.500827
+v 0.346352 0.287030 -0.444645
+v 0.410056 0.284430 -0.493393
+v 0.353796 0.283880 -0.437212
+v 0.416928 0.279287 -0.486544
+v 0.360668 0.278737 -0.430362
+v 0.422965 0.272350 -0.480542
+v 0.366705 0.271800 -0.424360
+v 0.427935 0.263886 -0.475618
+v 0.371675 0.263336 -0.419436
+v 0.431648 0.254219 -0.471962
+v 0.375388 0.253669 -0.415780
+v 0.396776 0.243722 -0.432582
+v 0.377699 0.243172 -0.413532
+v 0.397576 0.232316 -0.431777
+v 0.378521 0.232252 -0.412777
+v 0.396693 0.221688 -0.432437
+v 0.377820 0.221322 -0.413543
+v 0.394516 0.211344 -0.434671
+v 0.375622 0.210797 -0.415801
+v 0.390909 0.201642 -0.438338
+v 0.372015 0.201094 -0.419468
+v 0.386032 0.193129 -0.443270
+v 0.367137 0.192581 -0.424400
+v 0.380070 0.186134 -0.449279
+v 0.361176 0.185585 -0.430409
+v 0.373254 0.180924 -0.456134
+v 0.354360 0.180374 -0.437264
+v 0.365846 0.177700 -0.463570
+v 0.346951 0.177150 -0.444701
+v 0.358130 0.176585 -0.471304
+v 0.339234 0.176035 -0.452434
+v 0.350402 0.177623 -0.479036
+v 0.331506 0.177073 -0.460168
+v 0.342960 0.180774 -0.486471
+v 0.324064 0.180224 -0.467602
+v 0.336090 0.185916 -0.493322
+v 0.317193 0.185367 -0.474454
+v 0.330055 0.192853 -0.499326
+v 0.311159 0.192304 -0.480458
+v 0.325088 0.201317 -0.504253
+v 0.306191 0.200769 -0.485385
+v 0.321379 0.210983 -0.507913
+v 0.302483 0.210436 -0.489045
+v 0.319096 0.221305 -0.510144
+v 0.300175 0.220938 -0.491298
+v 0.318385 0.231924 -0.511081
+v 0.299357 0.231861 -0.492054
+v 0.317383 0.243790 -0.512081
+v 0.272458 0.243271 -0.467219
+v 0.356857 0.254782 -0.546846
+v 0.274749 0.254264 -0.464853
+v 0.360620 0.264921 -0.543010
+v 0.278512 0.264402 -0.461016
+v 0.365713 0.273816 -0.537851
+v 0.283605 0.273298 -0.455858
+v 0.371938 0.281127 -0.531568
+v 0.289830 0.280609 -0.449575
+v 0.379058 0.286572 -0.524403
+v 0.296950 0.286053 -0.442409
+v 0.386798 0.289941 -0.516630
+v 0.304690 0.289423 -0.434636
+v 0.394860 0.291105 -0.508548
+v 0.312752 0.290587 -0.426555
+v 0.402936 0.290021 -0.500468
+v 0.320828 0.289502 -0.418475
+v 0.410714 0.286728 -0.492701
+v 0.328606 0.286210 -0.410707
+v 0.417897 0.281354 -0.485544
+v 0.335789 0.280836 -0.403551
+v 0.424207 0.274105 -0.479274
+v 0.342099 0.273587 -0.397280
+v 0.429402 0.265261 -0.474130
+v 0.347294 0.264742 -0.392137
+v 0.433283 0.255160 -0.470311
+v 0.351175 0.254641 -0.388318
+v 0.398517 0.244190 -0.430832
+v 0.353592 0.243672 -0.385970
+v 0.399340 0.232775 -0.430008
+v 0.354453 0.232256 -0.385184
+v 0.398467 0.221351 -0.430670
+v 0.353724 0.220833 -0.385989
+v 0.396177 0.210359 -0.433036
+v 0.351434 0.209840 -0.388356
+v 0.392414 0.200220 -0.436873
+v 0.347670 0.199702 -0.392192
+v 0.387321 0.191324 -0.442031
+v 0.342578 0.190806 -0.397351
+v 0.381096 0.184013 -0.448314
+v 0.336352 0.183495 -0.403634
+v 0.373976 0.178569 -0.455480
+v 0.329233 0.178051 -0.410799
+v 0.366236 0.175200 -0.463253
+v 0.321493 0.174682 -0.418572
+v 0.358174 0.174035 -0.471335
+v 0.313430 0.173517 -0.426654
+v 0.350098 0.175120 -0.479415
+v 0.305355 0.174602 -0.434734
+v 0.342319 0.178413 -0.487182
+v 0.297576 0.177894 -0.442501
+v 0.335137 0.183787 -0.494339
+v 0.290394 0.183268 -0.449658
+v 0.328827 0.191035 -0.500609
+v 0.284084 0.190517 -0.455928
+v 0.323632 0.199880 -0.505753
+v 0.278889 0.199362 -0.461072
+v 0.319751 0.209981 -0.509572
+v 0.275008 0.209463 -0.464891
+v 0.317334 0.220950 -0.511919
+v 0.272591 0.220432 -0.467239
+v 0.316617 0.232366 -0.512849
+v 0.271730 0.231848 -0.468025
+v 0.483236 0.506097 -0.346004
+v 0.464159 0.505869 -0.326953
+v 0.521307 0.510448 -0.382180
+v 0.465047 0.510220 -0.325998
+v 0.522780 0.514461 -0.380644
+v 0.466519 0.514233 -0.324462
+v 0.524780 0.517982 -0.378587
+v 0.468520 0.517755 -0.322405
+v 0.527232 0.520876 -0.376087
+v 0.470972 0.520648 -0.319906
+v 0.530041 0.523031 -0.373242
+v 0.473780 0.522803 -0.317060
+v 0.533098 0.524364 -0.370159
+v 0.476838 0.524137 -0.313978
+v 0.536288 0.524825 -0.366958
+v 0.480028 0.524598 -0.310777
+v 0.539486 0.524396 -0.363762
+v 0.483226 0.524168 -0.307580
+v 0.542571 0.523093 -0.360693
+v 0.486311 0.522865 -0.304511
+v 0.545423 0.520966 -0.357870
+v 0.489163 0.520738 -0.301688
+v 0.547933 0.518097 -0.355400
+v 0.491673 0.517869 -0.299218
+v 0.550004 0.514596 -0.353379
+v 0.493744 0.514368 -0.297197
+v 0.551558 0.510597 -0.351884
+v 0.495298 0.510370 -0.295703
+v 0.515350 0.506255 -0.313842
+v 0.496273 0.506028 -0.294792
+v 0.515680 0.501537 -0.313508
+v 0.496633 0.501511 -0.294500
+v 0.515249 0.497142 -0.313715
+v 0.496362 0.496990 -0.294835
+v 0.514364 0.492863 -0.314656
+v 0.495469 0.492637 -0.295786
+v 0.512889 0.488850 -0.316188
+v 0.493994 0.488624 -0.297319
+v 0.510885 0.485329 -0.318242
+v 0.491990 0.485102 -0.299373
+v 0.508431 0.482436 -0.320739
+v 0.489536 0.482209 -0.301870
+v 0.505620 0.480281 -0.323583
+v 0.486725 0.480054 -0.304714
+v 0.502561 0.478947 -0.326664
+v 0.483666 0.478720 -0.307795
+v 0.499371 0.478486 -0.329865
+v 0.480476 0.478259 -0.310996
+v 0.496174 0.478915 -0.333061
+v 0.477278 0.478688 -0.314193
+v 0.493090 0.480219 -0.336131
+v 0.474194 0.479992 -0.317262
+v 0.490240 0.482346 -0.338957
+v 0.471344 0.482119 -0.320088
+v 0.487732 0.485215 -0.341429
+v 0.468837 0.484988 -0.322560
+v 0.485664 0.488716 -0.343453
+v 0.466768 0.488489 -0.324584
+v 0.484114 0.492714 -0.344951
+v 0.465218 0.492488 -0.326082
+v 0.483154 0.496983 -0.345857
+v 0.464247 0.496832 -0.326997
+v 0.482925 0.501376 -0.346310
+v 0.463890 0.501349 -0.327291
+v 0.482510 0.506283 -0.346724
+v 0.437586 0.506069 -0.301861
+v 0.520619 0.510830 -0.382855
+v 0.438511 0.510615 -0.300861
+v 0.522156 0.515023 -0.381248
+v 0.440048 0.514809 -0.299255
+v 0.524245 0.518703 -0.379097
+v 0.442137 0.518489 -0.297104
+v 0.526806 0.521727 -0.376484
+v 0.444698 0.521512 -0.294491
+v 0.529740 0.523979 -0.373510
+v 0.447632 0.523764 -0.291516
+v 0.532935 0.525372 -0.370288
+v 0.450827 0.525158 -0.288295
+v 0.536268 0.525854 -0.366943
+v 0.454160 0.525640 -0.284950
+v 0.539610 0.525405 -0.363603
+v 0.457502 0.525191 -0.281610
+v 0.542834 0.524043 -0.360397
+v 0.460726 0.523829 -0.278404
+v 0.545815 0.521821 -0.357447
+v 0.463707 0.521606 -0.275454
+v 0.548439 0.518822 -0.354868
+v 0.466331 0.518608 -0.272874
+v 0.550605 0.515164 -0.352758
+v 0.468497 0.514950 -0.270764
+v 0.552230 0.510986 -0.351198
+v 0.470122 0.510772 -0.269204
+v 0.516068 0.506449 -0.313117
+v 0.471143 0.506235 -0.268254
+v 0.516408 0.501727 -0.312776
+v 0.471521 0.501513 -0.267952
+v 0.515986 0.497002 -0.312988
+v 0.471242 0.496788 -0.268307
+v 0.515060 0.492455 -0.313988
+v 0.470317 0.492241 -0.269307
+v 0.513523 0.488262 -0.315594
+v 0.468780 0.488048 -0.270914
+v 0.511434 0.484583 -0.317745
+v 0.466691 0.484368 -0.273065
+v 0.508873 0.481559 -0.320359
+v 0.464130 0.481344 -0.275678
+v 0.505939 0.479307 -0.323333
+v 0.461196 0.479092 -0.278652
+v 0.502744 0.477913 -0.326555
+v 0.458001 0.477699 -0.281874
+v 0.499412 0.477432 -0.329900
+v 0.454668 0.477217 -0.285219
+v 0.496069 0.477880 -0.333239
+v 0.451326 0.477666 -0.288559
+v 0.492845 0.479242 -0.336446
+v 0.448102 0.479028 -0.291765
+v 0.489864 0.481465 -0.339395
+v 0.445121 0.481251 -0.294715
+v 0.487240 0.484463 -0.341975
+v 0.442497 0.484249 -0.297294
+v 0.485074 0.488121 -0.344085
+v 0.440331 0.487907 -0.299404
+v 0.483449 0.492299 -0.345645
+v 0.438706 0.492085 -0.300964
+v 0.482428 0.496836 -0.346595
+v 0.437685 0.496622 -0.301914
+v 0.482193 0.501558 -0.347041
+v 0.437307 0.501344 -0.302217
+v 0.460456 0.243339 -0.368816
+v 0.441379 0.242789 -0.349765
+v 0.499832 0.253858 -0.403684
+v 0.443572 0.253308 -0.347502
+v 0.503436 0.263561 -0.400015
+v 0.447176 0.263011 -0.343833
+v 0.508310 0.272074 -0.395079
+v 0.452050 0.271524 -0.338898
+v 0.514270 0.279070 -0.389068
+v 0.458009 0.278520 -0.332886
+v 0.521083 0.284280 -0.382211
+v 0.464823 0.283730 -0.326030
+v 0.528491 0.287504 -0.374773
+v 0.472231 0.286954 -0.318592
+v 0.536207 0.288619 -0.367040
+v 0.479947 0.288069 -0.310858
+v 0.543935 0.287581 -0.359307
+v 0.487675 0.287030 -0.303125
+v 0.551378 0.284430 -0.351873
+v 0.495118 0.283880 -0.295692
+v 0.558251 0.279287 -0.345024
+v 0.501991 0.278737 -0.288842
+v 0.564288 0.272350 -0.339022
+v 0.508028 0.271800 -0.282840
+v 0.569258 0.263886 -0.334098
+v 0.512998 0.263336 -0.277916
+v 0.572971 0.254219 -0.330442
+v 0.516710 0.253669 -0.274260
+v 0.538099 0.243722 -0.291062
+v 0.519022 0.243172 -0.272012
+v 0.538899 0.232316 -0.290256
+v 0.519844 0.232252 -0.271257
+v 0.538016 0.221688 -0.290917
+v 0.519142 0.221322 -0.272023
+v 0.535839 0.211344 -0.293151
+v 0.516944 0.210797 -0.274281
+v 0.532232 0.201642 -0.296818
+v 0.513338 0.201094 -0.277948
+v 0.527354 0.193129 -0.301750
+v 0.508460 0.192581 -0.282880
+v 0.521393 0.186134 -0.307759
+v 0.502499 0.185585 -0.288889
+v 0.514577 0.180924 -0.314614
+v 0.495683 0.180374 -0.295744
+v 0.507169 0.177700 -0.322050
+v 0.488274 0.177150 -0.303181
+v 0.499452 0.176585 -0.329783
+v 0.480557 0.176035 -0.310914
+v 0.491725 0.177623 -0.337516
+v 0.472829 0.177073 -0.318648
+v 0.484283 0.180774 -0.344951
+v 0.465387 0.180224 -0.326082
+v 0.477412 0.185916 -0.351802
+v 0.458516 0.185368 -0.332934
+v 0.471378 0.192853 -0.357806
+v 0.452481 0.192304 -0.338938
+v 0.466411 0.201317 -0.362733
+v 0.447514 0.200769 -0.343865
+v 0.462702 0.210983 -0.366393
+v 0.443805 0.210436 -0.347525
+v 0.460419 0.221305 -0.368624
+v 0.441498 0.220938 -0.349778
+v 0.459708 0.231924 -0.369560
+v 0.440679 0.231861 -0.350534
+v 0.458706 0.243790 -0.370561
+v 0.413781 0.243271 -0.325699
+v 0.498179 0.254782 -0.405326
+v 0.416071 0.254264 -0.323333
+v 0.501943 0.264921 -0.401490
+v 0.419835 0.264402 -0.319496
+v 0.507035 0.273816 -0.396331
+v 0.424927 0.273298 -0.314338
+v 0.513261 0.281127 -0.390048
+v 0.431153 0.280609 -0.308055
+v 0.520380 0.286572 -0.382883
+v 0.438273 0.286053 -0.300889
+v 0.528120 0.289941 -0.375110
+v 0.446012 0.289423 -0.293116
+v 0.536183 0.291105 -0.367028
+v 0.454075 0.290587 -0.285035
+v 0.544259 0.290021 -0.358948
+v 0.462151 0.289502 -0.276955
+v 0.552037 0.286728 -0.351181
+v 0.469929 0.286210 -0.269187
+v 0.559219 0.281354 -0.344024
+v 0.477111 0.280836 -0.262031
+v 0.565529 0.274105 -0.337754
+v 0.483421 0.273587 -0.255760
+v 0.570724 0.265261 -0.332610
+v 0.488616 0.264742 -0.250617
+v 0.574605 0.255160 -0.328791
+v 0.492497 0.254641 -0.246798
+v 0.539839 0.244190 -0.289312
+v 0.494915 0.243672 -0.244450
+v 0.540662 0.232775 -0.288488
+v 0.495775 0.232256 -0.243664
+v 0.539790 0.221351 -0.289150
+v 0.495047 0.220833 -0.244469
+v 0.537500 0.210359 -0.291516
+v 0.492757 0.209840 -0.246836
+v 0.533736 0.200220 -0.295353
+v 0.488993 0.199702 -0.250672
+v 0.528644 0.191324 -0.300511
+v 0.483901 0.190806 -0.255831
+v 0.522418 0.184014 -0.306794
+v 0.477675 0.183495 -0.262114
+v 0.515299 0.178569 -0.313960
+v 0.470555 0.178051 -0.269279
+v 0.507559 0.175200 -0.321733
+v 0.462816 0.174682 -0.277052
+v 0.499496 0.174035 -0.329815
+v 0.454753 0.173517 -0.285134
+v 0.491421 0.175120 -0.337894
+v 0.446677 0.174602 -0.293214
+v 0.483642 0.178413 -0.345662
+v 0.438899 0.177894 -0.300981
+v 0.476460 0.183787 -0.352818
+v 0.431717 0.183268 -0.308138
+v 0.470150 0.191035 -0.359089
+v 0.425407 0.190517 -0.314408
+v 0.464955 0.199880 -0.364233
+v 0.420212 0.199362 -0.319552
+v 0.461074 0.209981 -0.368052
+v 0.416331 0.209463 -0.323371
+v 0.458657 0.220950 -0.370399
+v 0.413913 0.220432 -0.325719
+v 0.457939 0.232366 -0.371329
+v 0.413053 0.231848 -0.326505
+v 0.437307 -0.005892 -0.302217
+v 0.482193 -0.005677 -0.347041
+v 0.437685 -0.010613 -0.301914
+v 0.482428 -0.010399 -0.346595
+v 0.438706 -0.015150 -0.300964
+v 0.483449 -0.014936 -0.345645
+v 0.440331 -0.019328 -0.299404
+v 0.485074 -0.019114 -0.344085
+v 0.442497 -0.022987 -0.297294
+v 0.487240 -0.022772 -0.341975
+v 0.445121 -0.025985 -0.294715
+v 0.489864 -0.025771 -0.339395
+v 0.448102 -0.028208 -0.291765
+v 0.492845 -0.027993 -0.336446
+v 0.451326 -0.029570 -0.288559
+v 0.496069 -0.029355 -0.333239
+v 0.454668 -0.030018 -0.285219
+v 0.499412 -0.029804 -0.329900
+v 0.458001 -0.029537 -0.281874
+v 0.502744 -0.029322 -0.326555
+v 0.461196 -0.028143 -0.278652
+v 0.505939 -0.027929 -0.323333
+v 0.464130 -0.025891 -0.275678
+v 0.508873 -0.025677 -0.320359
+v 0.466691 -0.022867 -0.273065
+v 0.511434 -0.022653 -0.317745
+v 0.468780 -0.019188 -0.270914
+v 0.513523 -0.018973 -0.315594
+v 0.470317 -0.014994 -0.269307
+v 0.515060 -0.014780 -0.313988
+v 0.471242 -0.010448 -0.268307
+v 0.515986 -0.010233 -0.312988
+v 0.471521 -0.005723 -0.267952
+v 0.516408 -0.005508 -0.312776
+v 0.471143 -0.001001 -0.268254
+v 0.516068 -0.000787 -0.313117
+v 0.470122 0.003536 -0.269204
+v 0.552230 0.003751 -0.351198
+v 0.468497 0.007714 -0.270764
+v 0.550605 0.007929 -0.352758
+v 0.466331 0.011373 -0.272874
+v 0.548439 0.011587 -0.354868
+v 0.463707 0.014371 -0.275454
+v 0.545815 0.014585 -0.357447
+v 0.460726 0.016593 -0.278404
+v 0.542834 0.016808 -0.360397
+v 0.457502 0.017955 -0.281610
+v 0.539610 0.018170 -0.363603
+v 0.454160 0.018404 -0.284950
+v 0.536268 0.018618 -0.366943
+v 0.450827 0.017922 -0.288295
+v 0.532935 0.018137 -0.370288
+v 0.447632 0.016529 -0.291516
+v 0.529740 0.016743 -0.373510
+v 0.444698 0.014277 -0.294491
+v 0.526806 0.014491 -0.376484
+v 0.442137 0.011253 -0.297104
+v 0.524245 0.011467 -0.379097
+v 0.440048 0.007574 -0.299255
+v 0.522156 0.007788 -0.381248
+v 0.438511 0.003380 -0.300861
+v 0.520619 0.003594 -0.382855
+v 0.437586 -0.001167 -0.301861
+v 0.482510 -0.000952 -0.346724
+v 0.463890 -0.005886 -0.327291
+v 0.482925 -0.005860 -0.346310
+v 0.464247 -0.010404 -0.326997
+v 0.483154 -0.010252 -0.345857
+v 0.465218 -0.014748 -0.326082
+v 0.484114 -0.014522 -0.344951
+v 0.466768 -0.018746 -0.324584
+v 0.485664 -0.018520 -0.343453
+v 0.468837 -0.022247 -0.322560
+v 0.487732 -0.022021 -0.341429
+v 0.471344 -0.025117 -0.320088
+v 0.490240 -0.024890 -0.338957
+v 0.474194 -0.027244 -0.317262
+v 0.493090 -0.027017 -0.336131
+v 0.477278 -0.028547 -0.314193
+v 0.496174 -0.028320 -0.333061
+v 0.480476 -0.028977 -0.310996
+v 0.499371 -0.028749 -0.329865
+v 0.483666 -0.028516 -0.307795
+v 0.502561 -0.028288 -0.326664
+v 0.486725 -0.027182 -0.304714
+v 0.505620 -0.026955 -0.323583
+v 0.489536 -0.025027 -0.301870
+v 0.508431 -0.024800 -0.320739
+v 0.491990 -0.022133 -0.299373
+v 0.510885 -0.021906 -0.318242
+v 0.493994 -0.018612 -0.297319
+v 0.512889 -0.018385 -0.316188
+v 0.495469 -0.014598 -0.295786
+v 0.514364 -0.014372 -0.314656
+v 0.496362 -0.010245 -0.294835
+v 0.515249 -0.010094 -0.313715
+v 0.496633 -0.005724 -0.294500
+v 0.515680 -0.005698 -0.313508
+v 0.496273 -0.001208 -0.294792
+v 0.515350 -0.000980 -0.313842
+v 0.495298 0.003134 -0.295703
+v 0.551558 0.003362 -0.351884
+v 0.493744 0.007132 -0.297197
+v 0.550004 0.007360 -0.353379
+v 0.491673 0.010633 -0.299218
+v 0.547933 0.010861 -0.355400
+v 0.489163 0.013503 -0.301688
+v 0.545423 0.013730 -0.357870
+v 0.486311 0.015630 -0.304511
+v 0.542571 0.015857 -0.360693
+v 0.483226 0.016933 -0.307580
+v 0.539486 0.017161 -0.363762
+v 0.480028 0.017362 -0.310777
+v 0.536288 0.017590 -0.366958
+v 0.476838 0.016901 -0.313978
+v 0.533098 0.017129 -0.370159
+v 0.473780 0.015568 -0.317060
+v 0.530041 0.015795 -0.373242
+v 0.470972 0.013413 -0.319906
+v 0.527232 0.013640 -0.376087
+v 0.468520 0.010519 -0.322405
+v 0.524780 0.010747 -0.378587
+v 0.466519 0.006998 -0.324462
+v 0.522780 0.007226 -0.380644
+v 0.465047 0.002985 -0.325998
+v 0.521307 0.003212 -0.382180
+v 0.464159 -0.001366 -0.326953
+v 0.483236 -0.001139 -0.346004
+v 0.389794 0.400585 -0.439576
+v 0.370717 0.400035 -0.420525
+v 0.429171 0.411104 -0.474444
+v 0.372911 0.410554 -0.418263
+v 0.432774 0.420807 -0.470775
+v 0.376514 0.420257 -0.414593
+v 0.437649 0.429320 -0.465839
+v 0.381389 0.428770 -0.409658
+v 0.443608 0.436316 -0.459828
+v 0.387348 0.435766 -0.403646
+v 0.450422 0.441526 -0.452971
+v 0.394162 0.440976 -0.396790
+v 0.457829 0.444750 -0.445533
+v 0.401569 0.444201 -0.389352
+v 0.465546 0.445865 -0.437800
+v 0.409285 0.445315 -0.381618
+v 0.473274 0.444827 -0.430067
+v 0.417014 0.444276 -0.373885
+v 0.480717 0.441676 -0.422633
+v 0.424457 0.441126 -0.366452
+v 0.487589 0.436533 -0.415784
+v 0.431329 0.435983 -0.359602
+v 0.493626 0.429597 -0.409782
+v 0.437366 0.429046 -0.353600
+v 0.498597 0.421132 -0.404858
+v 0.442337 0.420582 -0.348676
+v 0.502309 0.411466 -0.401202
+v 0.446049 0.410915 -0.345020
+v 0.467437 0.400968 -0.361822
+v 0.448360 0.400418 -0.342772
+v 0.468237 0.389562 -0.361016
+v 0.449182 0.389498 -0.342017
+v 0.467354 0.378934 -0.361677
+v 0.448481 0.378568 -0.342783
+v 0.465178 0.368590 -0.363911
+v 0.446283 0.368043 -0.345041
+v 0.461571 0.358888 -0.367578
+v 0.442676 0.358340 -0.348708
+v 0.456693 0.350376 -0.372510
+v 0.437799 0.349827 -0.353640
+v 0.450732 0.343380 -0.378519
+v 0.431837 0.342831 -0.359649
+v 0.443916 0.338170 -0.385374
+v 0.425021 0.337620 -0.366504
+v 0.436507 0.334946 -0.392810
+v 0.417612 0.334396 -0.373941
+v 0.428791 0.333831 -0.400544
+v 0.409896 0.333281 -0.381674
+v 0.421064 0.334869 -0.408276
+v 0.402168 0.334319 -0.389408
+v 0.413622 0.338020 -0.415711
+v 0.394726 0.337471 -0.396842
+v 0.406751 0.343162 -0.422562
+v 0.387855 0.342614 -0.403694
+v 0.400716 0.350099 -0.428566
+v 0.381820 0.349550 -0.409698
+v 0.395749 0.358563 -0.433493
+v 0.376853 0.358015 -0.414625
+v 0.392040 0.368229 -0.437153
+v 0.373144 0.367682 -0.418285
+v 0.389757 0.378551 -0.439384
+v 0.370836 0.378184 -0.420538
+v 0.389046 0.389171 -0.440320
+v 0.370018 0.389107 -0.421294
+v 0.388045 0.401036 -0.441321
+v 0.343120 0.400517 -0.396459
+v 0.427518 0.412028 -0.476086
+v 0.345410 0.411510 -0.394093
+v 0.431282 0.422167 -0.472250
+v 0.349174 0.421649 -0.390256
+v 0.436374 0.431063 -0.467091
+v 0.354266 0.430544 -0.385098
+v 0.442600 0.438373 -0.460808
+v 0.360492 0.437855 -0.378815
+v 0.449719 0.443818 -0.453643
+v 0.367611 0.443299 -0.371649
+v 0.457459 0.447187 -0.445870
+v 0.375351 0.446669 -0.363876
+v 0.465522 0.448351 -0.437788
+v 0.383414 0.447833 -0.355795
+v 0.473598 0.447267 -0.429708
+v 0.391489 0.446748 -0.347715
+v 0.481376 0.443974 -0.421941
+v 0.399268 0.443456 -0.339947
+v 0.488558 0.438600 -0.414784
+v 0.406450 0.438082 -0.332791
+v 0.494868 0.431351 -0.408514
+v 0.412760 0.430833 -0.326520
+v 0.500063 0.422507 -0.403370
+v 0.417955 0.421988 -0.321377
+v 0.503944 0.412406 -0.399551
+v 0.421836 0.411887 -0.317558
+v 0.469178 0.401436 -0.360072
+v 0.424253 0.400918 -0.315210
+v 0.470001 0.390021 -0.359248
+v 0.425114 0.389503 -0.314424
+v 0.469129 0.378597 -0.359910
+v 0.424386 0.378079 -0.315229
+v 0.466839 0.367605 -0.362276
+v 0.422095 0.367086 -0.317596
+v 0.463075 0.357466 -0.366113
+v 0.418332 0.356948 -0.321432
+v 0.457983 0.348570 -0.371271
+v 0.413239 0.348052 -0.326591
+v 0.451757 0.341260 -0.377554
+v 0.407014 0.340741 -0.332874
+v 0.444637 0.335815 -0.384720
+v 0.399894 0.335297 -0.340039
+v 0.436898 0.332446 -0.392493
+v 0.392154 0.331928 -0.347812
+v 0.428835 0.331281 -0.400575
+v 0.384092 0.330763 -0.355894
+v 0.420759 0.332366 -0.408655
+v 0.376016 0.331848 -0.363974
+v 0.412981 0.335659 -0.416422
+v 0.368238 0.335141 -0.371741
+v 0.405798 0.341033 -0.423579
+v 0.361055 0.340515 -0.378898
+v 0.399489 0.348281 -0.429849
+v 0.354745 0.347763 -0.385168
+v 0.394294 0.357126 -0.434993
+v 0.349550 0.356608 -0.390312
+v 0.390413 0.367227 -0.438812
+v 0.345669 0.366709 -0.394131
+v 0.387995 0.378196 -0.441159
+v 0.343252 0.377678 -0.396479
+v 0.387278 0.389612 -0.442089
+v 0.342391 0.389094 -0.397265
+v 0.366645 0.094108 -0.372977
+v 0.411532 0.094323 -0.417801
+v 0.367024 0.089387 -0.372674
+v 0.411767 0.089601 -0.417355
+v 0.368045 0.084850 -0.371724
+v 0.412788 0.085064 -0.416405
+v 0.369670 0.080672 -0.370164
+v 0.414413 0.080886 -0.414845
+v 0.371836 0.077013 -0.368054
+v 0.416579 0.077228 -0.412735
+v 0.374460 0.074015 -0.365475
+v 0.419203 0.074229 -0.410155
+v 0.377441 0.071792 -0.362525
+v 0.422184 0.072007 -0.407206
+v 0.380665 0.070430 -0.359319
+v 0.425408 0.070645 -0.403999
+v 0.384007 0.069982 -0.355979
+v 0.428750 0.070196 -0.400660
+v 0.387340 0.070463 -0.352634
+v 0.432083 0.070678 -0.397315
+v 0.390534 0.071857 -0.349412
+v 0.435278 0.072071 -0.394093
+v 0.393468 0.074109 -0.346438
+v 0.438212 0.074323 -0.391119
+v 0.396029 0.077133 -0.343825
+v 0.440773 0.077347 -0.388505
+v 0.398118 0.080812 -0.341674
+v 0.442861 0.081027 -0.386354
+v 0.399655 0.085006 -0.340067
+v 0.444398 0.085220 -0.384748
+v 0.400581 0.089552 -0.339067
+v 0.445324 0.089767 -0.383748
+v 0.400860 0.094278 -0.338712
+v 0.445747 0.094492 -0.383536
+v 0.400482 0.098999 -0.339015
+v 0.445407 0.099214 -0.383877
+v 0.399461 0.103536 -0.339964
+v 0.481569 0.103751 -0.421958
+v 0.397836 0.107714 -0.341524
+v 0.479944 0.107929 -0.423518
+v 0.395670 0.111373 -0.343634
+v 0.477778 0.111587 -0.425628
+v 0.393046 0.114371 -0.346214
+v 0.475154 0.114585 -0.428207
+v 0.390064 0.116594 -0.349164
+v 0.472172 0.116808 -0.431157
+v 0.386841 0.117955 -0.352370
+v 0.468949 0.118170 -0.434363
+v 0.383498 0.118404 -0.355710
+v 0.465606 0.118618 -0.437703
+v 0.380166 0.117922 -0.359055
+v 0.462274 0.118137 -0.441048
+v 0.376971 0.116529 -0.362276
+v 0.459079 0.116743 -0.444270
+v 0.374037 0.114277 -0.365251
+v 0.456145 0.114491 -0.447244
+v 0.371476 0.111253 -0.367864
+v 0.453584 0.111467 -0.449857
+v 0.369387 0.107574 -0.370015
+v 0.451495 0.107788 -0.452008
+v 0.367850 0.103380 -0.371621
+v 0.449958 0.103594 -0.453615
+v 0.366924 0.098833 -0.372622
+v 0.411849 0.099048 -0.417484
+v 0.393229 0.094114 -0.398051
+v 0.412264 0.094140 -0.417070
+v 0.393586 0.089596 -0.397757
+v 0.412492 0.089748 -0.416617
+v 0.394557 0.085252 -0.396842
+v 0.413453 0.085478 -0.415711
+v 0.396107 0.081254 -0.395344
+v 0.415003 0.081480 -0.414213
+v 0.398175 0.077753 -0.393320
+v 0.417071 0.077979 -0.412189
+v 0.400683 0.074883 -0.390848
+v 0.419579 0.075110 -0.409717
+v 0.403533 0.072756 -0.388022
+v 0.422429 0.072983 -0.406891
+v 0.406617 0.071453 -0.384953
+v 0.425512 0.071680 -0.403821
+v 0.409815 0.071023 -0.381756
+v 0.428710 0.071251 -0.400625
+v 0.413005 0.071484 -0.378555
+v 0.431900 0.071712 -0.397424
+v 0.416064 0.072818 -0.375474
+v 0.434959 0.073045 -0.394343
+v 0.418874 0.074973 -0.372630
+v 0.437769 0.075200 -0.391499
+v 0.421329 0.077867 -0.370133
+v 0.440224 0.078094 -0.389002
+v 0.423332 0.081388 -0.368079
+v 0.442227 0.081615 -0.386948
+v 0.424808 0.085402 -0.366546
+v 0.443703 0.085628 -0.385416
+v 0.425700 0.089755 -0.365595
+v 0.444587 0.089906 -0.384475
+v 0.425972 0.094276 -0.365260
+v 0.445018 0.094302 -0.384268
+v 0.425612 0.098792 -0.365552
+v 0.444689 0.099020 -0.384602
+v 0.424636 0.103134 -0.366463
+v 0.480896 0.103362 -0.422644
+v 0.423083 0.107132 -0.367957
+v 0.479343 0.107360 -0.424139
+v 0.421011 0.110633 -0.369978
+v 0.477271 0.110861 -0.426160
+v 0.418501 0.113503 -0.372448
+v 0.474762 0.113730 -0.428630
+v 0.415649 0.115630 -0.375271
+v 0.471910 0.115857 -0.431453
+v 0.412565 0.116933 -0.378340
+v 0.468825 0.117161 -0.434522
+v 0.409366 0.117363 -0.381537
+v 0.465627 0.117590 -0.437718
+v 0.406177 0.116902 -0.384738
+v 0.462437 0.117129 -0.440919
+v 0.403119 0.115568 -0.387820
+v 0.459379 0.115795 -0.444002
+v 0.400310 0.113413 -0.390666
+v 0.456571 0.113640 -0.446847
+v 0.397859 0.110519 -0.393165
+v 0.454119 0.110747 -0.449347
+v 0.395858 0.106998 -0.395222
+v 0.452118 0.107226 -0.451404
+v 0.394386 0.102985 -0.396758
+v 0.450646 0.103212 -0.452940
+v 0.393498 0.098634 -0.397713
+v 0.412575 0.098861 -0.416764
+v 0.331265 -0.168051 -0.290411
+v 0.290873 -0.168051 -0.330859
+v 0.331321 -0.168051 -0.371251
+v 0.371713 -0.168051 -0.330803
+v 0.250573 -0.168051 -0.209831
+v 0.210124 -0.168051 -0.169439
+v 0.169732 -0.168051 -0.209888
+v 0.210181 -0.168051 -0.250280
+v 0.169732 -0.168051 -0.209888
+v 0.210124 -0.168051 -0.169439
+v 0.371713 -0.168051 -0.330803
+v 0.331321 -0.168051 -0.371251
+v 0.210181 -0.168051 -0.250280
+v 0.290873 -0.168051 -0.330859
+v 0.250573 -0.168051 -0.209831
+v 0.331265 -0.168051 -0.290411
+v 0.331265 0.037812 -0.290411
+v 0.331265 0.165702 -0.290411
+v 0.290873 0.165702 -0.330859
+v 0.290873 0.037812 -0.330859
+v 0.331321 0.037812 -0.371251
+v 0.331321 0.165702 -0.371251
+v 0.371713 0.165702 -0.330803
+v 0.371713 0.037812 -0.330803
+v 0.250573 0.037812 -0.209831
+v 0.250573 0.165702 -0.209831
+v 0.210124 0.165702 -0.169439
+v 0.210124 0.037812 -0.169439
+v 0.169732 0.037812 -0.209888
+v 0.169732 0.165702 -0.209888
+v 0.210181 0.165702 -0.250280
+v 0.210181 0.037812 -0.250280
+v 0.331265 0.166622 -0.290411
+v 0.290873 0.166622 -0.330859
+v 0.331321 0.166622 -0.371251
+v 0.371713 0.166622 -0.330803
+v 0.250573 0.166622 -0.209831
+v 0.210124 0.166622 -0.169439
+v 0.169732 0.166622 -0.209888
+v 0.210181 0.166622 -0.250280
+v 0.169732 0.166622 -0.209888
+v 0.210124 0.166622 -0.169439
+v 0.371713 0.166622 -0.330803
+v 0.331321 0.166622 -0.371251
+v 0.210181 0.166622 -0.250280
+v 0.290873 0.166622 -0.330859
+v 0.250573 0.166622 -0.209831
+v 0.331265 0.166622 -0.290411
+v 0.331265 0.370885 -0.290411
+v 0.331265 0.497782 -0.290411
+v 0.290873 0.497782 -0.330859
+v 0.290873 0.370885 -0.330859
+v 0.331321 0.370885 -0.371251
+v 0.331321 0.497782 -0.371251
+v 0.371713 0.497782 -0.330803
+v 0.371713 0.370885 -0.330803
+v 0.250573 0.370885 -0.209831
+v 0.250573 0.497782 -0.209831
+v 0.210124 0.497782 -0.169439
+v 0.210124 0.370885 -0.169439
+v 0.169732 0.370885 -0.209888
+v 0.169732 0.497782 -0.209888
+v 0.210181 0.497782 -0.250280
+v 0.210181 0.370885 -0.250280
+v 0.578448 -0.145166 -0.196962
+v 0.225142 -0.145166 -0.550762
+v 0.578448 0.603749 -0.196962
+v 0.225142 0.603749 -0.550762
+v 0.544895 0.603749 -0.163455
+v 0.544895 -0.145166 -0.163455
+v 0.191589 -0.145166 -0.517255
+v 0.191588 0.603749 -0.517255
+vt 0.285559 0.095797
+vt 0.214079 0.095797
+vt 0.214079 0.000000
+vt 0.285559 0.000000
+vt 0.357039 0.095797
+vt 0.285559 0.095797
+vt 0.285559 0.000000
+vt 0.357039 0.000000
+vt 0.642599 0.095797
+vt 0.571118 0.095797
+vt 0.571118 0.000000
+vt 0.642598 0.000000
+vt 0.714079 0.904203
+vt 0.785559 0.904203
+vt 0.785559 1.000000
+vt 0.714079 1.000000
+vt 0.642599 0.904203
+vt 0.714079 0.904203
+vt 0.714079 1.000000
+vt 0.642599 1.000000
+vt 0.071480 0.095797
+vt 0.000000 0.095797
+vt 0.000000 0.000000
+vt 0.071480 0.000000
+vt 0.571118 0.095797
+vt 0.499638 0.095797
+vt 0.499638 0.000000
+vt 0.571118 0.000000
+vt 0.857040 0.394495
+vt 0.928520 0.394495
+vt 0.928520 0.480583
+vt 0.857040 0.480583
+vt 0.857040 0.129242
+vt 0.785559 0.129242
+vt 0.785559 0.043154
+vt 0.857040 0.043154
+vt 0.785559 0.172396
+vt 0.857040 0.172396
+vt 0.785559 0.000000
+vt 0.857040 0.000000
+vt 0.285559 0.250000
+vt 0.214079 0.250000
+vt 0.357039 0.250000
+vt 0.285559 0.250000
+vt 0.642599 0.250000
+vt 0.571118 0.250000
+vt 0.714079 0.750000
+vt 0.785559 0.750000
+vt 0.642599 0.750000
+vt 0.714079 0.750000
+vt 0.928520 0.154203
+vt 0.857040 0.154203
+vt 0.857040 0.000000
+vt 0.928520 0.000000
+vt 0.071480 0.250000
+vt 0.000000 0.250000
+vt 0.571118 0.250000
+vt 0.499638 0.250000
+vt 0.000000 0.000000
+vt 0.000000 0.000000
+vt 0.000000 0.000000
+vt 0.000000 0.000000
+vt 0.615085 0.501950
+vt 0.538102 0.501950
+vt 0.538102 0.192341
+vt 0.615085 0.192341
+vt 0.538102 0.000000
+vt 0.615085 0.000000
+vt 0.076983 0.501950
+vt 0.000000 0.501950
+vt 0.000000 0.192341
+vt 0.076983 0.192341
+vt 0.000000 0.000000
+vt 0.076983 0.000000
+vt 0.692068 0.501950
+vt 0.692068 0.192341
+vt 0.692068 0.000000
+vt 0.769051 0.501950
+vt 0.692068 0.501950
+vt 0.692068 0.192341
+vt 0.769051 0.192341
+vt 0.692068 0.000000
+vt 0.769051 0.000000
+vt 0.846034 0.501950
+vt 0.769051 0.501950
+vt 0.769051 0.192341
+vt 0.846034 0.192341
+vt 0.769051 0.000000
+vt 0.846034 0.000000
+vt 0.923017 0.996502
+vt 0.846034 0.996502
+vt 0.846034 0.686893
+vt 0.923017 0.686893
+vt 0.384526 0.501950
+vt 0.307543 0.501950
+vt 0.307542 0.192341
+vt 0.384525 0.192341
+vt 0.307542 0.000000
+vt 0.384525 0.000000
+vt 0.307542 0.501950
+vt 0.230559 0.501950
+vt 0.230559 0.192341
+vt 0.307542 0.192341
+vt 0.230559 0.000000
+vt 0.307542 0.000000
+vt 0.923017 0.478709
+vt 1.000000 0.478709
+vt 1.000000 0.650215
+vt 0.923017 0.650215
+vt 0.923017 0.600923
+vt 0.846034 0.600923
+vt 0.846034 0.429417
+vt 0.923017 0.429417
+vt 0.846034 0.686893
+vt 0.923017 0.686893
+vt 0.846034 0.343447
+vt 0.923017 0.343447
+vt 0.000000 0.000000
+vt 0.000000 0.000000
+vt 0.000000 0.000000
+vt 0.000000 0.000000
+vt 0.615085 1.000000
+vt 0.538102 1.000000
+vt 0.538102 0.692796
+vt 0.615085 0.692796
+vt 0.538102 0.501950
+vt 0.615085 0.501950
+vt 0.076983 1.000000
+vt 0.000000 1.000000
+vt 0.000000 0.692797
+vt 0.076983 0.692797
+vt 0.000000 0.501950
+vt 0.076983 0.501950
+vt 0.769051 1.000000
+vt 0.692068 1.000000
+vt 0.692068 0.692796
+vt 0.769051 0.692796
+vt 0.692068 0.501950
+vt 0.769051 0.501950
+vt 0.615085 0.501950
+vt 0.692068 0.501950
+vt 0.692068 0.809153
+vt 0.615085 0.809153
+vt 0.692068 1.000000
+vt 0.615085 1.000000
+vt 0.846034 1.000000
+vt 0.769051 1.000000
+vt 0.769051 0.692796
+vt 0.846034 0.692796
+vt 0.769051 0.501950
+vt 0.846034 0.501950
+vt 1.000000 0.307203
+vt 0.923017 0.307203
+vt 0.923017 0.000000
+vt 1.000000 0.000000
+vt 0.384526 1.000000
+vt 0.307543 1.000000
+vt 0.307542 0.692797
+vt 0.384525 0.692797
+vt 0.307542 0.501950
+vt 0.384525 0.501950
+vt 0.307542 1.000000
+vt 0.230559 1.000000
+vt 0.230559 0.692797
+vt 0.307542 0.692796
+vt 0.230559 0.501950
+vt 0.307542 0.501950
+vt 0.923017 0.307203
+vt 1.000000 0.307203
+vt 1.000000 0.478709
+vt 0.923017 0.478709
+vt 0.923017 0.257476
+vt 0.846034 0.257476
+vt 0.846034 0.085970
+vt 0.923017 0.085970
+vt 0.846034 0.343447
+vt 0.923017 0.343447
+vt 0.846034 0.000000
+vt 0.923017 0.000000
+vt 0.875462 0.748915
+vt 0.437731 0.748915
+vt 0.437731 0.000000
+vt 0.875462 0.000000
+vt 0.437731 0.000000
+vt 0.437731 0.748915
+vt 0.000000 0.748915
+vt 0.000000 0.000000
+vt 0.958487 0.748915
+vt 0.916975 0.748915
+vt 0.916975 0.000000
+vt 0.958487 0.000000
+vt 0.958487 0.000000
+vt 1.000000 0.000000
+vt 1.000000 0.500000
+vt 0.958487 0.500000
+vt 1.000000 1.000000
+vt 0.958487 1.000000
+vt 0.958487 0.500000
+vt 1.000000 0.500000
+vt 0.875462 0.000000
+vt 0.916974 0.000000
+vt 0.916975 0.748915
+vt 0.875462 0.748915
+vt 0.442670 0.517822
+vt 0.228883 0.517823
+vt 0.228889 0.488295
+vt 0.442971 0.724510
+vt 0.443060 0.754024
+vt 0.370472 0.723575
+vt 0.442967 0.311134
+vt 0.370467 0.312068
+vt 0.443056 0.281620
+vt 0.443160 0.252098
+vt 0.371348 0.252525
+vt 0.443163 0.783546
+vt 0.371352 0.783117
+vt 0.006929 0.253167
+vt 0.177644 0.253134
+vt 0.006828 0.284020
+vt 0.007055 0.808541
+vt 0.006941 0.777687
+vt 0.177771 0.808498
+vt 0.006827 0.746834
+vt 0.176852 0.746796
+vt 0.006727 0.314875
+vt 0.176753 0.314837
+vt 0.371492 0.871219
+vt 0.371495 0.841694
+vt 0.443305 0.842613
+vt 0.615392 0.436018
+vt 0.610260 0.440534
+vt 0.592437 0.415287
+vt 0.816609 0.103895
+vt 0.836176 0.125250
+vt 0.831035 0.128981
+vt 0.706468 0.066881
+vt 0.736753 0.067631
+vt 0.735929 0.074111
+vt 0.647824 0.083609
+vt 0.650942 0.089526
+vt 0.626230 0.105756
+vt 0.765981 0.074365
+vt 0.763884 0.080481
+vt 0.579817 0.387126
+vt 0.586362 0.385333
+vt 0.621946 0.100560
+vt 0.605204 0.126737
+vt 0.706979 0.073452
+vt 0.678244 0.078632
+vt 0.792953 0.086670
+vt 0.812355 0.108585
+vt 0.676401 0.072253
+vt 0.789700 0.092175
+vt 0.599888 0.122511
+vt 0.589057 0.151745
+vt 0.582798 0.148853
+vt 0.579868 0.178984
+vt 0.850517 0.149568
+vt 0.844628 0.151667
+vt 0.572791 0.357181
+vt 0.571207 0.326153
+vt 0.578089 0.326242
+vt 0.579568 0.357437
+vt 0.892437 0.349226
+vt 0.885423 0.348954
+vt 0.885704 0.319257
+vt 0.886223 0.285996
+vt 0.879631 0.287703
+vt 0.636826 0.456466
+vt 0.632640 0.461897
+vt 0.874138 0.409852
+vt 0.856681 0.436209
+vt 0.851292 0.431762
+vt 0.661830 0.472412
+vt 0.658752 0.478560
+vt 0.689480 0.483245
+vt 0.687628 0.489885
+vt 0.718747 0.488548
+vt 0.718195 0.495436
+vt 0.779839 0.488518
+vt 0.749318 0.494983
+vt 0.748545 0.488099
+vt 0.808610 0.476251
+vt 0.777761 0.481894
+vt 0.834553 0.458608
+vt 0.805300 0.470133
+vt 0.830124 0.453224
+vt 0.573209 0.178195
+vt 0.886228 0.380492
+vt 0.867982 0.406513
+vt 0.879533 0.378395
+vt 0.370709 0.754396
+vt 0.319322 0.130795
+vt 0.319224 0.161649
+vt 0.007220 0.160604
+vt 0.007387 0.901104
+vt 0.319390 0.899923
+vt 0.319502 0.930776
+vt 0.442778 0.399714
+vt 0.228990 0.399716
+vt 0.229046 0.370189
+vt 0.007499 0.931958
+vt 0.319616 0.961631
+vt 0.006361 0.469146
+vt 0.176387 0.469108
+vt 0.176362 0.499962
+vt 0.442678 0.488295
+vt 0.228910 0.458769
+vt 0.007727 0.006334
+vt 0.319730 0.007378
+vt 0.319626 0.038233
+vt 0.228890 0.547350
+vt 0.007613 0.962812
+vt 0.319730 0.992485
+vt 0.228946 0.606403
+vt 0.228912 0.576877
+vt 0.442700 0.576876
+vt 0.228992 0.635930
+vt 0.442734 0.606402
+vt 0.442833 0.370188
+vt 0.229109 0.340661
+vt 0.229113 0.694984
+vt 0.229049 0.665457
+vt 0.442837 0.665456
+vt 0.442901 0.694984
+vt 0.370705 0.281246
+vt 0.371443 0.812167
+vt 0.443254 0.813086
+vt 0.892437 0.317355
+vt 0.371421 0.900745
+vt 0.443302 0.872141
+vt 0.371269 0.930272
+vt 0.443231 0.901668
+vt 0.007276 0.870250
+vt 0.319278 0.869069
+vt 0.006405 0.438291
+vt 0.176430 0.438254
+vt 0.443090 0.104449
+vt 0.371280 0.105372
+vt 0.371043 0.075847
+vt 0.443237 0.133976
+vt 0.371427 0.134897
+vt 0.443305 0.163503
+vt 0.371495 0.164423
+vt 0.443305 0.193031
+vt 0.371495 0.193949
+vt 0.443252 0.222558
+vt 0.371442 0.223476
+vt 0.177399 0.283987
+vt 0.006543 0.376583
+vt 0.176568 0.376545
+vt 0.176492 0.407399
+vt 0.006467 0.407437
+vt 0.007165 0.839396
+vt 0.319168 0.838215
+vt 0.370694 0.989321
+vt 0.371029 0.959797
+vt 0.442838 0.960722
+vt 0.442780 0.635930
+vt 0.442698 0.458768
+vt 0.228944 0.429242
+vt 0.006337 0.500000
+vt 0.176359 0.530816
+vt 0.319524 0.069087
+vt 0.007520 0.068042
+vt 0.319423 0.099941
+vt 0.007419 0.098896
+vt 0.007319 0.129750
+vt 0.442897 0.340661
+vt 0.319126 0.192504
+vt 0.007122 0.191458
+vt 0.319029 0.223358
+vt 0.007025 0.222313
+vt 0.177512 0.777645
+vt 0.443079 0.931196
+vt 0.176656 0.345691
+vt 0.006631 0.345729
+vt 0.442853 0.074922
+vt 0.370712 0.046322
+vt 0.442732 0.429241
+vt 0.442678 0.547349
+vt 0.176377 0.561671
+vt 0.006351 0.561708
+vt 0.176415 0.592525
+vt 0.006390 0.592562
+vt 0.176474 0.623379
+vt 0.006448 0.623417
+vt 0.176549 0.654233
+vt 0.006524 0.654271
+vt 0.176640 0.685087
+vt 0.006614 0.685125
+vt 0.176742 0.715941
+vt 0.006716 0.715979
+vt 0.615392 0.436018
+vt 0.610260 0.440534
+vt 0.592437 0.415287
+vt 0.006631 0.345729
+vt 0.176656 0.345691
+vt 0.176568 0.376545
+vt 0.371443 0.812167
+vt 0.371352 0.783117
+vt 0.443163 0.783546
+vt 0.176852 0.746796
+vt 0.177512 0.777645
+vt 0.006941 0.777687
+vt 0.007165 0.839396
+vt 0.319168 0.838215
+vt 0.319278 0.869069
+vt 0.006467 0.407437
+vt 0.176492 0.407399
+vt 0.176430 0.438254
+vt 0.442897 0.340661
+vt 0.229109 0.340661
+vt 0.370467 0.312068
+vt 0.319524 0.069087
+vt 0.319423 0.099941
+vt 0.007419 0.098896
+vt 0.319322 0.130795
+vt 0.319224 0.161649
+vt 0.007220 0.160604
+vt 0.856681 0.436209
+vt 0.834553 0.458608
+vt 0.830124 0.453224
+vt 0.007727 0.006334
+vt 0.319730 0.007378
+vt 0.319626 0.038233
+vt 0.229049 0.665457
+vt 0.228992 0.635930
+vt 0.442780 0.635930
+vt 0.442967 0.311134
+vt 0.443056 0.281620
+vt 0.228890 0.547350
+vt 0.228883 0.517823
+vt 0.442670 0.517822
+vt 0.443060 0.754024
+vt 0.319126 0.192504
+vt 0.319029 0.223358
+vt 0.007025 0.222313
+vt 0.370709 0.754396
+vt 0.370472 0.723575
+vt 0.647824 0.083609
+vt 0.650942 0.089526
+vt 0.626230 0.105756
+vt 0.765981 0.074365
+vt 0.792953 0.086670
+vt 0.789700 0.092175
+vt 0.718747 0.488548
+vt 0.718195 0.495436
+vt 0.687628 0.489885
+vt 0.779839 0.488518
+vt 0.749318 0.494983
+vt 0.748545 0.488099
+vt 0.370705 0.281246
+vt 0.371348 0.252525
+vt 0.228946 0.606403
+vt 0.442734 0.606402
+vt 0.228889 0.488295
+vt 0.579817 0.387126
+vt 0.586362 0.385333
+vt 0.006337 0.500000
+vt 0.176362 0.499962
+vt 0.176359 0.530816
+vt 0.892437 0.349226
+vt 0.885423 0.348954
+vt 0.885704 0.319257
+vt 0.706468 0.066881
+vt 0.736753 0.067631
+vt 0.735929 0.074111
+vt 0.443305 0.193031
+vt 0.371495 0.193949
+vt 0.371495 0.164423
+vt 0.177644 0.253134
+vt 0.177399 0.283987
+vt 0.006828 0.284020
+vt 0.176549 0.654233
+vt 0.176640 0.685087
+vt 0.006614 0.685125
+vt 0.443160 0.252098
+vt 0.371269 0.930272
+vt 0.371421 0.900745
+vt 0.443231 0.901668
+vt 0.816609 0.103895
+vt 0.836176 0.125250
+vt 0.831035 0.128981
+vt 0.621946 0.100560
+vt 0.605204 0.126737
+vt 0.442698 0.458768
+vt 0.228910 0.458769
+vt 0.228944 0.429242
+vt 0.442732 0.429241
+vt 0.228990 0.399716
+vt 0.874138 0.409852
+vt 0.851292 0.431762
+vt 0.228912 0.576877
+vt 0.442678 0.547349
+vt 0.176377 0.561671
+vt 0.006351 0.561708
+vt 0.850517 0.149568
+vt 0.844628 0.151667
+vt 0.371029 0.959797
+vt 0.443079 0.931196
+vt 0.442853 0.074922
+vt 0.371043 0.075847
+vt 0.370712 0.046322
+vt 0.371495 0.841694
+vt 0.443254 0.813086
+vt 0.443252 0.222558
+vt 0.371442 0.223476
+vt 0.763884 0.080481
+vt 0.443090 0.104449
+vt 0.371280 0.105372
+vt 0.808610 0.476251
+vt 0.805300 0.470133
+vt 0.006727 0.314875
+vt 0.176753 0.314837
+vt 0.007613 0.962812
+vt 0.319616 0.961631
+vt 0.319730 0.992485
+vt 0.006827 0.746834
+vt 0.176742 0.715941
+vt 0.006716 0.715979
+vt 0.661830 0.472412
+vt 0.658752 0.478560
+vt 0.632640 0.461897
+vt 0.442971 0.724510
+vt 0.006929 0.253167
+vt 0.572791 0.357181
+vt 0.571207 0.326153
+vt 0.578089 0.326242
+vt 0.442778 0.399714
+vt 0.229046 0.370189
+vt 0.442700 0.576876
+vt 0.176474 0.623379
+vt 0.006524 0.654271
+vt 0.006543 0.376583
+vt 0.229113 0.694984
+vt 0.442837 0.665456
+vt 0.007520 0.068042
+vt 0.371492 0.871219
+vt 0.443302 0.872141
+vt 0.689480 0.483245
+vt 0.443305 0.163503
+vt 0.371427 0.134897
+vt 0.007055 0.808541
+vt 0.177771 0.808498
+vt 0.442678 0.488295
+vt 0.777761 0.481894
+vt 0.573209 0.178195
+vt 0.579868 0.178984
+vt 0.636826 0.456466
+vt 0.579568 0.357437
+vt 0.007387 0.901104
+vt 0.319390 0.899923
+vt 0.319502 0.930776
+vt 0.176415 0.592525
+vt 0.006390 0.592562
+vt 0.007122 0.191458
+vt 0.812355 0.108585
+vt 0.582798 0.148853
+vt 0.589057 0.151745
+vt 0.007276 0.870250
+vt 0.007319 0.129750
+vt 0.006448 0.623417
+vt 0.886228 0.380492
+vt 0.879533 0.378395
+vt 0.442833 0.370188
+vt 0.370694 0.989321
+vt 0.442838 0.960722
+vt 0.886223 0.285996
+vt 0.879631 0.287703
+vt 0.599888 0.122511
+vt 0.676401 0.072253
+vt 0.443237 0.133976
+vt 0.443305 0.842613
+vt 0.867982 0.406513
+vt 0.006405 0.438291
+vt 0.176387 0.469108
+vt 0.892437 0.317355
+vt 0.442901 0.694984
+vt 0.006361 0.469146
+vt 0.007499 0.931958
+vt 0.706979 0.073452
+vt 0.678244 0.078632
+vt 0.598317 0.411848
+vt 0.007623 0.037188
+vt 0.007728 0.993666
+vt 0.442504 0.990249
+vt 0.006334 0.530854
+vt 0.442522 0.045396
+vt 0.442670 0.517822
+vt 0.228883 0.517823
+vt 0.228889 0.488295
+vt 0.442971 0.724510
+vt 0.443060 0.754024
+vt 0.370472 0.723575
+vt 0.442967 0.311134
+vt 0.370467 0.312068
+vt 0.443056 0.281620
+vt 0.443160 0.252098
+vt 0.371348 0.252525
+vt 0.443163 0.783546
+vt 0.371352 0.783117
+vt 0.006929 0.253167
+vt 0.177644 0.253134
+vt 0.006828 0.284020
+vt 0.007055 0.808541
+vt 0.006941 0.777687
+vt 0.177771 0.808498
+vt 0.006827 0.746834
+vt 0.176852 0.746796
+vt 0.006727 0.314875
+vt 0.176753 0.314837
+vt 0.371492 0.871219
+vt 0.371495 0.841694
+vt 0.443305 0.842613
+vt 0.615392 0.436018
+vt 0.610260 0.440534
+vt 0.592437 0.415287
+vt 0.816609 0.103895
+vt 0.836176 0.125250
+vt 0.831035 0.128981
+vt 0.706468 0.066881
+vt 0.736753 0.067631
+vt 0.735929 0.074111
+vt 0.647824 0.083609
+vt 0.650942 0.089526
+vt 0.626230 0.105756
+vt 0.765981 0.074365
+vt 0.763884 0.080481
+vt 0.579817 0.387126
+vt 0.586362 0.385333
+vt 0.621946 0.100560
+vt 0.605204 0.126737
+vt 0.706979 0.073452
+vt 0.678244 0.078632
+vt 0.792953 0.086670
+vt 0.812355 0.108585
+vt 0.676401 0.072253
+vt 0.789700 0.092175
+vt 0.599888 0.122511
+vt 0.589057 0.151745
+vt 0.582798 0.148853
+vt 0.579868 0.178984
+vt 0.850517 0.149568
+vt 0.844628 0.151667
+vt 0.572791 0.357181
+vt 0.571207 0.326153
+vt 0.578089 0.326242
+vt 0.579568 0.357437
+vt 0.892437 0.349226
+vt 0.885423 0.348954
+vt 0.885704 0.319257
+vt 0.886223 0.285996
+vt 0.879631 0.287703
+vt 0.636826 0.456466
+vt 0.632640 0.461897
+vt 0.874138 0.409852
+vt 0.856681 0.436209
+vt 0.851292 0.431762
+vt 0.661830 0.472412
+vt 0.658752 0.478560
+vt 0.689480 0.483245
+vt 0.687628 0.489885
+vt 0.718747 0.488548
+vt 0.718195 0.495436
+vt 0.779839 0.488518
+vt 0.749318 0.494983
+vt 0.748545 0.488099
+vt 0.808610 0.476251
+vt 0.777761 0.481894
+vt 0.834553 0.458608
+vt 0.805300 0.470133
+vt 0.830124 0.453224
+vt 0.573209 0.178195
+vt 0.886228 0.380492
+vt 0.867982 0.406513
+vt 0.879533 0.378395
+vt 0.370709 0.754396
+vt 0.319322 0.130795
+vt 0.319224 0.161649
+vt 0.007220 0.160604
+vt 0.007387 0.901104
+vt 0.319390 0.899923
+vt 0.319502 0.930776
+vt 0.442778 0.399714
+vt 0.228990 0.399716
+vt 0.229046 0.370189
+vt 0.007499 0.931958
+vt 0.319616 0.961631
+vt 0.006361 0.469146
+vt 0.176387 0.469108
+vt 0.176362 0.499962
+vt 0.442678 0.488295
+vt 0.228910 0.458769
+vt 0.007727 0.006334
+vt 0.319730 0.007378
+vt 0.319626 0.038233
+vt 0.228890 0.547350
+vt 0.007613 0.962812
+vt 0.319730 0.992485
+vt 0.228946 0.606403
+vt 0.228912 0.576877
+vt 0.442700 0.576876
+vt 0.228992 0.635930
+vt 0.442734 0.606402
+vt 0.442833 0.370188
+vt 0.229109 0.340661
+vt 0.229113 0.694984
+vt 0.229049 0.665457
+vt 0.442837 0.665456
+vt 0.442901 0.694984
+vt 0.370705 0.281246
+vt 0.371443 0.812167
+vt 0.443254 0.813086
+vt 0.892437 0.317355
+vt 0.371421 0.900745
+vt 0.443302 0.872141
+vt 0.371269 0.930272
+vt 0.443231 0.901668
+vt 0.007276 0.870250
+vt 0.319278 0.869069
+vt 0.006405 0.438291
+vt 0.176430 0.438254
+vt 0.443090 0.104449
+vt 0.371280 0.105372
+vt 0.371043 0.075847
+vt 0.443237 0.133976
+vt 0.371427 0.134897
+vt 0.443305 0.163503
+vt 0.371495 0.164423
+vt 0.443305 0.193031
+vt 0.371495 0.193949
+vt 0.443252 0.222558
+vt 0.371442 0.223476
+vt 0.177399 0.283987
+vt 0.006543 0.376583
+vt 0.176568 0.376545
+vt 0.176492 0.407399
+vt 0.006467 0.407437
+vt 0.007165 0.839396
+vt 0.319168 0.838215
+vt 0.370694 0.989321
+vt 0.371029 0.959797
+vt 0.442838 0.960722
+vt 0.442780 0.635930
+vt 0.442698 0.458768
+vt 0.228944 0.429242
+vt 0.006337 0.500000
+vt 0.176359 0.530816
+vt 0.319524 0.069087
+vt 0.007520 0.068042
+vt 0.319423 0.099941
+vt 0.007419 0.098896
+vt 0.007319 0.129750
+vt 0.442897 0.340661
+vt 0.319126 0.192504
+vt 0.007122 0.191458
+vt 0.319029 0.223358
+vt 0.007025 0.222313
+vt 0.177512 0.777645
+vt 0.443079 0.931196
+vt 0.176656 0.345691
+vt 0.006631 0.345729
+vt 0.442853 0.074922
+vt 0.370712 0.046322
+vt 0.442732 0.429241
+vt 0.442678 0.547349
+vt 0.176377 0.561671
+vt 0.006351 0.561708
+vt 0.176415 0.592525
+vt 0.006390 0.592562
+vt 0.176474 0.623379
+vt 0.006448 0.623417
+vt 0.176549 0.654233
+vt 0.006524 0.654271
+vt 0.176640 0.685087
+vt 0.006614 0.685125
+vt 0.176742 0.715941
+vt 0.006716 0.715979
+vt 0.598317 0.411848
+vt 0.007623 0.037188
+vt 0.007728 0.993666
+vt 0.442504 0.990249
+vt 0.006334 0.530854
+vt 0.442522 0.045396
+vt 0.598317 0.411848
+vt 0.007623 0.037188
+vt 0.007728 0.993666
+vt 0.442504 0.990249
+vt 0.006334 0.530854
+vt 0.442522 0.045396
+vt 0.006929 0.253167
+vt 0.007025 0.222313
+vt 0.177644 0.253134
+vt 0.442678 0.488295
+vt 0.228889 0.488295
+vt 0.228910 0.458769
+vt 0.442670 0.517822
+vt 0.006631 0.345729
+vt 0.176656 0.345691
+vt 0.176568 0.376545
+vt 0.689480 0.483245
+vt 0.718747 0.488548
+vt 0.687628 0.489885
+vt 0.371352 0.783117
+vt 0.370709 0.754396
+vt 0.443060 0.754024
+vt 0.442971 0.724510
+vt 0.370472 0.723575
+vt 0.228883 0.517823
+vt 0.176852 0.746796
+vt 0.177512 0.777645
+vt 0.006941 0.777687
+vt 0.892437 0.317355
+vt 0.885704 0.319257
+vt 0.879631 0.287703
+vt 0.586362 0.385333
+vt 0.579817 0.387126
+vt 0.579568 0.357437
+vt 0.370694 0.989321
+vt 0.371029 0.959797
+vt 0.442838 0.960722
+vt 0.748545 0.488099
+vt 0.749318 0.494983
+vt 0.718195 0.495436
+vt 0.836176 0.125250
+vt 0.850517 0.149568
+vt 0.844628 0.151667
+vt 0.319423 0.099941
+vt 0.319322 0.130795
+vt 0.007319 0.129750
+vt 0.371269 0.930272
+vt 0.371421 0.900745
+vt 0.443231 0.901668
+vt 0.007419 0.098896
+vt 0.763884 0.080481
+vt 0.765981 0.074365
+vt 0.789700 0.092175
+vt 0.443302 0.872141
+vt 0.442833 0.370188
+vt 0.442778 0.399714
+vt 0.229046 0.370189
+vt 0.319626 0.038233
+vt 0.319524 0.069087
+vt 0.007520 0.068042
+vt 0.808610 0.476251
+vt 0.779839 0.488518
+vt 0.777761 0.481894
+vt 0.176640 0.685087
+vt 0.176742 0.715941
+vt 0.006716 0.715979
+vt 0.371495 0.841694
+vt 0.371443 0.812167
+vt 0.443254 0.813086
+vt 0.006614 0.685125
+vt 0.006467 0.407437
+vt 0.006543 0.376583
+vt 0.176492 0.407399
+vt 0.892437 0.349226
+vt 0.886228 0.380492
+vt 0.885423 0.348954
+vt 0.599888 0.122511
+vt 0.605204 0.126737
+vt 0.589057 0.151745
+vt 0.443305 0.193031
+vt 0.443252 0.222558
+vt 0.371495 0.193949
+vt 0.636826 0.456466
+vt 0.632640 0.461897
+vt 0.610260 0.440534
+vt 0.735929 0.074111
+vt 0.736753 0.067631
+vt 0.442837 0.665456
+vt 0.229049 0.665457
+vt 0.442780 0.635930
+vt 0.006361 0.469146
+vt 0.006405 0.438291
+vt 0.176387 0.469108
+vt 0.007613 0.962812
+vt 0.319616 0.961631
+vt 0.319730 0.992485
+vt 0.598317 0.411848
+vt 0.592437 0.415287
+vt 0.442678 0.547349
+vt 0.228890 0.547350
+vt 0.443160 0.252098
+vt 0.371348 0.252525
+vt 0.371442 0.223476
+vt 0.442504 0.990249
+vt 0.319126 0.192504
+vt 0.319029 0.223358
+vt 0.621946 0.100560
+vt 0.647824 0.083609
+vt 0.626230 0.105756
+vt 0.371492 0.871219
+vt 0.615392 0.436018
+vt 0.442732 0.429241
+vt 0.442698 0.458768
+vt 0.228944 0.429242
+vt 0.007499 0.931958
+vt 0.879533 0.378395
+vt 0.867982 0.406513
+vt 0.572791 0.357181
+vt 0.443237 0.133976
+vt 0.371427 0.134897
+vt 0.371280 0.105372
+vt 0.442853 0.074922
+vt 0.443090 0.104449
+vt 0.371043 0.075847
+vt 0.007727 0.006334
+vt 0.319730 0.007378
+vt 0.578089 0.326242
+vt 0.443305 0.163503
+vt 0.371495 0.164423
+vt 0.006727 0.314875
+vt 0.176753 0.314837
+vt 0.319502 0.930776
+vt 0.006337 0.500000
+vt 0.176362 0.499962
+vt 0.792953 0.086670
+vt 0.816609 0.103895
+vt 0.812355 0.108585
+vt 0.176549 0.654233
+vt 0.650942 0.089526
+vt 0.006828 0.284020
+vt 0.177399 0.283987
+vt 0.661830 0.472412
+vt 0.658752 0.478560
+vt 0.571207 0.326153
+vt 0.006524 0.654271
+vt 0.442901 0.694984
+vt 0.229113 0.694984
+vt 0.007122 0.191458
+vt 0.831035 0.128981
+vt 0.006390 0.592562
+vt 0.176415 0.592525
+vt 0.006448 0.623417
+vt 0.805300 0.470133
+vt 0.228990 0.399716
+vt 0.582798 0.148853
+vt 0.176430 0.438254
+vt 0.886223 0.285996
+vt 0.706979 0.073452
+vt 0.706468 0.066881
+vt 0.176474 0.623379
+vt 0.229109 0.340661
+vt 0.834553 0.458608
+vt 0.676401 0.072253
+vt 0.228992 0.635930
+vt 0.228946 0.606403
+vt 0.442734 0.606402
+vt 0.443079 0.931196
+vt 0.442700 0.576876
+vt 0.176377 0.561671
+vt 0.228912 0.576877
+vt 0.442967 0.311134
+vt 0.370467 0.312068
+vt 0.443056 0.281620
+vt 0.370712 0.046322
+vt 0.830124 0.453224
+vt 0.007220 0.160604
+vt 0.370705 0.281246
+vt 0.176359 0.530816
+vt 0.443305 0.842613
+vt 0.874138 0.409852
+vt 0.851292 0.431762
+vt 0.442897 0.340661
+vt 0.007276 0.870250
+vt 0.319278 0.869069
+vt 0.319390 0.899923
+vt 0.678244 0.078632
+vt 0.006334 0.530854
+vt 0.006351 0.561708
+vt 0.856681 0.436209
+vt 0.443163 0.783546
+vt 0.007728 0.993666
+vt 0.007623 0.037188
+vt 0.007387 0.901104
+vt 0.319224 0.161649
+vt 0.442522 0.045396
+vt 0.006827 0.746834
+vt 0.007165 0.839396
+vt 0.007055 0.808541
+vt 0.177771 0.808498
+vt 0.319168 0.838215
+vt 0.573209 0.178195
+vt 0.579868 0.178984
+vt 0.442670 0.517822
+vt 0.228883 0.517823
+vt 0.228889 0.488295
+vt 0.442971 0.724510
+vt 0.443060 0.754024
+vt 0.370472 0.723575
+vt 0.442967 0.311134
+vt 0.370467 0.312068
+vt 0.443056 0.281620
+vt 0.443160 0.252098
+vt 0.371348 0.252525
+vt 0.443163 0.783546
+vt 0.371352 0.783117
+vt 0.006929 0.253167
+vt 0.177644 0.253134
+vt 0.006828 0.284020
+vt 0.007055 0.808541
+vt 0.006941 0.777687
+vt 0.177771 0.808498
+vt 0.006827 0.746834
+vt 0.176852 0.746796
+vt 0.006727 0.314875
+vt 0.176753 0.314837
+vt 0.371492 0.871219
+vt 0.371495 0.841694
+vt 0.443305 0.842613
+vt 0.615392 0.436018
+vt 0.610260 0.440534
+vt 0.592437 0.415287
+vt 0.816609 0.103895
+vt 0.836176 0.125250
+vt 0.831035 0.128981
+vt 0.706468 0.066881
+vt 0.736753 0.067631
+vt 0.735929 0.074111
+vt 0.647824 0.083609
+vt 0.650942 0.089526
+vt 0.626230 0.105756
+vt 0.765981 0.074365
+vt 0.763884 0.080481
+vt 0.579817 0.387126
+vt 0.586362 0.385333
+vt 0.621946 0.100560
+vt 0.605204 0.126737
+vt 0.706979 0.073452
+vt 0.678244 0.078632
+vt 0.792953 0.086670
+vt 0.812355 0.108585
+vt 0.676401 0.072253
+vt 0.789700 0.092175
+vt 0.599888 0.122511
+vt 0.589057 0.151745
+vt 0.582798 0.148853
+vt 0.579868 0.178984
+vt 0.850517 0.149568
+vt 0.844628 0.151667
+vt 0.572791 0.357181
+vt 0.571207 0.326153
+vt 0.578089 0.326242
+vt 0.579568 0.357437
+vt 0.892437 0.349226
+vt 0.885423 0.348954
+vt 0.885704 0.319257
+vt 0.886223 0.285996
+vt 0.879631 0.287703
+vt 0.636826 0.456466
+vt 0.632640 0.461897
+vt 0.874138 0.409852
+vt 0.856681 0.436209
+vt 0.851292 0.431762
+vt 0.661830 0.472412
+vt 0.658752 0.478560
+vt 0.689480 0.483245
+vt 0.687628 0.489885
+vt 0.718747 0.488548
+vt 0.718195 0.495436
+vt 0.779839 0.488518
+vt 0.749318 0.494983
+vt 0.748545 0.488099
+vt 0.808610 0.476251
+vt 0.777761 0.481894
+vt 0.834553 0.458608
+vt 0.805300 0.470133
+vt 0.830124 0.453224
+vt 0.573209 0.178195
+vt 0.886228 0.380492
+vt 0.867982 0.406513
+vt 0.879533 0.378395
+vt 0.370709 0.754396
+vt 0.319322 0.130795
+vt 0.319224 0.161649
+vt 0.007220 0.160604
+vt 0.007387 0.901104
+vt 0.319390 0.899923
+vt 0.319502 0.930776
+vt 0.442778 0.399714
+vt 0.228990 0.399716
+vt 0.229046 0.370189
+vt 0.007499 0.931958
+vt 0.319616 0.961631
+vt 0.006361 0.469146
+vt 0.176387 0.469108
+vt 0.176362 0.499962
+vt 0.442678 0.488295
+vt 0.228910 0.458769
+vt 0.007727 0.006334
+vt 0.319730 0.007378
+vt 0.319626 0.038233
+vt 0.228890 0.547350
+vt 0.007613 0.962812
+vt 0.319730 0.992485
+vt 0.228946 0.606403
+vt 0.228912 0.576877
+vt 0.442700 0.576876
+vt 0.228992 0.635930
+vt 0.442734 0.606402
+vt 0.442833 0.370188
+vt 0.229109 0.340661
+vt 0.229113 0.694984
+vt 0.229049 0.665457
+vt 0.442837 0.665456
+vt 0.442901 0.694984
+vt 0.370705 0.281246
+vt 0.371443 0.812167
+vt 0.443254 0.813086
+vt 0.892437 0.317355
+vt 0.371421 0.900745
+vt 0.443302 0.872141
+vt 0.371269 0.930272
+vt 0.443231 0.901668
+vt 0.007276 0.870250
+vt 0.319278 0.869069
+vt 0.006405 0.438291
+vt 0.176430 0.438254
+vt 0.443090 0.104449
+vt 0.371280 0.105372
+vt 0.371043 0.075847
+vt 0.443237 0.133976
+vt 0.371427 0.134897
+vt 0.443305 0.163503
+vt 0.371495 0.164423
+vt 0.443305 0.193031
+vt 0.371495 0.193949
+vt 0.443252 0.222558
+vt 0.371442 0.223476
+vt 0.177399 0.283987
+vt 0.006543 0.376583
+vt 0.176568 0.376545
+vt 0.176492 0.407399
+vt 0.006467 0.407437
+vt 0.007165 0.839396
+vt 0.319168 0.838215
+vt 0.370694 0.989321
+vt 0.371029 0.959797
+vt 0.442838 0.960722
+vt 0.442780 0.635930
+vt 0.442698 0.458768
+vt 0.228944 0.429242
+vt 0.006337 0.500000
+vt 0.176359 0.530816
+vt 0.319524 0.069087
+vt 0.007520 0.068042
+vt 0.319423 0.099941
+vt 0.007419 0.098896
+vt 0.007319 0.129750
+vt 0.442897 0.340661
+vt 0.319126 0.192504
+vt 0.007122 0.191458
+vt 0.319029 0.223358
+vt 0.007025 0.222313
+vt 0.177512 0.777645
+vt 0.443079 0.931196
+vt 0.176656 0.345691
+vt 0.006631 0.345729
+vt 0.442853 0.074922
+vt 0.370712 0.046322
+vt 0.442732 0.429241
+vt 0.442678 0.547349
+vt 0.176377 0.561671
+vt 0.006351 0.561708
+vt 0.176415 0.592525
+vt 0.006390 0.592562
+vt 0.176474 0.623379
+vt 0.006448 0.623417
+vt 0.176549 0.654233
+vt 0.006524 0.654271
+vt 0.176640 0.685087
+vt 0.006614 0.685125
+vt 0.176742 0.715941
+vt 0.006716 0.715979
+vt 0.598317 0.411848
+vt 0.007623 0.037188
+vt 0.007728 0.993666
+vt 0.442504 0.990249
+vt 0.006334 0.530854
+vt 0.442522 0.045396
+vt 0.006929 0.253167
+vt 0.007025 0.222313
+vt 0.177644 0.253134
+vt 0.442678 0.488295
+vt 0.228889 0.488295
+vt 0.228910 0.458769
+vt 0.442670 0.517822
+vt 0.006631 0.345729
+vt 0.176656 0.345691
+vt 0.176568 0.376545
+vt 0.689480 0.483245
+vt 0.718747 0.488548
+vt 0.687628 0.489885
+vt 0.371352 0.783117
+vt 0.370709 0.754396
+vt 0.443060 0.754024
+vt 0.442971 0.724510
+vt 0.370472 0.723575
+vt 0.228883 0.517823
+vt 0.176852 0.746796
+vt 0.177512 0.777645
+vt 0.006941 0.777687
+vt 0.892437 0.317355
+vt 0.885704 0.319257
+vt 0.879631 0.287703
+vt 0.586362 0.385333
+vt 0.579817 0.387126
+vt 0.579568 0.357437
+vt 0.370694 0.989321
+vt 0.371029 0.959797
+vt 0.442838 0.960722
+vt 0.748545 0.488099
+vt 0.749318 0.494983
+vt 0.718195 0.495436
+vt 0.836176 0.125250
+vt 0.850517 0.149568
+vt 0.844628 0.151667
+vt 0.319423 0.099941
+vt 0.319322 0.130795
+vt 0.007319 0.129750
+vt 0.371269 0.930272
+vt 0.371421 0.900745
+vt 0.443231 0.901668
+vt 0.007419 0.098896
+vt 0.763884 0.080481
+vt 0.765981 0.074365
+vt 0.789700 0.092175
+vt 0.443302 0.872141
+vt 0.442833 0.370188
+vt 0.442778 0.399714
+vt 0.229046 0.370189
+vt 0.319626 0.038233
+vt 0.319524 0.069087
+vt 0.007520 0.068042
+vt 0.808610 0.476251
+vt 0.779839 0.488518
+vt 0.777761 0.481894
+vt 0.176640 0.685087
+vt 0.176742 0.715941
+vt 0.006716 0.715979
+vt 0.371495 0.841694
+vt 0.371443 0.812167
+vt 0.443254 0.813086
+vt 0.006614 0.685125
+vt 0.006467 0.407437
+vt 0.006543 0.376583
+vt 0.176492 0.407399
+vt 0.892437 0.349226
+vt 0.886228 0.380492
+vt 0.885423 0.348954
+vt 0.599888 0.122511
+vt 0.605204 0.126737
+vt 0.589057 0.151745
+vt 0.443305 0.193031
+vt 0.443252 0.222558
+vt 0.371495 0.193949
+vt 0.636826 0.456466
+vt 0.632640 0.461897
+vt 0.610260 0.440534
+vt 0.735929 0.074111
+vt 0.736753 0.067631
+vt 0.442837 0.665456
+vt 0.229049 0.665457
+vt 0.442780 0.635930
+vt 0.006361 0.469146
+vt 0.006405 0.438291
+vt 0.176387 0.469108
+vt 0.007613 0.962812
+vt 0.319616 0.961631
+vt 0.319730 0.992485
+vt 0.598317 0.411848
+vt 0.592437 0.415287
+vt 0.442678 0.547349
+vt 0.228890 0.547350
+vt 0.443160 0.252098
+vt 0.371348 0.252525
+vt 0.371442 0.223476
+vt 0.442504 0.990249
+vt 0.319126 0.192504
+vt 0.319029 0.223358
+vt 0.621946 0.100560
+vt 0.647824 0.083609
+vt 0.626230 0.105756
+vt 0.371492 0.871219
+vt 0.615392 0.436018
+vt 0.442732 0.429241
+vt 0.442698 0.458768
+vt 0.228944 0.429242
+vt 0.007499 0.931958
+vt 0.879533 0.378395
+vt 0.867982 0.406513
+vt 0.572791 0.357181
+vt 0.443237 0.133976
+vt 0.371427 0.134897
+vt 0.371280 0.105372
+vt 0.442853 0.074922
+vt 0.443090 0.104449
+vt 0.371043 0.075847
+vt 0.007727 0.006334
+vt 0.319730 0.007378
+vt 0.578089 0.326242
+vt 0.443305 0.163503
+vt 0.371495 0.164423
+vt 0.006727 0.314875
+vt 0.176753 0.314837
+vt 0.319502 0.930776
+vt 0.006337 0.500000
+vt 0.176362 0.499962
+vt 0.792953 0.086670
+vt 0.816609 0.103895
+vt 0.812355 0.108585
+vt 0.176549 0.654233
+vt 0.650942 0.089526
+vt 0.006828 0.284020
+vt 0.177399 0.283987
+vt 0.661830 0.472412
+vt 0.658752 0.478560
+vt 0.571207 0.326153
+vt 0.006524 0.654271
+vt 0.442901 0.694984
+vt 0.229113 0.694984
+vt 0.007122 0.191458
+vt 0.831035 0.128981
+vt 0.006390 0.592562
+vt 0.176415 0.592525
+vt 0.006448 0.623417
+vt 0.805300 0.470133
+vt 0.228990 0.399716
+vt 0.582798 0.148853
+vt 0.176430 0.438254
+vt 0.886223 0.285996
+vt 0.706979 0.073452
+vt 0.706468 0.066881
+vt 0.176474 0.623379
+vt 0.229109 0.340661
+vt 0.834553 0.458608
+vt 0.676401 0.072253
+vt 0.228992 0.635930
+vt 0.228946 0.606403
+vt 0.442734 0.606402
+vt 0.443079 0.931196
+vt 0.442700 0.576876
+vt 0.176377 0.561671
+vt 0.228912 0.576877
+vt 0.442967 0.311134
+vt 0.370467 0.312068
+vt 0.443056 0.281620
+vt 0.370712 0.046322
+vt 0.830124 0.453224
+vt 0.007220 0.160604
+vt 0.370705 0.281246
+vt 0.176359 0.530816
+vt 0.443305 0.842613
+vt 0.874138 0.409852
+vt 0.851292 0.431762
+vt 0.442897 0.340661
+vt 0.007276 0.870250
+vt 0.319278 0.869069
+vt 0.319390 0.899923
+vt 0.678244 0.078632
+vt 0.006334 0.530854
+vt 0.006351 0.561708
+vt 0.856681 0.436209
+vt 0.443163 0.783546
+vt 0.007728 0.993666
+vt 0.007623 0.037188
+vt 0.007387 0.901104
+vt 0.319224 0.161649
+vt 0.442522 0.045396
+vt 0.006827 0.746834
+vt 0.007165 0.839396
+vt 0.007055 0.808541
+vt 0.177771 0.808498
+vt 0.319168 0.838215
+vt 0.573209 0.178195
+vt 0.579868 0.178984
+vt 0.874125 0.609201
+vt 0.817898 0.626255
+vt 0.670298 0.547363
+vt 0.653238 0.491123
+vt 0.732120 0.343530
+vt 0.846854 0.332224
+vt 0.935969 0.405357
+vt 0.953029 0.461597
+vt 0.759412 0.620495
+vt 0.732132 0.609195
+vt 0.658998 0.432637
+vt 0.686702 0.380807
+vt 0.759394 0.332230
+vt 0.898684 0.359926
+vt 0.919564 0.380805
+vt 0.947269 0.520085
+vt 0.919563 0.571916
+vt 0.846857 0.620495
+vt 0.788371 0.626255
+vt 0.707581 0.592792
+vt 0.686702 0.571913
+vt 0.658999 0.520082
+vt 0.653238 0.461596
+vt 0.670298 0.405358
+vt 0.707581 0.359928
+vt 0.788366 0.326464
+vt 0.817893 0.326463
+vt 0.874134 0.343522
+vt 0.947270 0.432638
+vt 0.953029 0.491125
+vt 0.935968 0.547365
+vt 0.898673 0.592803
+vt 0.214996 0.906316
+vt 0.198460 0.906317
+vt 0.182243 0.903091
+vt 0.281116 0.782613
+vt 0.290669 0.814108
+vt 0.246483 0.896766
+vt 0.231211 0.741659
+vt 0.182233 0.741662
+vt 0.198458 0.738433
+vt 0.126012 0.797890
+vt 0.141526 0.768865
+vt 0.166960 0.747990
+vt 0.271928 0.875886
+vt 0.260230 0.887583
+vt 0.214993 0.738433
+vt 0.260236 0.757172
+vt 0.271928 0.768865
+vt 0.122786 0.830643
+vt 0.290669 0.830644
+vt 0.287443 0.846861
+vt 0.287444 0.797891
+vt 0.132340 0.862137
+vt 0.166967 0.896763
+vt 0.153218 0.887577
+vt 0.141526 0.875885
+vt 0.132339 0.782614
+vt 0.281115 0.862138
+vt 0.126012 0.846860
+vt 0.153218 0.757173
+vt 0.246487 0.747986
+vt 0.231212 0.903091
+vt 0.122786 0.814107
+vt 0.305766 0.603342
+vt 0.249539 0.620395
+vt 0.101939 0.541503
+vt 0.084879 0.485264
+vt 0.163760 0.337671
+vt 0.278494 0.326364
+vt 0.367610 0.399497
+vt 0.384670 0.455738
+vt 0.191052 0.614636
+vt 0.163773 0.603336
+vt 0.090639 0.426777
+vt 0.118343 0.374948
+vt 0.191035 0.326370
+vt 0.330325 0.354067
+vt 0.351205 0.374946
+vt 0.378909 0.514226
+vt 0.351204 0.566056
+vt 0.278498 0.614635
+vt 0.220011 0.620396
+vt 0.139222 0.586933
+vt 0.118343 0.566054
+vt 0.090640 0.514223
+vt 0.084879 0.455737
+vt 0.101938 0.399499
+vt 0.139222 0.354069
+vt 0.220007 0.320605
+vt 0.249534 0.320604
+vt 0.305774 0.337663
+vt 0.378910 0.426778
+vt 0.384670 0.485266
+vt 0.367609 0.541505
+vt 0.330314 0.586943
+vt 0.103870 0.076834
+vt 0.115562 0.065142
+vt 0.129303 0.055959
+vt 0.094683 0.170106
+vt 0.129310 0.204732
+vt 0.115562 0.195546
+vt 0.208826 0.204735
+vt 0.177339 0.214285
+vt 0.088356 0.154828
+vt 0.085130 0.138611
+vt 0.085130 0.122076
+vt 0.088355 0.105859
+vt 0.160804 0.214285
+vt 0.144587 0.211060
+vt 0.193554 0.049628
+vt 0.208831 0.055955
+vt 0.222579 0.065141
+vt 0.243459 0.090582
+vt 0.249787 0.105860
+vt 0.253013 0.122077
+vt 0.234272 0.183855
+vt 0.222573 0.195552
+vt 0.144577 0.049631
+vt 0.160801 0.046402
+vt 0.193556 0.211059
+vt 0.249787 0.154830
+vt 0.177337 0.046402
+vt 0.234272 0.076833
+vt 0.243459 0.170107
+vt 0.094683 0.090583
+vt 0.103870 0.183854
+vt 0.253013 0.138613
+vt 0.606547 0.945139
+vt 0.550320 0.962192
+vt 0.402720 0.883300
+vt 0.385660 0.827061
+vt 0.464542 0.679467
+vt 0.579275 0.668161
+vt 0.668391 0.741294
+vt 0.685451 0.797535
+vt 0.491833 0.956433
+vt 0.464554 0.945133
+vt 0.391420 0.768574
+vt 0.419124 0.716744
+vt 0.491816 0.668167
+vt 0.631106 0.695864
+vt 0.651986 0.716743
+vt 0.679690 0.856022
+vt 0.651985 0.907853
+vt 0.579279 0.956432
+vt 0.520792 0.962193
+vt 0.440003 0.928729
+vt 0.419124 0.907851
+vt 0.391421 0.856020
+vt 0.385660 0.797533
+vt 0.402719 0.741295
+vt 0.440003 0.695865
+vt 0.520788 0.662401
+vt 0.550315 0.662401
+vt 0.606555 0.679459
+vt 0.679692 0.768575
+vt 0.685451 0.827063
+vt 0.668390 0.883302
+vt 0.631095 0.928740
+vt 0.443713 0.231131
+vt 0.455405 0.219439
+vt 0.469147 0.210256
+vt 0.434527 0.324402
+vt 0.469154 0.359029
+vt 0.455406 0.349843
+vt 0.548670 0.359032
+vt 0.517183 0.368582
+vt 0.428200 0.309125
+vt 0.424973 0.292908
+vt 0.424973 0.276373
+vt 0.428199 0.260156
+vt 0.500648 0.368582
+vt 0.484431 0.365357
+vt 0.533398 0.203925
+vt 0.548675 0.210252
+vt 0.562423 0.219438
+vt 0.583303 0.244879
+vt 0.589631 0.260156
+vt 0.592857 0.276374
+vt 0.574115 0.338152
+vt 0.562417 0.349849
+vt 0.484421 0.203928
+vt 0.500645 0.200699
+vt 0.533400 0.365356
+vt 0.589630 0.309127
+vt 0.517180 0.200699
+vt 0.574116 0.231130
+vt 0.583302 0.324403
+vt 0.434527 0.244880
+vt 0.443713 0.338151
+vt 0.592857 0.292910
+vn -0.7066 0.0000 -0.7076
+vn 0.7066 0.0000 0.7076
+vn 0.7076 0.0000 -0.7066
+vn -0.7076 0.0000 0.7066
+vn 0.0000 -1.0000 0.0000
+vn 0.0000 1.0000 0.0000
+vn -0.0619 -0.9955 -0.0717
+vn 0.7048 -0.0946 0.7031
+vn -0.7015 -0.1015 -0.7054
+vn -0.7052 0.0944 -0.7026
+vn 0.7011 0.1014 0.7058
+vn -0.7040 0.0945 -0.7039
+vn 0.7024 0.1015 0.7045
+vn 0.7040 -0.0945 0.7039
+vn -0.7024 -0.1015 -0.7045
+vn 0.5353 0.6370 0.5546
+vn 0.7132 0.0090 -0.7009
+vn 0.7092 0.0066 -0.7050
+vn 0.7079 0.0100 -0.7062
+vn 0.7058 0.0090 -0.7083
+vn 0.7086 0.0095 -0.7056
+vn 0.7092 0.0054 -0.7050
+vn 0.7055 0.0081 -0.7087
+vn 0.7072 0.0101 -0.7070
+vn 0.7093 0.0076 -0.7049
+vn 0.7066 0.0094 -0.7076
+vn 0.7091 0.0087 -0.7051
+vn 0.7054 0.0070 -0.7088
+vn 0.7056 0.0059 -0.7086
+vn 0.7089 0.0057 -0.7053
+vn 0.7063 0.0002 -0.7079
+vn 0.7054 -0.0134 -0.7087
+vn 0.7041 -0.0144 -0.7100
+vn 0.2791 -0.9600 -0.0210
+vn 0.7138 0.0120 -0.7003
+vn 0.7013 0.0119 -0.7128
+vn 0.7135 0.0152 -0.7005
+vn 0.7124 0.0179 -0.7015
+vn 0.7107 0.0199 -0.7033
+vn 0.7063 0.0208 -0.7076
+vn 0.7042 0.0198 -0.7097
+vn 0.7025 0.0178 -0.7115
+vn 0.7015 0.0150 -0.7126
+vn -0.1111 -0.9098 -0.3999
+vn 0.7020 0.0089 -0.7122
+vn 0.7032 0.0056 -0.7110
+vn 0.7042 -0.0921 0.7040
+vn -0.4526 0.7708 -0.4484
+vn 0.4439 0.7752 0.4494
+vn -0.5415 -0.6371 -0.5485
+vn 0.3281 0.8835 0.3342
+vn -0.1972 -0.9579 -0.2086
+vn -0.1981 -0.9579 -0.2077
+vn 0.0636 0.9955 0.0700
+vn 0.0766 -0.9948 0.0669
+vn 0.1997 0.9579 0.2061
+vn 0.3396 -0.8802 0.3314
+vn 0.4539 -0.7708 0.4470
+vn -0.6197 -0.4745 -0.6252
+vn 0.6266 -0.4683 0.6229
+vn 0.6763 -0.2963 0.6744
+vn -0.7024 -0.0990 -0.7048
+vn -0.7025 0.1021 -0.7043
+vn 0.6151 0.4745 0.6297
+vn 0.7085 0.0208 -0.7054
+vn 0.6713 0.2954 0.6798
+vn 0.7082 -0.0002 -0.7061
+vn 0.4350 0.7751 0.4582
+vn 0.3180 0.8834 0.3442
+vn 0.5426 0.6371 0.5474
+vn -0.3258 -0.8835 -0.3365
+vn -0.2214 0.9557 -0.1938
+vn -0.3480 0.8801 -0.3229
+vn -0.4613 0.7707 -0.4396
+vn -0.5569 0.6316 -0.5393
+vn -0.6311 0.4683 -0.6184
+vn -0.6802 0.2887 -0.6738
+vn 0.7027 0.1091 0.7031
+vn -0.5410 -0.6371 -0.5491
+vn -0.4419 -0.7752 -0.4515
+vn 0.6205 0.4745 0.6244
+vn 0.0523 0.9953 0.0813
+vn 0.5509 -0.6317 0.5455
+vn -0.3266 -0.8835 -0.3357
+vn -0.0610 -0.9955 -0.0727
+vn -0.0748 0.9948 -0.0687
+vn -0.2105 0.9559 -0.2048
+vn -0.3381 0.8803 -0.3330
+vn -0.6719 -0.3032 -0.6758
+vn -0.5498 0.6317 -0.5466
+vn -0.6258 0.4683 -0.6237
+vn -0.6766 0.2927 -0.6757
+vn 0.7040 -0.0946 0.7039
+vn 0.1888 0.9578 0.2170
+vn -0.6738 -0.2936 -0.6781
+vn -0.6193 -0.4745 -0.6256
+vn 0.6738 0.2936 0.6781
+vn -0.0862 0.9946 -0.0573
+vn -0.4426 -0.7752 -0.4508
+vn 0.2122 -0.9559 0.2031
+vn 0.0775 -0.9948 0.0660
+vn 0.2130 -0.9559 0.2022
+vn 0.3404 -0.8802 0.3306
+vn 0.4546 -0.7708 0.4463
+vn 0.5514 -0.6317 0.5449
+vn 0.6270 -0.4683 0.6225
+vn 0.6786 -0.2869 0.6762
+vn 0.7209 0.0217 -0.6927
+vn -0.6209 -0.4745 -0.6240
+vn 0.6735 0.2954 0.6776
+vn 0.7037 -0.0945 0.7042
+vn 0.6214 0.4745 0.6235
+vn -0.4445 -0.7752 -0.4488
+vn -0.6727 -0.3032 -0.6749
+vn -0.2087 0.9559 -0.2065
+vn -0.4512 0.7708 -0.4498
+vn 0.6924 0.0363 -0.7206
+vn 0.0655 0.9955 0.0682
+vn 0.5491 -0.6317 0.5473
+vn 0.0737 -0.9948 0.0698
+vn 0.7022 0.1014 0.7047
+vn -0.6249 0.4683 -0.6246
+vn 0.7039 -0.0921 0.7043
+vn 0.7033 0.0217 -0.7106
+vn 0.7110 0.0210 -0.7028
+vn 0.7145 0.0480 -0.6980
+vn 0.7039 0.0502 -0.7085
+vn -0.7028 0.1021 -0.7041
+vn 0.4517 -0.7708 0.4492
+vn -0.0648 -0.9955 -0.0689
+vn 0.7114 0.0131 -0.7026
+vn -0.0644 -0.9955 -0.0693
+vn 0.6989 -0.0348 -0.7144
+vn 0.7082 0.0241 -0.7056
+vn -0.5516 0.6317 -0.5447
+vn -0.7037 0.0945 -0.7042
+vn 0.5493 -0.6317 0.5470
+vn -0.7042 0.0944 -0.7037
+vn 0.3256 0.8835 0.3367
+vn 0.7115 0.0160 -0.7025
+vn 0.7023 0.0195 -0.7116
+vn -0.3291 -0.8836 -0.3332
+vn -0.4448 -0.7752 -0.4485
+vn 0.7093 0.0502 -0.7031
+vn 0.6921 0.0287 -0.7212
+vn 0.2094 -0.9559 0.2059
+vn 0.0741 -0.9948 0.0694
+vn 0.7107 0.0138 -0.7033
+vn 0.1970 0.9579 0.2088
+vn -0.0777 0.9948 -0.0658
+vn 0.6191 0.4745 0.6257
+vn -0.6271 0.4683 -0.6224
+vn 0.7098 0.0229 -0.7040
+vn -0.2132 0.9559 -0.2020
+vn 0.6948 0.0430 -0.7179
+vn -0.7027 -0.1015 -0.7042
+vn 0.2015 0.9579 0.2043
+vn 0.6255 -0.4683 0.6241
+vn 0.7215 0.0366 -0.6914
+vn 0.7025 0.1090 0.7033
+vn 0.7045 0.0004 -0.7097
+vn -0.5434 -0.6371 -0.5467
+vn -0.7028 -0.0990 -0.7044
+vn 0.3371 -0.8803 0.3340
+vn 0.4520 -0.7708 0.4490
+vn -0.5431 -0.6371 -0.5469
+vn 0.6253 -0.4683 0.6243
+vn -0.0730 0.9948 -0.0705
+vn 0.4417 0.7752 0.4517
+vn -0.6761 0.2927 -0.6762
+vn 0.7188 0.0432 -0.6939
+vn -0.4548 0.7708 -0.4462
+vn 0.6748 0.2936 0.6771
+vn -0.2008 -0.9579 -0.2050
+vn 0.6988 0.0479 -0.7137
+vn -0.1992 -0.9259 -0.3210
+vn 0.6776 -0.2869 0.6772
+vn 0.7223 0.0291 -0.6910
+vn 0.7020 -0.0323 -0.7114
+vn 0.4453 0.7752 0.4480
+vn 0.2098 -0.9559 0.2055
+vn -0.5486 0.6317 -0.5477
+vn -0.6748 -0.2936 -0.6771
+vn 0.7027 0.1015 0.7042
+vn 0.7115 0.0184 -0.7024
+vn 0.7028 0.0143 -0.7112
+vn 0.5438 0.6371 0.5463
+vn -0.3364 0.8803 -0.3346
+vn 0.3374 -0.8803 0.3336
+vn 0.6968 0.0136 -0.7172
+vn -0.6210 -0.4745 -0.6238
+vn 0.0608 0.9955 0.0729
+vn 0.1947 -0.9785 0.0684
+vn 0.7022 0.0168 -0.7118
+vn 0.7049 0.0228 -0.7089
+vn -0.3406 0.8802 -0.3304
+vn 0.5408 0.6370 0.5493
+vn 0.6938 0.0214 -0.7198
+vn -0.3288 -0.8836 -0.3335
+vn -0.6780 0.2887 -0.6760
+vn 0.7089 -0.0005 -0.7053
+vn 0.6755 -0.2963 0.6752
+vn -0.2005 -0.9579 -0.2054
+vn 0.3298 0.8836 0.3325
+vn 0.7064 0.0244 -0.7074
+vn -0.0619 -0.9955 -0.0718
+vn 0.5353 0.6370 0.5547
+vn 0.7116 0.0070 -0.7026
+vn 0.7097 0.0070 -0.7044
+vn 0.7079 0.0101 -0.7062
+vn 0.7061 0.0086 -0.7081
+vn 0.7087 0.0097 -0.7055
+vn 0.7120 0.0057 -0.7022
+vn 0.7059 0.0076 -0.7083
+vn 0.7072 0.0100 -0.7070
+vn 0.7097 0.0081 -0.7045
+vn 0.7064 0.0097 -0.7077
+vn 0.7093 0.0091 -0.7049
+vn 0.7060 0.0066 -0.7082
+vn 0.7063 0.0057 -0.7079
+vn 0.7095 0.0060 -0.7046
+vn 0.7071 -0.0002 -0.7071
+vn 0.7111 -0.0144 -0.7029
+vn 0.7098 -0.0134 -0.7043
+vn 0.4044 -0.9072 0.1162
+vn 0.7127 0.0100 -0.7014
+vn 0.7024 0.0099 -0.7117
+vn 0.7129 0.0133 -0.7012
+vn 0.7121 0.0164 -0.7018
+vn 0.7106 0.0189 -0.7033
+vn 0.7063 0.0204 -0.7077
+vn 0.7042 0.0188 -0.7097
+vn 0.7028 0.0163 -0.7112
+vn 0.7022 0.0131 -0.7119
+vn 0.0260 -0.9613 -0.2744
+vn 0.7036 0.0070 -0.7106
+vn 0.7060 0.0053 -0.7082
+vn 0.3281 0.8836 0.3342
+vn 0.0637 0.9955 0.0700
+vn 0.6810 -0.2869 0.6737
+vn 0.6151 0.4744 0.6298
+vn 0.7086 0.0204 -0.7054
+vn 0.6712 0.2935 0.6807
+vn 0.7089 0.0002 -0.7053
+vn -0.3481 0.8801 -0.3229
+vn -0.4614 0.7706 -0.4396
+vn -0.5570 0.6316 -0.5393
+vn -0.6312 0.4682 -0.6184
+vn -0.6811 0.2868 -0.6737
+vn 0.0523 0.9953 0.0814
+vn -0.0749 0.9948 -0.0687
+vn -0.6712 -0.2936 -0.6806
+vn -0.6786 0.2869 -0.6762
+vn 0.1888 0.9577 0.2170
+vn 0.6732 0.2995 0.6761
+vn 0.0775 -0.9948 0.0661
+vn 0.7092 0.0066 -0.7049
+vn 0.7079 0.0099 -0.7062
+vn 0.7065 0.0094 -0.7076
+vn 0.7054 0.0069 -0.7088
+vn 0.7057 0.0059 -0.7085
+vn 0.7041 -0.0144 -0.7099
+vn 0.2791 -0.9600 -0.0209
+vn 0.7042 0.0199 -0.7098
+vn 0.7014 0.0151 -0.7126
+vn 0.7081 -0.0002 -0.7061
+vn 0.7080 0.0101 -0.7062
+vn 0.7061 0.0087 -0.7081
+vn 0.7087 0.0098 -0.7055
+vn 0.7064 0.0098 -0.7077
+vn 0.7093 0.0091 -0.7048
+vn 0.7059 0.0066 -0.7082
+vn 0.4043 -0.9072 0.1162
+vn 0.7129 0.0133 -0.7011
+vn 0.7063 0.0205 -0.7077
+vn 0.0261 -0.9613 -0.2744
+vn 0.7061 0.0054 -0.7081
+vn 0.3396 -0.8802 0.3315
+vn 0.7090 0.0002 -0.7052
+vn 0.7171 0.0170 -0.6967
+vn 0.7127 0.0168 -0.7013
+vn 0.7083 0.0244 -0.7055
+vn 0.7038 0.0210 -0.7101
+vn 0.7101 0.0236 -0.7037
+vn 0.7181 0.0138 -0.6958
+vn 0.7033 0.0184 -0.7107
+vn 0.7065 0.0241 -0.7073
+vn 0.7126 0.0196 -0.7013
+vn 0.7046 0.0235 -0.7092
+vn 0.7116 0.0218 -0.7022
+vn 0.7035 0.0159 -0.7105
+vn 0.7044 0.0137 -0.7097
+vn 0.7122 0.0144 -0.7018
+vn 0.7064 -0.0005 -0.7078
+vn 0.7158 -0.0347 -0.6974
+vn 0.7127 -0.0323 -0.7008
+vn 0.3254 -0.9233 0.2043
+vn 0.7197 0.0241 -0.6939
+vn 0.6949 0.0238 -0.7187
+vn 0.7201 0.0321 -0.6932
+vn 0.7182 0.0396 -0.6947
+vn 0.7145 0.0457 -0.6982
+vn 0.7038 0.0494 -0.7086
+vn 0.6990 0.0455 -0.7137
+vn 0.6956 0.0394 -0.7173
+vn 0.6942 0.0317 -0.7191
+vn -0.0632 -0.9798 -0.1899
+vn 0.6978 0.0169 -0.7161
+vn 0.7038 0.0130 -0.7103
+vn 0.4454 0.7752 0.4480
+vn -0.2005 -0.9579 -0.2053
+vn -0.6211 -0.4745 -0.6238
+vn 0.6786 -0.2869 0.6761
+vn 0.6192 0.4744 0.6257
+vn 0.7094 0.0494 -0.7031
+vn 0.6737 0.2936 0.6782
+vn 0.7108 0.0005 -0.7034
+vn 0.5438 0.6371 0.5462
+vn -0.3288 -0.8835 -0.3335
+vn -0.2133 0.9559 -0.2020
+vn -0.4548 0.7707 -0.4462
+vn -0.5516 0.6316 -0.5448
+vn -0.6272 0.4683 -0.6224
+vn -0.6787 0.2868 -0.6761
+vn -0.5431 -0.6371 -0.5470
+vn -0.6737 -0.2936 -0.6782
+vn -0.6776 0.2869 -0.6772
+vn -0.6209 -0.4744 -0.6240
+vn 0.6738 0.2995 0.6755
+vn 0.0741 -0.9948 0.0695
+vn 0.6192 0.4745 0.6257
+vn -0.6272 0.4682 -0.6224
+vn 0.7099 0.0229 -0.7040
+vn 0.7197 0.0241 -0.6938
+vn -0.3291 -0.8835 -0.3332
+vn 0.7039 0.0494 -0.7086
+vn -0.3292 -0.8835 -0.3332
+vn 0.1947 -0.9785 0.0683
+vn 0.3371 -0.8802 0.3340
+vn -0.4448 -0.7752 -0.4486
+vn 0.2094 -0.9559 0.2058
+vn -0.5516 0.6317 -0.5448
+vn 0.7033 0.0184 -0.7106
+vn 0.5408 0.6371 0.5492
+vn 0.6192 0.4744 0.6258
+vn 0.7109 0.0005 -0.7033
+vn -0.4445 -0.7752 -0.4489
+vn 0.6968 0.0136 -0.7171
+vn -0.0632 -0.9798 -0.1900
+vn -0.4549 0.7707 -0.4462
+vn 0.7111 0.0210 -0.7028
+vn 0.7059 0.0090 -0.7083
+vn 0.7135 0.0151 -0.7005
+vn 0.7042 0.0198 -0.7098
+vn 0.7015 0.0151 -0.7126
+vn -0.1111 -0.9098 -0.4000
+vn 0.7020 0.0089 -0.7121
+vn 0.7082 -0.0002 -0.7060
+vn -0.4614 0.7707 -0.4396
+vn -0.2105 0.9559 -0.2047
+vn 0.7061 0.0053 -0.7081
+vn 0.7086 0.0204 -0.7053
+vn 0.4547 -0.7708 0.4463
+vn 0.7145 0.0458 -0.6982
+vn 0.7025 0.1091 0.7033
+vn 0.7037 -0.0946 0.7042
+vn 0.7093 0.0504 -0.7031
+vn 0.7117 0.0219 -0.7022
+vn 0.7038 0.0129 -0.7103
+vn 0.7223 0.0290 -0.6910
+vn 0.7101 0.0235 -0.7037
+vn 0.7094 0.0493 -0.7031
+vn 0.7099 0.0231 -0.7040
+vn 0.7038 0.0209 -0.7101
+vn 0.7197 0.0242 -0.6938
+vn 0.6977 0.0169 -0.7161
+vn 0.7020 -0.0324 -0.7114
+vn 0.7039 0.0493 -0.7086
+vn 0.7116 0.0185 -0.7024
+vn 0.7032 0.0218 -0.7106
+vn 0.7044 0.0004 -0.7098
+vn 0.4517 -0.7708 0.4493
+vn 0.7039 0.0503 -0.7085
+vn 0.7125 0.0196 -0.7014
+vn -0.7037 0.0946 -0.7042
+vn 0.6942 0.0318 -0.7191
+vn 0.6737 0.2935 0.6782
+vn 0.5408 0.6371 0.5493
+vn 0.7127 0.0169 -0.7013
+vn 0.6938 0.0215 -0.7198
+vn 0.7114 0.0130 -0.7026
+vn 0.7024 0.0195 -0.7116
+vn 0.6921 0.0287 -0.7213
+vn 0.7188 0.0433 -0.6939
+vn 0.7076 0.0044 -0.7066
+vn 0.7076 0.0040 -0.7066
+vn 0.7076 0.0045 -0.7066
+vn 0.7074 0.0041 -0.7068
+vn 0.7076 0.0046 -0.7066
+vn 0.7078 0.0038 -0.7064
+vn 0.7076 0.0039 -0.7066
+vn 0.7076 0.0041 -0.7066
+vn 0.7084 0.0042 -0.7057
+vn 0.7077 0.0043 -0.7065
+vn 0.7075 0.0108 -0.7067
+vn 0.7076 0.0096 -0.7066
+vn 0.7080 0.0092 -0.7062
+vn 0.7075 0.0108 -0.7066
+vn 0.7096 0.0102 -0.7045
+vn 0.7076 0.0097 -0.7066
+vn 0.7075 0.0096 -0.7066
+vn 0.7076 0.0108 -0.7065
+vn 0.7076 0.0098 -0.7065
+vn 0.7075 0.0109 -0.7066
+vn 0.7076 0.0106 -0.7066
+vn 0.7075 0.0107 -0.7066
+vn 0.7076 0.0096 -0.7065
+vn 0.7076 0.0111 -0.7065
+vn 0.7076 0.0108 -0.7066
+vn 0.7070 0.0099 -0.7071
+vn 0.7076 0.0095 -0.7066
+vn 0.7076 0.0107 -0.7065
+vn 0.7077 0.0107 -0.7064
+vn 0.7078 0.0104 -0.7063
+vn 0.7077 0.0044 -0.7065
+vn 0.7075 0.0045 -0.7067
+vn 0.7085 0.0042 -0.7057
+vn 0.7070 0.0099 -0.7072
+vn 0.7076 0.0111 -0.7066
+vn 0.7096 0.0102 -0.7046
+vn 0.7076 0.0097 -0.7065
+vn 0.7084 0.0042 -0.7058
+vn 0.7075 0.0109 -0.7067
+vn 0.7076 0.0099 -0.7065
+vn 0.7097 0.0102 -0.7044
+vn 0.7078 0.0107 -0.7064
+vn 0.7075 0.0097 -0.7066
+vn 0.7076 0.0107 -0.7066
+g KsHauptsignal_Plane.006_Mast
+usemtl Mast
+s off
+f 13/1/1 12/2/1 11/3/1 14/4/1
+f 9/5/2 16/6/2 15/7/2 10/8/2
+f 16/9/3 13/10/3 14/11/3 15/12/3
+f 12/13/4 9/14/4 10/15/4 11/16/4
+f 21/17/4 20/18/4 19/19/4 22/20/4
+f 24/21/1 21/22/1 22/23/1 23/24/1
+f 20/25/2 17/26/2 18/27/2 19/28/2
+f 24/21/1 23/24/1 11/3/1 12/2/1
+f 17/29/5 24/30/5 12/31/5 9/32/5
+f 18/27/2 17/26/2 9/5/2 10/8/2
+f 23/33/6 18/34/6 10/35/6 11/36/6
+f 19/37/6 18/34/6 23/33/6 22/38/6
+f 11/36/6 10/35/6 15/39/6 14/40/6
+f 3/41/1 2/42/1 12/2/1 13/1/1
+f 1/43/2 4/44/2 16/6/2 9/5/2
+f 4/45/3 3/46/3 13/10/3 16/9/3
+f 2/47/4 1/48/4 9/14/4 12/13/4
+f 7/49/4 6/50/4 20/18/4 21/17/4
+f 5/51/3 8/52/3 24/53/3 17/54/3
+f 8/55/1 7/56/1 21/22/1 24/21/1
+f 6/57/2 5/58/2 17/26/2 20/25/2
+f 800/59/6 797/60/6 793/61/6 794/62/6
+f 804/63/1 806/64/1 812/65/1 813/66/1
+f 813/66/1 812/65/1 811/67/1 814/68/1
+f 808/69/2 803/70/2 816/71/2 809/72/2
+f 809/72/2 816/71/2 815/73/2 810/74/2
+f 803/75/3 804/63/3 813/66/3 816/76/3
+f 816/76/3 813/66/3 814/68/3 815/77/3
+f 806/78/4 808/79/4 809/80/4 812/81/4
+f 812/81/4 809/80/4 810/82/4 811/83/4
+f 801/84/4 802/85/4 820/86/4 821/87/4
+f 821/87/4 820/86/4 819/88/4 822/89/4
+f 807/90/3 805/91/3 824/92/3 817/93/3
+f 805/94/1 801/95/1 821/96/1 824/97/1
+f 824/97/1 821/96/1 822/98/1 823/99/1
+f 802/100/2 807/101/2 817/102/2 820/103/2
+f 820/103/2 817/102/2 818/104/2 819/105/2
+f 824/97/1 823/99/1 811/67/1 812/65/1
+f 817/106/5 824/107/5 812/108/5 809/109/5
+f 818/104/2 817/102/2 809/72/2 810/74/2
+f 823/110/6 818/111/6 810/112/6 811/113/6
+f 819/114/6 818/111/6 823/110/6 822/115/6
+f 811/113/6 810/112/6 815/116/6 814/117/6
+f 832/118/6 829/119/6 825/120/6 826/121/6
+f 836/122/1 838/123/1 844/124/1 845/125/1
+f 845/125/1 844/124/1 843/126/1 846/127/1
+f 840/128/2 835/129/2 848/130/2 841/131/2
+f 841/131/2 848/130/2 847/132/2 842/133/2
+f 835/134/3 836/135/3 845/136/3 848/137/3
+f 848/137/3 845/136/3 846/138/3 847/139/3
+f 838/140/4 840/141/4 841/142/4 844/143/4
+f 844/143/4 841/142/4 842/144/4 843/145/4
+f 833/146/4 834/147/4 852/148/4 853/149/4
+f 853/149/4 852/148/4 851/150/4 854/151/4
+f 839/152/3 837/153/3 856/154/3 849/155/3
+f 837/156/1 833/157/1 853/158/1 856/159/1
+f 856/159/1 853/158/1 854/160/1 855/161/1
+f 834/162/2 839/163/2 849/164/2 852/165/2
+f 852/165/2 849/164/2 850/166/2 851/167/2
+f 856/159/1 855/161/1 843/126/1 844/124/1
+f 849/168/5 856/169/5 844/170/5 841/171/5
+f 850/166/2 849/164/2 841/131/2 842/133/2
+f 855/172/6 850/173/6 842/174/6 843/175/6
+f 851/176/6 850/173/6 855/172/6 854/177/6
+f 843/175/6 842/174/6 847/178/6 846/179/6
+g KsHauptsignal_Plane.006_Schirm
+usemtl Schirm
+f 857/180/3 858/181/3 860/182/3 859/183/3
+f 862/184/4 861/185/4 864/186/4 863/187/4
+f 859/188/2 861/189/2 862/190/2 857/191/2
+f 860/192/6 864/193/6 861/194/6 859/195/6
+f 857/196/5 862/197/5 863/198/5 858/199/5
+f 858/200/1 863/201/1 864/202/1 860/203/1
+g KsHauptsignal_Plane.006_Lampenrahmen
+usemtl Lampenrahmen
+f 40/204/7 39/205/7 41/206/7
+f 26/207/8 88/208/8 25/209/8
+f 54/210/9 53/211/9 56/212/9
+f 58/213/10 56/212/10 57/214/10
+f 86/215/11 85/216/11 88/208/11
+f 90/217/12 89/218/12 152/219/12
+f 118/220/13 120/221/13 117/222/13
+f 122/223/14 121/224/14 120/221/14
+f 150/225/15 152/219/15 149/226/15
+f 79/227/16 81/228/16 82/229/16
+f 81/230/17 145/231/17 147/232/17
+f 111/233/18 113/234/18 49/235/18
+f 103/236/19 105/237/19 41/238/19
+f 99/239/20 35/240/20 33/241/20
+f 105/237/21 107/242/21 43/243/21
+f 147/232/22 149/244/22 85/245/22
+f 97/246/23 33/241/23 31/247/23
+f 103/236/24 39/248/24 37/249/24
+f 109/250/25 111/233/25 47/251/25
+f 35/240/26 99/239/26 101/252/26
+f 107/242/27 109/250/27 45/253/27
+f 95/254/28 31/247/28 29/255/28
+f 93/256/29 29/255/29 27/257/29
+f 113/234/30 115/258/30 51/259/30
+f 151/260/31 89/261/31 25/262/31
+f 149/244/32 151/260/32 87/263/32
+f 121/264/33 57/265/33 55/266/33
+f 115/258/34 117/267/34 53/268/34
+f 79/269/35 143/270/35 145/231/35
+f 125/271/36 127/272/36 63/273/36
+f 77/274/37 141/275/37 143/270/37
+f 75/276/38 139/277/38 141/275/38
+f 73/278/39 137/279/39 139/277/39
+f 133/280/40 135/281/40 71/282/40
+f 131/283/41 133/280/41 69/284/41
+f 129/285/42 131/283/42 67/286/42
+f 127/272/43 129/285/43 65/287/43
+f 91/288/44 27/257/44 25/262/44
+f 123/289/45 125/271/45 61/290/45
+f 123/289/46 59/291/46 57/265/46
+f 88/208/47 87/292/47 25/209/47
+f 97/293/48 95/294/48 96/295/48
+f 112/296/49 111/297/49 109/298/49
+f 48/299/50 47/300/50 49/301/50
+f 110/302/51 109/298/51 107/303/51
+f 140/304/52 139/305/52 137/306/52
+f 42/307/53 41/206/53 43/308/53
+f 106/309/54 105/310/54 103/311/54
+f 37/312/55 39/205/55 40/204/55
+f 108/313/56 107/303/56 105/314/56
+f 33/315/57 35/316/57 36/317/57
+f 31/318/58 33/315/58 34/319/58
+f 50/320/59 49/301/59 51/321/59
+f 27/322/60 29/323/60 30/324/60
+f 25/209/61 27/322/61 28/325/61
+f 53/211/62 55/326/62 56/212/62
+f 56/212/63 55/326/63 57/214/63
+f 81/228/64 83/327/64 84/328/64
+f 71/282/65 135/281/65 137/279/65
+f 83/327/66 85/216/66 86/215/66
+f 119/329/67 55/266/67 53/268/67
+f 77/330/68 79/227/68 80/331/68
+f 75/332/69 77/330/69 78/333/69
+f 114/334/70 113/335/70 111/297/70
+f 142/336/71 141/337/71 139/305/71
+f 68/338/72 67/339/72 69/340/72
+f 66/341/73 65/342/73 67/339/73
+f 64/343/74 63/344/74 65/342/74
+f 62/345/75 61/346/75 63/344/75
+f 60/347/76 59/348/76 61/346/76
+f 58/213/77 57/214/77 59/348/77
+f 85/216/78 87/292/78 88/208/78
+f 89/218/12 151/349/12 152/219/12
+f 146/350/79 145/351/79 143/352/79
+f 144/353/80 143/352/80 141/337/80
+f 116/354/81 115/355/81 113/335/81
+f 71/356/82 73/357/82 74/358/82
+f 29/323/83 31/318/83 32/359/83
+f 44/360/84 43/308/84 45/361/84
+f 138/362/85 137/306/85 135/363/85
+f 103/311/86 101/364/86 102/365/86
+f 101/364/87 99/366/87 100/367/87
+f 99/366/88 97/293/88 98/368/88
+f 52/369/89 51/321/89 53/211/89
+f 95/294/90 93/370/90 94/371/90
+f 93/370/91 91/372/91 92/373/91
+f 92/373/92 91/372/92 89/218/92
+f 120/221/13 119/374/13 117/222/13
+f 121/224/93 119/374/93 120/221/93
+f 73/357/94 75/332/94 76/375/94
+f 150/225/95 149/226/95 147/376/95
+f 148/377/96 147/376/96 145/351/96
+f 116/354/97 118/220/97 117/222/97
+f 70/378/98 69/340/98 71/379/98
+f 46/380/99 45/361/99 47/300/99
+f 35/316/100 37/312/100 38/381/100
+f 135/363/101 133/382/101 134/383/101
+f 133/382/102 131/384/102 132/385/102
+f 131/384/103 129/386/103 130/387/103
+f 129/386/104 127/388/104 128/389/104
+f 127/388/105 125/390/105 126/391/105
+f 125/390/106 123/392/106 124/393/106
+f 123/392/107 121/224/107 122/223/107
+f 152/219/15 151/349/15 149/226/15
+f 209/394/108 273/395/108 275/396/108
+f 276/397/109 275/398/109 273/399/109
+f 211/400/110 213/401/110 214/402/110
+f 249/403/111 247/404/111 248/405/111
+f 244/406/112 243/407/112 241/408/112
+f 272/409/113 271/410/113 269/411/113
+f 180/412/114 179/413/114 181/414/114
+f 229/415/115 227/416/115 228/417/115
+f 225/418/116 223/419/116 224/420/116
+f 255/421/117 257/422/117 193/423/117
+f 234/424/118 233/425/118 231/426/118
+f 157/427/119 159/428/119 160/429/119
+f 182/430/15 181/414/15 184/431/15
+f 165/432/120 167/433/120 168/434/120
+f 214/402/121 213/401/121 216/435/121
+f 221/436/122 219/437/122 220/438/122
+f 216/435/123 215/439/123 153/440/123
+f 227/441/124 163/442/124 161/443/124
+f 235/444/125 237/445/125 173/446/125
+f 201/447/126 265/448/126 267/449/126
+f 261/450/127 263/451/127 199/452/127
+f 184/431/128 183/453/128 185/454/128
+f 159/428/129 161/455/129 162/456/129
+f 168/434/130 167/433/130 169/457/130
+f 275/396/131 277/458/131 213/459/131
+f 266/460/132 265/461/132 263/462/132
+f 249/463/133 185/464/133 183/465/133
+f 231/466/134 233/467/134 169/468/134
+f 190/469/135 189/470/135 191/471/135
+f 217/472/136 279/473/136 280/474/136
+f 255/475/137 253/476/137 254/477/137
+f 186/478/138 184/431/138 185/454/138
+f 203/479/139 205/480/139 206/481/139
+f 239/482/140 241/483/140 177/484/140
+f 225/485/141 161/443/141 159/486/141
+f 172/487/142 171/488/142 173/489/142
+f 174/490/143 173/489/143 175/491/143
+f 199/452/144 263/451/144 265/448/144
+f 253/492/145 255/421/145 191/493/145
+f 163/494/146 165/432/146 166/495/146
+f 263/462/147 261/496/147 262/497/147
+f 241/483/148 243/498/148 179/499/148
+f 201/500/149 203/479/149 204/501/149
+f 198/502/150 197/503/150 199/504/150
+f 209/505/151 211/400/151 212/506/151
+f 188/507/152 187/508/152 189/470/152
+f 233/467/153 235/444/153 171/509/153
+f 196/510/154 195/511/154 197/503/154
+f 257/422/155 259/512/155 195/513/155
+f 278/514/156 280/474/156 277/515/156
+f 236/516/157 235/517/157 233/518/157
+f 250/519/111 249/403/111 248/405/111
+f 253/476/158 251/520/158 252/521/158
+f 205/522/159 269/523/159 271/524/159
+f 213/401/160 215/439/160 216/435/160
+f 154/525/93 216/435/93 153/440/93
+f 218/526/136 217/472/136 280/474/136
+f 279/527/161 217/528/161 153/529/161
+f 176/530/162 175/491/162 177/531/162
+f 181/414/163 183/453/163 184/431/163
+f 161/455/164 163/494/164 164/532/164
+f 280/474/156 279/473/156 277/515/156
+f 257/533/165 255/475/165 256/534/165
+f 274/535/166 273/399/166 271/410/166
+f 155/536/167 157/427/167 158/537/167
+f 231/426/168 229/415/168 230/538/168
+f 205/480/169 207/539/169 208/540/169
+f 220/438/170 219/437/170 217/472/170
+f 203/541/171 267/449/171 269/523/171
+f 192/542/172 191/471/172 193/543/172
+f 244/406/173 246/544/173 245/545/173
+f 170/546/174 169/457/174 171/488/174
+f 259/512/175 261/450/175 197/547/175
+f 219/548/176 155/549/176 153/529/176
+f 251/520/177 249/403/177 250/519/177
+f 207/550/178 271/524/178 273/395/178
+f 277/458/179 279/527/179 215/551/179
+f 240/552/180 239/553/180 237/554/180
+f 261/496/181 259/555/181 260/556/181
+f 223/419/182 221/436/182 222/557/182
+f 278/514/183 277/515/183 275/398/183
+f 248/405/184 247/404/184 245/545/184
+f 237/445/185 239/482/185 175/558/185
+f 246/544/184 248/405/184 245/545/184
+f 221/559/186 157/560/186 155/549/186
+f 242/561/187 241/408/187 239/553/187
+f 227/416/188 225/418/188 226/562/188
+f 259/555/189 257/533/189 258/563/189
+f 251/564/190 187/565/190 185/464/190
+f 178/566/191 177/531/191 179/413/191
+f 199/567/192 201/500/192 202/568/192
+f 243/498/193 245/569/193 181/570/193
+f 223/571/194 159/486/194 157/560/194
+f 163/442/195 227/441/195 229/572/195
+f 194/573/196 193/543/196 195/511/196
+f 207/539/197 209/505/197 210/574/197
+f 251/564/198 253/492/198 189/575/198
+f 270/576/199 269/411/199 267/577/199
+f 186/478/200 185/454/200 187/508/200
+f 247/578/201 183/465/201 181/570/201
+f 153/440/202 155/536/202 156/579/202
+f 268/580/203 267/577/203 265/461/203
+f 238/581/204 237/554/204 235/517/204
+f 231/466/205 167/582/205 165/583/205
+f 42/307/206 40/204/206 41/206/206
+f 80/331/207 79/227/207 82/229/207
+f 83/584/208 81/230/208 147/232/208
+f 47/251/209 111/233/209 49/235/209
+f 39/248/210 103/236/210 41/238/210
+f 97/246/211 99/239/211 33/241/211
+f 41/238/212 105/237/212 43/243/212
+f 83/584/213 147/232/213 85/245/213
+f 95/254/214 97/246/214 31/247/214
+f 101/252/215 103/236/215 37/249/215
+f 45/253/216 109/250/216 47/251/216
+f 37/249/217 35/240/217 101/252/217
+f 43/243/218 107/242/218 45/253/218
+f 93/256/219 95/254/219 29/255/219
+f 91/288/220 93/256/220 27/257/220
+f 49/235/221 113/234/221 51/259/221
+f 87/263/222 151/260/222 25/262/222
+f 85/245/223 149/244/223 87/263/223
+f 119/329/224 121/264/224 55/266/224
+f 51/259/225 115/258/225 53/268/225
+f 81/230/226 79/269/226 145/231/226
+f 61/290/227 125/271/227 63/273/227
+f 79/269/228 77/274/228 143/270/228
+f 77/274/229 75/276/229 141/275/229
+f 75/276/230 73/278/230 139/277/230
+f 69/284/231 133/280/231 71/282/231
+f 67/286/232 131/283/232 69/284/232
+f 65/287/233 129/285/233 67/286/233
+f 63/273/234 127/272/234 65/287/234
+f 89/261/235 91/288/235 25/262/235
+f 59/291/236 123/289/236 61/290/236
+f 121/264/237 123/289/237 57/265/237
+f 98/368/48 97/293/48 96/295/48
+f 110/302/49 112/296/49 109/298/49
+f 50/320/50 48/299/50 49/301/50
+f 108/313/238 110/302/238 107/303/238
+f 138/362/52 140/304/52 137/306/52
+f 44/360/53 42/307/53 43/308/53
+f 104/585/239 106/309/239 103/311/239
+f 38/381/55 37/312/55 40/204/55
+f 106/586/56 108/313/56 105/314/56
+f 34/319/57 33/315/57 36/317/57
+f 32/359/58 31/318/58 34/319/58
+f 52/369/59 50/320/59 51/321/59
+f 28/325/60 27/322/60 30/324/60
+f 26/207/240 25/209/240 28/325/240
+f 82/229/241 81/228/241 84/328/241
+f 73/278/242 71/282/242 137/279/242
+f 84/328/243 83/327/243 86/215/243
+f 117/267/244 119/329/244 53/268/244
+f 78/333/68 77/330/68 80/331/68
+f 76/375/69 75/332/69 78/333/69
+f 112/296/70 114/334/70 111/297/70
+f 140/304/71 142/336/71 139/305/71
+f 70/378/72 68/338/72 69/340/72
+f 68/338/245 66/341/245 67/339/245
+f 66/341/246 64/343/246 65/342/246
+f 64/343/247 62/345/247 63/344/247
+f 62/345/248 60/347/248 61/346/248
+f 60/347/249 58/213/249 59/348/249
+f 144/353/79 146/350/79 143/352/79
+f 142/336/80 144/353/80 141/337/80
+f 114/334/81 116/354/81 113/335/81
+f 72/587/250 71/356/250 74/358/250
+f 30/324/83 29/323/83 32/359/83
+f 46/380/84 44/360/84 45/361/84
+f 136/588/85 138/362/85 135/363/85
+f 104/585/251 103/311/251 102/365/251
+f 102/365/87 101/364/87 100/367/87
+f 100/367/88 99/366/88 98/368/88
+f 54/210/252 52/369/252 53/211/252
+f 96/295/90 95/294/90 94/371/90
+f 94/371/91 93/370/91 92/373/91
+f 90/217/253 92/373/253 89/218/253
+f 74/358/254 73/357/254 76/375/254
+f 148/377/95 150/225/95 147/376/95
+f 146/350/96 148/377/96 145/351/96
+f 115/355/255 116/354/255 117/222/255
+f 72/589/98 70/378/98 71/379/98
+f 48/299/99 46/380/99 47/300/99
+f 36/317/100 35/316/100 38/381/100
+f 136/588/256 135/363/256 134/383/256
+f 134/383/102 133/382/102 132/385/102
+f 132/385/103 131/384/103 130/387/103
+f 130/387/104 129/386/104 128/389/104
+f 128/389/105 127/388/105 126/391/105
+f 126/391/106 125/390/106 124/393/106
+f 124/393/107 123/392/107 122/223/107
+f 296/590/206 295/591/206 297/592/206
+f 282/593/8 344/594/8 281/595/8
+f 310/596/9 309/597/9 312/598/9
+f 314/599/10 312/598/10 313/600/10
+f 342/601/11 341/602/11 344/594/11
+f 346/603/12 345/604/12 408/605/12
+f 374/606/13 376/607/13 373/608/13
+f 378/609/14 377/610/14 376/607/14
+f 406/611/15 408/605/15 405/612/15
+f 335/613/16 337/614/16 338/615/16
+f 337/616/17 401/617/17 403/618/17
+f 367/619/257 369/620/257 305/621/257
+f 359/622/258 361/623/258 297/624/258
+f 355/625/20 291/626/20 289/627/20
+f 361/623/21 363/628/21 299/629/21
+f 403/618/22 405/630/22 341/631/22
+f 353/632/23 289/627/23 287/633/23
+f 359/622/24 295/634/24 293/635/24
+f 365/636/25 367/619/25 303/637/25
+f 291/626/259 355/625/259 357/638/259
+f 363/628/27 365/636/27 301/639/27
+f 351/640/260 287/633/260 285/641/260
+f 349/642/261 285/641/261 283/643/261
+f 369/620/30 371/644/30 307/645/30
+f 407/646/31 345/647/31 281/648/31
+f 405/630/32 407/646/32 343/649/32
+f 377/650/262 313/651/262 311/652/262
+f 371/644/263 373/653/263 309/654/263
+f 335/655/35 399/656/35 401/617/35
+f 381/657/36 383/658/36 319/659/36
+f 333/660/37 397/661/37 399/656/37
+f 331/662/38 395/663/38 397/661/38
+f 329/664/39 393/665/39 395/663/39
+f 389/666/40 391/667/40 327/668/40
+f 387/669/264 389/666/264 325/670/264
+f 385/671/42 387/669/42 323/672/42
+f 383/658/265 385/671/265 321/673/265
+f 347/674/44 283/643/44 281/648/44
+f 379/675/45 381/657/45 317/676/45
+f 379/675/46 315/677/46 313/651/46
+f 344/594/47 343/678/47 281/595/47
+f 353/679/48 351/680/48 352/681/48
+f 368/682/49 367/683/49 365/684/49
+f 304/685/50 303/686/50 305/687/50
+f 366/688/51 365/684/51 363/689/51
+f 396/690/52 395/691/52 393/692/52
+f 298/693/53 297/592/53 299/694/53
+f 362/695/54 361/696/54 359/697/54
+f 293/698/55 295/591/55 296/590/55
+f 364/699/56 363/689/56 361/700/56
+f 289/701/57 291/702/57 292/703/57
+f 287/704/58 289/701/58 290/705/58
+f 306/706/59 305/687/59 307/707/59
+f 283/708/60 285/709/60 286/710/60
+f 281/595/61 283/708/61 284/711/61
+f 309/597/62 311/712/62 312/598/62
+f 312/598/63 311/712/63 313/600/63
+f 337/614/64 339/713/64 340/714/64
+f 327/668/65 391/667/65 393/665/65
+f 339/713/66 341/602/66 342/601/66
+f 375/715/266 311/652/266 309/654/266
+f 333/716/68 335/613/68 336/717/68
+f 331/718/69 333/716/69 334/719/69
+f 370/720/70 369/721/70 367/683/70
+f 398/722/71 397/723/71 395/691/71
+f 324/724/72 323/725/72 325/726/72
+f 322/727/73 321/728/73 323/725/73
+f 320/729/74 319/730/74 321/728/74
+f 318/731/75 317/732/75 319/730/75
+f 316/733/76 315/734/76 317/732/76
+f 314/599/77 313/600/77 315/734/77
+f 341/602/78 343/678/78 344/594/78
+f 345/604/12 407/735/12 408/605/12
+f 402/736/79 401/737/79 399/738/79
+f 400/739/80 399/738/80 397/723/80
+f 372/740/81 371/741/81 369/721/81
+f 327/742/250 329/743/250 330/744/250
+f 285/709/83 287/704/83 288/745/83
+f 300/746/84 299/694/84 301/747/84
+f 394/748/85 393/692/85 391/749/85
+f 359/697/86 357/750/86 358/751/86
+f 357/750/87 355/752/87 356/753/87
+f 355/752/88 353/679/88 354/754/88
+f 308/755/89 307/707/89 309/597/89
+f 351/680/90 349/756/90 350/757/90
+f 349/756/91 347/758/91 348/759/91
+f 348/759/92 347/758/92 345/604/92
+f 376/607/13 375/760/13 373/608/13
+f 377/610/93 375/760/93 376/607/93
+f 329/743/94 331/718/94 332/761/94
+f 406/611/95 405/612/95 403/762/95
+f 404/763/96 403/762/96 401/737/96
+f 372/740/97 374/606/97 373/608/97
+f 326/764/98 325/726/98 327/765/98
+f 302/766/99 301/747/99 303/686/99
+f 291/702/100 293/698/100 294/767/100
+f 391/749/256 389/768/256 390/769/256
+f 389/768/102 387/770/102 388/771/102
+f 387/770/103 385/772/103 386/773/103
+f 385/772/104 383/774/104 384/775/104
+f 383/774/105 381/776/105 382/777/105
+f 381/776/106 379/778/106 380/779/106
+f 379/778/107 377/610/107 378/609/107
+f 408/605/15 407/735/15 405/612/15
+f 298/693/206 296/590/206 297/592/206
+f 336/717/207 335/613/207 338/615/207
+f 339/780/208 337/616/208 403/618/208
+f 303/637/209 367/619/209 305/621/209
+f 295/634/267 359/622/267 297/624/267
+f 353/632/268 355/625/268 289/627/268
+f 297/624/269 361/623/269 299/629/269
+f 339/780/213 403/618/213 341/631/213
+f 351/640/214 353/632/214 287/633/214
+f 357/638/215 359/622/215 293/635/215
+f 301/639/216 365/636/216 303/637/216
+f 293/635/270 291/626/270 357/638/270
+f 299/629/271 363/628/271 301/639/271
+f 349/642/272 351/640/272 285/641/272
+f 347/674/220 349/642/220 283/643/220
+f 305/621/221 369/620/221 307/645/221
+f 343/649/222 407/646/222 281/648/222
+f 341/631/223 405/630/223 343/649/223
+f 375/715/224 377/650/224 311/652/224
+f 307/645/273 371/644/273 309/654/273
+f 337/616/226 335/655/226 401/617/226
+f 317/676/227 381/657/227 319/659/227
+f 335/655/274 333/660/274 399/656/274
+f 333/660/229 331/662/229 397/661/229
+f 331/662/230 329/664/230 395/663/230
+f 325/670/275 389/666/275 327/668/275
+f 323/672/232 387/669/232 325/670/232
+f 321/673/233 385/671/233 323/672/233
+f 319/659/234 383/658/234 321/673/234
+f 345/647/276 347/674/276 281/648/276
+f 315/677/236 379/675/236 317/676/236
+f 377/650/277 379/675/277 313/651/277
+f 354/754/48 353/679/48 352/681/48
+f 366/688/49 368/682/49 365/684/49
+f 306/706/50 304/685/50 305/687/50
+f 364/699/238 366/688/238 363/689/238
+f 394/748/52 396/690/52 393/692/52
+f 300/746/53 298/693/53 299/694/53
+f 360/781/239 362/695/239 359/697/239
+f 294/767/55 293/698/55 296/590/55
+f 362/782/56 364/699/56 361/700/56
+f 290/705/278 289/701/278 292/703/278
+f 288/745/58 287/704/58 290/705/58
+f 308/755/59 306/706/59 307/707/59
+f 284/711/60 283/708/60 286/710/60
+f 282/593/240 281/595/240 284/711/240
+f 338/615/241 337/614/241 340/714/241
+f 329/664/242 327/668/242 393/665/242
+f 340/714/243 339/713/243 342/601/243
+f 373/653/279 375/715/279 309/654/279
+f 334/719/68 333/716/68 336/717/68
+f 332/761/69 331/718/69 334/719/69
+f 368/682/70 370/720/70 367/683/70
+f 396/690/71 398/722/71 395/691/71
+f 326/764/72 324/724/72 325/726/72
+f 324/724/245 322/727/245 323/725/245
+f 322/727/246 320/729/246 321/728/246
+f 320/729/247 318/731/247 319/730/247
+f 318/731/248 316/733/248 317/732/248
+f 316/733/249 314/599/249 315/734/249
+f 400/739/79 402/736/79 399/738/79
+f 398/722/80 400/739/80 397/723/80
+f 370/720/81 372/740/81 369/721/81
+f 328/783/250 327/742/250 330/744/250
+f 286/710/83 285/709/83 288/745/83
+f 302/766/84 300/746/84 301/747/84
+f 392/784/85 394/748/85 391/749/85
+f 360/781/251 359/697/251 358/751/251
+f 358/751/87 357/750/87 356/753/87
+f 356/753/88 355/752/88 354/754/88
+f 310/596/252 308/755/252 309/597/252
+f 352/681/90 351/680/90 350/757/90
+f 350/757/91 349/756/91 348/759/91
+f 346/603/253 348/759/253 345/604/253
+f 330/744/254 329/743/254 332/761/254
+f 404/763/95 406/611/95 403/762/95
+f 402/736/96 404/763/96 401/737/96
+f 371/741/255 372/740/255 373/608/255
+f 328/785/98 326/764/98 327/765/98
+f 304/685/99 302/766/99 303/686/99
+f 292/703/100 291/702/100 294/767/100
+f 392/784/256 391/749/256 390/769/256
+f 390/769/102 389/768/102 388/771/102
+f 388/771/103 387/770/103 386/773/103
+f 386/773/104 385/772/104 384/775/104
+f 384/775/105 383/774/105 382/777/105
+f 382/777/106 381/776/106 380/779/106
+f 380/779/107 379/778/107 378/609/107
+f 170/546/130 168/434/130 169/457/130
+f 208/540/197 207/539/197 210/574/197
+f 211/786/280 209/394/280 275/396/280
+f 175/558/281 239/482/281 177/484/281
+f 167/582/282 231/466/282 169/468/282
+f 225/485/283 227/441/283 161/443/283
+f 169/468/284 233/467/284 171/509/284
+f 211/786/285 275/396/285 213/459/285
+f 223/571/286 225/485/286 159/486/286
+f 229/572/287 231/466/287 165/583/287
+f 173/446/288 237/445/288 175/558/288
+f 165/583/289 163/442/289 229/572/289
+f 171/509/290 235/444/290 173/446/290
+f 221/559/291 223/571/291 157/560/291
+f 219/548/292 221/559/292 155/549/292
+f 177/484/293 241/483/293 179/499/293
+f 215/551/294 279/527/294 153/529/294
+f 213/459/295 277/458/295 215/551/295
+f 247/578/296 249/463/296 183/465/296
+f 179/499/297 243/498/297 181/570/297
+f 209/394/298 207/550/298 273/395/298
+f 189/575/299 253/492/299 191/493/299
+f 207/550/300 205/522/300 271/524/300
+f 205/522/301 203/541/301 269/523/301
+f 203/541/302 201/447/302 267/449/302
+f 197/547/303 261/450/303 199/452/303
+f 195/513/304 259/512/304 197/547/304
+f 193/423/305 257/422/305 195/513/305
+f 191/493/306 255/421/306 193/423/306
+f 217/528/307 219/548/307 153/529/307
+f 187/565/308 251/564/308 189/575/308
+f 249/463/309 251/564/309 185/464/309
+f 226/562/116 225/418/116 224/420/116
+f 238/581/310 240/552/310 237/554/310
+f 178/566/162 176/530/162 177/531/162
+f 236/516/204 238/581/204 235/517/204
+f 266/460/311 268/580/311 265/461/311
+f 172/487/174 170/546/174 171/488/174
+f 232/787/118 234/424/118 231/426/118
+f 166/495/120 165/432/120 168/434/120
+f 234/788/157 236/516/157 233/518/157
+f 162/456/164 161/455/164 164/532/164
+f 160/429/129 159/428/129 162/456/129
+f 180/412/312 178/566/312 179/413/312
+f 156/579/167 155/536/167 158/537/167
+f 154/525/313 153/440/313 156/579/313
+f 210/574/314 209/505/314 212/506/314
+f 201/447/315 199/452/315 265/448/315
+f 212/506/316 211/400/316 214/402/316
+f 245/569/317 247/578/317 181/570/317
+f 206/481/169 205/480/169 208/540/169
+f 204/501/139 203/479/139 206/481/139
+f 240/552/318 242/561/318 239/553/318
+f 268/580/319 270/576/319 267/577/319
+f 198/502/320 196/510/320 197/503/320
+f 196/510/196 194/573/196 195/511/196
+f 194/573/321 192/542/321 193/543/321
+f 192/542/322 190/469/322 191/471/322
+f 190/469/323 188/507/323 189/470/323
+f 188/507/324 186/478/324 187/508/324
+f 272/409/325 274/535/325 271/410/325
+f 270/576/113 272/409/113 269/411/113
+f 242/561/112 244/406/112 241/408/112
+f 200/789/192 199/567/192 202/568/192
+f 158/537/119 157/427/119 160/429/119
+f 174/490/142 172/487/142 173/489/142
+f 264/790/132 266/460/132 263/462/132
+f 232/787/168 231/426/168 230/538/168
+f 230/538/115 229/415/115 228/417/115
+f 228/417/188 227/416/188 226/562/188
+f 182/430/326 180/412/326 181/414/326
+f 224/420/182 223/419/182 222/557/182
+f 222/557/122 221/436/122 220/438/122
+f 218/526/327 220/438/327 217/472/327
+f 202/568/149 201/500/149 204/501/149
+f 276/397/183 278/514/183 275/398/183
+f 274/535/328 276/397/328 273/399/328
+f 243/407/329 244/406/329 245/545/329
+f 200/791/150 198/502/150 199/504/150
+f 176/530/143 174/490/143 175/491/143
+f 164/532/146 163/494/146 166/495/146
+f 264/790/330 263/462/330 262/497/330
+f 262/497/181 261/496/181 260/556/181
+f 260/556/189 259/555/189 258/563/189
+f 258/563/165 257/533/165 256/534/165
+f 256/534/137 255/475/137 254/477/137
+f 254/477/158 253/476/158 252/521/158
+f 252/521/177 251/520/177 250/519/177
+f 471/792/327 469/793/327 472/794/327
+f 519/795/174 520/796/174 518/797/174
+f 519/795/130 521/798/130 520/796/130
+f 413/799/109 414/800/109 416/801/109
+f 486/802/302 488/803/302 422/804/302
+f 476/805/160 474/806/160 473/807/160
+f 535/808/93 473/807/93 536/809/93
+f 521/798/130 522/810/130 520/796/130
+f 440/811/111 442/812/111 441/813/111
+f 442/814/201 506/815/201 508/816/201
+f 476/817/295 412/818/295 474/819/295
+f 490/820/192 488/821/192 487/822/192
+f 490/823/144 426/824/144 424/825/144
+f 448/826/148 446/827/148 510/828/148
+f 462/829/188 464/830/188 463/831/188
+f 486/832/139 484/833/139 483/834/139
+f 461/835/188 462/829/188 463/831/188
+f 518/836/290 454/837/290 516/838/290
+f 483/834/169 484/833/169 481/839/169
+f 511/840/162 513/841/162 512/842/162
+f 458/843/168 460/844/168 459/845/168
+f 430/846/175 428/847/175 492/848/175
+f 436/849/158 438/850/158 437/851/158
+f 480/852/331 478/853/331 477/854/331
+f 435/855/158 436/849/158 437/851/158
+f 417/856/166 415/857/166 418/858/166
+f 440/859/309 438/860/309 504/861/309
+f 466/862/194 530/863/194 532/864/194
+f 499/865/332 501/866/332 500/867/332
+f 482/868/178 418/869/178 416/870/178
+f 520/871/284 456/872/284 518/836/284
+f 531/873/119 532/874/119 529/875/119
+f 421/876/199 419/877/199 422/878/199
+f 488/803/315 490/823/315 424/825/315
+f 453/879/157 454/880/157 456/881/157
+f 460/844/115 462/829/115 461/835/115
+f 478/882/285 414/883/285 476/817/285
+f 523/884/120 524/885/120 521/798/120
+f 503/886/200 504/887/200 502/888/200
+f 456/872/333 454/837/333 518/836/333
+f 489/889/192 490/820/192 487/822/192
+f 468/890/122 470/891/122 469/793/122
+f 464/892/283 462/893/283 528/894/283
+f 484/833/169 482/895/169 481/839/169
+f 480/896/334 482/868/334 416/870/334
+f 515/897/335 517/898/335 516/899/335
+f 453/879/204 451/900/204 454/880/204
+f 502/901/308 438/860/308 500/902/308
+f 412/818/179 410/903/179 474/819/179
+f 495/904/196 496/905/196 494/906/196
+f 491/907/154 493/908/154 492/909/154
+f 455/910/118 456/911/118 458/843/118
+f 474/819/294 410/903/294 536/912/294
+f 497/913/172 498/914/172 496/905/172
+f 411/915/183 412/916/183 414/800/183
+f 492/848/336 428/847/336 490/823/336
+f 451/900/204 452/917/204 454/880/204
+f 423/918/311 421/876/311 424/919/311
+f 452/920/185 450/921/185 514/922/185
+f 434/923/137 436/849/137 435/855/137
+f 488/803/126 424/825/126 422/804/126
+f 462/893/124 526/924/124 528/894/124
+f 409/925/156 410/926/156 412/916/156
+f 484/927/159 420/928/159 418/869/159
+f 410/903/161 472/929/161 536/912/161
+f 433/930/137 434/923/137 435/855/137
+f 493/908/154 494/906/154 492/909/154
+f 533/931/167 534/932/167 531/873/167
+f 535/808/313 536/809/313 533/931/313
+f 467/933/122 468/890/122 469/793/122
+f 512/934/293 448/826/293 510/828/293
+f 429/935/189 430/936/189 431/937/189
+f 494/938/304 430/846/304 492/848/304
+f 513/841/162 514/939/162 512/842/162
+f 468/940/291 466/862/291 532/864/291
+f 419/877/113 417/856/113 420/941/113
+f 480/896/108 416/870/108 414/883/108
+f 413/799/183 411/915/183 414/800/183
+f 517/898/337 518/797/337 516/899/337
+f 446/827/338 444/942/338 508/816/338
+f 522/943/282 458/944/282 520/871/282
+f 432/945/165 434/923/165 433/930/165
+f 511/840/191 512/842/191 510/946/191
+f 432/947/155 430/846/155 494/938/155
+f 469/793/170 470/891/170 472/794/170
+f 526/924/195 462/893/195 460/948/195
+f 530/949/129 528/950/129 527/951/129
+f 487/822/149 488/821/149 485/952/149
+f 527/951/339 528/950/339 525/953/339
+f 428/954/181 430/936/181 429/935/181
+f 513/841/340 515/897/340 514/939/340
+f 525/953/341 526/955/341 523/884/341
+f 528/950/164 526/955/164 525/953/164
+f 411/915/156 409/925/156 412/916/156
+f 458/944/134 456/872/134 520/871/134
+f 507/956/15 508/957/15 505/958/15
+f 491/907/150 492/909/150 490/959/150
+f 428/847/127 426/824/127 490/823/127
+f 496/960/305 432/947/305 494/938/305
+f 463/831/116 464/830/116 465/961/116
+f 505/958/128 506/962/128 504/887/128
+f 415/857/109 413/799/109 416/801/109
+f 423/918/132 424/919/132 426/963/132
+f 526/955/341 524/885/341 523/884/341
+f 481/839/197 482/895/197 479/964/197
+f 500/902/299 436/965/299 498/966/299
+f 516/838/288 452/920/288 514/922/288
+f 507/956/326 509/967/326 508/957/326
+f 497/913/342 499/865/342 498/914/342
+f 447/968/318 448/969/318 450/970/318
+f 529/875/129 530/949/129 527/951/129
+f 478/882/280 480/896/280 414/883/280
+f 460/948/287 458/944/287 524/971/287
+f 425/972/147 426/963/147 427/973/147
+f 472/794/136 410/926/136 409/925/136
+f 485/952/139 486/832/139 483/834/139
+f 509/967/312 511/840/312 510/946/312
+f 508/957/163 506/962/163 505/958/163
+f 498/966/306 434/974/306 496/960/306
+f 477/854/316 478/853/316 475/975/316
+f 501/866/324 503/886/324 502/888/324
+f 455/976/157 453/879/157 456/881/157
+f 471/792/136 472/794/136 409/925/136
+f 457/977/168 458/843/168 459/845/168
+f 449/978/318 447/968/318 450/970/318
+f 493/908/196 495/904/196 494/906/196
+f 517/898/174 519/795/174 518/797/174
+f 465/961/182 466/979/182 467/933/182
+f 489/980/150 491/907/150 490/959/150
+f 482/868/300 484/927/300 418/869/300
+f 437/851/177 438/850/177 439/981/177
+f 439/981/111 440/811/111 441/813/111
+f 466/862/343 464/892/343 530/863/343
+f 442/814/296 440/859/296 506/815/296
+f 419/877/199 420/941/199 422/878/199
+f 415/857/166 416/801/166 418/858/166
+f 445/982/173 443/983/173 444/984/173
+f 466/979/182 468/890/182 467/933/182
+f 443/983/184 441/813/184 444/984/184
+f 430/936/189 432/945/189 431/937/189
+f 482/895/344 480/852/344 479/964/344
+f 431/937/165 432/945/165 433/930/165
+f 421/876/311 422/878/311 424/919/311
+f 514/922/281 450/921/281 512/934/281
+f 479/964/345 480/852/345 477/854/345
+f 426/963/147 428/954/147 427/973/147
+f 499/865/342 500/867/342 498/914/342
+f 484/927/301 486/802/301 420/928/301
+f 509/967/114 510/946/114 508/957/114
+f 457/977/118 455/910/118 458/843/118
+f 450/921/140 448/826/140 512/934/140
+f 444/942/346 442/814/346 508/816/346
+f 503/886/138 505/958/138 504/887/138
+f 447/968/112 445/982/112 448/969/112
+f 425/972/132 423/918/132 426/963/132
+f 510/828/297 446/827/297 508/816/297
+f 446/985/329 445/982/329 444/984/329
+f 427/973/181 428/954/181 429/935/181
+f 470/986/176 534/987/176 536/912/176
+f 524/971/289 526/924/289 460/948/289
+f 534/932/167 532/874/167 531/873/167
+f 440/859/133 504/861/133 506/815/133
+f 417/856/347 418/858/347 420/941/347
+f 441/813/184 442/812/184 444/984/184
+f 468/940/186 532/864/186 534/987/186
+f 438/860/348 502/901/348 504/861/348
+f 438/860/198 436/965/198 500/902/198
+f 536/809/202 534/932/202 533/931/202
+f 458/944/205 522/943/205 524/971/205
+f 478/853/110 476/805/110 475/975/110
+f 445/982/112 446/985/112 448/969/112
+f 414/883/131 412/818/131 476/817/131
+f 438/850/177 440/811/177 439/981/177
+f 459/845/115 460/844/115 461/835/115
+f 451/900/310 449/978/310 452/917/310
+f 464/830/116 466/979/116 465/961/116
+f 464/892/141 528/894/141 530/863/141
+f 515/897/143 516/899/143 514/939/143
+f 436/965/145 434/974/145 498/966/145
+f 470/986/292 468/940/292 534/987/292
+f 488/821/149 486/832/149 485/952/149
+f 501/866/152 502/888/152 500/867/152
+f 486/802/171 422/804/171 420/928/171
+f 449/978/180 450/970/180 452/917/180
+f 472/929/349 470/986/349 536/912/349
+f 495/904/350 497/913/350 496/905/350
+f 434/974/117 432/947/117 496/960/117
+f 532/874/119 530/949/119 529/875/119
+f 524/885/120 522/810/120 521/798/120
+f 475/975/121 476/805/121 473/807/121
+f 473/807/123 474/806/123 536/809/123
+f 454/837/351 452/920/351 516/838/351
+f 552/988/7 551/989/7 553/990/7
+f 538/991/8 600/992/8 537/993/8
+f 566/994/9 565/995/9 568/996/9
+f 570/997/10 568/996/10 569/998/10
+f 598/999/11 597/1000/11 600/992/11
+f 602/1001/12 601/1002/12 664/1003/12
+f 630/1004/13 632/1005/13 629/1006/13
+f 634/1007/14 633/1008/14 632/1005/14
+f 662/1009/15 664/1003/15 661/1010/15
+f 591/1011/16 593/1012/16 594/1013/16
+f 593/1014/17 657/1015/17 659/1016/17
+f 623/1017/18 625/1018/18 561/1019/18
+f 615/1020/19 617/1021/19 553/1022/19
+f 611/1023/352 547/1024/352 545/1025/352
+f 617/1021/21 619/1026/21 555/1027/21
+f 659/1016/22 661/1028/22 597/1029/22
+f 609/1030/23 545/1025/23 543/1031/23
+f 615/1020/24 551/1032/24 549/1033/24
+f 621/1034/25 623/1017/25 559/1035/25
+f 547/1024/259 611/1023/259 613/1036/259
+f 619/1026/27 621/1034/27 557/1037/27
+f 607/1038/28 543/1031/28 541/1039/28
+f 605/1040/29 541/1039/29 539/1041/29
+f 625/1018/30 627/1042/30 563/1043/30
+f 663/1044/31 601/1045/31 537/1046/31
+f 661/1028/32 663/1044/32 599/1047/32
+f 633/1048/262 569/1049/262 567/1050/262
+f 627/1042/34 629/1051/34 565/1052/34
+f 591/1053/35 655/1054/35 657/1015/35
+f 637/1055/36 639/1056/36 575/1057/36
+f 589/1058/353 653/1059/353 655/1054/353
+f 587/1060/38 651/1061/38 653/1059/38
+f 585/1062/39 649/1063/39 651/1061/39
+f 645/1064/40 647/1065/40 583/1066/40
+f 643/1067/354 645/1064/354 581/1068/354
+f 641/1069/42 643/1067/42 579/1070/42
+f 639/1056/355 641/1069/355 577/1071/355
+f 603/1072/356 539/1041/356 537/1046/356
+f 635/1073/357 637/1055/357 573/1074/357
+f 635/1073/46 571/1075/46 569/1049/46
+f 600/992/47 599/1076/47 537/993/47
+f 609/1077/48 607/1078/48 608/1079/48
+f 624/1080/49 623/1081/49 621/1082/49
+f 560/1083/50 559/1084/50 561/1085/50
+f 622/1086/51 621/1082/51 619/1087/51
+f 652/1088/52 651/1089/52 649/1090/52
+f 554/1091/53 553/990/53 555/1092/53
+f 618/1093/54 617/1094/54 615/1095/54
+f 549/1096/55 551/989/55 552/988/55
+f 620/1097/56 619/1087/56 617/1098/56
+f 545/1099/57 547/1100/57 548/1101/57
+f 543/1102/58 545/1099/58 546/1103/58
+f 562/1104/59 561/1085/59 563/1105/59
+f 539/1106/60 541/1107/60 542/1108/60
+f 537/993/61 539/1106/61 540/1109/61
+f 565/995/62 567/1110/62 568/996/62
+f 568/996/63 567/1110/63 569/998/63
+f 593/1012/64 595/1111/64 596/1112/64
+f 583/1066/65 647/1065/65 649/1063/65
+f 595/1111/66 597/1000/66 598/999/66
+f 631/1113/358 567/1050/358 565/1052/358
+f 589/1114/68 591/1011/68 592/1115/68
+f 587/1116/69 589/1114/69 590/1117/69
+f 626/1118/70 625/1119/70 623/1081/70
+f 654/1120/71 653/1121/71 651/1089/71
+f 580/1122/72 579/1123/72 581/1124/72
+f 578/1125/73 577/1126/73 579/1123/73
+f 576/1127/359 575/1128/359 577/1126/359
+f 574/1129/75 573/1130/75 575/1128/75
+f 572/1131/76 571/1132/76 573/1130/76
+f 570/997/77 569/998/77 571/1132/77
+f 597/1000/78 599/1076/78 600/992/78
+f 601/1002/12 663/1133/12 664/1003/12
+f 658/1134/79 657/1135/79 655/1136/79
+f 656/1137/80 655/1136/80 653/1121/80
+f 628/1138/81 627/1139/81 625/1119/81
+f 583/1140/82 585/1141/82 586/1142/82
+f 541/1107/83 543/1102/83 544/1143/83
+f 556/1144/84 555/1092/84 557/1145/84
+f 650/1146/85 649/1090/85 647/1147/85
+f 615/1095/86 613/1148/86 614/1149/86
+f 613/1148/360 611/1150/360 612/1151/360
+f 611/1150/88 609/1077/88 610/1152/88
+f 564/1153/89 563/1105/89 565/995/89
+f 607/1078/90 605/1154/90 606/1155/90
+f 605/1154/91 603/1156/91 604/1157/91
+f 604/1157/92 603/1156/92 601/1002/92
+f 632/1005/13 631/1158/13 629/1006/13
+f 633/1008/93 631/1158/93 632/1005/93
+f 585/1141/94 587/1116/94 588/1159/94
+f 662/1009/95 661/1010/95 659/1160/95
+f 660/1161/96 659/1160/96 657/1135/96
+f 628/1138/97 630/1004/97 629/1006/97
+f 582/1162/98 581/1124/98 583/1163/98
+f 558/1164/99 557/1145/99 559/1084/99
+f 547/1100/100 549/1096/100 550/1165/100
+f 647/1147/256 645/1166/256 646/1167/256
+f 645/1166/102 643/1168/102 644/1169/102
+f 643/1168/103 641/1170/103 642/1171/103
+f 641/1170/104 639/1172/104 640/1173/104
+f 639/1172/105 637/1174/105 638/1175/105
+f 637/1174/106 635/1176/106 636/1177/106
+f 635/1176/107 633/1008/107 634/1007/107
+f 664/1003/15 663/1133/15 661/1010/15
+f 554/1091/206 552/988/206 553/990/206
+f 592/1115/207 591/1011/207 594/1013/207
+f 595/1178/208 593/1014/208 659/1016/208
+f 559/1035/209 623/1017/209 561/1019/209
+f 551/1032/267 615/1020/267 553/1022/267
+f 609/1030/211 611/1023/211 545/1025/211
+f 553/1022/212 617/1021/212 555/1027/212
+f 595/1178/213 659/1016/213 597/1029/213
+f 607/1038/214 609/1030/214 543/1031/214
+f 613/1036/215 615/1020/215 549/1033/215
+f 557/1037/216 621/1034/216 559/1035/216
+f 549/1033/270 547/1024/270 613/1036/270
+f 555/1027/271 619/1026/271 557/1037/271
+f 605/1040/272 607/1038/272 541/1039/272
+f 603/1072/220 605/1040/220 539/1041/220
+f 561/1019/221 625/1018/221 563/1043/221
+f 599/1047/222 663/1044/222 537/1046/222
+f 597/1029/223 661/1028/223 599/1047/223
+f 631/1113/224 633/1048/224 567/1050/224
+f 563/1043/273 627/1042/273 565/1052/273
+f 593/1014/226 591/1053/226 657/1015/226
+f 573/1074/227 637/1055/227 575/1057/227
+f 591/1053/228 589/1058/228 655/1054/228
+f 589/1058/229 587/1060/229 653/1059/229
+f 587/1060/230 585/1062/230 651/1061/230
+f 581/1068/231 645/1064/231 583/1066/231
+f 579/1070/232 643/1067/232 581/1068/232
+f 577/1071/233 641/1069/233 579/1070/233
+f 575/1057/234 639/1056/234 577/1071/234
+f 601/1045/235 603/1072/235 537/1046/235
+f 571/1075/236 635/1073/236 573/1074/236
+f 633/1048/361 635/1073/361 569/1049/361
+f 610/1152/48 609/1077/48 608/1079/48
+f 622/1086/49 624/1080/49 621/1082/49
+f 562/1104/50 560/1083/50 561/1085/50
+f 620/1097/238 622/1086/238 619/1087/238
+f 650/1146/52 652/1088/52 649/1090/52
+f 556/1144/53 554/1091/53 555/1092/53
+f 616/1179/239 618/1093/239 615/1095/239
+f 550/1165/55 549/1096/55 552/988/55
+f 618/1180/56 620/1097/56 617/1098/56
+f 546/1103/57 545/1099/57 548/1101/57
+f 544/1143/58 543/1102/58 546/1103/58
+f 564/1153/59 562/1104/59 563/1105/59
+f 540/1109/60 539/1106/60 542/1108/60
+f 538/991/240 537/993/240 540/1109/240
+f 594/1013/241 593/1012/241 596/1112/241
+f 585/1062/362 583/1066/362 649/1063/362
+f 596/1112/243 595/1111/243 598/999/243
+f 629/1051/244 631/1113/244 565/1052/244
+f 590/1117/68 589/1114/68 592/1115/68
+f 588/1159/69 587/1116/69 590/1117/69
+f 624/1080/70 626/1118/70 623/1081/70
+f 652/1088/71 654/1120/71 651/1089/71
+f 582/1162/72 580/1122/72 581/1124/72
+f 580/1122/245 578/1125/245 579/1123/245
+f 578/1125/246 576/1127/246 577/1126/246
+f 576/1127/247 574/1129/247 575/1128/247
+f 574/1129/248 572/1131/248 573/1130/248
+f 572/1131/249 570/997/249 571/1132/249
+f 656/1137/79 658/1134/79 655/1136/79
+f 654/1120/80 656/1137/80 653/1121/80
+f 626/1118/81 628/1138/81 625/1119/81
+f 584/1181/250 583/1140/250 586/1142/250
+f 542/1108/83 541/1107/83 544/1143/83
+f 558/1164/84 556/1144/84 557/1145/84
+f 648/1182/85 650/1146/85 647/1147/85
+f 616/1179/251 615/1095/251 614/1149/251
+f 614/1149/87 613/1148/87 612/1151/87
+f 612/1151/88 611/1150/88 610/1152/88
+f 566/994/252 564/1153/252 565/995/252
+f 608/1079/90 607/1078/90 606/1155/90
+f 606/1155/91 605/1154/91 604/1157/91
+f 602/1001/253 604/1157/253 601/1002/253
+f 586/1142/94 585/1141/94 588/1159/94
+f 660/1161/95 662/1009/95 659/1160/95
+f 658/1134/96 660/1161/96 657/1135/96
+f 627/1139/255 628/1138/255 629/1006/255
+f 584/1183/98 582/1162/98 583/1163/98
+f 560/1083/99 558/1164/99 559/1084/99
+f 548/1101/100 547/1100/100 550/1165/100
+f 648/1182/256 647/1147/256 646/1167/256
+f 646/1167/102 645/1166/102 644/1169/102
+f 644/1169/103 643/1168/103 642/1171/103
+f 642/1171/363 641/1170/363 640/1173/363
+f 640/1173/105 639/1172/105 638/1175/105
+f 638/1175/106 637/1174/106 636/1177/106
+f 636/1177/107 635/1176/107 634/1007/107
+f 727/1184/327 725/1185/327 728/1186/327
+f 775/1187/174 776/1188/174 774/1189/174
+f 775/1187/130 777/1190/130 776/1188/130
+f 669/1191/109 670/1192/109 672/1193/109
+f 742/1194/364 744/1195/364 678/1196/364
+f 732/1197/365 730/1198/365 729/1199/365
+f 791/1200/93 729/1199/93 792/1201/93
+f 777/1190/130 778/1202/130 776/1188/130
+f 696/1203/366 698/1204/366 697/1205/366
+f 698/1206/201 762/1207/201 764/1208/201
+f 732/1209/295 668/1210/295 730/1211/295
+f 746/1212/192 744/1213/192 743/1214/192
+f 746/1215/367 682/1216/367 680/1217/367
+f 704/1218/148 702/1219/148 766/1220/148
+f 718/1221/188 720/1222/188 719/1223/188
+f 742/1224/139 740/1225/139 739/1226/139
+f 717/1227/188 718/1221/188 719/1223/188
+f 774/1228/368 710/1229/368 772/1230/368
+f 739/1226/169 740/1225/169 737/1231/169
+f 767/1232/162 769/1233/162 768/1234/162
+f 714/1235/168 716/1236/168 715/1237/168
+f 686/1238/175 684/1239/175 748/1240/175
+f 692/1241/158 694/1242/158 693/1243/158
+f 736/1244/151 734/1245/151 733/1246/151
+f 691/1247/158 692/1241/158 693/1243/158
+f 673/1248/166 671/1249/166 674/1250/166
+f 696/1251/369 694/1252/369 760/1253/369
+f 722/1254/194 786/1255/194 788/1256/194
+f 755/1257/323 757/1258/323 756/1259/323
+f 738/1260/370 674/1261/370 672/1262/370
+f 776/1263/371 712/1264/371 774/1228/371
+f 787/1265/119 788/1266/119 785/1267/119
+f 677/1268/199 675/1269/199 678/1270/199
+f 744/1195/372 746/1215/372 680/1217/372
+f 709/1271/157 710/1272/157 712/1273/157
+f 716/1236/115 718/1221/115 717/1227/115
+f 734/1274/285 670/1275/285 732/1209/285
+f 779/1276/120 780/1277/120 777/1190/120
+f 759/1278/200 760/1279/200 758/1280/200
+f 712/1264/373 710/1229/373 774/1228/373
+f 745/1281/192 746/1212/192 743/1214/192
+f 724/1282/122 726/1283/122 725/1185/122
+f 720/1284/374 718/1285/374 784/1286/374
+f 740/1225/169 738/1287/169 737/1231/169
+f 736/1288/375 738/1260/375 672/1262/375
+f 771/1289/142 773/1290/142 772/1291/142
+f 709/1271/204 707/1292/204 710/1272/204
+f 758/1293/376 694/1252/376 756/1294/376
+f 668/1210/377 666/1295/377 730/1211/377
+f 751/1296/196 752/1297/196 750/1298/196
+f 747/1299/154 749/1300/154 748/1301/154
+f 711/1302/118 712/1303/118 714/1235/118
+f 730/1211/294 666/1295/294 792/1304/294
+f 753/1305/172 754/1306/172 752/1297/172
+f 667/1307/183 668/1308/183 670/1192/183
+f 748/1240/378 684/1239/378 746/1215/378
+f 707/1292/204 708/1309/204 710/1272/204
+f 679/1310/203 677/1268/203 680/1311/203
+f 708/1312/379 706/1313/379 770/1314/379
+f 690/1315/137 692/1241/137 691/1247/137
+f 744/1195/126 680/1217/126 678/1196/126
+f 718/1285/380 782/1316/380 784/1286/380
+f 665/1317/156 666/1318/156 668/1308/156
+f 740/1319/159 676/1320/159 674/1261/159
+f 666/1295/381 728/1321/381 792/1304/381
+f 689/1322/137 690/1315/137 691/1247/137
+f 749/1300/154 750/1298/154 748/1301/154
+f 789/1323/167 790/1324/167 787/1265/167
+f 791/1200/313 792/1201/313 789/1323/313
+f 723/1325/122 724/1282/122 725/1185/122
+f 768/1326/293 704/1218/293 766/1220/293
+f 685/1327/189 686/1328/189 687/1329/189
+f 750/1330/304 686/1238/304 748/1240/304
+f 769/1233/162 770/1331/162 768/1234/162
+f 724/1332/291 722/1254/291 788/1256/291
+f 675/1269/113 673/1248/113 676/1333/113
+f 736/1288/108 672/1262/108 670/1275/108
+f 669/1191/183 667/1307/183 670/1192/183
+f 773/1290/335 774/1189/335 772/1291/335
+f 702/1219/338 700/1334/338 764/1208/338
+f 778/1335/282 714/1336/282 776/1263/282
+f 688/1337/165 690/1315/165 689/1322/165
+f 767/1232/191 768/1234/191 766/1338/191
+f 688/1339/155 686/1238/155 750/1330/155
+f 725/1185/170 726/1283/170 728/1186/170
+f 782/1316/195 718/1285/195 716/1340/195
+f 786/1341/382 784/1342/382 783/1343/382
+f 743/1214/149 744/1213/149 741/1344/149
+f 783/1343/164 784/1342/164 781/1345/164
+f 684/1346/181 686/1328/181 685/1327/181
+f 769/1233/340 771/1289/340 770/1331/340
+f 781/1345/341 782/1347/341 779/1276/341
+f 784/1342/164 782/1347/164 781/1345/164
+f 667/1307/156 665/1317/156 668/1308/156
+f 714/1336/134 712/1264/134 776/1263/134
+f 763/1348/15 764/1349/15 761/1350/15
+f 747/1299/150 748/1301/150 746/1351/150
+f 684/1239/383 682/1216/383 746/1215/383
+f 752/1352/305 688/1339/305 750/1330/305
+f 719/1223/116 720/1222/116 721/1353/116
+f 761/1350/128 762/1354/128 760/1279/128
+f 671/1249/109 669/1191/109 672/1193/109
+f 679/1310/132 680/1311/132 682/1355/132
+f 782/1347/341 780/1277/341 779/1276/341
+f 737/1231/197 738/1287/197 735/1356/197
+f 756/1294/299 692/1357/299 754/1358/299
+f 772/1230/384 708/1312/384 770/1314/384
+f 763/1348/326 765/1359/326 764/1349/326
+f 753/1305/322 755/1257/322 754/1306/322
+f 703/1360/318 704/1361/318 706/1362/318
+f 785/1267/129 786/1341/129 783/1343/129
+f 734/1274/280 736/1288/280 670/1275/280
+f 716/1340/287 714/1336/287 780/1363/287
+f 681/1364/147 682/1355/147 683/1365/147
+f 728/1186/385 666/1318/385 665/1317/385
+f 741/1344/139 742/1224/139 739/1226/139
+f 765/1359/312 767/1232/312 766/1338/312
+f 764/1349/163 762/1354/163 761/1350/163
+f 754/1358/386 690/1366/386 752/1352/386
+f 733/1246/387 734/1245/387 731/1367/387
+f 757/1258/324 759/1278/324 758/1280/324
+f 711/1368/157 709/1271/157 712/1273/157
+f 727/1184/136 728/1186/136 665/1317/136
+f 713/1369/168 714/1235/168 715/1237/168
+f 705/1370/318 703/1360/318 706/1362/318
+f 749/1300/196 751/1296/196 750/1298/196
+f 773/1290/174 775/1187/174 774/1189/174
+f 721/1353/182 722/1371/182 723/1325/182
+f 745/1372/150 747/1299/150 746/1351/150
+f 738/1260/300 740/1319/300 674/1261/300
+f 693/1243/177 694/1242/177 695/1373/177
+f 695/1373/111 696/1203/111 697/1205/111
+f 722/1254/343 720/1284/343 786/1255/343
+f 698/1206/296 696/1251/296 762/1207/296
+f 675/1269/199 676/1333/199 678/1270/199
+f 671/1249/325 672/1193/325 674/1250/325
+f 701/1374/173 699/1375/173 700/1376/173
+f 722/1371/182 724/1282/182 723/1325/182
+f 699/1375/184 697/1205/184 700/1376/184
+f 686/1328/189 688/1337/189 687/1329/189
+f 738/1287/388 736/1244/388 735/1356/388
+f 687/1329/165 688/1337/165 689/1322/165
+f 677/1268/311 678/1270/311 680/1311/311
+f 770/1314/389 706/1313/389 768/1326/389
+f 735/1356/345 736/1244/345 733/1246/345
+f 682/1355/147 684/1346/147 683/1365/147
+f 755/1257/135 756/1259/135 754/1306/135
+f 740/1319/301 742/1194/301 676/1320/301
+f 765/1359/114 766/1338/114 764/1349/114
+f 713/1369/118 711/1302/118 714/1235/118
+f 706/1313/140 704/1218/140 768/1326/140
+f 700/1334/346 698/1206/346 764/1208/346
+f 759/1278/138 761/1350/138 760/1279/138
+f 703/1360/112 701/1374/112 704/1361/112
+f 681/1364/132 679/1310/132 682/1355/132
+f 766/1220/297 702/1219/297 764/1208/297
+f 702/1377/329 701/1374/329 700/1376/329
+f 683/1365/181 684/1346/181 685/1327/181
+f 726/1378/176 790/1379/176 792/1304/176
+f 780/1363/289 782/1316/289 716/1340/289
+f 790/1324/167 788/1266/167 787/1265/167
+f 696/1251/133 760/1253/133 762/1207/133
+f 673/1248/347 674/1250/347 676/1333/347
+f 697/1205/184 698/1204/184 700/1376/184
+f 724/1332/186 788/1256/186 790/1379/186
+f 694/1252/190 758/1293/190 760/1253/190
+f 694/1252/390 692/1357/390 756/1294/390
+f 792/1201/202 790/1324/202 789/1323/202
+f 714/1336/205 778/1335/205 780/1363/205
+f 734/1245/110 732/1197/110 731/1367/110
+f 701/1374/112 702/1377/112 704/1361/112
+f 670/1275/391 668/1210/391 732/1209/391
+f 694/1242/177 696/1203/177 695/1373/177
+f 715/1237/115 716/1236/115 717/1227/115
+f 707/1292/180 705/1370/180 708/1309/180
+f 720/1222/116 722/1371/116 721/1353/116
+f 720/1284/392 784/1286/392 786/1255/392
+f 771/1289/340 772/1291/340 770/1331/340
+f 692/1357/393 690/1366/393 754/1358/393
+f 726/1378/292 724/1332/292 790/1379/292
+f 744/1213/149 742/1224/149 741/1344/149
+f 757/1258/323 758/1280/323 756/1259/323
+f 742/1194/394 678/1196/394 676/1320/394
+f 705/1370/180 706/1362/180 708/1309/180
+f 728/1321/349 726/1378/349 792/1304/349
+f 751/1296/350 753/1305/350 752/1297/350
+f 690/1366/117 688/1339/117 752/1352/117
+f 788/1266/119 786/1341/119 785/1267/119
+f 780/1277/120 778/1202/120 777/1190/120
+f 731/1367/121 732/1197/121 729/1199/121
+f 729/1199/123 730/1198/123 792/1201/123
+f 710/1229/125 708/1312/125 772/1230/125
+g KsHauptsignal_Plane.006_Lights
+usemtl Lights
+f 88/1380/395 28/1381/395 40/1382/395
+f 40/1382/395 44/1383/395 56/1384/395
+f 88/1380/396 64/1385/396 72/1386/396
+f 72/1386/396 76/1387/396 88/1380/396
+f 40/1382/397 28/1381/397 32/1388/397
+f 32/1388/395 34/1389/395 40/1382/395
+f 56/1384/397 44/1383/397 48/1390/397
+f 48/1390/395 52/1391/395 56/1384/395
+f 56/1384/398 58/1392/398 64/1385/398
+f 64/1385/396 68/1393/396 70/1394/396
+f 88/1380/396 76/1387/396 80/1395/396
+f 80/1395/396 84/1396/396 88/1380/396
+f 88/1380/395 26/1397/395 28/1381/395
+f 28/1381/397 30/1398/397 32/1388/397
+f 40/1382/397 34/1389/397 36/1399/397
+f 36/1399/395 38/1400/395 40/1382/395
+f 40/1382/399 42/1401/399 44/1383/399
+f 44/1383/397 46/1402/397 48/1390/397
+f 48/1390/397 50/1403/397 52/1391/397
+f 52/1391/397 54/1404/397 56/1384/397
+f 64/1385/400 58/1392/400 60/1405/400
+f 60/1405/396 62/1406/396 64/1385/396
+f 64/1385/401 66/1407/401 68/1393/401
+f 64/1385/401 70/1394/401 72/1386/401
+f 72/1386/402 74/1408/402 76/1387/402
+f 76/1387/396 78/1409/396 80/1395/396
+f 80/1395/396 82/1410/396 84/1396/396
+f 84/1396/403 86/1411/403 88/1380/403
+f 64/1385/404 88/1380/404 40/1382/404
+f 156/1412/405 158/1413/405 160/1414/405
+f 200/1415/406 204/1416/406 216/1417/406
+f 192/1418/407 186/1419/407 188/1420/407
+f 176/1421/408 180/1422/408 184/1423/408
+f 212/1424/409 214/1425/409 216/1417/409
+f 188/1420/410 190/1426/410 192/1418/410
+f 192/1418/411 196/1427/411 198/1428/411
+f 184/1423/412 172/1429/412 176/1421/412
+f 204/1416/410 206/1430/410 208/1431/410
+f 200/1415/413 202/1432/413 204/1416/413
+f 216/1417/406 192/1418/406 200/1415/406
+f 168/1433/414 162/1434/414 164/1435/414
+f 164/1435/415 166/1436/415 168/1433/415
+f 160/1414/412 162/1434/412 168/1433/412
+f 176/1421/416 178/1437/416 180/1422/416
+f 208/1431/417 210/1438/417 212/1424/417
+f 168/1433/418 170/1439/418 172/1429/418
+f 168/1433/419 172/1429/419 184/1423/419
+f 168/1433/419 156/1412/419 160/1414/419
+f 180/1422/419 182/1440/419 184/1423/419
+f 208/1431/417 212/1424/417 216/1417/417
+f 216/1417/406 204/1416/406 208/1431/406
+f 192/1418/417 194/1441/417 196/1427/417
+f 184/1423/420 186/1419/420 192/1418/420
+f 192/1418/421 198/1428/421 200/1415/421
+f 216/1417/422 156/1412/422 168/1433/422
+f 216/1417/423 154/1442/423 156/1412/423
+f 172/1429/419 174/1443/419 176/1421/419
+f 192/1418/424 216/1417/424 168/1433/424
+f 56/1384/398 64/1385/398 40/1382/398
+f 344/1444/395 284/1445/395 296/1446/395
+f 296/1446/395 300/1447/395 312/1448/395
+f 344/1444/396 320/1449/396 328/1450/396
+f 328/1450/396 332/1451/396 344/1444/396
+f 296/1446/397 284/1445/397 288/1452/397
+f 288/1452/397 290/1453/397 296/1446/397
+f 312/1448/397 300/1447/397 304/1454/397
+f 304/1454/395 308/1455/395 312/1448/395
+f 312/1448/398 314/1456/398 320/1449/398
+f 320/1449/396 324/1457/396 326/1458/396
+f 344/1444/396 332/1451/396 336/1459/396
+f 336/1459/396 340/1460/396 344/1444/396
+f 344/1444/425 282/1461/425 284/1445/425
+f 284/1445/426 286/1462/426 288/1452/426
+f 296/1446/397 290/1453/397 292/1463/397
+f 292/1463/395 294/1464/395 296/1446/395
+f 296/1446/399 298/1465/399 300/1447/399
+f 300/1447/397 302/1466/397 304/1454/397
+f 304/1454/395 306/1467/395 308/1455/395
+f 308/1455/395 310/1468/395 312/1448/395
+f 320/1449/400 314/1456/400 316/1469/400
+f 316/1469/396 318/1470/396 320/1449/396
+f 320/1449/401 322/1471/401 324/1457/401
+f 320/1449/396 326/1458/396 328/1450/396
+f 328/1450/402 330/1472/402 332/1451/402
+f 332/1451/396 334/1473/396 336/1459/396
+f 336/1459/396 338/1474/396 340/1460/396
+f 340/1460/427 342/1475/427 344/1444/427
+f 320/1449/404 344/1444/404 296/1446/404
+f 312/1448/398 320/1449/398 296/1446/398
+f 184/1423/428 192/1418/428 168/1433/428
+f 509/1476/419 507/1477/419 505/1478/419
+f 521/1479/414 527/1480/414 525/1481/414
+f 473/1482/422 533/1483/422 521/1479/422
+f 521/1479/429 519/1484/429 517/1485/429
+f 517/1485/419 515/1486/419 513/1487/419
+f 533/1483/405 531/1488/405 529/1489/405
+f 497/1490/417 495/1491/417 493/1492/417
+f 489/1493/413 487/1494/413 485/1495/413
+f 477/1496/430 475/1497/430 473/1482/430
+f 473/1482/406 497/1490/406 489/1493/406
+f 497/1490/407 503/1498/407 501/1499/407
+f 505/1478/412 517/1485/412 513/1487/412
+f 473/1482/423 535/1500/423 533/1483/423
+f 481/1501/417 477/1496/417 473/1482/417
+f 497/1490/424 473/1482/424 521/1479/424
+f 501/1499/410 499/1502/410 497/1490/410
+f 497/1490/411 493/1492/411 491/1503/411
+f 521/1479/419 517/1485/419 505/1478/419
+f 505/1478/428 497/1490/428 521/1479/428
+f 473/1482/406 485/1495/406 481/1501/406
+f 497/1490/421 491/1503/421 489/1493/421
+f 529/1489/419 527/1480/419 521/1479/419
+f 521/1479/419 533/1483/419 529/1489/419
+f 481/1501/417 479/1504/417 477/1496/417
+f 505/1478/420 503/1498/420 497/1490/420
+f 513/1487/416 511/1505/416 509/1476/416
+f 489/1493/406 485/1495/406 473/1482/406
+f 513/1487/408 509/1476/408 505/1478/408
+f 525/1481/415 523/1506/415 521/1479/415
+f 485/1495/431 483/1507/431 481/1501/431
+f 600/1508/395 540/1509/395 552/1510/395
+f 552/1510/395 556/1511/395 568/1512/395
+f 600/1508/396 576/1513/396 584/1514/396
+f 584/1514/396 588/1515/396 600/1508/396
+f 552/1510/397 540/1509/397 544/1516/397
+f 544/1516/397 546/1517/397 552/1510/397
+f 568/1512/397 556/1511/397 560/1518/397
+f 560/1518/395 564/1519/395 568/1512/395
+f 568/1512/398 570/1520/398 576/1513/398
+f 576/1513/396 580/1521/396 582/1522/396
+f 600/1508/396 588/1515/396 592/1523/396
+f 592/1523/396 596/1524/396 600/1508/396
+f 600/1508/425 538/1525/425 540/1509/425
+f 540/1509/397 542/1526/397 544/1516/397
+f 552/1510/397 546/1517/397 548/1527/397
+f 548/1527/395 550/1528/395 552/1510/395
+f 552/1510/399 554/1529/399 556/1511/399
+f 556/1511/397 558/1530/397 560/1518/397
+f 560/1518/395 562/1531/395 564/1519/395
+f 564/1519/397 566/1532/397 568/1512/397
+f 576/1513/400 570/1520/400 572/1533/400
+f 572/1533/396 574/1534/396 576/1513/396
+f 576/1513/396 578/1535/396 580/1521/396
+f 576/1513/401 582/1522/401 584/1514/401
+f 584/1514/402 586/1536/402 588/1515/402
+f 588/1515/396 590/1537/396 592/1523/396
+f 592/1523/396 594/1538/396 596/1524/396
+f 596/1524/432 598/1539/432 600/1508/432
+f 576/1513/404 600/1508/404 552/1510/404
+f 568/1512/398 576/1513/398 552/1510/398
+f 765/1540/412 763/1541/412 761/1542/412
+f 777/1543/414 783/1544/414 781/1545/414
+f 729/1546/422 789/1547/422 777/1543/422
+f 777/1543/418 775/1548/418 773/1549/418
+f 773/1549/419 771/1550/419 769/1551/419
+f 789/1547/433 787/1552/433 785/1553/433
+f 753/1554/406 751/1555/406 749/1556/406
+f 745/1557/434 743/1558/434 741/1559/434
+f 733/1560/435 731/1561/435 729/1546/435
+f 729/1546/406 753/1554/406 745/1557/406
+f 753/1554/407 759/1562/407 757/1563/407
+f 761/1542/412 773/1549/412 769/1551/412
+f 729/1546/436 791/1564/436 789/1547/436
+f 737/1565/406 733/1560/406 729/1546/406
+f 753/1554/424 729/1546/424 777/1543/424
+f 757/1563/437 755/1566/437 753/1554/437
+f 753/1554/411 749/1556/411 747/1567/411
+f 777/1543/408 773/1549/408 761/1542/408
+f 761/1542/428 753/1554/428 777/1543/428
+f 729/1546/406 741/1559/406 737/1565/406
+f 753/1554/421 747/1567/421 745/1557/421
+f 785/1553/419 783/1544/419 777/1543/419
+f 777/1543/419 789/1547/419 785/1553/419
+f 737/1565/406 735/1568/406 733/1560/406
+f 761/1542/420 759/1562/420 753/1554/420
+f 769/1551/408 767/1569/408 765/1540/408
+f 745/1557/406 741/1559/406 729/1546/406
+f 769/1551/416 765/1540/416 761/1542/416
+f 781/1545/438 779/1570/438 777/1543/438
+f 741/1559/417 739/1571/417 737/1565/417
+l 794 795
+l 796 793
+l 795 796
+l 798 799
+l 799 800
+l 797 798
+l 826 827
+l 828 825
+l 827 828
+l 830 831
+l 831 832
+l 829 830
diff --git a/advtrains/advtrains_signals_ks/models/advtrains_signals_ks_main_smr60.obj b/advtrains/advtrains_signals_ks/models/advtrains_signals_ks_main_smr60.obj
new file mode 100644
index 0000000..81d5006
--- /dev/null
+++ b/advtrains/advtrains_signals_ks/models/advtrains_signals_ks_main_smr60.obj
@@ -0,0 +1,4310 @@
+# Blender v2.79 (sub 0) OBJ File: 'signal_ks_singlemesh_final.blend'
+# www.blender.org
+mtllib advtrains_signals_ks_main_smr60.mtl
+o KsHauptsignal_Plane.006
+v 0.406295 -0.503378 -0.170292
+v 0.380825 -0.503378 -0.221466
+v 0.432000 -0.503378 -0.246937
+v 0.457470 -0.503378 -0.195762
+v 0.304205 -0.503378 -0.119480
+v 0.253030 -0.503378 -0.094010
+v 0.227560 -0.503378 -0.145185
+v 0.278734 -0.503378 -0.170655
+v 0.406295 -0.299114 -0.170292
+v 0.406295 -0.172218 -0.170292
+v 0.380825 -0.172218 -0.221466
+v 0.380825 -0.299114 -0.221466
+v 0.432000 -0.299114 -0.246937
+v 0.432000 -0.172218 -0.246937
+v 0.457470 -0.172218 -0.195762
+v 0.457470 -0.299114 -0.195762
+v 0.304205 -0.299114 -0.119480
+v 0.304205 -0.172218 -0.119480
+v 0.253030 -0.172218 -0.094010
+v 0.253030 -0.299114 -0.094010
+v 0.227560 -0.299114 -0.145185
+v 0.227560 -0.172218 -0.145185
+v 0.278734 -0.172218 -0.170655
+v 0.278734 -0.299114 -0.170655
+v 0.464573 0.243339 -0.382701
+v 0.440437 0.242789 -0.370688
+v 0.512979 0.253858 -0.403273
+v 0.441799 0.253308 -0.367847
+v 0.515232 0.263561 -0.398650
+v 0.444052 0.263011 -0.363223
+v 0.518289 0.272074 -0.392423
+v 0.447109 0.271524 -0.356996
+v 0.522032 0.279070 -0.384831
+v 0.450853 0.278520 -0.349404
+v 0.526318 0.284280 -0.376167
+v 0.455139 0.283730 -0.340740
+v 0.530983 0.287504 -0.366763
+v 0.459803 0.286954 -0.331336
+v 0.535846 0.288619 -0.356981
+v 0.464667 0.288069 -0.321554
+v 0.540722 0.287581 -0.347195
+v 0.469542 0.287030 -0.311769
+v 0.545421 0.284430 -0.337784
+v 0.474242 0.283880 -0.302357
+v 0.549765 0.279287 -0.329108
+v 0.478586 0.278737 -0.293681
+v 0.553586 0.272350 -0.321501
+v 0.482406 0.271800 -0.286074
+v 0.556737 0.263886 -0.315254
+v 0.485558 0.263336 -0.279827
+v 0.559097 0.254219 -0.310609
+v 0.487918 0.253669 -0.275182
+v 0.513532 0.243722 -0.284329
+v 0.489396 0.243172 -0.272316
+v 0.514035 0.232316 -0.283311
+v 0.489936 0.232252 -0.271340
+v 0.513408 0.221688 -0.284217
+v 0.489514 0.221322 -0.272288
+v 0.512052 0.211344 -0.287027
+v 0.488147 0.210797 -0.275128
+v 0.509795 0.201642 -0.291649
+v 0.485890 0.201094 -0.279749
+v 0.506735 0.193129 -0.297874
+v 0.482829 0.192581 -0.285974
+v 0.502988 0.186134 -0.305464
+v 0.479082 0.185585 -0.293564
+v 0.498699 0.180924 -0.314127
+v 0.474794 0.180374 -0.302227
+v 0.494033 0.177700 -0.323530
+v 0.470127 0.177150 -0.311631
+v 0.489170 0.176585 -0.333312
+v 0.465263 0.176035 -0.321414
+v 0.484295 0.177623 -0.343097
+v 0.460389 0.177073 -0.331199
+v 0.479597 0.180774 -0.352509
+v 0.455690 0.180224 -0.340611
+v 0.475255 0.185916 -0.361186
+v 0.451348 0.185367 -0.349289
+v 0.471438 0.192853 -0.368795
+v 0.447531 0.192304 -0.356898
+v 0.468290 0.201317 -0.375043
+v 0.444383 0.200769 -0.363146
+v 0.465934 0.210983 -0.379691
+v 0.442027 0.210436 -0.367794
+v 0.464477 0.221305 -0.382531
+v 0.440554 0.220938 -0.370663
+v 0.464100 0.231924 -0.383645
+v 0.440018 0.231861 -0.371639
+v 0.463468 0.243790 -0.384912
+v 0.406630 0.243271 -0.356623
+v 0.511932 0.254782 -0.405355
+v 0.408050 0.254264 -0.353652
+v 0.514284 0.264921 -0.400523
+v 0.410402 0.264402 -0.348820
+v 0.517477 0.273816 -0.394015
+v 0.413595 0.273298 -0.342312
+v 0.521387 0.281127 -0.386081
+v 0.417505 0.280609 -0.334378
+v 0.525865 0.286572 -0.377027
+v 0.421983 0.286053 -0.325324
+v 0.530738 0.289941 -0.367200
+v 0.426856 0.289423 -0.315497
+v 0.535820 0.291105 -0.356977
+v 0.431938 0.290587 -0.305274
+v 0.540915 0.290021 -0.346752
+v 0.437033 0.289502 -0.295049
+v 0.545826 0.286728 -0.336918
+v 0.441945 0.286210 -0.285215
+v 0.550367 0.281354 -0.327853
+v 0.446485 0.280836 -0.276150
+v 0.554361 0.274105 -0.319904
+v 0.450479 0.273587 -0.268201
+v 0.557655 0.265261 -0.313378
+v 0.453774 0.264742 -0.261675
+v 0.560124 0.255160 -0.308525
+v 0.456242 0.254641 -0.256822
+v 0.514628 0.244190 -0.282117
+v 0.457790 0.243672 -0.253828
+v 0.515147 0.232775 -0.281074
+v 0.458356 0.232256 -0.252809
+v 0.514530 0.221351 -0.281979
+v 0.457921 0.220833 -0.253805
+v 0.513109 0.210359 -0.284950
+v 0.456500 0.209840 -0.256775
+v 0.510757 0.200220 -0.289782
+v 0.454148 0.199702 -0.261608
+v 0.507564 0.191324 -0.296290
+v 0.450956 0.190806 -0.268116
+v 0.503654 0.184013 -0.304224
+v 0.447046 0.183495 -0.276049
+v 0.499176 0.178569 -0.313278
+v 0.442568 0.178051 -0.285104
+v 0.494303 0.175200 -0.323105
+v 0.437694 0.174682 -0.294931
+v 0.489221 0.174035 -0.333328
+v 0.432613 0.173517 -0.305153
+v 0.484126 0.175120 -0.343553
+v 0.427518 0.174602 -0.315378
+v 0.479215 0.178413 -0.353387
+v 0.422606 0.177894 -0.325212
+v 0.474674 0.183787 -0.362452
+v 0.418066 0.183268 -0.334278
+v 0.470680 0.191035 -0.370401
+v 0.414072 0.190517 -0.342226
+v 0.467386 0.199880 -0.376927
+v 0.410777 0.199362 -0.348753
+v 0.464917 0.209981 -0.381780
+v 0.408309 0.209463 -0.353606
+v 0.463370 0.220950 -0.384774
+v 0.406761 0.220432 -0.356599
+v 0.462984 0.232366 -0.385883
+v 0.406194 0.231848 -0.357618
+v 0.568053 0.506097 -0.174790
+v 0.543917 0.505869 -0.162778
+v 0.615635 0.510448 -0.197017
+v 0.544456 0.510220 -0.161590
+v 0.616544 0.514461 -0.195093
+v 0.545365 0.514233 -0.159666
+v 0.617789 0.517982 -0.192508
+v 0.546609 0.517755 -0.157081
+v 0.619321 0.520876 -0.189360
+v 0.548141 0.520648 -0.153933
+v 0.621081 0.523031 -0.185770
+v 0.549902 0.522803 -0.150343
+v 0.623003 0.524364 -0.181876
+v 0.551824 0.524137 -0.146449
+v 0.625012 0.524825 -0.177829
+v 0.553833 0.524598 -0.142402
+v 0.627031 0.524396 -0.173783
+v 0.555851 0.524168 -0.138356
+v 0.628982 0.523093 -0.169894
+v 0.557803 0.522865 -0.134467
+v 0.630791 0.520966 -0.166311
+v 0.559611 0.520738 -0.130884
+v 0.632388 0.518097 -0.163172
+v 0.561208 0.517869 -0.127746
+v 0.633711 0.514596 -0.160599
+v 0.562531 0.514368 -0.125172
+v 0.634710 0.510597 -0.158689
+v 0.563530 0.510370 -0.123262
+v 0.588302 0.506255 -0.134101
+v 0.564166 0.506028 -0.122089
+v 0.588509 0.501537 -0.133680
+v 0.564415 0.501511 -0.121698
+v 0.588166 0.497142 -0.134013
+v 0.564264 0.496990 -0.122101
+v 0.587626 0.492863 -0.135185
+v 0.563720 0.492637 -0.123287
+v 0.586712 0.488850 -0.137107
+v 0.562806 0.488624 -0.125208
+v 0.585464 0.485329 -0.139691
+v 0.561558 0.485102 -0.127792
+v 0.583929 0.482436 -0.142837
+v 0.560023 0.482209 -0.130938
+v 0.582166 0.480281 -0.146426
+v 0.558260 0.480054 -0.134527
+v 0.580243 0.478947 -0.150318
+v 0.556337 0.478720 -0.138420
+v 0.578233 0.478486 -0.154366
+v 0.554327 0.478259 -0.142467
+v 0.576215 0.478915 -0.158412
+v 0.552309 0.478688 -0.146514
+v 0.574265 0.480219 -0.162301
+v 0.550359 0.479992 -0.150403
+v 0.572459 0.482346 -0.165885
+v 0.548552 0.482119 -0.153987
+v 0.570865 0.485215 -0.169025
+v 0.546959 0.484988 -0.157127
+v 0.569546 0.488716 -0.171601
+v 0.545639 0.488489 -0.159703
+v 0.568551 0.492714 -0.173513
+v 0.544645 0.492488 -0.161615
+v 0.567928 0.496983 -0.174678
+v 0.544014 0.496832 -0.162791
+v 0.567855 0.501376 -0.175180
+v 0.543769 0.501349 -0.163184
+v 0.567593 0.506283 -0.175704
+v 0.510755 0.506069 -0.147415
+v 0.615197 0.510830 -0.197875
+v 0.511315 0.510615 -0.146172
+v 0.616145 0.515023 -0.195864
+v 0.512263 0.514809 -0.144161
+v 0.617444 0.518703 -0.193161
+v 0.513562 0.518489 -0.141458
+v 0.619043 0.521727 -0.189871
+v 0.515161 0.521512 -0.138168
+v 0.620882 0.523979 -0.186119
+v 0.517000 0.523764 -0.134416
+v 0.622889 0.525372 -0.182050
+v 0.519007 0.525158 -0.130347
+v 0.624988 0.525854 -0.177821
+v 0.521106 0.525640 -0.126118
+v 0.627098 0.525405 -0.173593
+v 0.523216 0.525191 -0.121890
+v 0.629138 0.524043 -0.169529
+v 0.525256 0.523829 -0.117826
+v 0.631029 0.521821 -0.165786
+v 0.527147 0.521606 -0.114083
+v 0.632699 0.518822 -0.162507
+v 0.528817 0.518608 -0.110804
+v 0.634083 0.515164 -0.159819
+v 0.530202 0.514950 -0.108116
+v 0.635129 0.510986 -0.157824
+v 0.531247 0.510772 -0.106121
+v 0.588753 0.506449 -0.133185
+v 0.531915 0.506235 -0.104896
+v 0.588967 0.501727 -0.132754
+v 0.532177 0.501513 -0.104489
+v 0.588634 0.497002 -0.133089
+v 0.532025 0.496788 -0.104915
+v 0.588073 0.492455 -0.134331
+v 0.531465 0.492241 -0.106157
+v 0.587125 0.488262 -0.136343
+v 0.530517 0.488048 -0.108168
+v 0.585827 0.484583 -0.139045
+v 0.529218 0.484368 -0.110871
+v 0.584228 0.481559 -0.142336
+v 0.527619 0.481344 -0.114161
+v 0.582389 0.479307 -0.146088
+v 0.525780 0.479092 -0.117913
+v 0.580381 0.477913 -0.150156
+v 0.523773 0.477699 -0.121982
+v 0.578282 0.477432 -0.154386
+v 0.521674 0.477217 -0.126211
+v 0.576172 0.477880 -0.158614
+v 0.519564 0.477666 -0.130439
+v 0.574133 0.479242 -0.162677
+v 0.517524 0.479028 -0.134503
+v 0.572241 0.481465 -0.166420
+v 0.515633 0.481251 -0.138246
+v 0.570572 0.484463 -0.169699
+v 0.513963 0.484249 -0.141525
+v 0.569187 0.488121 -0.172388
+v 0.512579 0.487907 -0.144213
+v 0.568141 0.492299 -0.174383
+v 0.511533 0.492085 -0.146208
+v 0.567474 0.496836 -0.175607
+v 0.510866 0.496622 -0.147433
+v 0.567393 0.501558 -0.176105
+v 0.510603 0.501344 -0.147840
+v 0.553688 0.243339 -0.203652
+v 0.529552 0.242789 -0.191639
+v 0.602094 0.253858 -0.224224
+v 0.530914 0.253308 -0.188797
+v 0.604346 0.263561 -0.219601
+v 0.533167 0.263011 -0.184174
+v 0.607403 0.272074 -0.213374
+v 0.536224 0.271524 -0.177947
+v 0.611147 0.279070 -0.205782
+v 0.539967 0.278520 -0.170355
+v 0.615433 0.284280 -0.197118
+v 0.544254 0.283730 -0.161691
+v 0.620098 0.287504 -0.187714
+v 0.548918 0.286954 -0.152287
+v 0.624961 0.288619 -0.177931
+v 0.553781 0.288069 -0.142505
+v 0.629836 0.287581 -0.168146
+v 0.558657 0.287030 -0.132719
+v 0.634536 0.284430 -0.158735
+v 0.563357 0.283880 -0.123308
+v 0.638880 0.279287 -0.150059
+v 0.567700 0.278737 -0.114632
+v 0.642701 0.272350 -0.142451
+v 0.571521 0.271800 -0.107024
+v 0.645852 0.263886 -0.136205
+v 0.574672 0.263336 -0.100778
+v 0.648212 0.254219 -0.131560
+v 0.577033 0.253669 -0.096133
+v 0.602647 0.243722 -0.105280
+v 0.578511 0.243172 -0.093267
+v 0.603150 0.232316 -0.104262
+v 0.579051 0.232252 -0.092291
+v 0.602522 0.221688 -0.105168
+v 0.578629 0.221322 -0.093239
+v 0.601167 0.211344 -0.107978
+v 0.577261 0.210797 -0.096079
+v 0.598910 0.201642 -0.112600
+v 0.575004 0.201094 -0.100700
+v 0.595849 0.193129 -0.118825
+v 0.571944 0.192581 -0.106925
+v 0.592103 0.186134 -0.126415
+v 0.568197 0.185585 -0.114515
+v 0.587814 0.180924 -0.135078
+v 0.563908 0.180374 -0.123178
+v 0.583148 0.177700 -0.144481
+v 0.559242 0.177150 -0.132582
+v 0.578284 0.176585 -0.154263
+v 0.554378 0.176035 -0.142365
+v 0.573410 0.177623 -0.164048
+v 0.549503 0.177073 -0.152150
+v 0.568711 0.180774 -0.173460
+v 0.544805 0.180224 -0.161562
+v 0.564370 0.185916 -0.182137
+v 0.540463 0.185368 -0.170240
+v 0.560552 0.192853 -0.189746
+v 0.536645 0.192304 -0.177849
+v 0.557405 0.201317 -0.195994
+v 0.533498 0.200769 -0.184097
+v 0.555049 0.210983 -0.200642
+v 0.531142 0.210436 -0.188744
+v 0.553592 0.221305 -0.203482
+v 0.529669 0.220938 -0.191614
+v 0.553215 0.231924 -0.204596
+v 0.529133 0.231861 -0.192590
+v 0.552583 0.243790 -0.205863
+v 0.495744 0.243271 -0.177574
+v 0.601047 0.254782 -0.226306
+v 0.497165 0.254264 -0.174603
+v 0.603399 0.264921 -0.221474
+v 0.499517 0.264402 -0.169771
+v 0.606591 0.273816 -0.214966
+v 0.502709 0.273298 -0.163263
+v 0.610502 0.281127 -0.207032
+v 0.506620 0.280609 -0.155329
+v 0.614980 0.286572 -0.197978
+v 0.511098 0.286053 -0.146275
+v 0.619853 0.289941 -0.188150
+v 0.515971 0.289423 -0.136447
+v 0.624935 0.291105 -0.177928
+v 0.521053 0.290587 -0.126225
+v 0.630029 0.290021 -0.167703
+v 0.526147 0.289502 -0.116000
+v 0.634941 0.286728 -0.157869
+v 0.531059 0.286210 -0.106166
+v 0.639481 0.281354 -0.148803
+v 0.535600 0.280836 -0.097100
+v 0.643476 0.274105 -0.140855
+v 0.539594 0.273587 -0.089152
+v 0.646770 0.265261 -0.134329
+v 0.542888 0.264742 -0.082626
+v 0.649239 0.255160 -0.129475
+v 0.545357 0.254641 -0.077772
+v 0.603742 0.244190 -0.103068
+v 0.546904 0.243672 -0.074779
+v 0.604261 0.232775 -0.102025
+v 0.547471 0.232256 -0.073760
+v 0.603644 0.221351 -0.102930
+v 0.547036 0.220833 -0.074755
+v 0.602223 0.210359 -0.105901
+v 0.545615 0.209840 -0.077726
+v 0.599872 0.200220 -0.110733
+v 0.543263 0.199702 -0.082558
+v 0.596679 0.191324 -0.117241
+v 0.540071 0.190806 -0.089066
+v 0.592769 0.184014 -0.125175
+v 0.536160 0.183495 -0.097000
+v 0.588291 0.178569 -0.134229
+v 0.531682 0.178051 -0.106054
+v 0.583418 0.175200 -0.144056
+v 0.526809 0.174682 -0.115882
+v 0.578336 0.174035 -0.154279
+v 0.521727 0.173517 -0.126104
+v 0.573241 0.175120 -0.164503
+v 0.516633 0.174602 -0.136329
+v 0.568329 0.178413 -0.174338
+v 0.511721 0.177894 -0.146163
+v 0.563789 0.183787 -0.183403
+v 0.507181 0.183268 -0.155229
+v 0.559795 0.191035 -0.191352
+v 0.503186 0.190517 -0.163177
+v 0.556500 0.199880 -0.197878
+v 0.499892 0.199362 -0.169703
+v 0.554032 0.209981 -0.202731
+v 0.497423 0.209463 -0.174557
+v 0.552484 0.220950 -0.205725
+v 0.495876 0.220432 -0.177550
+v 0.552099 0.232366 -0.206834
+v 0.495309 0.231848 -0.178569
+v 0.510603 -0.005892 -0.147840
+v 0.567393 -0.005677 -0.176105
+v 0.510866 -0.010613 -0.147433
+v 0.567474 -0.010399 -0.175607
+v 0.511533 -0.015150 -0.146208
+v 0.568141 -0.014936 -0.174383
+v 0.512579 -0.019328 -0.144213
+v 0.569187 -0.019114 -0.172388
+v 0.513963 -0.022987 -0.141525
+v 0.570572 -0.022772 -0.169699
+v 0.515633 -0.025985 -0.138246
+v 0.572241 -0.025771 -0.166420
+v 0.517524 -0.028208 -0.134503
+v 0.574133 -0.027993 -0.162677
+v 0.519564 -0.029570 -0.130439
+v 0.576172 -0.029355 -0.158614
+v 0.521674 -0.030018 -0.126211
+v 0.578282 -0.029804 -0.154386
+v 0.523773 -0.029537 -0.121982
+v 0.580381 -0.029322 -0.150156
+v 0.525780 -0.028143 -0.117913
+v 0.582389 -0.027929 -0.146088
+v 0.527619 -0.025891 -0.114161
+v 0.584228 -0.025677 -0.142336
+v 0.529218 -0.022867 -0.110871
+v 0.585827 -0.022653 -0.139045
+v 0.530517 -0.019188 -0.108168
+v 0.587125 -0.018973 -0.136343
+v 0.531465 -0.014994 -0.106157
+v 0.588073 -0.014780 -0.134331
+v 0.532025 -0.010448 -0.104915
+v 0.588634 -0.010233 -0.133089
+v 0.532177 -0.005723 -0.104489
+v 0.588967 -0.005508 -0.132754
+v 0.531915 -0.001001 -0.104896
+v 0.588753 -0.000787 -0.133185
+v 0.531247 0.003536 -0.106121
+v 0.635129 0.003751 -0.157824
+v 0.530202 0.007714 -0.108116
+v 0.634083 0.007929 -0.159819
+v 0.528817 0.011373 -0.110804
+v 0.632699 0.011587 -0.162507
+v 0.527147 0.014371 -0.114083
+v 0.631029 0.014585 -0.165786
+v 0.525256 0.016593 -0.117826
+v 0.629138 0.016808 -0.169529
+v 0.523216 0.017955 -0.121890
+v 0.627098 0.018170 -0.173593
+v 0.521106 0.018404 -0.126118
+v 0.624988 0.018618 -0.177821
+v 0.519007 0.017922 -0.130347
+v 0.622889 0.018137 -0.182050
+v 0.517000 0.016529 -0.134416
+v 0.620882 0.016743 -0.186119
+v 0.515161 0.014277 -0.138168
+v 0.619043 0.014491 -0.189871
+v 0.513562 0.011253 -0.141458
+v 0.617444 0.011467 -0.193161
+v 0.512263 0.007574 -0.144161