From: <ror...@us...> - 2007-07-23 08:40:07
|
Revision: 112 http://roreditor.svn.sourceforge.net/roreditor/?rev=112&view=rev Author: rorthomas Date: 2007-07-23 01:40:03 -0700 (Mon, 23 Jul 2007) Log Message: ----------- * bugreport: added editorlog.log * depchecker: added ability to remove missing files by comparing to original RoR files * added some depchecker 'plugins' * added unzip/unrar ability * terraineditor: removed 'saved' dialog * added installmod script, which is able to install modifications out of a .rar or .zip * 031a_deps.bin : saved dependency tree for Rigs of Rods 0.31a Modified Paths: -------------- trunk/lib/ror/bugreport.py trunk/lib/ror/depchecker.py trunk/lib/ror/depcheckerplugins/ror_mesh.py trunk/lib/ror/depcheckerplugins/ror_overlay.py trunk/lib/ror/depcheckerplugins/ror_terrn.py trunk/lib/ror/repoclient.py trunk/lib/rorterraineditor/MainFrame.py trunk/lib/rorterraineditor/RoRTerrainOgreWindow.py Added Paths: ----------- trunk/installmod.bat trunk/installmod.py trunk/lib/UnRAR/ trunk/lib/UnRAR/__init__.py trunk/lib/UnRAR/unrar.dll trunk/lib/UnZIP/ trunk/lib/UnZIP/__init__.py trunk/lib/ror/031a_deps.bin trunk/lib/ror/depcheckerplugins/ror_afl.py trunk/lib/ror/depcheckerplugins/ror_asm.py trunk/lib/ror/depcheckerplugins/ror_cfg.py trunk/lib/ror/depcheckerplugins/ror_cg.py trunk/lib/ror/depcheckerplugins/ror_compositor.py trunk/lib/ror/depcheckerplugins/ror_dll.py trunk/lib/ror/depcheckerplugins/ror_exe.py trunk/lib/ror/depcheckerplugins/ror_glsl.py trunk/lib/ror/depcheckerplugins/ror_hlsl.py trunk/lib/ror/depcheckerplugins/ror_msi.py trunk/lib/ror/depcheckerplugins/ror_particle.py trunk/lib/ror/depcheckerplugins/ror_psd.py trunk/lib/ror/depcheckerplugins/ror_raw.py trunk/lib/ror/depcheckerplugins/ror_skeleton.py trunk/lib/ror/depcheckerplugins/ror_txt.py trunk/lib/ror/depcheckerplugins/ror_wav.py trunk/lib/ror/depcheckerplugins/ror_xml.py trunk/lib/ror/depcheckerplugins/ror_zip.py trunk/testunrar.py trunk/testunzip.py Added: trunk/installmod.bat =================================================================== --- trunk/installmod.bat (rev 0) +++ trunk/installmod.bat 2007-07-23 08:40:03 UTC (rev 112) @@ -0,0 +1 @@ +%systemdrive%\python25\python.exe installmod.py %1 %2 %3 %4 %5 %6 %7 %8 %9 Added: trunk/installmod.py =================================================================== --- trunk/installmod.py (rev 0) +++ trunk/installmod.py 2007-07-23 08:40:03 UTC (rev 112) @@ -0,0 +1,210 @@ +#Thomas Fischer 31/05/2007, th...@th... +import sys, os, os.path, shutil + +sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), "lib")) +from ror.logger import log +from ror.settingsManager import getSettingsManager + +TEMPDIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), "temp") + +def removetemp(reporterrors=True): + if os.path.isdir(TEMPDIR): + try: + shutil.rmtree(TEMPDIR) + except Exception, err: + if not reporterrors: + return + log().error(str(err)) + log().error("could not remove temporary diretory: %s! please delete by hand." % TEMPDIR) + sys.exit(1) + +def ExtractToTemp(filename): + file, extension = os.path.splitext(filename) + removetemp() + if extension.lower() == ".rar": + import UnRAR + os.mkdir(TEMPDIR) + dst = os.path.join(TEMPDIR, os.path.basename(filename)) + shutil.copyfile(filename, dst) + os.chdir(TEMPDIR) + UnRAR.Archive(os.path.basename(filename)).extract() + # change back to current path + os.chdir(os.path.dirname(os.path.abspath(__file__))) + return True + elif extension.lower() == ".zip": + import UnZIP + UnZIP.unzip(filename, TEMPDIR) + return True + else: + shutil.copyfile(filename, dst) + return False + +def installfile(maintarget, srcfile, dryrun): + file, extension = os.path.splitext(maintarget) + rorpath = getSettingsManager().getSetting("RigsOfRods", "BasePath") + + if extension in ['.truck', '.load']: + path = os.path.join(rorpath, "data", "trucks") + elif extension in ['.terrn']: + path = os.path.join(rorpath, "data", "terrains") + else: + path = rorpath + if dryrun: + log().info("would install %s to %s" % (os.path.basename(srcfile), path)) + else: + log().info("installing %s to %s" % (os.path.basename(srcfile), path)) + shutil.copyfile(srcfile, os.path.join(path, os.path.basename(srcfile))) + +def searchFile(filename, top): + for root, dirs, files in os.walk(top, topdown=False): + if filename in files: + return os.path.join(root, filename) + return None + +def usage(): + print "usage (general): %s <filename> <mode> <additionaloptions> [--verbose] [--dryrun]" % (os.path.basename(sys.argv[0])) + print "<filename> list" + print " list all found and valid modifications in filename" + print "" + print "<filename> listall --verbose" + print " list all found modifications in filename (valid and invalid)" + print "" + print "<filename> installall --verbose" + print " install all found modifications in filename" + print "" + print "<filename> install <modification> --verbose" + print " install a certain modifications in filename (valid and invalid)" + print "" + print "notes: the --verbose option is optional to increase the output for debugging" + print " the --dryrun option just prints out which files would be copied/installed." + sys.exit(0) + +def getTargets(verbose): + import ror.depchecker + dc = ror.depchecker.RoRDepChecker(TEMPDIR, "getfiles", "", verbose) + targets = [] + for file in dc.files: + filename, extension = os.path.splitext(file) + if extension.lower() in ['.truck', '.terrn', '.load']: + targets.append(os.path.basename(file)) + + validtargets = [] + invalidtargets = [] + for target in targets: + dc = ror.depchecker.RoRDepChecker(TEMPDIR, "dtree", target, verbose) + if dc.everythingfound: + validtargets.append(target) + else: + invalidtargets.append(target) + return validtargets, invalidtargets + + +def main(): + if len(sys.argv) < 3: + usage() + + targetfile = sys.argv[1] + if not os.path.isfile(targetfile): + log().error("%s is not a valid target filename!" % targetfile) + usage() + + mode = sys.argv[2] + if not mode in ['list', 'listall', 'install', 'installall']: + usage() + if len(sys.argv) < 4 and mode in ['install']: + usage() + + # get optional flags + verbose = False + dryrun = False + for option in sys.argv: + if option == "--verbose": + verbose = True + if option == "--dryrun": + dryrun = True + + + import ror.settingsManager + path = ror.settingsManager.getSettingsManager().getSetting("RigsOfRods", "BasePath") + if not os.path.isfile(os.path.join(path,"RoR.exe")): + import ror.starter + ror.starter.startApp() + + # Import Psyco if available + try: + import psyco + psyco.full() + except ImportError: + pass + + filename = os.path.abspath(targetfile) + ExtractToTemp(filename) + + if mode == "install": + target = sys.argv[3] + import ror.depchecker + log().info("### validating target ...") + dc = ror.depchecker.RoRDepChecker(TEMPDIR, "dtree", target, verbose) + if dc.invalid: + log().error("### target invalid!") + log().info("### please use the list mode to get valid targets") + usage() + + log().info("### target valid!") + #print dc.dstree + installcounter = 0 + for file in dc.dstree: + filename = file['filename'] + filenamefound = searchFile(filename, TEMPDIR) + if filenamefound is None: + log().error("File %s not found in %s!" % (filename, TEMPDIR)) + sys.exit(1) + installfile(target, filenamefound, dryrun) + installcounter += 1 + if dryrun: + log().info("### would install %d files." % installcounter) + else: + log().info("### %d files installed, finished!" % installcounter) + + elif mode == "installall": + validtargets, invalidtargets = getTargets(verbose) + log().info("### installing %d found modifications:" % (len(validtargets))) + installcounter = 0 + for target in validtargets: + log().info("### installing modification '%s'" % target) + dc = ror.depchecker.RoRDepChecker(TEMPDIR, "dtree", target, verbose) + for file in dc.dstree: + filename = file['filename'] + filenamefound = searchFile(filename, TEMPDIR) + if filenamefound is None: + log().error("File %s not found in %s!" % (filename, TEMPDIR)) + sys.exit(1) + installfile(target, filenamefound, dryrun) + installcounter += 1 + if dryrun: + log().info("### would install %d files." % installcounter) + else: + log().info("### %d files installed, finished!" % installcounter) + + elif mode in ["list", "listall"]: + validtargets, invalidtargets = getTargets(verbose) + if mode == "listall": + if len(invalidtargets) > 0: + print "broken modifications found:" + for v in invalidtargets: + print " %-20s" % v + print "use the --verbose flag to find the missing files!" + else: + print "no broken modifications found:" + + if len(validtargets) > 0: + print "installable modifications found: " + for v in validtargets: + print " %-20s" % v + else: + print "no installable modifications found! :(" + removetemp(False) + + +if __name__=="__main__": + main() \ No newline at end of file Added: trunk/lib/UnRAR/__init__.py =================================================================== --- trunk/lib/UnRAR/__init__.py (rev 0) +++ trunk/lib/UnRAR/__init__.py 2007-07-23 08:40:03 UTC (rev 112) @@ -0,0 +1,524 @@ +# Copyright (c) 2003-2005 Jimmy Retzlaff +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +""" +pyUnRAR is a ctypes based wrapper around the free UnRAR.dll. It +enables reading and unpacking of archives created with the +RAR/WinRAR archivers. There is a low-level interface which is very +similar to the C interface provided by UnRAR. There is also a +higher level interface which makes some common operations easier. +""" + +__version__ = '1.0' + +#from __future__ import generators + +import fnmatch +import os +import Queue +import threading +import time + +import ctypes.wintypes + +# Low level interface - see UnRARDLL\UNRARDLL.TXT + +ERAR_END_ARCHIVE = 10 +ERAR_NO_MEMORY = 11 +ERAR_BAD_DATA = 12 +ERAR_BAD_ARCHIVE = 13 +ERAR_UNKNOWN_FORMAT = 14 +ERAR_EOPEN = 15 +ERAR_ECREATE = 16 +ERAR_ECLOSE = 17 +ERAR_EREAD = 18 +ERAR_EWRITE = 19 +ERAR_SMALL_BUF = 20 +ERAR_UNKNOWN = 21 + +RAR_OM_LIST = 0 +RAR_OM_EXTRACT = 1 + +RAR_SKIP = 0 +RAR_TEST = 1 +RAR_EXTRACT = 2 + +RAR_VOL_ASK = 0 +RAR_VOL_NOTIFY = 1 + +RAR_DLL_VERSION = 3 + +# enum UNRARCALLBACK_MESSAGES +UCM_CHANGEVOLUME = 0 +UCM_PROCESSDATA = 1 +UCM_NEEDPASSWORD = 2 + +try: + unrar = ctypes.WinDLL(os.path.join(os.path.split(__file__)[0], 'unrar.dll')) +except WindowsError: + unrar = ctypes.WinDLL('unrar.dll') + +class RAROpenArchiveData(ctypes.Structure): + def __init__(self, ArcName=None, OpenMode=RAR_OM_LIST): + self.CmtBuf = ctypes.c_buffer(64*1024) + ctypes.Structure.__init__(self, ArcName=ArcName, OpenMode=OpenMode, _CmtBuf=ctypes.addressof(self.CmtBuf), CmtBufSize=ctypes.sizeof(self.CmtBuf)) + + _fields_ = [ + ('ArcName', ctypes.c_char_p), + ('OpenMode', ctypes.c_uint), + ('OpenResult', ctypes.c_uint), + ('_CmtBuf', ctypes.c_voidp), + ('CmtBufSize', ctypes.c_uint), + ('CmtSize', ctypes.c_uint), + ('CmtState', ctypes.c_uint), + ] + +class RAROpenArchiveDataEx(ctypes.Structure): + def __init__(self, ArcName=None, ArcNameW=u'', OpenMode=RAR_OM_LIST): + self.CmtBuf = ctypes.c_buffer(64*1024) + ctypes.Structure.__init__(self, ArcName=ArcName, ArcNameW=ArcNameW, OpenMode=OpenMode, _CmtBuf=ctypes.addressof(self.CmtBuf), CmtBufSize=ctypes.sizeof(self.CmtBuf)) + + _fields_ = [ + ('ArcName', ctypes.c_char_p), + ('ArcNameW', ctypes.c_wchar_p), + ('OpenMode', ctypes.c_uint), + ('OpenResult', ctypes.c_uint), + ('_CmtBuf', ctypes.c_voidp), + ('CmtBufSize', ctypes.c_uint), + ('CmtSize', ctypes.c_uint), + ('CmtState', ctypes.c_uint), + ('Flags', ctypes.c_uint), + ('Reserved', ctypes.c_uint*32), + ] + +class RARHeaderData(ctypes.Structure): + def __init__(self): + self.CmtBuf = ctypes.c_buffer(64*1024) + ctypes.Structure.__init__(self, _CmtBuf=ctypes.addressof(self.CmtBuf), CmtBufSize=ctypes.sizeof(self.CmtBuf)) + + _fields_ = [ + ('ArcName', ctypes.c_char*260), + ('FileName', ctypes.c_char*260), + ('Flags', ctypes.c_uint), + ('PackSize', ctypes.c_uint), + ('UnpSize', ctypes.c_uint), + ('HostOS', ctypes.c_uint), + ('FileCRC', ctypes.c_uint), + ('FileTime', ctypes.c_uint), + ('UnpVer', ctypes.c_uint), + ('Method', ctypes.c_uint), + ('FileAttr', ctypes.c_uint), + ('_CmtBuf', ctypes.c_voidp), + ('CmtBufSize', ctypes.c_uint), + ('CmtSize', ctypes.c_uint), + ('CmtState', ctypes.c_uint), + ] + +class RARHeaderDataEx(ctypes.Structure): + def __init__(self): + self.CmtBuf = ctypes.c_buffer(64*1024) + ctypes.Structure.__init__(self, _CmtBuf=ctypes.addressof(self.CmtBuf), CmtBufSize=ctypes.sizeof(self.CmtBuf)) + + _fields_ = [ + ('ArcName', ctypes.c_char*1024), + ('ArcNameW', ctypes.c_wchar*1024), + ('FileName', ctypes.c_char*1024), + ('FileNameW', ctypes.c_wchar*1024), + ('Flags', ctypes.c_uint), + ('PackSize', ctypes.c_uint), + ('PackSizeHigh', ctypes.c_uint), + ('UnpSize', ctypes.c_uint), + ('UnpSizeHigh', ctypes.c_uint), + ('HostOS', ctypes.c_uint), + ('FileCRC', ctypes.c_uint), + ('FileTime', ctypes.c_uint), + ('UnpVer', ctypes.c_uint), + ('Method', ctypes.c_uint), + ('FileAttr', ctypes.c_uint), + ('_CmtBuf', ctypes.c_voidp), + ('CmtBufSize', ctypes.c_uint), + ('CmtSize', ctypes.c_uint), + ('CmtState', ctypes.c_uint), + ('Reserved', ctypes.c_uint*1024), + ] + +def DosDateTimeToTimeTuple(dosDateTime): + """Convert an MS-DOS format date time to a Python time tuple. + """ + dosDate = dosDateTime >> 16 + dosTime = dosDateTime & 0xffff + day = dosDate & 0x1f + month = (dosDate >> 5) & 0xf + year = 1980 + (dosDate >> 9) + second = 2*(dosTime & 0x1f) + minute = (dosTime >> 5) & 0x3f + hour = dosTime >> 11 + return time.localtime(time.mktime((year, month, day, hour, minute, second, 0, 1, -1))) + +def _wrap(restype, function, argtypes): + result = function + result.argtypes = argtypes + result.restype = restype + return result + +RARGetDllVersion = _wrap(ctypes.c_int, unrar.RARGetDllVersion, []) + +RAROpenArchive = _wrap(ctypes.wintypes.HANDLE, unrar.RAROpenArchive, [ctypes.POINTER(RAROpenArchiveData)]) +RAROpenArchiveEx = _wrap(ctypes.wintypes.HANDLE, unrar.RAROpenArchiveEx, [ctypes.POINTER(RAROpenArchiveDataEx)]) + +RARReadHeader = _wrap(ctypes.c_int, unrar.RARReadHeader, [ctypes.wintypes.HANDLE, ctypes.POINTER(RARHeaderData)]) +RARReadHeaderEx = _wrap(ctypes.c_int, unrar.RARReadHeaderEx, [ctypes.wintypes.HANDLE, ctypes.POINTER(RARHeaderDataEx)]) + +_RARSetPassword = _wrap(ctypes.c_int, unrar.RARSetPassword, [ctypes.wintypes.HANDLE, ctypes.c_char_p]) +def RARSetPassword(*args, **kwargs): + _RARSetPassword(*args, **kwargs) + +RARProcessFile = _wrap(ctypes.c_int, unrar.RARProcessFile, [ctypes.wintypes.HANDLE, ctypes.c_int, ctypes.c_char_p, ctypes.c_char_p]) + +RARCloseArchive = _wrap(ctypes.c_int, unrar.RARCloseArchive, [ctypes.wintypes.HANDLE]) + +UNRARCALLBACK = ctypes.WINFUNCTYPE(ctypes.c_int, ctypes.c_uint, ctypes.c_long, ctypes.c_long, ctypes.c_long) +_RARSetCallback = _wrap(ctypes.c_int, unrar.RARSetCallback, [ctypes.wintypes.HANDLE, UNRARCALLBACK, ctypes.c_long]) +def RARSetCallback(*args, **kwargs): + _RARSetCallback(*args, **kwargs) + + +# Higher level interface + +class ArchiveHeaderBroken(Exception): pass +class InvalidRARArchive(Exception): pass +class FileOpenError(Exception): pass + +RARExceptions = { + ERAR_NO_MEMORY : MemoryError, + ERAR_BAD_DATA : ArchiveHeaderBroken, + ERAR_BAD_ARCHIVE : InvalidRARArchive, + ERAR_EOPEN : FileOpenError, + } + + +class _FileLikeObject: + """Implement a file like object accessible from RARFile.""" + + # UnRAR.dll's thread safety is unknown, so this queue is used + # to serialize access class-wide when using threads. + dllQueue = Queue.Queue(1) + dllQueue.put(None) + + def __init__(self, rarFile, mode): + """Called by RARFile.open, do not call directly.""" + self.rarFile = rarFile + self.mode = mode + self.instructionsForCallback = Queue.Queue() + self.dataFromCallback = Queue.Queue() + self.readBuffer = [] + self.readBufferLength = 0 + self.position = 0 + self.doneReading = False + self.name = self.rarFile.filename + self.lineQueue = Queue.Queue() + + def __del__(self): + self.close() + + def __iter__(self): + while True: + line = self.readline() + if line: + yield line + else: + break + + def close(self): + """Emulate file(...).close().""" + self.instructionsForCallback.put('Quit') + self._thread.join() + self.closed = True + + def flush(self): + """Emulate file(...).flush().""" + pass + + def read(self, size=-1): + """Emulate file(...).read(...).""" + if size < 0: + size = self.rarFile.size + + if not self.doneReading: + while self.readBufferLength < size and not self.doneReading: + if self.dataFromCallback.empty(): + self.instructionsForCallback.put('Read') + self.readBuffer.append(self.dataFromCallback.get()) + if self.readBuffer[-1] is None: + self.doneReading = True + del self.readBuffer[-1] + else: + self.readBufferLength += len(self.readBuffer[-1]) + + result = ''.join(self.readBuffer) + if len(result) <= size: + self.readBuffer = [] + self.readBufferLength = 0 + else: + self.readBuffer = [result[size:]] + self.readBufferLength = len(self.readBuffer[0]) + result = result[:size] + + self.position += len(result) + + if self.mode == 't': + result = result.replace('\r\n', '\n') + + # If threads remain open when Python shuts down them spurious + # exceptions can result. So we automatically try to close the + # file when appropriate (which ends the thread) in case the + # user doesn't. + if self.rarFile.size == self.position: + self.close() + + return result + + def readline(self, size=-1): + """Emulate file(...).readline(...).""" + if self.lineQueue.qsize() < 2: + buffer = self.read(256*1024) + if buffer: + if not self.lineQueue.empty(): + buffer = self.lineQueue.get() + buffer + buffer = buffer.split('\n') + for line in buffer[:-1]: + self.lineQueue.put(line+'\n') + if len(buffer) > 1: + if not buffer[-1]: + self.lineQueue.put(buffer[-1]+'\n') + else: + self.lineQueue.put(buffer[-1]) + + if self.lineQueue.empty(): + result = '' + else: + result = self.lineQueue.get() + + return result + + def readlines(self, sizehint=-1): + """Emulate file(...).readlines(...).""" + if 0 < sizehint < self.rarFile.size: + size = sizehint + else: + size = self.rarFile.size + + lines = [] + sizeRead = 0 + while True: + lines.append(self.readline()) + sizeRead += len(lines[-1]) + if 0 < size <= sizeRead or not lines[-1]: + break + + if not lines[-1]: + del lines[-1] + + return lines + + def xreadlines(self, sizehint=-1): + """Emulate file(...).xreadlines(...).""" + import xreadlines + return xreadlines.xreadlines(self) + + def seek(self, offset, whence=0): + """Emulate file(...).seek(...). + + Seeks cannot move backwards in the file. Seeking forward + requires decompressing the file until the seek-point which + can be time consuming. + """ + position = offset + if whence == 1: + position += self.position + elif whence == 2: + position += self.rarFile.size + + assert position >= self.position + read(position-self.position) + + def tell(self): + """Emulate file(...).tell().""" + return self.position + + def __callback(self, msg, UserData, P1, P2): + if msg == UCM_PROCESSDATA: + self.dllQueue.put(None) + self.dataFromCallback.put((ctypes.c_char*P2).from_address(P1).raw) + instruction = self.instructionsForCallback.get() + self.dllQueue.get() + if instruction == 'Quit': + return -1 + return 1 + + def expansionThread(self): + try: + self._thread = threading.currentThread() + threading.currentThread().setName(threading.currentThread().getName() + ' - ' + self.rarFile.filename) + RARSetCallback(self.rarFile.RAR._handle, UNRARCALLBACK(self.__callback), 0) + self.dllQueue.get() + try: + RARProcessFile(self.rarFile.RAR._handle, RAR_TEST, None, None) + finally: + self.dllQueue.put(None) + finally: + self.dataFromCallback.put(None) + + +class RARFile: + """Represent a file in an archive. Don't instantiate directly. + + Properties: + filename - name of the file in the archive including path (if any) + datetime - file date/time as a struct_time suitable for time.strftime + isdir - True if the file is a directory + size - size in bytes of the uncompressed file + comment - comment associated with the file + + Note - this is not currently intended to be a Python file-like object. + """ + + def __init__(self, RAR, headerData): + self.RAR = RAR + self.filename = headerData.FileName + self.datetime = DosDateTimeToTimeTuple(headerData.FileTime) + self.isdir = ((headerData.Flags & 0xE0) == 0xE0) + self.size = headerData.UnpSize + (headerData.UnpSizeHigh << 32) + if headerData.CmtState == 1: + self.comment = headerData.CmtBuf.value + else: + self.comment = None + + self._extracted = False + + def extract(self, filename=None): + """Extract the file to the file system.""" + + self._extracted = True + RARProcessFile(self.RAR._handle, RAR_EXTRACT, None, filename) + + def open(self, mode='rb'): + """Open a file-like object. + + Because of the style of the UnRAR.dll API for extracting files + without writing to disk, extraction must be done in a background + thread. This is encapsulated by pyUnRAR, but you should be aware + that calling this method results in a thread being spawned. + + >>> for fileInArchive in Archive('test.rar').iterfiles(): + ... if fileInArchive.filename.endswith('test.txt'): + ... print fileInArchive.open('rt').read() + This is only a test. + """ + + assert mode[0] == 'r' and (len(mode) == 1 or (len(mode) ==2 and mode[1] in 'bt')) + if 't' in mode: + mode = 't' + else: + mode = 'b' + + self._extracted = True + fileLikeObject = _FileLikeObject(self, mode) + expansionThread = threading.Thread(target=fileLikeObject.expansionThread) + expansionThread.setDaemon(True) + expansionThread.start() + return fileLikeObject + + def __str__(self): + return '<RARFile "%s" in "%s">' % (self.filename, self.RAR.archiveName) + + def _skip(self): + if not self._extracted: + RARProcessFile(self.RAR._handle, RAR_SKIP, None, None) + + +class Archive: + """Open and operate on an archive.""" + + def __init__(self, archiveName, password=None): + """Instantiate the archive. + + archiveName is the name of the RAR file. + password is used to decrypt the files in the archive. + + Properties: + comment - comment associated with the archive + + >>> print Archive('test.rar').comment + This is a test. + """ + self.archiveName = archiveName + archiveData = RAROpenArchiveDataEx(ArcNameW=self.archiveName, OpenMode=RAR_OM_EXTRACT) + self._handle = RAROpenArchiveEx(ctypes.byref(archiveData)) + + if archiveData.OpenResult != 0: + raise RARExceptions[archiveData.OpenResult] + + if archiveData.CmtState == 1: + self.comment = archiveData.CmtBuf.value + else: + self.comment = None + + if password: + RARSetPassword(self._handle, password) + + def __del__(self): + if self._handle and RARCloseArchive: + RARCloseArchive(self._handle) + + def extract(self, filespec='*'): + """Extract all files in the archive matching the filespec. + + >>> Archive('test.rar').extract('*.pyc') + """ + for rarFile in self.iterfiles(): + if fnmatch.fnmatch(rarFile.filename, filespec): + rarFile.extract() + + def iterfiles(self): + """Iterate over all the files in the archive. + + The yielded RARFile should not be stored, it is not valid once + the next iteration has occurred. + + >>> import os + >>> for fileInArchive in Archive('test.rar').iterfiles(): + ... print os.path.split(fileInArchive.filename)[-1], + ... print fileInArchive.isdir, + ... print fileInArchive.size, + ... print fileInArchive.comment, + ... print fileInArchive.datetime, + ... print time.strftime('%a, %d %b %Y %H:%M:%S', fileInArchive.datetime) + test True 0 None (2003, 6, 30, 1, 59, 48, 0, 181, 1) Mon, 30 Jun 2003 01:59:48 + test.txt False 20 None (2003, 6, 30, 2, 1, 2, 0, 181, 1) Mon, 30 Jun 2003 02:01:02 + this.py False 1030 None (2002, 2, 8, 16, 47, 48, 4, 39, 0) Fri, 08 Feb 2002 16:47:48 + """ + headerData = RARHeaderDataEx() + while not RARReadHeaderEx(self._handle, ctypes.byref(headerData)): + rarFile = RARFile(self, headerData) + yield rarFile + rarFile._skip() Added: trunk/lib/UnRAR/unrar.dll =================================================================== (Binary files differ) Property changes on: trunk/lib/UnRAR/unrar.dll ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/lib/UnZIP/__init__.py =================================================================== --- trunk/lib/UnZIP/__init__.py (rev 0) +++ trunk/lib/UnZIP/__init__.py 2007-07-23 08:40:03 UTC (rev 112) @@ -0,0 +1,12 @@ +import sys, zipfile, os, os.path + +def unzip(file, dir): + os.mkdir(dir) + zfobj = zipfile.ZipFile(file) + for name in zfobj.namelist(): + if name.endswith('/'): + os.mkdir(os.path.join(dir, name)) + else: + outfile = open(os.path.join(dir, name), 'wb') + outfile.write(zfobj.read(name)) + outfile.close() Added: trunk/lib/ror/031a_deps.bin =================================================================== --- trunk/lib/ror/031a_deps.bin (rev 0) +++ trunk/lib/ror/031a_deps.bin 2007-07-23 08:40:03 UTC (rev 112) @@ -0,0 +1,18659 @@ +(dp0 +S'SideBar.mesh' +p1 +(dp2 +S'requires' +p3 +(dp4 +S'material' +p5 +(lp6 +S'Grey' +p7 +asS'file' +p8 +(lp9 +S'SideBar.material' +p10 +assS'requiredby' +p11 +(dp12 +g5 +(lp13 +sg8 +(lp14 +S'fl6-volvo.truck' +p15 +ag15 +assS'optional' +p16 +(dp17 +g5 +(lp18 +sg8 +(lp19 +ssS'provides' +p20 +(dp21 +g5 +(lp22 +sg8 +(lp23 +S'SideBar.mesh' +p24 +asssS'sign-dir-john-cast.mesh' +p25 +(dp26 +g3 +(dp27 +g5 +(lp28 +S'sign-nhelens' +p29 +asg8 +(lp30 +S'signs.material' +p31 +assg11 +(dp32 +g5 +(lp33 +sg8 +(lp34 +S'sign-dir-john-cast.odef' +p35 +assg16 +(dp36 +g5 +(lp37 +sg8 +(lp38 +ssg20 +(dp39 +g5 +(lp40 +sg8 +(lp41 +S'sign-dir-john-cast.mesh' +p42 +asssS'derooyrwheelface.png' +p43 +(dp44 +g3 +(dp45 +g5 +(lp46 +sg8 +(lp47 +ssg11 +(dp48 +g5 +(lp49 +sg8 +(lp50 +ssg16 +(dp51 +g5 +(lp52 +sg8 +(lp53 +ssg20 +(dp54 +g5 +(lp55 +sg8 +(lp56 +S'derooyrwheelface.png' +p57 +asssS'locked-off.png' +p58 +(dp59 +g3 +(dp60 +g5 +(lp61 +sg8 +(lp62 +ssg11 +(dp63 +g5 +(lp64 +sg8 +(lp65 +S'tracks.material' +p66 +assg16 +(dp67 +g5 +(lp68 +sg8 +(lp69 +ssg20 +(dp70 +g5 +(lp71 +sg8 +(lp72 +S'locked-off.png' +p73 +asssS'smitmast.mesh.xml' +p74 +(dp75 +g20 +(dp76 +ssS'airneedles.overlay' +p77 +(dp78 +g20 +(dp79 +ssS'EarthClearSkyFog.png' +p80 +(dp81 +g3 +(dp82 +g5 +(lp83 +sg8 +(lp84 +ssg11 +(dp85 +g5 +(lp86 +sg8 +(lp87 +ssg16 +(dp88 +g5 +(lp89 +sg8 +(lp90 +ssg20 +(dp91 +g5 +(lp92 +sg8 +(lp93 +S'EarthClearSkyFog.png' +p94 +asssS'dodgewheelface.png' +p95 +(dp96 +g3 +(dp97 +g5 +(lp98 +sg8 +(lp99 +ssg11 +(dp100 +g5 +(lp101 +sg8 +(lp102 +S'dodge.material' +p103 +assg16 +(dp104 +g5 +(lp105 +sg8 +(lp106 +ssg20 +(dp107 +g5 +(lp108 +sg8 +(lp109 +S'dodgewheelface.png' +p110 +asssS'myobs.mesh.xml' +p111 +(dp112 +g20 +(dp113 +ssS'wahoo.png' +p114 +(dp115 +g3 +(dp116 +g5 +(lp117 +sg8 +(lp118 +ssg11 +(dp119 +g5 +(lp120 +sg8 +(lp121 +S'wahoo.material' +p122 +assg16 +(dp123 +g5 +(lp124 +sg8 +(lp125 +ssg20 +(dp126 +g5 +(lp127 +sg8 +(lp128 +S'wahoo.png' +p129 +asssS'aspen-mini.png' +p130 +(dp131 +g3 +(dp132 +g5 +(lp133 +sg8 +(lp134 +ssg11 +(dp135 +g5 +(lp136 +sg8 +(lp137 +S'aspen.terrn' +p138 +assg16 +(dp139 +g5 +(lp140 +sg8 +(lp141 +ssg20 +(dp142 +g5 +(lp143 +sg8 +(lp144 +S'aspen-mini.png' +p145 +asssS'tatrawheelband.png' +p146 +(dp147 +g3 +(dp148 +g5 +(lp149 +sg8 +(lp150 +ssg11 +(dp151 +g5 +(lp152 +sg8 +(lp153 +S't813.material' +p154 +assg16 +(dp155 +g5 +(lp156 +sg8 +(lp157 +ssg20 +(dp158 +g5 +(lp159 +sg8 +(lp160 +S'tatrawheelband.png' +p161 +asssS'liebherr-mini.png' +p162 +(dp163 +g3 +(dp164 +g5 +(lp165 +sg8 +(lp166 +ssg11 +(dp167 +g5 +(lp168 +sg8 +(lp169 +S'liebherr.truck' +p170 +assg16 +(dp171 +g5 +(lp172 +sg8 +(lp173 +ssg20 +(dp174 +g5 +(lp175 +sg8 +(lp176 +S'liebherr-mini.png' +p177 +asssS'mirror.png' +p178 +(dp179 +g3 +(dp180 +g5 +(lp181 +sg8 +(lp182 +ssg11 +(dp183 +g5 +(lp184 +sg8 +(lp185 +S'common.material' +p186 +assg16 +(dp187 +g5 +(lp188 +sg8 +(lp189 +ssg20 +(dp190 +g5 +(lp191 +sg8 +(lp192 +S'mirror.png' +p193 +asssS'myobs.mesh' +p194 +(dp195 +g3 +(dp196 +g5 +(lp197 +S'myobs-white' +p198 +asg8 +(lp199 +S'myobs.material' +p200 +assg11 +(dp201 +g5 +(lp202 +sg8 +(lp203 +S'myobs.odef' +p204 +assg16 +(dp205 +g5 +(lp206 +sg8 +(lp207 +ssg20 +(dp208 +g5 +(lp209 +sg8 +(lp210 +S'myobs.mesh' +p211 +asssS'roadquay.mesh' +p212 +(dp213 +g3 +(dp214 +g5 +(lp215 +S'road' +p216 +asg8 +(lp217 +S'road.material' +p218 +assg11 +(dp219 +g5 +(lp220 +sg8 +(lp221 +S'roadquay.odef' +p222 +assg16 +(dp223 +g5 +(lp224 +sg8 +(lp225 +ssg20 +(dp226 +g5 +(lp227 +sg8 +(lp228 +S'roadquay.mesh' +p229 +asssS'island-15h.jpg' +p230 +(dp231 +g3 +(dp232 +g5 +(lp233 +sg8 +(lp234 +ssg11 +(dp235 +g5 +(lp236 +sg8 +(lp237 +ssg16 +(dp238 +g5 +(lp239 +sg8 +(lp240 +ssg20 +(dp241 +g5 +(lp242 +sg8 +(lp243 +S'island-15h.jpg' +p244 +asssS'turbotwin-mini.png' +p245 +(dp246 +g3 +(dp247 +g5 +(lp248 +sg8 +(lp249 +ssg11 +(dp250 +g5 +(lp251 +sg8 +(lp252 +S'turbotwin.truck' +p253 +assg16 +(dp254 +g5 +(lp255 +sg8 +(lp256 +ssg20 +(dp257 +g5 +(lp258 +sg8 +(lp259 +S'turbotwin-mini.png' +p260 +asssS'NACA64.1.412.afl' +p261 +(dp262 +g20 +(dp263 +ssS'ae86wheelband.png' +p264 +(dp265 +g3 +(dp266 +g5 +(lp267 +sg8 +(lp268 +ssg11 +(dp269 +g5 +(lp270 +sg8 +(lp271 +S'Toyota86mat.material' +p272 +assg16 +(dp273 +g5 +(lp274 +sg8 +(lp275 +ssg20 +(dp276 +g5 +(lp277 +sg8 +(lp278 +S'ae86wheelband.png' +p279 +asssS'lopress-on.png' +p280 +(dp281 +g3 +(dp282 +g5 +(lp283 +sg8 +(lp284 +ssg11 +(dp285 +g5 +(lp286 +sg8 +(lp287 +g66 +assg16 +(dp288 +g5 +(lp289 +sg8 +(lp290 +ssg20 +(dp291 +g5 +(lp292 +sg8 +(lp293 +S'lopress-on.png' +p294 +asssS'rightmirror.mesh.xml' +p295 +(dp296 +g20 +(dp297 +ssS'sphere.mesh' +p298 +(dp299 +g3 +(dp300 +g5 +(lp301 +S'BaseWhite' +p302 +asg8 +(lp303 +ssg11 +(dp304 +g5 +(lp305 +sg8 +(lp306 +ssg16 +(dp307 +g5 +(lp308 +sg8 +(lp309 +ssg20 +(dp310 +g5 +(lp311 +sg8 +(lp312 +S'sphere.mesh' +p313 +asssS'C1.material' +p314 +(dp315 +g3 +(dp316 +g5 +(lp317 +sg8 +(lp318 +S'C1.jpg' +p319 +aS'C1beam.jpg' +p320 +assg11 +(dp321 +g5 +(lp322 +sg8 +(lp323 +S'C1.truck' +p324 +assg16 +(dp325 +g5 +(lp326 +sg8 +(lp327 +ssg20 +(dp328 +g5 +(lp329 +S'C1' +p330 +aS'C1beam' +p331 +asg8 +(lp332 +S'C1.material' +p333 +asssg324 +(dp334 +g3 +(dp335 +g5 +(lp336 +S'C1' +p337 +asg8 +(lp338 +g314 +assg11 +(dp339 +g5 +(lp340 +sg8 +(lp341 +S'island.terrn' +p342 +assg16 +(dp343 +g5 +(lp344 +S'tracks/C1help' +p345 +asg8 +(lp346 +S'C1-mini.png' +p347 +assg20 +(dp348 +g5 +(lp349 +sg8 +(lp350 +S'C1.truck' +p351 +asssS'semiflat.material' +p352 +(dp353 +g3 +(dp354 +g5 +(lp355 +sg8 +(lp356 +S'semiflat.png' +p357 +assg11 +(dp358 +g5 +(lp359 +sg8 +(lp360 +S'semiflat.load' +p361 +assg16 +(dp362 +g5 +(lp363 +sg8 +(lp364 +ssg20 +(dp365 +g5 +(lp366 +S'tracks/semiflat' +p367 +asg8 +(lp368 +S'semiflat.material' +p369 +asssS'sign-dir-john-cast.mesh.xml' +p370 +(dp371 +g20 +(dp372 +ssS'checkchecked.png' +p373 +(dp374 +g3 +(dp375 +g5 +(lp376 +sg8 +(lp377 +ssg11 +(dp378 +g5 +(lp379 +sg8 +(lp380 +S'truck_editor.material' +p381 +assg16 +(dp382 +g5 +(lp383 +sg8 +(lp384 +ssg20 +(dp385 +g5 +(lp386 +sg8 +(lp387 +S'checkchecked.png' +p388 +asssS'road-block2.mesh' +p389 +(dp390 +g3 +(dp391 +g5 +(lp392 +S'road' +p393 +asg8 +(lp394 +g218 +assg11 +(dp395 +g5 +(lp396 +sg8 +(lp397 +S'road-block2.odef' +p398 +assg16 +(dp399 +g5 +(lp400 +sg8 +(lp401 +ssg20 +(dp402 +g5 +(lp403 +sg8 +(lp404 +S'road-block2.mesh' +p405 +asssS'altimeter.png' +p406 +(dp407 +g3 +(dp408 +g5 +(lp409 +sg8 +(lp410 +ssg11 +(dp411 +g5 +(lp412 +sg8 +(lp413 +S'dashboard.material' +p414 +assg16 +(dp415 +g5 +(lp416 +sg8 +(lp417 +ssg20 +(dp418 +g5 +(lp419 +sg8 +(lp420 +S'altimeter.png' +p421 +asssS'Blur0_vs.glsl' +p422 +(dp423 +g20 +(dp424 +ssS'sign-dir-cold-cast.odef' +p425 +(dp426 +g3 +(dp427 +g5 +(lp428 +sg8 +(lp429 +S'sign-dir-cold-cast.mesh' +p430 +assg11 +(dp431 +g5 +(lp432 +sg8 +(lp433 +S'nhelens.terrn' +p434 +assg16 +(dp435 +g5 +(lp436 +sg8 +(lp437 +ssg20 +(dp438 +g5 +(lp439 +sg8 +(lp440 +S'sign-dir-cold-cast.odef' +p441 +asssS'airintake.mesh.xml' +p442 +(dp443 +g20 +(dp444 +ssS'redarrow.png' +p445 +(dp446 +g3 +(dp447 +g5 +(lp448 +sg8 +(lp449 +ssg11 +(dp450 +g5 +(lp451 +sg8 +(lp452 +g414 +assg16 +(dp453 +g5 +(lp454 +sg8 +(lp455 +ssg20 +(dp456 +g5 +(lp457 +sg8 +(lp458 +S'redarrow.png' +p459 +asssS'nhelens-12h.jpg' +p460 +(dp461 +g3 +(dp462 +g5 +(lp463 +sg8 +(lp464 +ssg11 +(dp465 +g5 +(lp466 +sg8 +(lp467 +ssg16 +(dp468 +g5 +(lp469 +sg8 +(lp470 +ssg20 +(dp471 +g5 +(lp472 +sg8 +(lp473 +S'nhelens-12h.jpg' +p474 +asssS'semi.png' +p475 +(dp476 +g3 +(dp477 +g5 +(lp478 +sg8 +(lp479 +ssg11 +(dp480 +g5 +(lp481 +sg8 +(lp482 +S'semi.material' +p483 +assg16 +(dp484 +g5 +(lp485 +sg8 +(lp486 +ssg20 +(dp487 +g5 +(lp488 +sg8 +(lp489 +S'semi.png' +p490 +asssS'clutch-off.png' +p491 +(dp492 +g3 +(dp493 +g5 +(lp494 +sg8 +(lp495 +ssg11 +(dp496 +g5 +(lp497 +sg8 +(lp498 +g66 +assg16 +(dp499 +g5 +(lp500 +sg8 +(lp501 +ssg20 +(dp502 +g5 +(lp503 +sg8 +(lp504 +S'clutch-off.png' +p505 +asssS'hsi.png' +p506 +(dp507 +g3 +(dp508 +g5 +(lp509 +sg8 +(lp510 +ssg11 +(dp511 +g5 +(lp512 +sg8 +(lp513 +g414 +assg16 +(dp514 +g5 +(lp515 +sg8 +(lp516 +ssg20 +(dp517 +g5 +(lp518 +sg8 +(lp519 +S'hsi.png' +p520 +asssS'boxtrailer.load' +p521 +(dp522 +g3 +(dp523 +g5 +(lp524 +S'tracks/fl6-volvo' +p525 +asg8 +(lp526 +S'fl6-volvo.material' +p527 +assg11 +(dp528 +g5 +(lp529 +sg8 +(lp530 +ssg16 +(dp531 +g5 +(lp532 +S'tracks/boxtrailerhelp' +p533 +asg8 +(lp534 +S'boxtrailer-mini.png' +p535 +assg20 +(dp536 +g5 +(lp537 +sg8 +(lp538 +S'boxtrailer.load' +p539 +asssS'chapel.odef' +p540 +(dp541 +g3 +(dp542 +g5 +(lp543 +sg8 +(lp544 +S'chapel.mesh' +p545 +assg11 +(dp546 +g5 +(lp547 +sg8 +(lp548 +g138 +ag434 +assg16 +(dp549 +g5 +(lp550 +sg8 +(lp551 +ssg20 +(dp552 +g5 +(lp553 +sg8 +(lp554 +S'chapel.odef' +p555 +asssS'sign-descent.png' +p556 +(dp557 +g3 +(dp558 +g5 +(lp559 +sg8 +(lp560 +ssg11 +(dp561 +g5 +(lp562 +sg8 +(lp563 +g31 +assg16 +(dp564 +g5 +(lp565 +sg8 +(lp566 +ssg20 +(dp567 +g5 +(lp568 +sg8 +(lp569 +S'sign-descent.png' +p570 +asssS'wrecker.material' +p571 +(dp572 +g3 +(dp573 +g5 +(lp574 +sg8 +(lp575 +S'wrecker.png' +p576 +aS'wrecker_emissive.png' +p577 +aS'wreckerhelp.png' +p578 +assg11 +(dp579 +g5 +(lp580 +sg8 +(lp581 +S'wrecker.truck' +p582 +ag582 +aS'Scanialoader.truck' +p583 +assg16 +(dp584 +g5 +(lp585 +sg8 +(lp586 +ssg20 +(dp587 +g5 +(lp588 +S'tracks/wrecker' +p589 +aS'tracks/wreckerhelp' +p590 +asg8 +(lp591 +S'wrecker.material' +p592 +asssS'an-12.material' +p593 +(dp594 +g3 +(dp595 +g5 +(lp596 +sg8 +(lp597 +S'an-12.png' +p598 +aS'an12wheelface.png' +p599 +aS'an12wheelband.png' +p600 +aS'prop.png' +p601 +assg11 +(dp602 +g5 +(lp603 +sg8 +(lp604 +S'an12nacelle.mesh' +p605 +aS'an12fairing-right.mesh' +p606 +aS'an-12.truck' +p607 +aS'an12turret.mesh' +p608 +aS'an12fairing-left.mesh' +p609 +aS'pale.mesh' +p610 +assg16 +(dp611 +g5 +(lp612 +sg8 +(lp613 +ssg20 +(dp614 +g5 +(lp615 +S'tracks/An12' +p616 +aS'tracks/an12wheelface' +p617 +aS'tracks/an12wheelband' +p618 +aS'prop' +p619 +asg8 +(lp620 +S'an-12.material' +p621 +asssS'buildicon.png' +p622 +(dp623 +g3 +(dp624 +g5 +(lp625 +sg8 +(lp626 +ssg11 +(dp627 +g5 +(lp628 +sg8 +(lp629 +g381 +assg16 +(dp630 +g5 +(lp631 +sg8 +(lp632 +ssg20 +(dp633 +g5 +(lp634 +sg8 +(lp635 +S'buildicon.png' +p636 +asssS'robot.mesh' +p637 +(dp638 +g3 +(dp639 +g5 +(lp640 +S'Material' +p641 +asg8 +(lp642 +S'robot.material' +p643 +assg11 +(dp644 +g5 +(lp645 +sg8 +(lp646 +ssg16 +(dp647 +g5 +(lp648 +sg8 +(lp649 +ssg20 +(dp650 +g5 +(lp651 +sg8 +(lp652 +S'robot.mesh' +p653 +asssS'resources.cfg' +p654 +(dp655 +g20 +(dp656 +ssS'pbrake-on.png' +p657 +(dp658 +g3 +(dp659 +g5 +(lp660 +sg8 +(lp661 +ssg11 +(dp662 +g5 +(lp663 +sg8 +(lp664 +g66 +assg16 +(dp665 +g5 +(lp666 +sg8 +(lp667 +ssg20 +(dp668 +g5 +(lp669 +sg8 +(lp670 +S'pbrake-on.png' +p671 +asssS'clack.wav' +p672 +(dp673 +g3 +(dp674 +g5 +(lp675 +sg8 +(lp676 +ssg11 +(dp677 +g5 +(lp678 +sg8 +(lp679 +ssg16 +(dp680 +g5 +(lp681 +sg8 +(lp682 +ssg20 +(dp683 +g5 +(lp684 +sg8 +(lp685 +S'clack.wav' +p686 +asssS'dashbar.png' +p687 +(dp688 +g3 +(dp689 +g5 +(lp690 +sg8 +(lp691 +ssg11 +(dp692 +g5 +(lp693 +sg8 +(lp694 +g414 +assg16 +(dp695 +g5 +(lp696 +sg8 +(lp697 +ssg20 +(dp698 +g5 +(lp699 +sg8 +(lp700 +S'dashbar.png' +p701 +asssS'adi.png' +p702 +(dp703 +g3 +(dp704 +g5 +(lp705 +sg8 +(lp706 +ssg11 +(dp707 +g5 +(lp708 +sg8 +(lp709 +g414 +assg16 +(dp710 +g5 +(lp711 +sg8 +(lp712 +ssg20 +(dp713 +g5 +(lp714 +sg8 +(lp715 +S'adi.png' +p716 +asssS'road-slab5.mesh.xml' +p717 +(dp718 +g20 +(dp719 +ssS'roadborderleft.mesh' +p720 +(dp721 +g3 +(dp722 +g5 +(lp723 +S'road' +p724 +asg8 +(lp725 +g218 +assg11 +(dp726 +g5 +(lp727 +sg8 +(lp728 +S'roadborderleft.odef' +p729 +assg16 +(dp730 +g5 +(lp731 +sg8 +(lp732 +ssg20 +(dp733 +g5 +(lp734 +sg8 +(lp735 +S'roadborderleft.mesh' +p736 +asssS'dafwheelband.png' +p737 +(dp738 +g3 +(dp739 +g5 +(lp740 +sg8 +(lp741 +ssg11 +(dp742 +g5 +(lp743 +sg8 +(lp744 +S'flatdaf.material' +p745 +aS'daf.material' +p746 +assg16 +(dp747 +g5 +(lp748 +sg8 +(lp749 +ssg20 +(dp750 +g5 +(lp751 +sg8 +(lp752 +S'dafwheelband.png' +p753 +asssS'starter.wav' +p754 +(dp755 +g3 +(dp756 +g5 +(lp757 +sg8 +(lp758 +ssg11 +(dp759 +g5 +(lp760 +sg8 +(lp761 +ssg16 +(dp762 +g5 +(lp763 +sg8 +(lp764 +ssg20 +(dp765 +g5 +(lp766 +sg8 +(lp767 +S'starter.wav' +p768 +asssS'robot.mesh.xml' +p769 +(dp770 +g20 +(dp771 +ssS'redbeacon.mesh.xml' +p772 +(dp773 +g20 +(dp774 +ssS'aspen-12h.jpg' +p775 +(dp776 +g3 +(dp777 +g5 +(lp778 +sg8 +(lp779 +ssg11 +(dp780 +g5 +(lp781 +sg8 +(lp782 +ssg16 +(dp783 +g5 +(lp784 +sg8 +(lp785 +ssg20 +(dp786 +g5 +(lp787 +sg8 +(lp788 +S'aspen-12h.jpg' +p789 +asssS'wheelprop.mesh' +p790 +(dp791 +g3 +(dp792 +g5 +(lp793 +S'tracks/daffwheelface' +p794 +asg8 +(lp795 +g746 +assg11 +(dp796 +g5 +(lp797 +sg8 +(lp798 +S'daf.truck' +p799 +ag799 +assg16 +(dp800 +g5 +(lp801 +sg8 +(lp802 +ssg20 +(dp803 +g5 +(lp804 +sg8 +(lp805 +S'wheelprop.mesh' +p806 +asssS'acontainer.material' +p807 +(dp808 +g3 +(dp809 +g5 +(lp810 +sg8 +(lp811 +S'acontainer.png' +p812 +assg11 +(dp813 +g5 +(lp814 +sg8 +(lp815 +S'acontainer.load' +p816 +assg16 +(dp817 +g5 +(lp818 +sg8 +(lp819 +ssg20 +(dp820 +g5 +(lp821 +S'tracks/acontainer' +p822 +asg8 +(lp823 +S'acontainer.material' +p824 +asssS'aspen.raw' +p825 +(dp826 +g3 +(dp827 +g5 +(lp828 +sg8 +(lp829 +ssg11 +(dp830 +g5 +(lp831 +sg8 +(lp832 +S'aspen.cfg' +p833 +assg16 +(dp834 +g5 +(lp835 +sg8 +(lp836 +ssg20 +(dp837 +g5 +(lp838 +sg8 +(lp839 +S'aspen.raw' +p840 +asssS'flatdaf.png' +p841 +(dp842 +g3 +(dp843 +g5 +(lp844 +sg8 +(lp845 +ssg11 +(dp846 +g5 +(lp847 +sg8 +(lp848 +g745 +assg16 +(dp849 +g5 +(lp850 +sg8 +(lp851 +ssg20 +(dp852 +g5 +(lp853 +sg8 +(lp854 +S'flatdaf.png' +p855 +asssS'island-14h.jpg' +p856 +(dp857 +g3 +(dp858 +g5 +(lp859 +sg8 +(lp860 +ssg11 +(dp861 +g5 +(lp862 +sg8 +(lp863 +ssg16 +(dp864 +g5 +(lp865 +sg8 +(lp866 +ssg20 +(dp867 +g5 +(lp868 +sg8 +(lp869 +S'island-14h.jpg' +p870 +asssg10 +(dp871 +g3 +(dp872 +g5 +(lp873 +sg8 +(lp874 +ssg11 +(dp875 +g5 +(lp876 +sg8 +(lp877 +g1 +assg16 +(dp878 +g5 +(lp879 +sg8 +(lp880 +ssg20 +(dp881 +g5 +(lp882 +S'Grey' +p883 +asg8 +(lp884 +S'SideBar.material' +p885 +asssS'lab.mesh' +p886 +(dp887 +g3 +(dp888 +g5 +(lp889 +S'lab' +p890 +asg8 +(lp891 +S'lab.material' +p892 +assg11 +(dp893 +g5 +(lp894 +sg8 +(lp895 +S'lab.odef' +p896 +assg16 +(dp897 +g5 +(lp898 +sg8 +(lp899 +ssg20 +(dp900 +g5 +(lp901 +sg8 +(lp902 +S'lab.mesh' +p903 +asssS'road-slab.mesh' +p904 +(dp905 +g3 +(dp906 +g5 +(lp907 +S'road' +p908 +asg8 +(lp909 +g218 +assg11 +(dp910 +g5 +(lp911 +sg8 +(lp912 +S'road-slab.odef' +p913 +assg16 +(dp914 +g5 +(lp915 +sg8 +(lp916 +ssg20 +(dp917 +g5 +(lp918 +sg8 +(lp919 +S'road-slab.mesh' +p920 +asssS'aspen-9h.jpg' +p921 +(dp922 +g3 +(dp923 +g5 +(lp924 +sg8 +(lp925 +ssg11 +(dp926 +g5 +(lp927 +sg8 +(lp928 +ssg16 +(dp929 +g5 +(lp930 +sg8 +(lp931 +ssg20 +(dp932 +g5 +(lp933 +sg8 +(lp934 +S'aspen-9h.jpg' +p935 +asssS'Blur0_ps20.hlsl' +p936 +(dp937 +g20 +(dp938 +ssS'renault-mini.png' +p939 +(dp940 +g3 +(dp941 +g5 +(lp942 +sg8 +(lp943 +ssg11 +(dp944 +g5 +(lp945 +sg8 +(lp946 +S'renault.truck' +p947 +assg16 +(dp948 +g5 +(lp949 +sg8 +(lp950 +ssg20 +(dp951 +g5 +(lp952 +sg8 +(lp953 +S'renault-mini.png' +p954 +asssS'beam.mesh.xml' +p955 +(dp956 +g20 +(dp957 +ssS'daf_emissive.png' +p958 +(dp959 +g3 +(dp960 +g5 +(lp961 +sg8 +(lp962 +ssg11 +(dp963 +g5 +(lp964 +sg8 +(lp965 +g746 +assg16 +(dp966 +g5 +(lp967 +sg8 +(lp968 +ssg20 +(dp969 +g5 +(lp970 +sg8 +(lp971 +S'daf_emissive.png' +p972 +asssS'smallhouse.material' +p973 +(dp974 +g3 +(dp975 +g5 +(lp976 +sg8 +(lp977 +S'smallhouse.jpg' +p978 +assg11 +(dp979 +g5 +(lp980 +sg8 +(lp981 +S'smallhouse.mesh' +p982 +assg16 +(dp983 +g5 +(lp984 +sg8 +(lp985 +ssg20 +(dp986 +g5 +(lp987 +S'tracks/smallhouse' +p988 +asg8 +(lp989 +S'smallhouse.material' +p990 +asssS'road-runway-band.odef' +p991 +(dp992 +g3 +(dp993 +g5 +(lp994 +sg8 +(lp995 +S'road-runway-band.mesh' +p996 +assg11 +(dp997 +g5 +(lp998 +sg8 +(lp999 +g342 +ag138 +ag434 +assg16 +(dp1000 +g5 +(lp1001 +sg8 +(lp1002 +ssg20 +(dp1003 +g5 +(lp1004 +sg8 +(lp1005 +S'road-runway-band.odef' +p1006 +asssS'an-12.png' +p1007 +(dp1008 +g3 +(dp1009 +g5 +(lp1010 +sg8 +(lp1011 +ssg11 +(dp1012 +g5 +(lp1013 +sg8 +(lp1014 +g593 +assg16 +(dp1015 +g5 +(lp1016 +sg8 +(lp1017 +ssg20 +(dp1018 +g5 +(lp1019 +sg8 +(lp1020 +S'an-12.png' +p1021 +asssS'road.odef' +p1022 +(dp1023 +g3 +(dp1024 +g5 +(lp1025 +sg8 +(lp1026 +S'road.mesh' +p1027 +assg11 +(dp1028 +g5 +(lp1029 +sg8 +(lp1030 +g342 +ag138 +ag434 +assg16 +(dp1031 +g5 +(lp1032 +sg8 +(lp1033 +ssg20 +(dp1034 +g5 +(lp1035 +sg8 +(lp1036 +S'road.odef' +p1037 +asssS'sign-bump.odef' +p1038 +(dp1039 +g3 +(dp1040 +g5 +(lp1041 +sg8 +(lp1042 +S'sign-bump.mesh' +p1043 +assg11 +(dp1044 +g5 +(lp1045 +sg8 +(lp1046 +g138 +ag434 +assg16 +(dp1047 +g5 +(lp1048 +sg8 +(lp1049 +ssg20 +(dp1050 +g5 +(lp1051 +sg8 +(lp1052 +S'sign-bump.odef' +p1053 +asssS'hydrostop.wav' +p1054 +(dp1055 +g3 +(dp1056 +g5 +(lp1057 +sg8 +(lp1058 +ssg11 +(dp1059 +g5 +(lp1060 +sg8 +(lp1061 +ssg16 +(dp1062 +g5 +(lp1063 +sg8 +(lp1064 +ssg20 +(dp1065 +g5 +(lp1066 +sg8 +(lp1067 +S'hydrostop.wav' +p1068 +asssS'aspen-17h.jpg' +p1069 +(dp1070 +g3 +(dp1071 +g5 +(lp1072 +sg8 +(lp1073 +ssg11 +(dp1074 +g5 +(lp1075 +sg8 +(lp1076 +ssg16 +(dp1077 +g5 +(lp1078 +sg8 +(lp1079 +ssg20 +(dp1080 +g5 +(lp1081 +sg8 +(lp1082 +S'aspen-17h.jpg' +p1083 +asssS'hangardoor.material' +p1084 +(dp1085 +g3 +(dp1086 +g5 +(lp1087 +sg8 +(lp1088 +S'hangardoor.png' +p1089 +assg11 +(dp1090 +g5 +(lp1091 +sg8 +(lp1092 +S'hangardoor.mesh' +p1093 +assg16 +(dp1094 +g5 +(lp1095 +sg8 +(lp1096 +ssg20 +(dp1097 +g5 +(lp1098 +S'hangardoor' +p1099 +asg8 +(lp1100 +S'hangardoor.material' +p1101 +asssS'liebherr.png' +p1102 +(dp1103 +g3 +(dp1104 +g5 +(lp1105 +sg8 +(lp1106 +ssg11 +(dp1107 +g5 +(lp1108 +sg8 +(lp1109 +S'liebherr.material' +p1110 +assg16 +(dp1111 +g5 +(lp1112 +sg8 +(lp1113 +ssg20 +(dp1114 +g5 +(lp1115 +sg8 +(lp1116 +S'liebherr.png' +p1117 +asssS'multibenne_emissive.png' +p1118 +(dp1119 +g3 +(dp1120 +g5 +(lp1121 +sg8 +(lp1122 +ssg11 +(dp1123 +g5 +(lp1124 +sg8 +(lp1125 +S'multibenne.material' +p1126 +assg16 +(dp1127 +g5 +(lp1128 +sg8 +(lp1129 +ssg20 +(dp1130 +g5 +(lp1131 +sg8 +(lp1132 +S'multibenne_emissive.png' +p1133 +asssS'turbo.wav' +p1134 +(dp1135 +g3 +(dp1136 +g5 +(lp1137 +sg8 +(lp1138 +ssg11 +(dp1139 +g5 +(lp1140 +sg8 +(lp1141 +ssg16 +(dp1142 +g5 +(lp1143 +sg8 +(lp1144 +ssg20 +(dp1145 +g5 +(lp1146 +sg8 +(lp1147 +S'turbo.wav' +p1148 +asssS't813.png' +p1149 +(dp1150 +g3 +(dp1151 +g5 +(lp1152 +sg8 +(lp1153 +ssg11 +(dp1154 +g5 +(lp1155 +sg8 +(lp1156 +g154 +assg16 +(dp1157 +g5 +(lp1158 +sg8 +(lp1159 +ssg20 +(dp1160 +g5 +(lp1161 +sg8 +(lp1162 +S't813.png' +p1163 +asssS'seat.mesh.xml' +p1164 +(dp1165 +g20 +(dp1166 +ssS'island-mini.png' +p1167 +(dp1168 +g3 +(dp1169 +g5 +(lp1170 +sg8 +(lp1171 +ssg11 +(dp1172 +g5 +(lp1173 +sg8 +(lp1174 +g342 +assg16 +(dp1175 +g5 +(lp1176 +sg8 +(lp1177 +ssg20 +(dp1178 +g5 +(lp1179 +sg8 +(lp1180 +S'island-mini.png' +p1181 +asssS'OgreCore.zip' +p1182 +(dp1183 +g20 +(dp1184 +ssS'RenderSystem_Direct3D9.dll' +p1185 +(dp1186 +g20 +(dp1187 +ssS'dodgewheelband.png' +p1188 +(dp1189 +g3 +(dp1190 +g5 +(lp1191 +sg8 +(lp1192 +ssg11 +(dp1193 +g5 +(lp1194 +sg8 +(lp1195 +g103 +assg16 +(dp1196 +g5 +(lp1197 +sg8 +(lp1198 +ssg20 +(dp1199 +g5 +(lp1200 +sg8 +(lp1201 +S'dodgewheelband.png' +p1202 +asssS'sign-dir-cold-cast.mesh.xml' +p1203 +(dp1204 +g20 +(dp1205 +ssS'RustySteel.jpg' +p1206 +(dp1207 +g3 +(dp1208 +g5 +(lp1209 +sg8 +(lp1210 +ssg11 +(dp1211 +g5 +(lp1212 +sg8 +(lp1213 +g186 +assg16 +(dp1214 +g5 +(lp1215 +sg8 +(lp1216 +ssg20 +(dp1217 +g5 +(lp1218 +sg8 +(lp1219 +S'RustySteel.jpg' +p1220 +asssS'island-7h.jpg' +p1221 +(dp1222 +g3 +(dp1223 +g5 +(lp1224 +sg8 +(lp1225 +ssg11 +(dp1226 +g5 +(lp1227 +sg8 +(lp1228 +ssg16 +(dp1229 +g5 +(lp1230 +sg8 +(lp1231 +ssg20 +(dp1232 +g5 +(lp1233 +sg8 +(lp1234 +S'island-7h.jpg' +p1235 +asssS'sign-dir-fish.odef' +p1236 +(dp1237 +g3 +(dp1238 +g5 +(lp1239 +sg8 +(lp1240 +S'sign-dir-fish.mesh' +p1241 +assg11 +(dp1242 +g5 +(lp1243 +sg8 +(lp1244 +g434 +assg16 +(dp1245 +g5 +(lp1246 +sg8 +(lp1247 +ssg20 +(dp1248 +g5 +(lp1249 +sg8 +(lp1250 +S'sign-dir-fish.odef' +p1251 +asssS'island-12h.jpg' +p1252 +(dp1253 +g3 +(dp1254 +g5 +(lp1255 +sg8 +(lp1256 +ssg11 +(dp1257 +g5 +(lp1258 +sg8 +(lp1259 +ssg16 +(dp1260 +g5 +(lp1261 +sg8 +(lp1262 +ssg20 +(dp1263 +g5 +(lp1264 +sg8 +(lp1265 +S'island-12h.jpg' +p1266 +asssS'caliber.png' +p1267 +(dp1268 +g3 +(dp1269 +g5 +(lp1270 +sg8 +(lp1271 +ssg11 +(dp1272 +g5 +(lp1273 +sg8 +(lp1274 +S'caliber.material' +p1275 +assg16 +(dp1276 +g5 +(lp1277 +sg8 +(lp1278 +ssg20 +(dp1279 +g5 +(lp1280 +sg8 +(lp1281 +S'caliber.png' +p1282 +asssS'C1.jpg' +p1283 +(dp1284 +g3 +(dp1285 +g5 +(lp1286 +sg8 +(lp1287 +ssg11 +(dp1288 +g5 +(lp1289 +sg8 +(lp1290 +g314 +assg16 +(dp1291 +g5 +(lp1292 +sg8 +(lp1293 +ssg20 +(dp1294 +g5 +(lp1295 +sg8 +(lp1296 +S'C1.jpg' +p1297 +asssS'wheelband1.jpg' +p1298 +(dp1299 +g3 +(dp1300 +g5 +(lp1301 +sg8 +(lp1302 +ssg11 +(dp1303 +g5 +(lp1304 +sg8 +(lp1305 +g186 +assg16 +(dp1306 +g5 +(lp1307 +sg8 +(lp1308 +ssg20 +(dp1309 +g5 +(lp1310 +sg8 +(lp1311 +S'wheelband1.jpg' +p1312 +asssS'pedal.png' +p1313 +(dp1314 +g3 +(dp1315 +g5 +(lp1316 +sg8 +(lp1317 +ssg11 +(dp1318 +g5 +(lp1319 +sg8 +(lp1320 +g414 +assg16 +(dp1321 +g5 +(lp1322 +sg8 +(lp1323 +ssg20 +(dp1324 +g5 +(lp1325 +sg8 +(lp1326 +S'pedal.png' +p1327 +asssS'mouse.png' +p1328 +(dp1329 +g3 +(dp1330 +g5 +(lp1331 +sg8 +(lp1332 +ssg11 +(dp1333 +g5 +(lp1334 +sg8 +(lp1335 +g381 +assg16 +(dp1336 +g5 +(lp1337 +sg8 +(lp1338 +ssg20 +(dp1339 +g5 +(lp1340 +sg8 +(lp1341 +S'mouse.png' +p1342 +asssS'sign-dir-cold-left.mesh.xml' +p1343 +(dp1344 +g20 +(dp1345 +ssS'ILUT.dll' +p1346 +(dp1347 +g20 +(dp1348 +ssS'door.wav' +p1349 +(dp1350 +g3 +(dp1351 +g5 +(lp1352 +sg8 +(lp1353 +ssg11 +(dp1354 +g5 +(lp1355 +sg8 +(lp1356 +ssg16 +(dp1357 +g5 +(lp1358 +sg8 +(lp1359 +ssg20 +(dp1360 +g5 +(lp1361 +sg8 +(lp1362 +S'door.wav' +p1363 +asssS'nhelens.raw' +p1364 +(dp1365 +g3 +(dp1366 +g5 +(lp1367 +sg8 +(lp1368 +ssg11 +(dp1369 +g5 +(lp1370 +sg8 +(lp1371 +S'nhelens.cfg' +p1372 +assg16 +(dp1373 +g5 +(lp1374 +sg8 +(lp1375 +ssg20 +(dp1376 +g5 +(lp1377 +sg8 +(lp1378 +S'nhelens.raw' +p1379 +asssS'mouse.overlay' +p1380 +(dp1381 +g20 +(dp1382 +ssS'flatdafrwheelface.png' +p1383 +(dp1384 +g3 +(dp1385 +g5 +(lp1386 +sg8 +(lp1387 +ssg11 +(dp1388 +g5 +(lp1389 +sg8 +(lp1390 +g745 +assg16 +(dp1391 +g5 +(lp1392 +sg8 +(lp1393 +ssg20 +(dp1394 +g5 +(lp1395 +sg8 +(lp1396 +S'flatdafrwheelface.png' +p1397 +asssS'ripple.png' +p1398 +(dp1399 +g3 +(dp1400 +g5 +(lp1401 +sg8 +(lp1402 +ssg11 +(dp1403 +g5 +(lp1404 +sg8 +(lp1405 +g66 +assg16 +(dp1406 +g5 +(lp1407 +sg8 +(lp1408 +ssg20 +(dp1409 +g5 +(lp1410 +sg8 +(lp1411 +S'ripple.png' +p1412 +asssS'nhelens-15h.jpg' +p1413 +(dp1414 +g3 +(dp1415 +g5 +(lp1416 +sg8 +(lp1417 +ssg11 +(dp1418 +g5 +(lp1419 +sg8 +(lp1420 +ssg16 +(dp1421 +g5 +(lp1422 +sg8 +(lp1423 +ssg20 +(dp1424 +g5 +(lp1425 +sg8 +(lp1426 +S'nhelens-15h.jpg' +p1427 +asssS'road-block5.odef' +p1428 +(dp1429 +g3 +(dp1430 +g5 +(lp1431 +sg8 +(lp1432 +S'road-block5.mesh' +p1433 +assg11 +(dp1434 +g5 +(lp1435 +sg8 +(lp1436 +ssg16 +(dp1437 +g5 +(lp1438 +sg8 +(lp1439 +ssg20 +(dp1440 +g5 +(lp1441 +sg8 +(lp1442 +S'road-block5.odef' +p1443 +asssS'agoral-mini.png' +p1444 +(dp1445 +g3 +(dp1446 +g5 +(lp1447 +sg8 +(lp1448 +ssg11 +(dp1449 +g5 +(lp1450 +sg8 +(lp1451 +S'agoral.truck' +p1452 +assg16 +(dp1453 +g5 +(lp1454 +sg8 +(lp1455 +ssg20 +(dp1456 +g5 +(lp1457 +sg8 +(lp1458 +S'agoral-mini.png' +p1459 +asssS'blackdot.png' +p1460 +(dp1461 +g3 +(dp1462 +g5 +(lp1463 +sg8 +(lp1464 +ssg11 +(dp1465 +g5 +(lp1466 +sg8 +(lp1467 +g414 +assg16 +(dp1468 +g5 +(lp1469 +sg8 +(lp1470 +ssg20 +(dp1471 +g5 +(lp1472 +sg8 +(lp1473 +S'blackdot.png' +p1474 +asssS'acontainer.png' +p1475 +(dp1476 +g3 +(dp1477 +g5 +(lp1478 +sg8 +(lp1479 +ssg11 +(dp1480 +g5 +(lp1481 +sg8 +(lp1482 +g807 +assg16 +(dp1483 +g5 +(lp1484 +sg8 +(lp1485 +ssg20 +(dp1486 +g5 +(lp1487 +sg8 +(lp1488 +S'acontainer.png' +p1489 +asssS'sign-rocks.odef' +p1490 +(dp1491 +g3 +(dp1492 +g5 +(lp1493 +sg8 +(lp1494 +S'sign-rocks.mesh' +p1495 +assg11 +(dp1496 +g5 +(lp1497 +sg8 +(lp1498 +g138 +ag434 +assg16 +(dp1499 +g5 +(lp1500 +sg8 +(lp1501 +ssg20 +(dp1502 +g5 +(lp1503 +sg8 +(lp1504 +S'sign-rocks.odef' +p1505 +asssS'sign-dir-cargo.mesh' +p1506 +(dp1507 +g3 +(dp1508 +g5 +(lp1509 +S'sign-nhelens' +p1510 +asg8 +(lp1511 +g31 +assg11 +(dp1512 +g5 +(lp1513 +sg8 +(lp1514 +S'sign-dir-cargo.odef' +p1515 +assg16 +(dp1516 +g5 +(lp1517 +sg8 +(lp1518 +ssg20 +(dp1519 +g5 +(lp1520 +sg8 +(lp1521 +S'sign-dir-cargo.mesh' +p1522 +asssS'engine.overlay' +p1523 +(dp1524 +g20 +(dp1525 +ssS'road-park.mesh' +p1526 +(dp1527 +g3 +(dp1528 +g5 +(lp1529 +S'road' +p1530 +asg8 +(lp1531 +g218 +assg11 +(dp1532 +g5 +(lp1533 +sg8 +(lp1534 +S'road-park.odef' +p1535 +assg16 +(dp1536 +g5 +(lp1537 +sg8 +(lp1538 +ssg20 +(dp1539 +g5 +(lp1540 +sg8 +(lp1541 +S'road-park.mesh' +p1542 +asssS'whiteneedle.png' +p1543 +(dp1544 +g3 +(dp1545 +g5 +(lp1546 +sg8 +(lp1547 +ssg11 +(dp1548 +g5 +(lp1549 +sg8 +(lp1550 +g414 +assg16 +(dp1551 +g5 +(lp1552 +sg8 +(lp1553 +ssg20 +(dp1554 +g5 +(lp1555 +sg8 +(lp1556 +S'whiteneedle.png' +p1557 +asssS'secured-on.png' +p1558 +(dp1559 +g3 +(dp1560 +g5 +(lp1561 +sg8 +(lp1562 +ssg11 +(dp1563 +g5 +(lp1564 +sg8 +(lp1565 +g66 +assg16 +(dp1566 +g5 +(lp1567 +sg8 +(lp1568 +ssg20 +(dp1569 +g5 +(lp1570 +sg8 +(lp1571 +S'secured-on.png' +p1572 +asssS'sign-pos-castle.odef' +p1573 +(dp1574 +g3 +(dp1575 +g5 +(lp1576 +sg8 +(lp1577 +S'sign-pos-castle.mesh' +p1578 +assg11 +(dp1579 +g5 +(lp1580 +sg8 +(lp1581 +g434 +assg16 +(dp1582 +g5 +(lp1583 +sg8 +(lp1584 +ssg20 +(dp1585 +g5 +(lp1586 +sg8 +(lp1587 +S'sign-pos-castle.odef' +p1588 +asssS'Caelum.dll' +p1589 +(dp1590 +g20 +(dp1591 +ssS'sign-pos-castle.mesh' +p1592 +(dp1593 +g3 +(dp1594 +g5 +(lp1595 +S'sign-nhelens' +p1596 +asg8 +(lp1597 +g31 +assg11 +(dp1598 +g5 +(lp1599 +sg8 +(lp1600 +g1573 +assg16 +(dp1601 +g5 +(lp1602 +sg8 +(lp1603 +ssg20 +(dp1604 +g5 +(lp1605 +sg8 +(lp1606 +S'sign-pos-castle.mesh' +p1607 +asssS'unknown.png' +p1608 +(dp1609 +g3 +(dp1610 +g5 +(lp1611 +sg8 +(lp1612 +ssg11 +(dp1613 +g5 +(lp1614 +sg8 +(lp1615 +g66 +ag414 +ag381 +assg16 +(dp1616 +g5 +(lp1617 +sg8 +(lp1618 +ssg20 +(dp1619 +g5 +(lp1620 +sg8 +(lp1621 +S'unknown.png' +p1622 +asssS'road-runway-end.odef' +p1623 +(dp1624 +g3 +(dp1625 +g5 +(lp1626 +sg8 +(lp1627 +S'road-runway-end.mesh' +p1628 +assg11 +(dp1629 +g5 +(lp1630 +sg8 +(lp1631 +g342 +ag138 +ag434 +assg16 +(dp1632 +g5 +(lp1633 +sg8 +(lp1634 +ssg20 +(dp1635 +g5 +(lp1636 +sg8 +(lp1637 +S'road-runway-end.odef' +p1638 +asssS'nedlloyd.mesh' +p1639 +(dp1640 +g3 +(dp1641 +g5 +(lp1642 +S'nedlloyd' +p1643 +asg8 +(lp1644 +S'nedlloyd.material' +p1645 +assg11 +(dp1646 +g5 +(lp1647 +sg8 +(lp1648 +S'nedlloyd.odef' +p1649 +assg16 +(dp1650 +g5 +(lp1651 +sg8 +(lp1652 +ssg20 +(dp1653 +g5 +(lp1654 +sg8 +(lp1655 +S'nedlloyd.mesh' +p1656 +asssS'semi.truck' +p1657 +(dp1658 +g3 +(dp1659 +g5 +(lp1660 +S'tracks/semi' +p1661 +asg8 +(lp1662 +S'dashboard.mesh' +p1663 +aS'leftmirror.mesh' +p1664 +aS'rightmirror.mesh' +p1665 +aS'seat.mesh' +p1666 +aS'seat.mesh' +p1667 +ag483 +ag483 +aS'semi-mini.png' +p1668 +assg11 +(dp1669 +g5 +(lp1670 +sg8 +(lp1671 +ssg16 +(dp1672 +g5 +(lp1673 +S'tracks/semihelp' +p1674 +asg8 +(lp1675 +S'semi-mini.png' +p1676 +assg20 +(dp1677 +g5 +(lp1678 +sg8 +(lp1679 +S'semi.truck' +p1680 +asssS'virtualdashboard.png' +p1681 +(dp1682 +g3 +(dp1683 +g5 +(lp1684 +sg8 +(lp1685 +ssg11 +(dp1686 +g5 +(lp1687 +sg8 +(lp1688 +ssg16 +(dp1689 +g5 +(lp1690 +sg8 +(lp1691 +ssg20 +(dp1692 +g5 +(lp1693 +sg8 +(lp1694 +S'virtualdashboard.png' +p1695 +asssg607 +(dp1696 +g3 +(dp1697 +g5 +(lp1698 +S'tracks/An12' +p1699 +asg8 +(lp1700 +S'an12nacelle.mesh' +p1701 +aS'an12nacelle.mesh' +p1702 +aS'an12nacelle.mesh' +p1703 +aS'an12nacelle.mesh' +p1704 +aS'pale.mesh' +p1705 +aS'pale.mesh' +p1706 +aS'pale.mesh' +p1707 +aS'pale.mesh' +p1708 +aS'spinprop.mesh' +p1709 +aS'pale.mesh' +p1710 +aS'pale.mesh' +p1711 +aS'pale.mesh' +p1712 +aS'pale.mesh' +p1713 +aS'spinprop.mesh' +p1714 +aS'pale.mesh' +p1715 +aS'pale.mesh' +p1716 +aS'pale.mesh' +p1717 +aS'pale.mesh' +p1718 +aS'spinprop.mesh' +p1719 +aS'pale.mesh' +p1720 +aS'pale.mesh' +p1721 +aS'pale.mesh' +p1722 +aS'pale.mesh' +p1723 +aS'spinprop.mesh' +p1724 +aS'redbeacon.mesh' +p1725 +aS'redbeacon.mesh' +p1726 +aS'an12turret.mesh' +p1727 +aS'an12fairing-left.mesh' +p1728 +aS'an12fairing-right.mesh' +p1729 +ag593 +aS'an-12-mini.png' +p1730 +assg11 +(dp1731 +g5 +(lp1732 +sg8 +(lp1733 +g342 +ag138 +assg16 +(dp1734 +g5 +(lp1735 +S'tracks/an-12help' +p1736 +asg8 +(lp1737 +S'an-12-mini.png' +p1738 +assg20 +(dp1739 +g5 +(lp1740 +sg8 +(lp1741 +S'an-12.truck' +p1742 +asssS'chp-start.mesh' +p1743 +(dp1744 +g3 +(dp1745 +g5 +(lp1746 +S'chp' +p1747 +asg8 +(lp1748 +S'chp.material' +p1749 +assg11 +(dp1750 +g5 +(lp1751 +sg8 +(lp1752 +S'chp-start.odef' +p1753 +assg16 +(dp1754 +g5 +(lp1755 +sg8 +(lp1756 +ssg20 +(dp1757 +g5 +(lp1758 +sg8 +(lp1759 +S'chp-start.mesh' +p1760 +asssS'starterstart.wav' +p1761 +(dp1762 +g3 +(dp1763 +g5 +(lp1764 +sg8 +(lp1765 +ssg11 +(dp1766 +g5 +(lp1767 +sg8 +(lp1768 +ssg16 +(dp1769 +g5 +(lp1770 +sg8 +(lp1771 +ssg20 +(dp1772 +g5 +(lp1773 +sg8 +(lp1774 +S'starterstart.wav' +p1775 +asssS'sign-leftturn.mesh' +p1776 +(dp1777 +g3 +(dp1778 +g5 +(lp1779 +S'sign-leftturn' +p1780 +asg8 +(lp1781 +g31 +assg11 +(dp1782 +g5 +(lp1783 +sg8 +(lp1784 +S'sign-leftturn.odef' +p1785 +assg16 +(dp1786 +g5 +(lp1787 +sg8 +(lp1788 +ssg20 +(dp1789 +g5 +(lp1790 +sg8 +(lp1791 +S'sign-leftturn.mesh' +p1792 +asssS'challywheelface.png' +p1793 +(dp1794 +g3 +(dp1795 +g5 +(lp1796 +sg8 +(lp1797 +ssg11 +(dp1798 +g5 +(lp1799 +sg8 +(lp1800 +S'challenger.material' +p1801 +assg16 +(dp1802 +g5 +(lp1803 +sg8 +(lp1804 +ssg20 +(dp1805 +g5 +(lp1806 +sg8 +(lp1807 +S'challywheelface.png' +p1808 +asssS'agoras.truck' +p1809 +(dp1810 +g3 +(dp1811 +g5 +(lp1812 +S'tracks/agora' +p1813 +asg8 +(lp1814 +S'dashboard.mesh' +p1815 +aS'leftmirror.mesh' +p1816 +aS'rightmirror.mesh' +p1817 +aS'seat.mesh' +p1818 +aS'agora.material' +p1819 +aS'agoras-mini.png' +p1820 +assg11 +(dp1821 +g5 +(lp1822 +sg8 +(lp1823 +ssg16 +(dp1824 +g5 +(lp1825 +S'tracks/agorashelp' +p1826 +asg8 +(lp1827 +S'agoras-mini.png' +p1828 +assg20 +(dp1829 +g5 +(lp1830 +sg8 +(lp1831 +S'agoras.truck' +p1832 +asssS'beacon.mesh.xml' +p1833 +(dp1834 +g20 +(dp1835 +ssS'flatdaf.truck' +p1836 +(dp1837 +g3 +(dp1838 +g5 +(lp1839 +S'tr... [truncated message content] |