Results 1 to 20 of 20

Thread: Does this justify using Goto

  1. #1

    Thread Starter
    Still learning kebo's Avatar
    Join Date
    Apr 2004
    Location
    Gardnerville,nv
    Posts
    3,712

    Does this justify using Goto

    So I have a logic flow chart I need to implement that essentially gets 4 boolean values in order (A,B,C and D) from the user.

    If A is true get B other wise return nothing
    If B is true get C otherwise get A again
    If C is true get D otherwise get C again
    If D is true Return something otherwise get C again.
    Here is the flow chart.
    Name:  Capture.PNG
Views: 251
Size:  23.0 KB

    I have mulled on this for quite a while and the most elegant and simple implementation I found was this...
    Code:
        Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles Me.Shown
    
            Dim A As Boolean = False
            Dim B As Boolean = False
            Dim C As Boolean = False
            Dim D As Boolean = False
    
    getA:
            A = getBool("A")
            If Not A Then
                MessageBox.Show("return nothing")
                Exit Sub
            End If
    
    getB:
            If Not getBool("B") Then
                GoTo getA
            End If
    
    getC:
            If Not getBool("C") Then
                GoTo getB
            End If
    
    getD:
            If Not getBool("D") Then
                GoTo getC
            End If
    
            MessageBox.Show("Return something")
    
        End Sub
    
        Private Function getBool(varName As String) As Boolean
    
            Dim ret As Boolean
            ret = (MessageBox.Show(varName, "Get variable", MessageBoxButtons.OKCancel) = Windows.Forms.DialogResult.OK)
            Return ret
    
        End Function
    For the record, I felt kinda dirty and soiled while I was writing this but the alternative methods weren't looking so good (at least not in my "thought experiments").

    Anyone have any better ways? and if the goto shouldn't be used in this limited and very specific implementation why not?
    thanks for your time
    kevin
    Process control doesn't give you good quality, it gives you consistent quality.
    Good quality comes from consistently doing the right things.

    Vague general questions have vague general answers.
    A $100 donation is required for me to help you if you PM me asking for help. Instructions for donating to one of our local charities will be provided.

    ______________________________
    Last edited by kebo : Now. Reason: superfluous typo's

  2. #2
    Bad man! ident's Avatar
    Join Date
    Mar 2009
    Location
    Cambridge
    Posts
    5,390

    Re: Does this justify using Goto

    NOOOOOOOOOOOOOOOOOOOO, whats up with you!!!! you are not that evil

  3. #3

    Thread Starter
    Still learning kebo's Avatar
    Join Date
    Apr 2004
    Location
    Gardnerville,nv
    Posts
    3,712

    Re: Does this justify using Goto

    Quote Originally Posted by ident View Post
    NOOOOOOOOOOOOOOOOOOOO, whats up with you!!!! you are not that evil

    why not? I mean I know what the Goto can lead to if left to propagate unchecked, but in a very isolated and extremely limited use, what the problem?
    Is there a simpler solution?
    Process control doesn't give you good quality, it gives you consistent quality.
    Good quality comes from consistently doing the right things.

    Vague general questions have vague general answers.
    A $100 donation is required for me to help you if you PM me asking for help. Instructions for donating to one of our local charities will be provided.

    ______________________________
    Last edited by kebo : Now. Reason: superfluous typo's

  4. #4
    Hyperactive Member stepdragon's Avatar
    Join Date
    Aug 2011
    Location
    Cincinnati
    Posts
    288

    Re: Does this justify using Goto

    Would this do it?

    vb.net Code:
    1. Module Module1
    2.  
    3.     Sub Main()
    4.  
    5.         Dim A As Boolean = False
    6.         Dim B As Boolean = False
    7.         Dim C As Boolean = False
    8.         Dim D As Boolean = False
    9.  
    10.         Dim Output As String = ""
    11.  
    12.         Do
    13.             A = GetInput("Enter A:")
    14.             If A Then
    15.                 Do
    16.                     B = GetInput("Enter B:")
    17.                     If B Then
    18.                         Do
    19.                             C = GetInput("Enter C:")
    20.                             If C Then
    21.                                 Do
    22.                                     D = GetInput("Enter D:")
    23.                                     If D Then
    24.                                         Output = "We Did It!"
    25.                                     Else
    26.                                         Exit Do
    27.                                     End If
    28.                                 Loop Until Output <> ""
    29.                             Else
    30.                                 Exit Do
    31.                             End If
    32.                         Loop Until Output <> ""
    33.                     Else
    34.                         Exit Do
    35.                     End If
    36.                 Loop Until Output <> ""
    37.             Else
    38.                 Output = "Return Nothing"
    39.             End If
    40.         Loop Until Output <> ""
    41.  
    42.     End Sub
    43.  
    44.     Function GetInput(ByVal Prompt As String) As Boolean
    45.         Console.WriteLine(Prompt)
    46.         Return Boolean.Parse(Console.ReadLine())
    47.     End Function
    48.  
    49. End Module

    If you're wrong, you'll learn. If I'm wrong, I'll learn. Try something new and go from there. That's how we improve.

    CodeBank: VB.Net - Simple Proper Image Scaling in Correct Aspect Ratio - Star Rating Control
    Useful Links: HOW TO USE CODE TAGS

  5. #5

    Thread Starter
    Still learning kebo's Avatar
    Join Date
    Apr 2004
    Location
    Gardnerville,nv
    Posts
    3,712

    Re: Does this justify using Goto

    Quote Originally Posted by stepdragon View Post
    Would this do it?
    Yea it would do it, but insofar as a simpler solution, thats a tough sell; I guess that's left to the individual though. Looking at both solutions it's hard not use the goto just because of it being easier to digest and expand if needed.
    kevin
    Process control doesn't give you good quality, it gives you consistent quality.
    Good quality comes from consistently doing the right things.

    Vague general questions have vague general answers.
    A $100 donation is required for me to help you if you PM me asking for help. Instructions for donating to one of our local charities will be provided.

    ______________________________
    Last edited by kebo : Now. Reason: superfluous typo's

  6. #6
    Hyperactive Member stepdragon's Avatar
    Join Date
    Aug 2011
    Location
    Cincinnati
    Posts
    288

    Re: Does this justify using Goto

    How is this for simple?

    I never seem to make any code as efficient as possible the first time around. I took another look comparing WHY your code looked easier to read than mine, and I was able to make mine simpler. See if this looks better to you.

    vb.net Code:
    1. Module Module1
    2.  
    3.     Sub Main()
    4.  
    5.         Dim Output As String = ""
    6.  
    7.         While GetInput("Enter A:")
    8.             While GetInput("Enter B:")
    9.                 While GetInput("Enter C:")
    10.                     If GetInput("Enter D:") And Output = "" Then
    11.                         Output = "We Did It!"
    12.                         Exit While
    13.                     End If
    14.                 End While
    15.                 If Output <> "" Then Exit While
    16.             End While
    17.             If Output <> "" Then Exit While
    18.         End While
    19.  
    20.         If Output = "" Then Output = "Return Nothing"
    21.  
    22.         Console.WriteLine(Output)
    23.         Console.ReadLine()
    24.  
    25.     End Sub
    26.  
    27.     Function GetInput(ByVal Prompt As String) As Boolean
    28.         Console.WriteLine(Prompt)
    29.         Return Boolean.Parse(Console.ReadLine())
    30.     End Function
    31.  
    32. End Module

    If you're wrong, you'll learn. If I'm wrong, I'll learn. Try something new and go from there. That's how we improve.

    CodeBank: VB.Net - Simple Proper Image Scaling in Correct Aspect Ratio - Star Rating Control
    Useful Links: HOW TO USE CODE TAGS

  7. #7
    PowerPoster
    Join Date
    Oct 2010
    Posts
    2,141

    Re: Does this justify using Goto

    I'm not opposed to using a goto, but I do not like writing multiple if statements. It looks like you are processing list of conditions where exiting is only permissible for the first and last steps, so how about something like this:

    VB.Net Code:
    1. Private Sub Form1_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown
    2. Dim ans As String = test()
    3. End Sub
    4.  
    5. Private Function test() As String
    6.    Dim cases As New List(Of String)
    7.    cases.Add("A")
    8.    cases.Add("B")
    9.    cases.Add("C")
    10.    cases.Add("D")
    11.    Dim index As Int32 = 0
    12.    Dim testCase As Boolean
    13.    Dim ret As String
    14.    Dim lastIndex As Int32 = cases.Count - 1
    15.    Do
    16.       testCase = getBool(cases(index))
    17.       If testCase Then
    18.          If index = lastIndex Then 'D
    19.             ret = "something"
    20.             Exit Do
    21.          Else
    22.             index += 1
    23.          End If
    24.       Else
    25.          If index = 0 Then 'A
    26.             ret = "nothing"
    27.             Exit Do
    28.          Else
    29.             index -= 1
    30.          End If
    31.       End If
    32.    Loop
    33.    Return ret
    34. End Function
    35.  
    36. Private Function getBool(ByVal varName As String) As Boolean
    37.    Return MessageBox.Show(varName, "Get variable", MessageBoxButtons.OKCancel) = Windows.Forms.DialogResult.OK
    38. End Function

  8. #8

    Thread Starter
    Still learning kebo's Avatar
    Join Date
    Apr 2004
    Location
    Gardnerville,nv
    Posts
    3,712

    Re: Does this justify using Goto

    Quote Originally Posted by TnTinMN View Post
    I'm not opposed to using a goto, but I do not like writing multiple if statements. It looks like you are processing list of conditions where exiting is only permissible for the first and last steps, so how about something like this:

    VB.Net Code:
    1. Private Sub Form1_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown
    2. Dim ans As String = test()
    3. End Sub
    4.  
    5. Private Function test() As String
    6.    Dim cases As New List(Of String)
    7.    cases.Add("A")
    8.    cases.Add("B")
    9.    cases.Add("C")
    10.    cases.Add("D")
    11.    Dim index As Int32 = 0
    12.    Dim testCase As Boolean
    13.    Dim ret As String
    14.    Dim lastIndex As Int32 = cases.Count - 1
    15.    Do
    16.       testCase = getBool(cases(index))
    17.       If testCase Then
    18.          If index = lastIndex Then 'D
    19.             ret = "something"
    20.             Exit Do
    21.          Else
    22.             index += 1
    23.          End If
    24.       Else
    25.          If index = 0 Then 'A
    26.             ret = "nothing"
    27.             Exit Do
    28.          Else
    29.             index -= 1
    30.          End If
    31.       End If
    32.    Loop
    33.    Return ret
    34. End Function
    35.  
    36. Private Function getBool(ByVal varName As String) As Boolean
    37.    Return MessageBox.Show(varName, "Get variable", MessageBoxButtons.OKCancel) = Windows.Forms.DialogResult.OK
    38. End Function
    thats pretty clever. I don't think I would have though of it. I wonder if it would work if the cases are delegate routines that would get called. Ultimately the booleans are returns from funtion calls... hmmmm
    Process control doesn't give you good quality, it gives you consistent quality.
    Good quality comes from consistently doing the right things.

    Vague general questions have vague general answers.
    A $100 donation is required for me to help you if you PM me asking for help. Instructions for donating to one of our local charities will be provided.

    ______________________________
    Last edited by kebo : Now. Reason: superfluous typo's

  9. #9
    PowerPoster
    Join Date
    Oct 2010
    Posts
    2,141

    Re: Does this justify using Goto

    Quote Originally Posted by kebo View Post
    I wonder if it would work if the cases are delegate routines that would get called. Ultimately the booleans are returns from funtion calls... hmmmm
    Of course it will work with delegates!; I like delegates! I first wrote it that way, but changed it so as not to confuse those who get squeamish over such animals. If you need assistance (I doubt it though), just yell.

  10. #10

    Thread Starter
    Still learning kebo's Avatar
    Join Date
    Apr 2004
    Location
    Gardnerville,nv
    Posts
    3,712

    Re: Does this justify using Goto

    yea thanks man.
    Process control doesn't give you good quality, it gives you consistent quality.
    Good quality comes from consistently doing the right things.

    Vague general questions have vague general answers.
    A $100 donation is required for me to help you if you PM me asking for help. Instructions for donating to one of our local charities will be provided.

    ______________________________
    Last edited by kebo : Now. Reason: superfluous typo's

  11. #11
    Super Moderator Shaggy Hiker's Avatar
    Join Date
    Aug 2002
    Location
    Idaho
    Posts
    35,235

    Re: Does this justify using Goto

    On a philosophical note, it does not justify Goto. The problem with Goto isn't just that it can lead to other problems if used unwisely, the problem is that it has such an odor to it in the development community that the presence of it in your code will never get you labeled "brilliant but eccentric". People just won't read that far, and quite often, that's the real issue.
    My usual boring signature: Nothing

  12. #12
    Super Moderator FunkyDexter's Avatar
    Join Date
    Apr 2005
    Location
    An obscure body in the SK system. The inhabitants call it Earth
    Posts
    7,612

    Re: Does this justify using Goto

    I think I might be miss-understanding the problem because I think the requirement as stated would create an infinite loop.

    If A is true get B other wise return nothing
    If B is true get C otherwise get A again
    If A is true and B is false you will repeatedly get A, then B, then A, then B etc. to infinite. In fact your original code will only reach an end state if either all variables are false (in which case it will return nothing) or all variables are true (in which case it will return something).

    If you genuinely do need an infinite loop then TinMan's solution is pretty elegant but I can't help feeling we're getting something wrong here.
    You can depend upon the Americans to do the right thing. But only after they have exhausted every other possibility - Winston Churchill

    Hadoop actually sounds more like the way they greet each other in Yorkshire - Inferrd

  13. #13

    Thread Starter
    Still learning kebo's Avatar
    Join Date
    Apr 2004
    Location
    Gardnerville,nv
    Posts
    3,712

    Re: Does this justify using Goto

    Quote Originally Posted by FunkyDexter View Post
    . In fact your original code will only reach an end state if either all variables are false (in which case it will return nothing) or all variables are true (in which case it will return something)
    You have it right. The only way the routine returns something is when all variables are true. This logic is used for getting user information about a real world process the software controls. First the user gets the machine (A). Next they choose a program that will run on the machine(B). After that they enter information about the machine and the program (C), finally a summary check(D). I have, at times, watched an operator get to the summary and discover they picked the wrong machine so they need to be able to go back and make a change. Its only an infinite look if they don't have a clue about what they are doing which is not the case.
    kevin
    Process control doesn't give you good quality, it gives you consistent quality.
    Good quality comes from consistently doing the right things.

    Vague general questions have vague general answers.
    A $100 donation is required for me to help you if you PM me asking for help. Instructions for donating to one of our local charities will be provided.

    ______________________________
    Last edited by kebo : Now. Reason: superfluous typo's

  14. #14
    Powered By Medtronic dbasnett's Avatar
    Join Date
    Dec 2007
    Location
    Pointless Forest 38.517,-92.023
    Posts
    9,302

    Re: Does this justify using Goto

    Quote Originally Posted by TnTinMN View Post
    I'm not opposed to using a goto, but I do not like writing multiple if statements. It looks like you are processing list of conditions where exiting is only permissible for the first and last steps, so how about something like this:

    VB.Net Code:
    1. Private Sub Form1_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown
    2. Dim ans As String = test()
    3. End Sub
    4.  
    5. Private Function test() As String
    6.    Dim cases As New List(Of String)
    7.    cases.Add("A")
    8.    cases.Add("B")
    9.    cases.Add("C")
    10.    cases.Add("D")
    11.    Dim index As Int32 = 0
    12.    Dim testCase As Boolean
    13.    Dim ret As String
    14.    Dim lastIndex As Int32 = cases.Count - 1
    15.    Do
    16.       testCase = getBool(cases(index))
    17.       If testCase Then
    18.          If index = lastIndex Then 'D
    19.             ret = "something"
    20.             Exit Do
    21.          Else
    22.             index += 1
    23.          End If
    24.       Else
    25.          If index = 0 Then 'A
    26.             ret = "nothing"
    27.             Exit Do
    28.          Else
    29.             index -= 1
    30.          End If
    31.       End If
    32.    Loop
    33.    Return ret
    34. End Function
    35.  
    36. Private Function getBool(ByVal varName As String) As Boolean
    37.    Return MessageBox.Show(varName, "Get variable", MessageBoxButtons.OKCancel) = Windows.Forms.DialogResult.OK
    38. End Function
    test simplified
    Code:
        Private Function test() As String
            Dim cases As New List(Of String) From {"A", "B", "C", "D"}
            Dim index As Int32 = 0
            Dim ret As String = "*"
            Do
                If getBool(cases(index)) Then 'good answer?
                    ret = "something" 'yes
                    index += 1
                Else 'no
                    ret = "nothing"
                    index -= 1
                End If
            Loop While index >= 0 AndAlso index < cases.Count
            Return ret
        End Function
    My First Computer -- Documentation Link (RT?M) -- Using the Debugger -- Prime Number Sieve
    Counting Bits -- Subnet Calculator -- UI Guidelines -- >> SerialPort Answer <<

    "Those who use Application.DoEvents have no idea what it does and those who know what it does never use it." John Wein

  15. #15

    Thread Starter
    Still learning kebo's Avatar
    Join Date
    Apr 2004
    Location
    Gardnerville,nv
    Posts
    3,712

    Re: Does this justify using Goto

    Quote Originally Posted by Shaggy Hiker View Post
    On a philosophical note, it does not justify Goto. The problem with Goto isn't just that it can lead to other problems if used unwisely, the problem is that it has such an odor to it in the development community that the presence of it in your code will never get you labeled "brilliant but eccentric". People just won't read that far, and quite often, that's the real issue.
    I think your spot on. There is (for good reason) a prejudicial bias against Goto because it can turn code into a bowl of noddles and lead to solutions that have no real structure and organization. However, I have yet to hear any reason for not using it that speaks of a lack of performance. In fact performance wise,if I had to bet, I would say the Goto method above runs quicker and compiles smaller than any other solution provided. Given the fact that the Goto method is still easier to read than the other solutions (argue it if you want, but it's subjective at this point) then it would be bad coding practice not to use Goto even if you get chastised.
    kevin
    Process control doesn't give you good quality, it gives you consistent quality.
    Good quality comes from consistently doing the right things.

    Vague general questions have vague general answers.
    A $100 donation is required for me to help you if you PM me asking for help. Instructions for donating to one of our local charities will be provided.

    ______________________________
    Last edited by kebo : Now. Reason: superfluous typo's

  16. #16
    Hyperactive Member stepdragon's Avatar
    Join Date
    Aug 2011
    Location
    Cincinnati
    Posts
    288

    Re: Does this justify using Goto

    I would like to add one more thought for your consideration to the discussion. It regards what you consider 'simple'.

    In the logic puzzle prompted, as I stated before, it is practically the definition of a nested loop. You either continue deeper a layer, or out by a layer until you hit the end. Therefore for the sake of this next point, the code in Post #1, is almost identical (in operation) as the code in Post #6. I say this because you are using Goto statements AS Loops with conditions.

    However, when I read these two lines in code, they have different meanings:

    End While - Jump to the beginning of <This Loop>
    Goto - Jump <Somewhere>


    I'm making this point because, when reading and following code, it is always clear where a loop begins. Yes, it may be difficult to find if things aren't aligned nice and pretty like VS makes them, but you can easily follow each level in the chain to find the beginning. This in my opinion is what makes that code 'simple', and easier to read. With the Goto statement, however, there is no direct link between start and finish, so one must go looking for the continuation point themselves. This I believe is more complex, from the programmer's perspective.

    In the end I think it comes down to this:
    If you're using Goto to recreate the functionality of a loop - a loop should be used.
    If you're using Goto in a more complex situation - You risk creating confusion to anyone else looking at your code.

    I recommend avoiding it whenever possible.

    If you're wrong, you'll learn. If I'm wrong, I'll learn. Try something new and go from there. That's how we improve.

    CodeBank: VB.Net - Simple Proper Image Scaling in Correct Aspect Ratio - Star Rating Control
    Useful Links: HOW TO USE CODE TAGS

  17. #17
    Frenzied Member
    Join Date
    Jul 2011
    Location
    UK
    Posts
    1,282

    Re: Does this justify using Goto

    In this case, I actually find the code with GOTOs easiest to understand, followed by dbasnett's interpretation of TnTinMN's code.

    Possibly like many people here, I made a New Year's resolution to exercise more, and so, as an exercise, I also had a go at finding a solution. It goes to show that GOTOs are not the most evil, obfuscated code construct available in .NET. Not by a long chalk.


    I dedicate the following to .paul. Happy New Year

    VB.NET Code:
    1. Private Sub Button1_Click(sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2.     Dim tests As New Dictionary(Of String, Func(Of String, Boolean))
    3.     tests.Add("A", AddressOf getBool)
    4.     tests.Add("B", AddressOf getBool)
    5.     tests.Add("C", AddressOf getBool)
    6.     tests.Add("D", AddressOf getBool)
    7.  
    8.     Dim Test As Func(Of Integer, String) = Function(indx) If(Not tests.Values(indx)(tests.Keys(indx)), If(indx = 0, "nothing", Test(indx - 1)), If(indx = 3, "SOMETHING", Test(indx + 1)))
    9.  
    10.     MessageBox.Show(Test(0))
    11. End Sub
    12.  
    13. Private Function getBool(testName As String) As Boolean
    14.     Return MessageBox.Show(testName, "Get variable", MessageBoxButtons.OKCancel) = Windows.Forms.DialogResult.OK
    15. End Function

  18. #18

    Thread Starter
    Still learning kebo's Avatar
    Join Date
    Apr 2004
    Location
    Gardnerville,nv
    Posts
    3,712

    Re: Does this justify using Goto

    Quote Originally Posted by Inferrd View Post
    VB.NET Code:
    1. Dim Test As Func(Of Integer, String) = Function(indx) If(Not tests.Values(indx)(tests.Keys(indx)), If(indx = 0, "nothing", Test(indx - 1)), If(indx = 3, "SOMETHING", Test(indx + 1)))
    Oy vey
    Process control doesn't give you good quality, it gives you consistent quality.
    Good quality comes from consistently doing the right things.

    Vague general questions have vague general answers.
    A $100 donation is required for me to help you if you PM me asking for help. Instructions for donating to one of our local charities will be provided.

    ______________________________
    Last edited by kebo : Now. Reason: superfluous typo's

  19. #19
    Super Moderator FunkyDexter's Avatar
    Join Date
    Apr 2005
    Location
    An obscure body in the SK system. The inhabitants call it Earth
    Posts
    7,612

    Re: Does this justify using Goto

    First the user gets the machine (A). Next they choose a program that will run on the machine(B). After that they enter information about the machine and the program (C), finally a summary check(D).
    Sounds like a wizard to me and there are already well documented patterns to implement that. Just google Wizard Design Pattern and you'll find stank loads of stuff. No point in reinventing wheels.

    And no, it doesn't justify using Goto, in my opinion. You'd be far better, for example, creating an iWizardStep interface with a Run method which returned an enumeration of StepBack, StepForward or CancelWizard. Your individual steps can then implement that interface and still be wholly self contained. You then have an overall Wizard class which contains a List(of iWizardStep). The Wizard can then iterate the list stepping back, forward or just exiting as appropriate. The advantage to this is that it decouples the implementation of the steps from the sequencing of those steps, meaning that you could build up a wizard dynamically with whichever steps you wanted at the time.

    I'm not sure I'd argue that GoTos are always bad but I would argue that they're almost never good and the "almost" is only in there to cover the lack of certain constructs in certain languages (e.g. to immediately exit a loop in a language that doesn't have a specific loop exit command). I've never come across a GoTo in .Net that couldn't be more clearly expressed by using a different construct and I'm not convinced I'd ever have to sacrifice performance either. If you're worrying about performance in a routine to control steps through a wizard you're almost certainly hung up on a premature optimisation.
    You can depend upon the Americans to do the right thing. But only after they have exhausted every other possibility - Winston Churchill

    Hadoop actually sounds more like the way they greet each other in Yorkshire - Inferrd

  20. #20
    PowerPoster SJWhiteley's Avatar
    Join Date
    Feb 2009
    Location
    South of the Mason-Dixon Line
    Posts
    2,256

    Re: Does this justify using Goto

    Using GOTO is like running a red light: just because you get away with it once or twice doesn't mean it is OK to do.
    "Ok, my response to that is pending a Google search" - Bucky Katt.
    "There are two types of people in the world: Those who can extrapolate from incomplete data sets." - Unk.
    "Before you can 'think outside the box' you need to understand where the box is."

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  



Click Here to Expand Forum to Full Width