Editing
Scanco User Instructions
(section)
Jump to navigation
Jump to search
Warning:
You are not logged in. Your IP address will be publicly visible if you make any edits. If you
log in
or
create an account
, your edits will be attributed to your username, along with other benefits.
Anti-spam check. Do
not
fill this in!
=OpenVMS Basics= The micro-CT scanners in the lab are manufactured by [http://www.scanco.ch Scanco Medical] and most analyses are performed using their custom software. The micro-CT workstations run OpenVMS as its operating system and it is useful to learn some basic commands. ==OpenVMS Beginner's Reference== OpenVMS (informally known as VMS) is a high-end computer server operating system with reliable, multitasking, real-time and batch processing. OpenVMS supports computer clustering via a LAN, enabling computers to share resources such as processors and disks to balance workload efficiently. *[http://saf.bio.caltech.edu/vms_beginners_faq.html '''OpenVMS Beginner's FAQ'''] [[Image:Redirect.jpg|15px]] [[#top|''Return to Contents'']] or [[Main_Page|''Return to Main Page'']] ==Session Manager== The session manager automatically starts after a user logs in locally. For remote sessions, the session manager can be started with the command <code>$ vue </code>. [[Image:SessionManager.jpg|600px]] ===Session=== Here you will find an option to "End Session", which you should do when you are finished using a workstation. You can click "Work in Progress..." when you have to leave in the middle of a session without logging out but showing a work in progress screen to other users to prevent interference. ===Views (directory shortcuts)=== The session manager is a graphical user interface that can be used to navigate directories (left side of session manager) and open files (right side of session manager). There are shortcuts to key directories under "Views". Single-click on a directory to list its subdirectories and files. Double-click on a file to open it. ===Commands and Utilities=== Under commands you will find tools such as copy, delete, and rename; however, it is much more practical to do these sorts of operations from a DEC terminal. ===Applications=== Under applications you can launch various applications including: *DECterm: opens a DEC terminal *MICROCT: opens the micro-ct control panel (buttons for Scanco Medical programs) *Mozilla/Netscape: opens a web browser *XV: opens a screen capture program [[Image:Redirect.jpg|15px]] [[#top|''Return to Contents'']] or [[Main_Page|''Return to Main Page'']] ==DEC Terminal and Digital Command Language (DCL)== This is a DEC terminal: Commands issued in a DEC terminal are DCL commands. [[Image:decterm.jpg|600px]] ===Copy and paste using the mouse in DEC terminal=== In the DEC terminal, you can highlight text by holding down and moving the mouse. Highlighted text can be pasted into applications or in the terminal using the middle mouse button. You can also highlight files in the Session Manager and paste the filename (with its full path) using the middle mouse button. [[Image:Redirect.jpg|15px]] [[#top|''Return to Contents'']] or [[Main_Page|''Return to Main Page'']] ===What is a symbol=== DCL can store information such as strings or integers in "symbols". DCL can also manipulate these symbols to create other symbols. Symbols are primarily used to define short strings that replace long commands, perform certain calculations and replacements within DCL procedures, hold status information. <pre> $ UR == "SET DEFAULT DISK4:[BONELAB.PROJECTS]" !A short hand to change locations to the project disk. $ UR :== SET DEFAULT DISK4:[BONELAB.PROJECTS] !Another way to define the symbol without quotations. $ x == 3 !Store the value 3 in the symbol x. $ SHOW SYMBOL x !Displays the value of the specified symbol, x. $ DELETE/SYMBOL/GLOBAL x !Deletes the specified symbol, x. </pre> Selected symbols on the Scanco system: <pre> $ UD !Changes to the data directory. $ UR !Changes to the projects directory. $ DISKS !Shows the current disk usage. $ DEC !Opens a new DEC terminal. $ EVE file.txt !Opens the file in the text editor. $ AIX file.aim !Shows the processing log for an aim file. $ AIX -L file.aim !The "-L" is used to show the full processing log. $ QUE !Shows all entries in the queue. $ GS file.ps or file.pdf !Opens *.ps and *.pdf files in GhostScript. $ CTHEADER file.isq or file.rsq !Shows scan information for an *.isq or *.rsq file. </pre> To create a symbol, use the assignment statement ( = or = = ) or the string assignment (:= or := =). The = versus == means local versus global assignment (same as := and :==). Local symbols are only available within the same procedure or procedure level (-> subroutines with CALL). For being available in another procedure or subroutine you need global symbols, otherwise there is no difference. When you use the string assignment, all alphabetic characters are converted to uppercase and multiple spaces and tabs are compressed to a single space. You can use string assignments to create a symbol that represents a DCL command or to define a foreign command (note that in either case, there is a 255-character limit). To continue a character string over two lines in a string assignment, use a single hyphen. For example: $ a := asdfasfdasdf asdfasfafasdf $ b = "asdfasfdasdf asdfasfafasdf" $ sh symb a A = "ASDFASFDASDF ASDFASFAFASDF" $ sh symb b B = "asdfasfdasdf asdfasfafasdf" The symbols are translated by single quotes. If the symbol translation is within a string, e.g. <pre> $ WRITE OUTFILE "''AIMFILE'" </pre> then we need two single quotes '' to indicate that this is not a string that contains a real single quote. It is a bit confusing that you only need at the beginning of a symbol two single quotes, but not in the end. If you have the symbol just in a command, then 'AIMFILE' will do the job, e.g. <pre> MYFILE := 'EVAL_DIR''AIMFILE' </pre> More about symbols you can find in the Open VMS User's Manual under 12.2 symbols, which can be viewed here: http://bone.wiki/images/c/c0/Open_VMS_User%27s_Manual.PDF [[Image:Redirect.jpg|15px]] [[#top|''Return to Contents'']] or [[Main_Page|''Return to Main Page'']] ===What is a logical=== Logical names are strings, like symbols, but can be passed into programs whereas symbols can usually only be interpreted by the command line interpreter. For example, if the logical name UD was defined to be DISK2:[XTREMECT2.DATA] then UD: could be used as a substitute when entering the path to search for files from within a program. <pre> $ DEFINE UD DISK2:[XTREMECT2.DATA] !Defines a logical ud to point to the data directory. $ DEFINE uct_default_isq myfile.isq !Defines the default isq file for Scanco Medical programs. The isq filename must contain the full path to the file to be evaluated, whereas the path can be left out if you just want to contour the scan. </pre> Selected logicals on the micro-CT system: <pre> COM !Logical pointing to the commands directory IDISK1:[XTREMECT2.COMMANDS] UD !Logical pointing to the data directory DISK2:[XTREMECT2.DATA] UD6 !Logical pointing to the data directory DISK6:[XTREMECT2.DATA] UR !Logical pointing to the projects directory DISK4:[BONELAB.PROJECTS] UE !Logical pointing to the evaluation script directory MICROCT_ROOT:[EVAL] UU !Logical pointing to the templates directory MICROCT_ROOT:[UIL] UCT_RESULTS !Logical pointing to the results directory MICROCT_USER:[RESULTS] </pre> [[Image:Redirect.jpg|15px]] [[#top|''Return to Contents'']] or [[Main_Page|''Return to Main Page'']] ===Arithmetic operations=== {| class="wikitable" |style="width: 10%"|Addition ||style="width: 5%;text-align:center;"| + ||The plus sign (+) adds two numbers. |- |style="width: 10%"|Subtraction ||style="width: 5%;text-align:center;"| - ||The minus sign (-) subtracts the second specified number from the first specified number. |- |style="width: 10%"|Multiplication ||style="width: 5%;text-align:center;"| * ||The asterisk (*) multiplies two numbers. |- |style="width: 10%"|Division ||style="width: 5%;text-align:center;"| / ||The slash (/) divides the first specified number by the second specified number. If a number does not divide evenly, the remainder is lost. No rounding takes place. |} [[Image:Redirect.jpg|15px]] [[#top|''Return to Contents'']] or [[Main_Page|''Return to Main Page'']] ===Logical expressions=== {| class="wikitable" style="width: 100%;" |style="width: 10%"|And||.AND.||The operator .AND. combines two logical values as follows true .AND. true = true<br/>true .AND. false = false<br/>false .AND. true = false<br/>false .AND. false = false |- |style="width: 10%"|Or||.OR.||The operator .OR. combines two logical values as follows true .OR. true = true<br/>true .OR. false = true<br/>false .OR. true = true<br/>false .OR. false = false |- |style="width: 10%"|Not||.NOT.||The operator .NOT. reverses the bit configuration of a logical value. A true value becomes false and a false value becomes true. |} [[Image:Redirect.jpg|15px]] [[#top|''Return to Contents'']] or [[Main_Page|''Return to Main Page'']] ===Numeric comparisons=== {| class="wikitable" |style="width: 15%"|Equal to||style="width: 5%;text-align:center;"|.EQ.||Compares one number to another for equality. |- |style="width: 15%"|Not equal||style="width: 5%;text-align:center;"|.NE.||Compares one number to another for inequality. |- |style="width: 15%"|Greater than||style="width: 5%;text-align:center;"|.GT.||Compares one number to another for a greater value in the first number. |- |style="width: 15%"|Greater than or equal to||style="width: 5%;text-align:center;"|.GE.||Compares one number to another for greater or equal value in the first number. |- |style="width: 15%"|Less than or equal to||style="width: 5%;text-align:center;"|.LE.||Compares one number to another for a lesser or equal value in the first number. |- |style="width: 15%"|Less than||style="width: 5%;text-align:center;"|.LT.||Compares one number to another for a lesser value in the first number. |} [[Image:Redirect.jpg|15px]] [[#top|''Return to Contents'']] or [[Main_Page|''Return to Main Page'']] ===String comparisons=== The operators for string comparisons are the same as for numeric comparisons with an added "S" for string. {| class="wikitable" |style="width: 15%"|Equal to||style="width: 5%;text-align:center;"|.EQS.||Compares one character string to another for equality. |- |style="width: 15%"|Not equal||style="width: 5%;text-align:center;"|.NES.||Compares one character string to another for inequality. |- |style="width: 15%"|Greater than||style="width: 5%;text-align:center;"|.GTS.||Compares one character string to another for a greater value in the first specified string. |- |style="width: 15%"|Greater than or equal to||style="width: 5%;text-align:center;"|.GES.||Compares one character string to another for greater or equal value in the first specified string. |- |style="width: 15%"|Less than or equal to||style="width: 5%;text-align:center;"|.LES.||Compares one character string to another for a lesser or equal value in the first specified string. |- |style="width: 15%"|Less than||style="width: 5%;text-align:center;"|.LTS.||Compares one character string to another for a lesser value in the first specified string. |} [[Image:Redirect.jpg|15px]] [[#top|''Return to Contents'']] or [[Main_Page|''Return to Main Page'']] ==DCL Programming Guide== The OpenVMS systems allow for scripts to be written in a language called '''DCL (DIGITAL Command Language)'''. It was not designed to be more difficult than other scripting languages, but learning any new programming language comes with its learning curve. *DCL has 243 commands, but most programs can be written with a base set of about 20 commands. The goal of this section is to provide a convenient reference for these commonly-used commands. It is recommended to open a text editor, enter the whole series of commands, and then run them as a whole program. The terminal on OpenVMS is technically a DCL interpreter, so these commands could be typed in sequence into a terminal with the same result. Typing code interactively is helpful when testing a small code snippet in more detail. ===Your First DCL Script=== Ever since Kernighan and Ritchie wrote the book "The C Programming Language", it has been custom to start with a program that prints the text "Hello, world" to the screen. Open a text editor (for example "EVE") and enter the text below. <pre> $! My First DCL Script $ mymessage = "Hello, world" $ WRITE SYS$OUTPUT mymessage $ EXIT </pre> Now save the file as HELLO1.COM, and run it using <pre>$ @HELLO1.COM</pre> Several things are happening in the above program: *'''Comment !''': The exclamation mark can appear anywhere on the line, and everything following the mark will be treated as a comment. *'''Variable''': "mymessage" variable is populated with the string "Hello, world", which can be used in the rest of the script. *'''Command''' "WRITE" send text to various places, in this case to "SYS$OUTPUT", that is to the standard output (i.e. screen). *'''EXIT''' command tells the DCL interpreter that the script is done and we should exit. *Commands in DCL are '''NOT case sensitive''', so the command "write sys$output mymessage" would produce the exact same result, but by convention we write commands in all uppercase. *'''Special Comment !!''' automatically prints the contents of the comment to the screen/logfile. It is useful when you want to know what part of the script you are in. ===Basic Arithmetic=== The DCL language supports several types of data in variables. In the "Hello, world" example above, we saw how to store a string in a variable. We could have stored an integer, that is a positive or negative whole number, in the variable, and done some basic math. *Refer to [[Scanco_User_Instructions#Arithmetic_operations|'''Arithmetic Operations''']], For example: <pre> $ i = 1 $ WRITE SYS$OUTPUT i+1 $ j = 3 $ k = j * (i + 1) $ WRITE SYS$OUTPUT k $ WRITE SYS$OUTPUT (k / 4) $ WRITE SYS$OUTPUT 2 + 2 * 2 $ EXIT will return: 2 6 1 6 </pre> Two things are worth noting. *Because we are limited to integers, division of 6 / 4 needs to return an integer (1.5 is not an integer); the value is truncated, which means rounding is always done toward zero. *Order of operations is done in the "correct" order, and not left-to-right, so "2 + 2 * 2" is interpreted as "2 + (2 * 2)". ===Conditional Statements=== Sooner or later, you will want to run a program with some logic. The general syntax is: <pre> IF [condition] THEN [do something] ELSE [do something else] ENDIF </pre> *The "ELSE" component is optional. *If you need a very simple if..then with only one command, it can be written on one line without the "ENDIF": <pre> IF [condition] THEN [do something] </pre> *Refer to [[Scanco_User_Instructions#Numeric_comparisons|'''Numeric Comparisons''']], [[Scanco_User_Instructions#String_comparisons|'''String Comparisons''']] and [[Scanco_User_Instructions#Logical_expressions|''' Logical Expressions''']] for all possible logical operators (very similar to Fortran). ===Loops=== Most programming languages have 3 kinds of loops: *Precondition Loops: Condition is tested at the beginning of the loop *Postcondition Loops: Condition is tested after the loop has executed at least once *Iterative Loops: A variable changes in a predetermined fashion each time the loop is called. DCL has none of these. Instead, it has the concept of a "label" and the "GOTO" command. A loop in DCL would look like this: <pre> $ i = 1 $loop1: $ IF i .GE. 10 THEN GOTO exitloop1 $ WRITE SYS$OUTPUT i $ i = i + 1 $ GOTO loop1 $exitloop1: $ EXIT </pre> This program will print the numbers from 1 to 10 in sequence. ===Subroutines=== Most programming languages allow to define a set of commands that can be called from various parts of the program. *In DCL, the subroutine can be defined anywhere in the file (unlike C or Python, where the definition must precede the call). <pre> $ CALL mycustomsub Joe $ CALL mycustomsub Mary $ EXIT $mycustomsub: SUBROUTINE $ WRITE SYS$OUTPUT "Hello, ", P1, "!" $ EXIT $ ENDSUBROUTINE </pre> The first line calls a subroutine named "mycustomsub", which jumps execution to the 4th line. The parameters after the name of the function get copied over to local variables named "P1", "P2", "P3" etc. (in this example, only one parameter, but the maximum is 8) that are available to the subroutine. Note that the command "WRITE" accepts several arguments separated by commas, which get printed on one line. *The subroutine should be terminated with the command "EXIT" followed by "ENDSUBROUTINE". *Note that the parameters get passed literally to the subroutine, that is the subroutine gets the text "Joe", and not the contents of a variable named "Joe". *To force symbol substitution, the parameter would need to be enclosed in single quotes. <pre> $ Joe = "Joe Smith" $ Mary = "Mary Jane" $ CALL mycustomsub 'Joe' $ CALL mycustomsub 'Mary' $ EXIT $mycustomsub: SUBROUTINE $ WRITE SYS$OUTPUT "Hello, ", P1, "!" $ EXIT $ ENDSUBROUTINE </pre> ===Reading from files=== Sometimes you have a list of files (for example Micro-CT scans) that are to be processed in a certain way. The obvious way is to copy-paste the code several times, changing only the name of the file, but this is error-prone and inefficient. *A better way is to put the list of models into a text file, and then call a subroutine on each model file. For example: <pre> $ CLOSE/NOLOG foo $ OPEN/READ foo DISK3:[MICROCT.PROJECTS.OWOC.COM]MYLIST.TXT $read_loop: $ READ/END=done foo myline $ CALL process_me 'myline' $ GOTO read_loop $done: $ CLOSE/NOLOG foo $ EXIT $process_me: SUBROUTINE $ scriptname = DISK3:[MICROCT.PROJECTS.OWOC.COM]MYSCRIPT.COM $ SUBMIT/NOPRINT/QUE=SYS$FAST/PARAM='P1' 'scriptname' $ EXIT $ ENDSUBROUTINE </pre> *The first line closes the file handle, in case it was left open in a previous script. *The second opens the file "MYLIST.TXT" for reading, and assigns the open file a handle named "foo". *A loop reads the file line-by-line, calling a subroutine with the contents of each line. *When the end of the file is reached, the file is closed and the script exits. [[Image:Redirect.jpg|15px]] [[#top|''Return to Contents'']] or [[Main_Page|''Return to Main Page'']] ==List of basic commands== <pre> $ VUE !Start the session manager. Press enter after to regain prompt. $ DEC !Open a new DEC terminal $ UCT !Open the micro-CT control panel. $ UCT_SAMPLE !Start µCT Samples. $ UCT_MEASUREMENT !Start µCT Tomography. $ UCT_EVALUATION !Start µCT Evaluation Program. $ UCT_3D !Start µCT Ray. $ UCT_BACKUP !Start µCT Disk-Utility. $ CD UD !Change location to the data directory. $ CD UR !Change location to the projects directory. $ CD SYS$SCRATCH !Change location to the scratch directory. $ CD UCT_RESULTS !Change location to the results directory. $ DIR UE !List files in the evaluation directory. $ DIR UU !List files in the templates directory. $ DIR COM !List files in the commands directory. $ UCT_LIST !Extract results from the database. $ AIX -L !View the header of an AIM file. $ CTHEADER !View the header of an RSQ or ISQ file. $ EVE !Start the text editor. $ DISKS !Show the current disk usage (all hard drives). $ LOGOUT !End a session. For remote sessions, logout from the main (initial) login terminal. </pre> ===How to move to a different directory=== Use the SET DEFAULT command. You can use an absolute directory path or a relative directory path. <pre> $ SET DEFAULT disk:[dir.subdir] !Moves to specified path. $ SET DEFAULT [.subdir] !Moves one level into subdirectory subdir. </pre> Use the CD (i.e., change directory) command (this calls the script $ @SCOM:CD.COM). <pre> $ CD subdir !Moves into subdirectory subdir. $ CD subdir1 subdir2 !Moves into subdirectory subdir1, then into subdir2. $ CD .. !Moves up one level (i.e., out of one directory). </pre> What if you don't know the directory on the disk? For example, how can you change to DISK5 if you don't know what user is on that disk? You can enter the following: <pre> $ dir disk5:[000000].dir </pre> But you will need to be logged in as <code>system-user</code> in order to use that command. [[Image:Redirect.jpg|15px]] [[#top|''Return to Contents'']] or [[Main_Page|''Return to Main Page'']] ===How to list the files in a directory=== Use the DIRECTORY command, which may be abbreviated to DIR. <pre> $ DIR !List everything in the current directory. $ DIR disk:[dir.subdir] !Lists everything in the specified directory. $ DIR disk:[dir.subdir...] !Lists everything in the specified directory and subdirectories. $ DIR/COL=1 *.aim !Lists all files with the extension .aim in a single column. $ DIR /VERSIONS=1 !Show only the newest version of each file in the directory. $ DIR/SINCE=TODAY !Lists all files created today. $ DIR [...*.aim] !The "..." indicates to do so recursively (i.e., counting all files in all subdirectories). $ DIR/SIZE !Lists each file and its size. $ dir/size/grand_total [.subdir...] !List the total size of all files in the SUBDIR directory. $ HELP DIR !More information on the DIRECTORY command. </pre> [[Image:Redirect.jpg|15px]] [[#top|''Return to Contents'']] or [[Main_Page|''Return to Main Page'']] ===How to copy files=== Use the COPY or BACKUP command. <pre> $ COPY file1.ext disk:[dir.subdir1]file2.ext !Make a copy of file1.ext to another location and call it file2.ext $ COPY *.aim;* disk:[dir.subdir1] !Copy all .aim files (including all versions) to another location keeping the same name. $ HELP COPY !More information on the COPY command. </pre> <pre> $ BACKUP/VERIFY [.subdir1...]*.*;* [.subdir2...] !Copy entire directory SUBDIR1, including all subdirectories and files, into SUBDIR2. $ BACKUP/VERIFY [.subdir1...]*.*;* []subdir1.sav/SAVE !Copy entire directory SUBDIR1, including all subdirectories and files, into a save set. The save set could be transferred and unpacked on another OpenVMS machine. $ HELP BACKUP !More information on the BACKUP command. </pre> Or to copy a complete directory structure: <pre> $ backup/log/verify dna7:[xtremect.data...]*.*;* disk7:[xtremect2.external...] /by=parent </pre> [[Image:Redirect.jpg|15px]] [[#top|''Return to Contents'']] or [[Main_Page|''Return to Main Page'']] ===How to delete files=== Use the DELETE command, which may be abbreviated to DEL. <pre> $ DEL myfile.txt; !Delete the most recent version of myfile.txt. $ DEL myfile.txt;* !Delete all versions of myfile.txt. $ HELP DELETE !More information on the DELETE command. </pre> [[Image:Bones2.jpg|20px]] <b>Warning:</b> Extreme caution! <pre> $ DEL *.*;* !Delete everything in the current directory! </pre> [[Image:Redirect.jpg|15px]] [[#top|''Return to Contents'']] or [[Main_Page|''Return to Main Page'']] ===How to create a directory=== Use the CREATE/DIR command. <pre> $ CREATE/DIR [.subdir] !Creates a subdirectory named subdir.dir in the current directory. $ CREATE/DIR disk:[dir.subdir] !Creates the subdirectory subdir at the specified path. </pre> Or if you are creating a directory on a new disk (log in as user <code>system</code>): <pre> $ create/dir/log/vol=1 disk7:[xtremect2.abc] /own=xtremect2 </pre> If the owner of the new directory is not specified (qualifier '/own=<owner>), it will be assigned to the user as which the command has been entered. [[Image:Redirect.jpg|15px]] [[#top|''Return to Contents'']] or [[Main_Page|''Return to Main Page'']] ===How to move location of a directory=== Use the RENAME command. <pre> $ SET FILE/PROTECTION=O:RWED RESULTS.DIR $ RENAME RESULTS.DIR [-.-.-] !Moves the directory up three levels </pre> [[Image:Redirect.jpg|15px]] [[#top|''Return to Contents'']] or [[Main_Page|''Return to Main Page'']] ===How to rename files and directories=== Use the RENAME command. <pre> $ SET FILE/PROTECTION=O:RWED olddir.dir !Sets protections so you can rename the directory. $ RENAME oldfile.ext newfile.ext !Renames oldfile.ext to newfile.ext. </pre> [[Image:Redirect.jpg|15px]] [[#top|''Return to Contents'']] or [[Main_Page|''Return to Main Page'']] ===How to check the queue=== Use the SHOW QUEUE command, which may be abbreviated to SH QUE. <pre> $ SHOW QUEUE !Shows all the queues, there are many! $ SH QUE *FAST !Shows all queues whose names end with "fast", these are used for evaluations. $ SH QUE *SLOW !Shows all queues whose names end with "slow", these are used for reconstructions. $ SH QUE *FAST/ALL !By default you are only shown queue entries for the user you are logged in as. To show jobs for all users, use the /ALL qualifier. $ SH QUE *FAST/BY=EXE/ALL !Show only jobs that are currently executing for all users. </pre> [[Image:Redirect.jpg|15px]] [[#top|''Return to Contents'']] or [[Main_Page|''Return to Main Page'']] ===How to get queue information=== Use the SHOW ENTRY command to obtain information about batch jobs in the queues. <pre> $ SHOW ENTRY !Shows all the batch jobs for your user, there may be lots! $ SHOW ENTRY 251 !Shows information for batch job number 251. $ SHOW ENTRY 251/FULL !Shows detailed information for batch job number 251. $ SHOW ENTRY/ALL !Shows all the batch jobs for all users. </pre> [[Image:Redirect.jpg|15px]] [[#top|''Return to Contents'']] or [[Main_Page|''Return to Main Page'']]
Summary:
Please note that all contributions to bone.wiki may be edited, altered, or removed by other contributors. If you do not want your writing to be edited mercilessly, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource (see
BoneWiki:Copyrights
for details).
Do not submit copyrighted work without permission!
Cancel
Editing help
(opens in new window)
Navigation menu
Personal tools
Not logged in
Talk
Contributions
Log in
associated-pages
Page
Discussion
English
Views
Read
Edit
View history
More
Search
Navigation
Main page
Documents
Recent changes
Help
Tools
What links here
Related changes
Page information