    // 
    // This High Precision Calculator is (c) 2003 by Edward Martin III
    // All rights reserved.  Please contact me for permission to use any or
    // all of this source in a commercial product.
    // Eventually, it'll have all sorts of neat functions, but for now, its 
    // primary function is to not crash a browser.  And whatever's below:
    // 
    // MODIFICATION HISTORY
    //
    // wishlist:   
    //             How can I get some kind of real progress indicator?!
    //             Euler's Totient function
    //             export to an HTML file
    //             improve browser-related routine in Multiply
    //
    // 01-27-2004: Fixed a bug in the IsPrime function, which meant that the 
    //             calculator can now handle the nontrivial assertions that 
    //             asking if "0" or "1" is a prime is just a goofy question. 
    //             Thanks to Etienne Dumortier for finding it!
    // 06-27-2003: Added a couple of checks in the Power function, such that
    //             if the argument = 0 or 1, then the thing immediately makes 
    //             the shortcut answer.  It was just taking too long to 
    //             compute 1^5000000. 
    // 03-28-2003: Fixed a damn bug in the Multiplication function.  
    //             Eduard Martos Parejo found it for me (thank you, Eduard!) 
    //             and not only did I blast it away, but I was able to 
    //             finally clean up a bit of code that came close to being 
    //             a browser-sniffer.  I'm much happier with what it is 
    //             this time!
    // 01-28-2003: Fixed a damn bug in the DIV_MOD function
    // 01-27-2003: Added Floor(Sqrt(x)) function.  Also added an
    //             IsThisAPerfectSquare function, because the coding is 
    //             pretty trivial, once I have some form of sqrt function.  
    //             It's still a memory-gobbler, though.  I'm open to 
    //             algorithms to reduce this time/computation chunking...
    // 01-14-2003: Added IsPrime function.
    // 01-10-2003: Added Floor and Ceiling, as well as a couple of supporting
    //             rounding functions.  Added GCD and LCM and cleaned up a bit
    //             of code in various places.  Time for a deployment!
    // 01-09-2003: Finished Division.  Yay!  It seems to work pretty
    //             well, including using signs and decimals, but I expect I'll 
    //             have more than a few people point out errors to me.  I hope 
    //             not -- it seems pretty tough.
    //             Also fixed BuildString so that it can handle strings of 
    //             characters of pretty much any length (previously, it had 
    //             been limited to a count no higher than the limit of integers, 
    //             but now it uses the Calculator's own tools for manipulating 
    //             large numbers.)
    // 01-08-2003: Modified the Addition routine to behave better independent of 
    //             browser.  There's still a chunk of code in Multiply that has 
    //             to do result-checks because of browser incompatibilities, but 
    //             eventually, I might nail it, too.  Just not fond of even 
    //             coming CLOSE to results that vary browser-to-browser...
    // 12-19-2002: Added a Help button and associated window.  Much better!
    // 12-03-2002: Added a Status window.  This allows people to know something's 
    //             "going on" during long calculations.  I can't decide if I want 
    //             to disable buttons during long calculations, but this is a 
    //             good interim solution.  It's certainly better than an alert 
    //             window!
    // 11-21-2002: Completed Factorials and Powers.  My sympathies to anyone 
    //             feeding a big number into it -- it takes a bit of time.
    // 11-20-2002: Completed all the trivial cases for DIV and MOD, meaning cases
    //             where one of the numbers = 0, where the Divisor = 1, where 
    //             the Divisor is greater than the Dividend, and where the Divisor 
    //             equals the Dividend.
    // 11-14-2002: Wrangled the last bits of the page to XHTML standards.  Yay!
    //             Also added a ^2 function.  I added a memory bank, such that 
    //             you can "store" results into ten "accumulators".  I'm 
    //             picking ten for the heck of it.  If you really think you need
    //             more, I guess you could just ask.
    // 09-11-2002: Fixed a bug in the IsEqual routine.  Perhaps I should hire
    //             Matthew to find bugs -- he's nailed me twice so far!  Updated
    //             the IsLessThan and IsGreaterThan functions to account for sign
    //             and reinstated those on the client page.  I've changed the 
    //             graphic image of buttons to real buttons, which I HOPE will be 
    //             XHTML transitional acceptable.  For a while, it looked like 
    //             I'd have crazy-shaped buttons, but then I found I can specify 
    //             button width in the stylesheet.  So I did and it works quite 
    //             attractively.  At this moment, I haven't tested the changes 
    //             under Netscape, but I will before deployment.
    // 09-10-2002: Fixed a bug in the Subtraction routine.  Now, the Minuend and
    //             Subtrahend are padded with decimals before any comparisons are
    //             made.  Much smarter that way.  Thanks to Matthew Mastracci for
    //             pointing it out!  I also converted the page to my best attempt
    //             at XHTML and to use a stylesheet.  Always on the bleeding edge, 
    //             we are.  Alas, I miss the transitional mark because href can't 
    //             take an onClick event, but that's the only way to make it work 
    //             (as far as I can tell at the moment) in Netscape.  Grumble...  
    //             I'll bang on it more later.
    // 07-09-2002: Added Multiplication.  I also fixed a bug in the ZeroTrim function.   
    //             It wasn't producing incorrect answers until I implemented the  
    //             Multiplication function, so any valuable scientific research based  
    //             on my JavaScript calculator hasn't been subjected to trouble.
    // 10-04-2001: Added Sign switching functions to buttons and updated addition to 
    //             include negatives.  Added a "No Function Yet" reporter to functions 
    //             that, well, don't work yet.
    // 10-03-2001: Added subtraction.
    // 09-27-2001: Added graphic buttons for interface and changed code to be more 
    //             universal for browsers.  Only trouble with graphical buttons is 
    //             that they're not obviously "disabled" like they were in Explorer.  
    //             I guess I could do "disabled" looking buttons, but later...
    // 09-19-2001: Finished coding the basic addition block.  Looking in dread at 
    //             the future.
    // 

    function SleepButtons()
      {
        document.APCalculator.Status.value="Calculating...";
      }

    function WakeButtons()
      {
        document.APCalculator.Status.value="Done!";
      }

    function NilFunction()
      {
        var reporter="No Function Yet."
        return reporter;
      }

    function BuildString (Symbol, Multiple)
      // returns a string that consists of the a Multiple number of Symbols.
      // for example, BuildString(x,5) returns "xxxxx"
    {
    var CompoundString="";
      while (IsEqualTo(Multiple,"0") == "FALSE")
        {
          CompoundString = CompoundString + Symbol;
          Multiple = Subtraction(Multiple,"1");
        }
      return CompoundString;
    }

    function RoundBigNumberUp (BigPositiveNumber)
      // Rounds a 'big' number up.  The assumption is that the number is Positive
      {
        var Answer = "";
        BigPositiveNumber = ZeroTrim(BigPositiveNumber); // in case it has lotsa zeroes at the end
        if (BigPositiveNumber.search(/\./) != (-1)) // if the number contains a decimal...
          {
            Answer = CalculatorAdd(RegExp.leftContext,"1");
          }
        else // there is no decimal in the number, therefore, it is already rounded
          {
            Answer = BigPositiveNumber;
          }
        return Answer;
      }

    function RoundBigNumberDown (BigPositiveNumber)
      // Rounds a 'big' number down.  The assumption is that the number is Positive
      {
        var Answer = "";
        BigPositiveNumber = ZeroTrim(BigPositiveNumber); // in case it has lotsa zeroes at the end
        if (BigPositiveNumber.search(/\./) != (-1)) // if the number contains a decimal...
          {
            Answer = RegExp.leftContext;
          }
        else // there is no decimal in the number, therefore, it is already rounded
          {
            Answer = BigPositiveNumber;
          }
        return Answer;
      }

    function BigNumberCeiling (BigRealNumber)
      // Finds the ceiling of BigRealNumber.
      {
        var Answer = "";
        if (BigRealNumber.charAt(0) == "-") // then it is a negative number
          {Answer = "-" + RoundBigNumberDown(BigRealNumber.substring(1,BigRealNumber.length));}
        else
          {Answer = RoundBigNumberUp(BigRealNumber);}
        return Answer;
      }

    function BigNumberFloor (BigRealNumber)
      // Finds the floor of BigRealNumber.
      {
        var Answer = "";
        if (BigRealNumber.charAt(0) == "-") // then it is a negative number
          {Answer = "-" + RoundBigNumberUp(BigRealNumber.substring(1,BigRealNumber.length));}
        else
          {Answer = RoundBigNumberDown(BigRealNumber);}
        return Answer;
      }

    function SubProduct (Multiplicand, SingleDigitMultiplier)
      // Multiplies Multiplicand (any number of digits) by a single digit Multiplier
      {
        var Carry = "0";
        var SubProduct = "";
        var TempProd = "0";
        for (var counter = Multiplicand.length-1; counter > (-1); counter--)
        {
          var TempProd = (Multiplicand.charAt(counter) * SingleDigitMultiplier) + parseInt(Carry);
          if (TempProd < 10) {TempProd = "0" + TempProd} // Now all small products are 2-digit numbers
          Carry = (TempProd + "").charAt(0);
          SubProduct = (TempProd + "").charAt(1) + SubProduct;
        }
        if (Carry != "0") {SubProduct = (Carry + SubProduct)}
        return SubProduct;
      }

    function ZeroTrim(BloatyAnswer) // trim trailing zeroes after the decimal and leading zeroes before
    {
      if (BloatyAnswer.search(/\./i) == -1)
        {
        BloatyAnswer = BloatyAnswer + ".0";
        }
      if (BloatyAnswer.charAt(0) == ".")
        {
        BloatyAnswer = "0" + BloatyAnswer;
        }
      while (BloatyAnswer.charAt(BloatyAnswer.length - 1) == "0")
        {
          BloatyAnswer = BloatyAnswer.substring(0,BloatyAnswer.length - 1);
          // trim that last character off if it's a zero
        }
        if (BloatyAnswer.charAt(BloatyAnswer.length - 1) == ".")
          // trim off that last decimal point, if it's there
          {
            BloatyAnswer = BloatyAnswer.substring(0,BloatyAnswer.length - 1);
          }
      // trim leading zeroes, but if the answer is simply "0", then stop.
         while ((BloatyAnswer.length>1) && (BloatyAnswer.charAt(0)=="0") && (BloatyAnswer.charAt(1)!="."))
           {
             BloatyAnswer = BloatyAnswer.substring(1,BloatyAnswer.length);
           }
      return BloatyAnswer;
    }

    function SwitchSign(Arg)
    {
      if (Arg.charAt(0)=="-")
        Arg = Arg.substring(1,Arg.length);
      else
        {
          Arg="-"+Arg;
        }
      return Arg;
    }

    function IsLessThan(Arg1,Arg2) // Is Arg1 less than Arg2?
    {
      var Result = "";
      // If Arg1 is negative and Arg2 is positive, then the answer is automatically true
        if (Arg1.charAt(0) == "-" && Arg2.charAt(0) !="-") {Result = "TRUE"}
      // If Arg1 is positive and Arg2 is negative, then the answer is automatically false
        if (Arg1.charAt(0) != "-" && Arg2.charAt(0) =="-") {Result = "FALSE"}
      // If Arg1 = Arg2, then the answer is automatically false
        if (IsEqualTo(Arg1,Arg2) == "TRUE") {Result = "FALSE"}
      // If Arg1 and Arg2 are both negative, then we swap them, switch signs, and try again.
        if (Arg1.charAt(0) == "-" && Arg2.charAt(0) =="-") {Result = IsLessThan(SwitchSign(Arg2),SwitchSign(Arg1))}
      // If Arg1 and Arg2 are both positive
        if (Result == "")
          {
            // Pad them with zeroes to line up the decimal (if it exists)
               var type = "";
               var AnswerArray1 = Arg1.split("."); // Split into an array
               var AnswerArray2 = Arg2.split("."); // Split into an array
               // make sure arrays have '0' instead of 'undefined' or '' as elements
               // split produces a mixed response, an empty string on the left of the split
               // and undefined on the right of the split.  This is further complicated by
               // the fact that Navigator understands "undefined" in comparisions, but
               // IE doesn't, so I have to create a variable and assign it to a typeof.
                  if (AnswerArray1[0] == "") {AnswerArray1[0] = "0"}
                  type = typeof AnswerArray1[1];
                  if (type == "undefined") {AnswerArray1[1] = "0"}
                  if (AnswerArray2[0] == "") {AnswerArray2[0] = "0"}
                  type = typeof AnswerArray2[1];
                  if (type == "undefined") {AnswerArray2[1] = "0"}

               // Rebuild operands as strings with decimals.
                  Arg1 = AnswerArray1[0] + "." + AnswerArray1[1];
                  Arg2 = AnswerArray2[0] + "." + AnswerArray2[1];
               // if decimal split !=, then equalize by adding trailing zeroes to the short decimal
                  if (AnswerArray1[1].length > AnswerArray2[1].length)
                    {
                      Arg2 += BuildString("0",AnswerArray1[1].length-AnswerArray2[1].length+"");
                    }
                  if (AnswerArray2[1].length > AnswerArray1[1].length)
                    {
                      Arg1 += BuildString("0",AnswerArray2[1].length-AnswerArray1[1].length+"");
                    }

               // if integer split != then equalize by adding leading zeroes to the short integer
                  if (AnswerArray1[0].length > AnswerArray2[0].length)
                    {
                      Arg2 = BuildString("0",AnswerArray1[0].length-AnswerArray2[0].length+"") + Arg2;
                    }
                  if (AnswerArray2[0].length > AnswerArray1[0].length)
                    {
                      Arg1 = BuildString("0",AnswerArray2[0].length-AnswerArray1[0].length+"") + Arg1;
                    }
            var counter = 0;
            while ((Result=="") && (counter < Arg1.length))
            {
              if (Arg2.charAt(counter) < Arg1.charAt(counter)) {Result = "FALSE"}
              if (Arg2.charAt(counter) > Arg1.charAt(counter)) {Result = "TRUE"}
              counter++;
            }
          }
      // Return Result
        return Result;
    }

    function IsGreaterThan(Arg1,Arg2) // Is Arg1 greater than Arg2?
    {
      var Result = "";
      // If Arg1 is negative and Arg2 is positive, then the answer is automatically false
        if (Arg1.charAt(0) == "-" && Arg2.charAt(0) !="-") {Result = "FALSE"}
      // If Arg1 is positive and Arg2 is negative, then the answer is automatically true
        if (Arg1.charAt(0) != "-" && Arg2.charAt(0) =="-") {Result = "TRUE"}
      // If Arg1 = Arg2, then the answer is automatically false
        if (IsEqualTo(Arg1,Arg2) == "TRUE") {Result = "FALSE"}
      // If Arg1 and Arg2 are both negative, then we swap them, switch signs, and try again.
        if (Arg1.charAt(0) == "-" && Arg2.charAt(0) =="-") {Result = IsGreaterThan(SwitchSign(Arg2),SwitchSign(Arg1))}
      // If Arg1 and Arg2 are both positive
        if (Result == "")
          {
            // Pad them with zeroes to line up the decimal (if it exists)
               var type = "";
               var AnswerArray1 = Arg1.split("."); // Split into an array
               var AnswerArray2 = Arg2.split("."); // Split into an array
               // make sure arrays have '0' instead of 'undefined' or '' as elements
               // split produces a mixed response, an empty string on the left of the split
               // and undefined on the right of the split.  This is further complicated by
               // the fact that Navigator understands "undefined" in comparisions, but
               // IE doesn't, so I have to create a variable and assign it to a typeof.
                  if (AnswerArray1[0] == "") {AnswerArray1[0] = "0"}
                  type = typeof AnswerArray1[1];
                  if (type == "undefined") {AnswerArray1[1] = "0"}
                  if (AnswerArray2[0] == "") {AnswerArray2[0] = "0"}
                  type = typeof AnswerArray2[1];
                  if (type == "undefined") {AnswerArray2[1] = "0"}

               // Rebuild operands as strings with decimals.
                  Arg1 = AnswerArray1[0] + "." + AnswerArray1[1];
                  Arg2 = AnswerArray2[0] + "." + AnswerArray2[1];
               // if decimal split !=, then equalize by adding trailing zeroes to the short decimal
                  if (AnswerArray1[1].length > AnswerArray2[1].length)
                    {
                      Arg2 += BuildString("0",AnswerArray1[1].length-AnswerArray2[1].length+"");
                    }
                  if (AnswerArray2[1].length > AnswerArray1[1].length)
                    {
                      Arg1 += BuildString("0",AnswerArray2[1].length-AnswerArray1[1].length+"");
                    }

               // if integer split != then equalize by adding leading zeroes to the short integer
                  if (AnswerArray1[0].length > AnswerArray2[0].length)
                    {
                      Arg2 = BuildString("0",AnswerArray1[0].length-AnswerArray2[0].length+"") + Arg2;
                    }
                  if (AnswerArray2[0].length > AnswerArray1[0].length)
                    {
                      Arg1 = BuildString("0",AnswerArray2[0].length-AnswerArray1[0].length+"") + Arg1;
                    }
            var counter = 0;
            while ((Result=="") && (counter < Arg1.length))
            {
              if (Arg2.charAt(counter) < Arg1.charAt(counter)) {Result = "TRUE"}
              if (Arg2.charAt(counter) > Arg1.charAt(counter)) {Result = "FALSE"}
              counter++;
            }
          }
      // Return Result
        return Result;
    }

    function IsEqualTo(Arg1,Arg2)
    {
      var Result = "FALSE";
      if (Arg1.length == Arg2.length)
        {
          Result = "TRUE";
          for (counter = 0; counter < Arg1.length; counter++)
            {
              if (Arg1.charAt(counter) != Arg2.charAt(counter)) {Result = "FALSE"}
            }
        }

      // Return Result
        return Result;
    }

    function Subtraction(Minuend,Subtrahend) // Minuend - Subtrahend = Difference
    {
      var Difference = "";
      // Pad them with zeroes to line up the decimal (if it exists)
         var type="";
         var AnswerArray1 = Minuend.split("."); // Split into an array
         var AnswerArray2 = Subtrahend.split("."); // Split into an array
         // make sure arrays have '0' instead of 'undefined' or '' as elements
         // split produces a mixed response, an empty string on the left of the split
         // and undefined on the right of the split.  This is further complicated by
         // the fact that Navigator understands "undefined" in comparisions, but
         // IE doesn't, so I have to create a variable and assign it to a typeof.
            if (AnswerArray1[0] == "") {AnswerArray1[0] = "0"}
            type = typeof AnswerArray1[1];
            if (type == "undefined") {AnswerArray1[1] = "0"}
            if (AnswerArray2[0] == "") {AnswerArray2[0] = "0"}
            type = typeof AnswerArray2[1];
            if (type == "undefined") {AnswerArray2[1] = "0"}

         // Rebuild operands as strings with decimals.
            Minuend = AnswerArray1[0] + "." + AnswerArray1[1];
            Subtrahend = AnswerArray2[0] + "." + AnswerArray2[1];
         // if decimal split !=, then equalize by adding trailing zeroes to the short decimal
            if (AnswerArray1[1].length > AnswerArray2[1].length)
              {
                Subtrahend += BuildString("0",AnswerArray1[1].length-AnswerArray2[1].length+"");
              }
            if (AnswerArray2[1].length > AnswerArray1[1].length)
              {
                Minuend += BuildString("0",AnswerArray2[1].length-AnswerArray1[1].length+"");
              }
         // if integer split != then equalize by adding leading zeroes to the short integer
            if (AnswerArray1[0].length > AnswerArray2[0].length)
              {
                Subtrahend = BuildString("0",AnswerArray1[0].length-AnswerArray2[0].length+"") + Subtrahend;
              }
            if (AnswerArray2[0].length > AnswerArray1[0].length)
              {
                Minuend = BuildString("0",AnswerArray2[0].length-AnswerArray1[0].length+"") + Minuend;
              }
      // If Minuend == Subtrahend, then the answer is simply 0
         if (!Difference && (IsEqualTo(Minuend,Subtrahend)=="TRUE")) {Difference= "0"}
      // If Minuend is positive and Subtrahend is negative,
      // then this is an addition problem
         if (!Difference && Minuend.charAt(0)!="-" && Subtrahend.charAt(0)=="-")
           {
             Subtrahend=Subtrahend.substring(1,Subtrahend.length);
             Difference = CalculatorAdd(Minuend,Subtrahend);
           }
      // If Minuend and Subtrahend are negative, invert both
      //  signs and reverse operands -- continue
         if (!Difference && Minuend.charAt(0)=="-" && Subtrahend.charAt(0)=="-")
           {
             Subtrahend=Subtrahend.substring(1,Subtrahend.length);
             Minuend=Minuend.substring(1,Minuend.length);
             var TemporaryVariable = Subtrahend;
             Subtrahend = Minuend;
             Minuend = TemporaryVariable;
           }
      // If Minuend is negative and Subtrahend is positive, then
      // remove Minuend sign, process as an addition, and then
      // append negative sign.
         if (!Difference && Minuend.charAt(0) == "-" && Subtrahend.charAt(0) !="-")
           {
             Minuend=Minuend.substring(1,Minuend.length);
             Difference = "-" + CalculatorAdd(Minuend,Subtrahend);
           }
      // Minuend and Subtrahend are both positive numbers,
      // either because they started out that way, or they started
      // out as both negative numbers and were converted by an
      // earlier process.  For all other cases, Difference has
      // already been assigned a value
         if (!Difference)
           {
             // If the Minuend is smaller than the Subtrahend, then the
             // result will be a negative number, so set a "negative"
             // tag (NegativeTag = "-" instead of ""), reverse the
             // operands, and continue.
                var NegativeTag = "";
                if (IsLessThan(Minuend,Subtrahend)=="TRUE")
                {
                  var TempVariable = Minuend;
                  Minuend = Subtrahend;
                  Subtrahend = TempVariable;
                  NegativeTag="-";
                }
             // Perform the digit-by-digit subtraction
                var BorrowFlag="0";
                for (counter = Minuend.length-1; counter > -1; counter--)
                {
                  if (Minuend.charAt(counter) ==".") // then it's a decimal point
                    Difference = "." + Difference
                  else // it's a genuine number
                    {
                      // because it's a number, perform the subtraction and append it to Difference
                      var MinuendPiece = parseInt(Minuend.charAt(counter));
                      var SubtrahendPiece = parseInt(Subtrahend.charAt(counter));
                      if (BorrowFlag == 1) {BorrowFlag = 0; MinuendPiece = MinuendPiece -1}
                      if (MinuendPiece < 0) {MinuendPiece = 9; BorrowFlag = 1}
                      if (MinuendPiece < SubtrahendPiece)
                        {
                          MinuendPiece = MinuendPiece + 10;
                          BorrowFlag = 1;
                        }
                      Difference = (MinuendPiece - SubtrahendPiece) + Difference;
                    }
                }
             // Remove trailing and leading zeroes
                Difference = ZeroTrim(Difference);
             // Append to the NegativeTag
                Difference = NegativeTag + Difference;
           }
        // Return Difference
      return Difference;
    }

    function CalculatorAdd(operand1,operand2)
    {
      var answer = "";

      if (operand1.charAt(0)!="-" && operand2.charAt(0)=="-") {answer = Subtraction(operand1,SwitchSign(operand2))}
      if (operand1.charAt(0)=="-" && operand2.charAt(0)!="-") {answer = Subtraction(operand2,SwitchSign(operand1))}
      if (operand1.charAt(0)=="-" && operand2.charAt(0)=="-") {answer = Subtraction(operand1,SwitchSign(operand2))}
      if (answer=="")
      {
        // Equalize both sides of the decimals
           var Operand1LeftPad = "";
           var Operand2LeftPad = "";
           var Operand1RightPad = "";
           var Operand2RightPad = "";
           var Operand1RightSide = "";
           var Operand2RightSide = "";
           var Operand1LeftSide = "";
           var Operand2LeftSide = "";

           if (operand1.search(/\./) == -1) // then there is no decimal in operand1
             {
               Operand1RightSide = "0";
               Operand1LeftSide = operand1;
             }
             else // there is a decimal and we must determine the values of the sides
               {
                 Operand1RightSide=RegExp.rightContext;
                 Operand1LeftSide=RegExp.leftContext;
               }
           if (operand2.search(/\./) == -1) // then there is no decimal in operand2
             {
               Operand2RightSide = "0";
               Operand2LeftSide = operand2;
             }
             else // there is a decimal and we must determine the values of the sides
               {
                 Operand2RightSide=RegExp.rightContext;
                 Operand2LeftSide=RegExp.leftContext;
               }
           if (Operand1LeftSide.length > Operand2LeftSide.length)
             { Operand2LeftPad = BuildString("0",(Operand1LeftSide.length - Operand2LeftSide.length+"")+""); }
           if (Operand1LeftSide.length < Operand2LeftSide.length)
             { Operand1LeftPad = BuildString("0",(Operand2LeftSide.length - Operand1LeftSide.length)+""); }

           if (Operand1RightSide.length > Operand2RightSide.length)
             { Operand2RightPad = BuildString("0",(Operand1RightSide.length - Operand2RightSide.length)+""); }
           if (Operand1RightSide.length < Operand2RightSide.length)
             { Operand1RightPad = BuildString("0",(Operand2RightSide.length - Operand1RightSide.length)+""); }

           operand1 = Operand1LeftPad + Operand1LeftSide + "." + Operand1RightSide + Operand1RightPad;
           operand2 = Operand2LeftPad + Operand2LeftSide + "." + Operand2RightSide + Operand2RightPad;

      // perform digit-by-digit addition
         var CarryFlag = 0;
             answer = "";
         for (counter=operand1.length-1; counter > (-1); counter--)
           {
             var temp = parseInt(operand1.charAt(counter)) + parseInt(operand2.charAt(counter)) + parseInt(CarryFlag);
             if ((temp > (-1)) && (temp < 20))
               {
               if (temp > 9)
                 {
                   CarryFlag = 1;
                   answer = temp-10 + answer;
                 }
               else
                 {
                   CarryFlag = 0;
                   answer = temp + answer;
                 }
               }
             else
               {
                 answer = "." + answer;
                 // unless the answer is an actual number, it's going 
                 // to be NaN or undefined, or perhaps something else.  
                 // I just force the conversion to a decimal, but I 
                 // should consider adding some kind of error catching 
                 // routine here.
               }
           }
         // and just in case the CarryFlag is carrying something after all the digits are done...
         if (CarryFlag == 1) {answer = "1" + answer}

      //  In order to make things smoother earlier, I just converted both numbers to
      //  decimals, even if they weren't.  So now that the addition's over, there are
      //  two possibilities that would leave a number unattractive.  One, if I added
      //  two whole numbers such as 5 & 7, the result looks like 12.0, in which case
      //  I want to trim off the trailing zero AND the decimal point.  Another
      //  possibility is if trailing digits totaled out to 0, in which case they would
      //  still be there.  For example, 1.05 and 1.05 should be 2.1, but reports as
      //  2.10 so time to clean that up.
          answer = ZeroTrim(answer);
      }
      return answer;
    }

    function Multiply(Multiplicand,Multiplier)
      {
        var Product = "";
        var DecimalShift = "0";
        var ProductSign = "";
        // Determine the Product Sign and render both numbers positive
          if (Multiplicand.charAt(0) == "-" && Multiplier.charAt(0) != "-") {ProductSign = "-"}
          if (Multiplicand.charAt(0) != "-" && Multiplier.charAt(0) == "-") {ProductSign = "-"}
          if (Multiplicand.charAt(0) == "-") {Multiplicand = Multiplicand.substring(1,Multiplicand.length)}
          if (Multiplier.charAt(0) == "-") {Multiplier = Multiplier.substring(1,Multiplier.length)}

        // Handle the easy cases (when either the Muliplicand or the Multiplier is "1" or "0")
          if (ZeroTrim(Multiplicand) == "0")
            {
              Product = "0";
              ProductSign="";
            }
          if (ZeroTrim(Multiplier) == "0")
            {
              Product = "0";
              ProductSign="";
            }
          if (ZeroTrim(Multiplicand) == "1")
            {
              Product = Multiplier;
            }
          if (ZeroTrim(Multiplier) == "1")
            {
              Product = Multiplicand;
            }
        // If the Product ISN'T a no-brainer...
          if (Product == "")
            {
             // Determine the Product Decimal Shift
               // If there is a decimal in either factor, then the answer will include a 
               // decimal (unless it zeroes out), so we must determine where in the final 
               // Product the new decimal will appear.
               var DecimalShift = 0;
               var DecimalShiftMultiplicand = Multiplicand.length-(Multiplicand.indexOf(".")+1);
               var DecimalShiftMultiplier = Multiplier.length-(Multiplier.indexOf(".")+1);
               if(DecimalShiftMultiplicand == Multiplicand.length) { DecimalShiftMultiplicand = 0; }
               if(DecimalShiftMultiplier == Multiplier.length) { DecimalShiftMultiplier = 0; }
               DecimalShift = DecimalShiftMultiplier + DecimalShiftMultiplicand;
             // Remove the decimals from the numbers
               Multiplicand=ZeroTrim(Multiplicand.replace(".",""));
               Multiplier=ZeroTrim(Multiplier.replace(".",""));
               
             // Multiply the Multiplicand by the Multiplier
               Product = "0";
               for (var counter = Multiplier.length-1; counter > -1; counter--)
                 {
                   NumberOfZeroes = BuildString("0",Multiplier.length - counter - 1+"");
                   Product = CalculatorAdd(Product,(SubProduct(Multiplicand,Multiplier.charAt(counter)) + NumberOfZeroes));
                 }

             // Split the Product and re-insert the Decimal
                if (DecimalShift > Product.length)
                  { Product = "0." + BuildString("0",DecimalShift - Product.length + "") + Product; }
                else if (DecimalShift == Product.length)
                  { Product = "0." + Product; }
                else if (DecimalShift < Product.length)
                  { Product = Product.substr(0,Product.length - DecimalShift) + "." + Product.substr(Product.length - DecimalShift,DecimalShift); }
            }

        // Sign the Product
          Product = ZeroTrim(ProductSign + Product);

        // Return the Result
           return Product;
      }

    function DIV_MOD(Divisor,Dividend,Operation)
      {
	      	      
        // Declare variables
           var Quotient = "";
           var Remainder = "";
           var Answer = "";
           var QuotientSign = "";
           var counterDiv = 0;
           var DivHashTable = new Array(10);
           var OldDivisor;
           var OldDividend;
           var temp = "";

        

        // Determine the sign of the quotient and strip sign from the Divisor and Dividend
           // If Divisor is positive, but Dividend is negative, then the Quotient is Negative
              if (!Quotient && Divisor.charAt(0)!="-" && Dividend.charAt(0)=="-")
                {
                  QuotientSign = "-"
                  Dividend = Dividend.substring(1,Dividend.length)
                }
           // If Dividend is positive, but Divisor is negative, then the Quotient is Negative
              if (!Quotient && Divisor.charAt(0)=="-" && Dividend.charAt(0)!="-")
                {
                  QuotientSign = "-"
                  Divisor = Divisor.substring(1,Divisor.length)
                }
           // If Divisor AND Dividend are negative, then the Quotient is Positive
              if (!Quotient && Divisor.charAt(0)=="-" && Dividend.charAt(0)=="-")
                {
                  Dividend = Dividend.substring(1,Dividend.length)
                  Divisor = Divisor.substring(1,Divisor.length)
                }

        // Handle the situation if the Divisor is greater than the Dividend
           if (IsLessThan(Dividend,Divisor) == "TRUE" && !Quotient) // Is Arg1 less than Arg2?
           {
             Quotient = "0";
             Remainder = Dividend;
           }

        // Handle the situation if the Divisor and the Dividend are equal
           if (IsEqualTo(Divisor,Dividend) == "TRUE" && !Quotient)
           {
             Quotient = "1";
             Remainder = "0";
           }

        // Handle the situation if the Divisor == 1
           if (Divisor == "1" && !Quotient)
           {
             Quotient = Dividend;
             Remainder = "0";
           }


        // At this point, we probably have a normal, well-behaved division
           if (Quotient == "")
           {
             OldDivisor = Divisor;
             OldDividend = Dividend;
             if ((Divisor.search(/\./) == -1) && (Dividend.search(/\./) == -1)) // if each number contains no decimal, do nothing
             ;
             else // but if either one contains a decimal, then they must both be multiplied until they are Whole numbers.

               {
                 // Multiply by a power of 10 to remove the decimals.
                    var Throwaway = "";
                    var DivisorMultiplier = "";
                    var DividendMultiplier = "";
                    if (Divisor.search(/\./) == (-1)) DivisorMultiplier = ""; else {DivisorMultiplier = RegExp.rightContext};
                    if (Dividend.search(/\./) == (-1)) DividendMultiplier = ""; else {DividendMultiplier = RegExp.rightContext};
                    var TempMultiplier = Math.max(DivisorMultiplier.length,DividendMultiplier.length)+"";
                    TempMultiplier = "1" + BuildString("0",TempMultiplier+""); // Build the Multiplier
                    Divisor=Multiply(Divisor,TempMultiplier); // Perform the Big Multiplication
                    Dividend=Multiply(Dividend,TempMultiplier); // Perform the Big Multiplication
               }

             // Create a searchable hash table of Divisor values
                for (counterDiv = 0; counterDiv < 10; counterDiv++)
                  {
                    DivHashTable[counterDiv] = Multiply(Divisor,(counterDiv + '')); // the "+''" converts counterDiv to a string
                    // DivHashTable[0] = 0 * Divisor and so on...
                  }

             // Perform an ordinary division
                   
                // Set up variables
                   var CurrentAnswer = "";
                   var NewDividend = Dividend;
                   var Pointer = "";
                   var DividendMultiplierSubstring = "";
                   var TempMultiplier = "";
                   var HashCounter;
                // Start Looping through Dividend
                   while ((IsGreaterThan(NewDividend,Divisor) == "TRUE") || (IsEqualTo(NewDividend,Divisor) == "TRUE"))
                     {
                       // Set pointer at beginning of NewDividend
                          Pointer = 1;
                       // Increment the Pointer until DividendMultiplierString >= Divisor
                          while (IsLessThan(NewDividend.substring(0,Pointer),Divisor) == "TRUE")
                            {
                              Pointer++ ;
                            }
                          DividendMultiplierSubstring = NewDividend.substring(0,Pointer);
                       // Find the largest result in the hash table still less than DividendMultiplierSubstring
                          HashCounter = 9;
                          while (IsGreaterThan(DivHashTable[HashCounter]+"",DividendMultiplierSubstring) == "TRUE")
                            {
                              HashCounter-- ;
                            }
                       // HashCounter is its key in the Hash Table

                       // Append the same number of zeroes to the key as decimals to the right of pointer, making TempMultiplier
                          TempMultiplier = HashCounter+"" + BuildString("0",NewDividend.length-DividendMultiplierSubstring.length+"");

                       // Add TempMultiplier to CurrentAnswer
                          CurrentAnswer = CalculatorAdd(CurrentAnswer,TempMultiplier);
                       // Subtract the product of Divisor and TempMultiplier from NewDividend to get a NEW NewDividend
                          NewDividend = Subtraction(NewDividend,Multiply(Divisor,TempMultiplier));
                     } // while ((IsGreaterThan(NewDividend,Divisor) == "TRUE") ||...

             // Nail the calculated values down
                Quotient = CurrentAnswer;
                Remainder = Subtraction(OldDividend,Multiply(OldDivisor,Quotient));

             } // if (Quotient == "")

        // Return Answer to main program
           if (Operation == "DIV") {Answer = QuotientSign + Quotient}
           if (Operation == "MOD") {Answer = Remainder}
           return Answer;
      }

    function Factorial(StartNumber) // Look, Mom -- no recursion!
      {
        // Declare variables
           var Answer = "";
           var BigCounter = "";
           var RangeCheck = "";
           var Warning = "NOTE:"
                         + "\n"
                         + "The Factorial operator is designed to function only"
                         + "\n"
                         + "for the non-negative integers: {0, 1, 2, 3,...}."
                         + "\n\n"
                         + "Negative or Decimal arguments are not valid.";

        // If StartNumber = 0 or 1 then Answer = 1
           if (StartNumber == "0") {Answer = "1"}

        // Check and invalidate for Decimals
           if (!Answer && (StartNumber.indexOf(".") != "-1"))
             {
               Answer = "Undefined";
               alert(Warning);
             }

        // Check and invalidate for negative numbers
           if (!Answer && (StartNumber.charAt(0) == "-"))
             {
               Answer = "Undefined";
               alert(Warning);
             }

        // If the answer is nontrivial, then perform the calculation
           if (!Answer)
             {
               Answer = "1";
               BigCounter = "1";
               RangeCheck = CalculatorAdd(StartNumber,"1");
               while (BigCounter != RangeCheck)
                 {
                   Answer = Multiply(Answer,BigCounter);
                   BigCounter = CalculatorAdd(BigCounter,"1");
                 }
             }

        // Return the Answer
           return Answer;
      }

    function Power(StartNumber,Exponent)
      {
        // Declare variables
           var Answer = "";
           var BigCounter = "";
           var RangeCheck = "";
           var Warning = "NOTE:"
                         + "\n"
                         + "The Power operator is designed to function only with exponents"
                         + "\n"
                         + "that are non-negative integers {0, 1, 2, 3,...}."
                         + "\n\n"
                         + "Negative or Decimal exponents are not valid at this time.";

        // If Exponent = 0 then Answer = 1
           if (Exponent == "0") {Answer = "1"}

        // If Exponent = 1 then Answer = StartNumber
           if (Exponent == "1") {Answer = StartNumber}

        // If StartNumber = 0 then Answer = 0
           if (StartNumber == "0") {Answer = "0"}

        // If StartNumber = 1 then Answer = 1
           if (StartNumber == "1") {Answer = "1"}

        // Check and invalidate for Decimals
           if (!Answer && (Exponent.indexOf(".") != "-1"))
             {
               Answer = "Not valid at this time.";
               alert(Warning);
             }

        // Check and invalidate for negative numbers
           if (!Answer && (Exponent.charAt(0) == "-"))
             {
               Answer = "Not valid at this time.";
               alert(Warning);
             }

        // If the answer is nontrivial, then perform the calculation
           if (!Answer)
             {
               Answer = "1";
               BigCounter = "1";
               RangeCheck = CalculatorAdd(Exponent,"1");
               while (BigCounter != RangeCheck)
                 {
                   Answer = Multiply(Answer,StartNumber);
                   BigCounter = CalculatorAdd(BigCounter,"1");
                 }
             }

        // Return the Answer
           return Answer;
      }

    function GCD(XValue,YValue)
      {
        // Declare variables
           var Answer = "";
           var ZValue = "";
           var TempNumber = "";
           var Warning = "NOTE:"
                         + "\n"
                         + "The GCD operator is designed to function only"
                         + "\n"
                         + "for the non-negative integers: {0, 1, 2, 3,...}."
                         + "\n\n"
                         + "Negative or Decimal arguments are not valid.";
        // Error Checking
          if ((XValue.charAt(0) == "-") || (YValue.charAt(0) == "-") || ZeroTrim(XValue).search(/\./) != (-1) || ZeroTrim(YValue).search(/\./) != (-1))
            {
              Answer = "";
              alert(Warning);
            }
          else // We can do the calculation
            {
              while (IsEqualTo(XValue,YValue) == "FALSE")
                {
                  if (IsLessThan(XValue,YValue) == "TRUE") // then swap 'em
                    {
                      TempNumber = XValue;
                      XValue = YValue;
                      YValue = TempNumber;
                    }
                  ZValue = Subtraction(XValue,YValue);
                  XValue = YValue;
                  YValue = ZValue;
                }
              Answer = XValue; // The revised XValue from above
            }
        // Return Answer
           return Answer;
      }

    function LCM(XValue,YValue)
      {
        // Declare variables
           var Answer = "";
           var Warning = "NOTE:"
                         + "\n"
                         + "The LCM operator is designed to function only"
                         + "\n"
                         + "for the non-negative integers: {0, 1, 2, 3,...}."
                         + "\n\n"
                         + "Negative or Decimal arguments are not valid.";
        // Error Checking
          if ((XValue.charAt(0) == "-") || (YValue.charAt(0) == "-") || ZeroTrim(XValue).search(/\./) != (-1) || ZeroTrim(YValue).search(/\./) != (-1))
            {
              Answer = "";
              alert(Warning);
            }
          else // We can do the calculation
            {
              Answer = DIV_MOD(GCD(XValue,YValue),Multiply(XValue,YValue),"DIV");
            }
        // Return Answer
           return Answer;
      }

    function IsPrime(Argument) // Returns FALSE if Argument is Composite, TRUE if Argument is Prime
      {
        // Declare variables
           var Answer = "TRUE";
           var RollingNumber = "";
           var Counter;
           var DigitSum;
           var Warning = "NOTE:"
                         + "\n"
                         + "The Is Prime function is designed to function only"
                         + "\n"
                         + "for non-negative integers greater than 1: {2, 3, 4,...}."
                         + "\n\n"
                         + "0, 1, Negative or Decimal arguments are not valid.";
           var PrimeArray=["2","3","5","7","11","13","17","19","23","29","31","37","41","43","47","53","59","61","67","71","73","79","83","89","97","101","103","107","109","113","127","131","137","139","149","151","157","163","167","173","179","181","191","193","197","199","211","223","227","229","233","239","241","251","257","263","269","271","277","281","283","293","307","311","313","317","331","337","347","349","353","359","367","373","379","383","389","397","401","409","419","421","431","433","439","443","449","457","461","463","467","479","487","491","499","503","509","521","523","541","547","557","563","569","571","577","587","593","599","601","607","613","617","619","631","641","643","647","653","659","661","673","677","683","691","701","709","719","727","733","739","743","751","757","761","769","773","787","797","809","811","821","823","827","829","839","853","857","859","863","877","881","883","887","907","911","919","929","937","941","947","953","967","971","977","983","991","997","1009","1013","1019","1021","1031","1033","1039","1049","1051","1061","1063","1069","1087","1091","1093","1097","1103","1109","1117","1123","1129","1151","1153","1163","1171","1181","1187","1193","1201","1213","1217","1223","1229","1231","1237","1249","1259","1277","1279","1283","1289","1291","1297","1301","1303","1307","1319","1321","1327","1361","1367","1373","1381","1399","1409","1423","1427","1429","1433","1439","1447","1451","1453","1459","1471","1481","1483","1487","1489","1493","1499","1511","1523","1531","1543","1549","1553","1559","1567","1571","1579","1583","1597","1601","1607","1609","1613","1619","1621","1627","1637","1657","1663","1667","1669","1693","1697","1699","1709","1721","1723","1733","1741","1747","1753","1759","1777","1783","1787","1789","1801","1811","1823","1831","1847","1861","1867","1871","1873","1877","1879","1889","1901","1907","1913","1931","1933","1949","1951","1973","1979","1987","1993","1997","1999","2003","2011","2017","2027","2029","2039","2053","2063","2069","2081","2083","2087","2089","2099","2111","2113","2129","2131","2137","2141","2143","2153","2161","2179","2203","2207","2213","2221","2237","2239","2243","2251","2267","2269","2273","2281","2287","2293","2297","2309","2311","2333","2339","2341","2347","2351","2357","2371","2377","2381","2383","2389","2393","2399","2411","2417","2423","2437","2441","2447","2459","2467","2473","2477","2503","2521","2531","2539","2543","2549","2551","2557","2579","2591","2593","2609","2617","2621","2633","2647","2657","2659","2663","2671","2677","2683","2687","2689","2693","2699","2707","2711","2713","2719","2729","2731","2741","2749","2753","2767","2777","2789","2791","2797","2801","2803","2819","2833","2837","2843","2851","2857","2861","2879","2887","2897","2903","2909","2917","2927","2939","2953","2957","2963","2969","2971","2999","3001","3011","3019","3023","3037","3041","3049","3061","3067","3079","3083","3089","3109","3119","3121","3137","3163","3167","3169","3181","3187","3191","3203","3209","3217","3221","3229","3251","3253","3257","3259","3271","3299","3301","3307","3313","3319","3323","3329","3331","3343","3347","3359","3361","3371","3373","3389","3391","3407","3413","3433","3449","3457","3461","3463","3467","3469","3491","3499","3511","3517","3527","3529","3533","3539","3541","3547","3557","3559","3571","3581","3583","3593","3607","3613","3617","3623","3631","3637","3643","3659","3671","3673","3677","3691","3697","3701","3709","3719","3727","3733","3739","3761","3767","3769","3779","3793","3797","3803","3821","3823","3833","3847","3851","3853","3863","3877","3881","3889","3907","3911","3917","3919","3923","3929","3931","3943","3947","3967","3989","4001","4003","4007","4013","4019","4021","4027","4049","4051","4057","4073","4079","4091","4093","4099","4111","4127","4129","4133","4139","4153","4157","4159","4177","4201","4211","4217","4219","4229","4231","4241","4243","4253","4259","4261","4271","4273","4283","4289","4297","4327","4337","4339","4349","4357","4363","4373","4391","4397","4409","4421","4423","4441","4447","4451","4457","4463","4481","4483","4493","4507","4513","4517","4519","4523","4547","4549","4561","4567","4583","4591","4597","4603","4621","4637","4639","4643","4649","4651","4657","4663","4673","4679","4691","4703","4721","4723","4729","4733","4751","4759","4783","4787","4789","4793","4799","4801","4813","4817","4831","4861","4871","4877","4889","4903","4909","4919","4931","4933","4937","4943","4951","4957","4967","4969","4973","4987","4993","4999","5003","5009","5011","5021","5023","5039","5051","5059","5077","5081","5087","5099","5101","5107","5113","5119","5147","5153","5167","5171","5179","5189","5197","5209","5227","5231","5233","5237","5261","5273","5279","5281","5297","5303","5309","5323","5333","5347","5351","5381","5387","5393","5399","5407","5413","5417","5419","5431","5437","5441","5443","5449","5471","5477","5479","5483","5501","5503","5507","5519","5521","5527","5531","5557","5563","5569","5573","5581","5591","5623","5639","5641","5647","5651","5653","5657","5659","5669","5683","5689","5693","5701","5711","5717","5737","5741","5743","5749","5779","5783","5791","5801","5807","5813","5821","5827","5839","5843","5849","5851","5857","5861","5867","5869","5879","5881","5897","5903","5923","5927","5939","5953","5981","5987","6007","6011","6029","6037","6043","6047","6053","6067","6073","6079","6089","6091","6101","6113","6121","6131","6133","6143","6151","6163","6173","6197","6199","6203","6211","6217","6221","6229","6247","6257","6263","6269","6271","6277","6287","6299","6301","6311","6317","6323","6329","6337","6343","6353","6359","6361","6367","6373","6379","6389","6397","6421","6427","6449","6451","6469","6473","6481","6491","6521","6529","6547","6551","6553","6563","6569","6571","6577","6581","6599","6607","6619","6637","6653","6659","6661","6673","6679","6689","6691","6701","6703","6709","6719","6733","6737","6761","6763","6779","6781","6791","6793","6803","6823","6827","6829","6833","6841","6857","6863","6869","6871","6883","6899","6907","6911","6917","6947","6949","6959","6961","6967","6971","6977","6983","6991","6997","7001","7013","7019","7027","7039","7043","7057","7069","7079","7103","7109","7121","7127","7129","7151","7159","7177","7187","7193","7207","7211","7213","7219","7229","7237","7243","7247","7253","7283","7297","7307","7309","7321","7331","7333","7349","7351","7369","7393","7411","7417","7433","7451","7457","7459","7477","7481","7487","7489","7499","7507","7517","7523","7529","7537","7541","7547","7549","7559","7561","7573","7577","7583","7589","7591","7603","7607","7621","7639","7643","7649","7669","7673","7681","7687","7691","7699","7703","7717","7723","7727","7741","7753","7757","7759","7789","7793","7817","7823","7829","7841","7853","7867","7873","7877","7879","7883","7901","7907","7919","7927","7933","7937","7949","7951","7963","7993","8009","8011","8017","8039","8053","8059","8069","8081","8087","8089","8093","8101","8111","8117","8123","8147","8161","8167","8171","8179","8191","8209","8219","8221","8231","8233","8237","8243","8263","8269","8273","8287","8291","8293","8297","8311","8317","8329","8353","8363","8369","8377","8387","8389","8419","8423","8429","8431","8443","8447","8461","8467","8501","8513","8521","8527","8537","8539","8543","8563","8573","8581","8597","8599","8609","8623","8627","8629","8641","8647","8663","8669","8677","8681","8689","8693","8699","8707","8713","8719","8731","8737","8741","8747","8753","8761","8779","8783","8803","8807","8819","8821","8831","8837","8839","8849","8861","8863","8867","8887","8893","8923","8929","8933","8941","8951","8963","8969","8971","8999","9001","9007","9011","9013","9029","9041","9043","9049","9059","9067","9091","9103","9109","9127","9133","9137","9151","9157","9161","9173","9181","9187","9199","9203","9209","9221","9227","9239","9241","9257","9277","9281","9283","9293","9311","9319","9323","9337","9341","9343","9349","9371","9377","9391","9397","9403","9413","9419","9421","9431","9433","9437","9439","9461","9463","9467","9473","9479","9491","9497","9511","9521","9533","9539","9547","9551","9587","9601","9613","9619","9623","9629","9631","9643","9649","9661","9677","9679","9689","9697","9719","9721","9733","9739","9743","9749","9767","9769","9781","9787","9791","9803","9811","9817","9829","9833","9839","9851","9857","9859","9871","9883","9887","9901","9907","9923","9929","9931","9941","9949","9967","9973","10007","10009","10037","10039","10061","10067","10069","10079","10091","10093","10099","10103","10111","10133","10139","10141","10151","10159","10163","10169","10177","10181","10193","10211","10223","10243","10247","10253","10259","10267","10271","10273","10289","10301","10303","10313","10321","10331","10333","10337","10343","10357","10369","10391","10399","10427","10429","10433","10453","10457","10459","10463","10477","10487","10499","10501","10513","10529","10531","10559","10567","10589","10597","10601","10607","10613","10627","10631","10639","10651","10657","10663","10667","10687","10691","10709","10711","10723","10729","10733","10739","10753","10771","10781","10789","10799","10831","10837","10847","10853","10859","10861","10867","10883","10889","10891","10903","10909","10937","10939","10949","10957","10973","10979","10987","10993","11003","11027","11047","11057","11059","11069","11071","11083","11087","11093","11113","11117","11119","11131","11149","11159","11161","11171","11173","11177","11197","11213","11239","11243","11251","11257","11261","11273","11279","11287","11299","11311","11317","11321","11329","11351","11353","11369","11383","11393","11399","11411","11423","11437","11443","11447","11467","11471","11483","11489","11491","11497","11503","11519","11527","11549","11551","11579","11587","11593","11597","11617","11621","11633","11657","11677","11681","11689","11699","11701","11717","11719","11731","11743","11777","11779","11783","11789","11801","11807","11813","11821","11827","11831","11833","11839","11863","11867","11887","11897","11903","11909","11923","11927","11933","11939","11941","11953","11959","11969","11971","11981","11987","12007","12011","12037","12041","12043","12049","12071","12073","12097","12101","12107","12109","12113","12119","12143","12149","12157","12161","12163","12197","12203","12211","12227","12239","12241","12251","12253","12263","12269","12277","12281","12289","12301","12323","12329","12343","12347","12373","12377","12379","12391","12401","12409","12413","12421","12433","12437","12451","12457","12473","12479","12487","12491","12497","12503","12511","12517","12527","12539","12541","12547","12553","12569","12577","12583","12589","12601","12611","12613","12619","12637","12641","12647","12653","12659","12671","12689","12697","12703","12713","12721","12739","12743","12757","12763","12781","12791","12799","12809","12821","12823","12829","12841","12853","12889","12893","12899","12907","12911","12917","12919","12923","12941","12953","12959","12967","12973","12979","12983","13001","13003","13007","13009","13033","13037","13043","13049","13063","13093","13099","13103","13109","13121","13127","13147","13151","13159","13163","13171","13177","13183","13187","13217","13219","13229","13241","13249","13259","13267","13291","13297","13309","13313","13327","13331","13337","13339","13367","13381","13397","13399","13411","13417","13421","13441","13451","13457","13463","13469","13477","13487","13499","13513","13523","13537","13553","13567","13577","13591","13597","13613","13619","13627","13633","13649","13669","13679","13681","13687","13691","13693","13697","13709","13711","13721","13723","13729","13751","13757","13759","13763","13781","13789","13799","13807","13829","13831","13841","13859","13873","13877","13879","13883","13901","13903","13907","13913","13921","13931","13933","13963","13967","13997","13999","14009","14011","14029","14033","14051","14057","14071","14081","14083","14087","14107","14143","14149","14153","14159","14173","14177","14197","14207","14221","14243","14249","14251","14281","14293","14303","14321","14323","14327","14341","14347","14369","14387","14389","14401","14407","14411","14419","14423","14431","14437","14447","14449","14461","14479","14489","14503","14519","14533","14537","14543","14549","14551","14557","14561","14563","14591","14593","14621","14627","14629","14633","14639","14653","14657","14669","14683","14699","14713","14717","14723","14731","14737","14741","14747","14753","14759","14767","14771","14779","14783","14797","14813","14821","14827","14831","14843","14851","14867","14869","14879","14887","14891","14897","14923","14929","14939","14947","14951","14957","14969","14983","15013","15017","15031","15053","15061","15073","15077","15083","15091","15101","15107","15121","15131","15137","15139","15149","15161","15173","15187","15193","15199","15217","15227","15233","15241","15259","15263","15269","15271","15277","15287","15289","15299","15307","15313","15319","15329","15331","15349","15359","15361","15373","15377","15383","15391","15401","15413","15427","15439","15443","15451","15461","15467","15473","15493","15497","15511","15527","15541","15551","15559","15569","15581","15583","15601","15607","15619","15629","15641","15643","15647","15649","15661","15667","15671","15679","15683","15727","15731","15733","15737","15739","15749","15761","15767","15773","15787","15791","15797","15803","15809","15817","15823","15859","15877","15881","15887","15889","15901","15907","15913","15919","15923","15937","15959","15971","15973","15991","16001","16007","16033","16057","16061","16063","16067","16069","16073","16087","16091","16097","16103","16111","16127","16139","16141","16183","16187","16189","16193","16217","16223","16229","16231","16249","16253","16267","16273","16301","16319","16333","16339","16349","16361","16363","16369","16381","16411","16417","16421","16427","16433","16447","16451","16453","16477","16481","16487","16493","16519","16529","16547","16553","16561","16567","16573","16603","16607","16619","16631","16633","16649","16651","16657","16661","16673","16691","16693","16699","16703","16729","16741","16747","16759","16763","16787","16811","16823","16829","16831","16843","16871","16879","16883","16889","16901","16903","16921","16927","16931","16937","16943","16963","16979","16981","16987","16993","17011","17021","17027","17029","17033","17041","17047","17053","17077","17093","17099","17107","17117","17123","17137","17159","17167","17183","17189","17191","17203","17207","17209","17231","17239","17257","17291","17293","17299","17317","17321","17327","17333","17341","17351","17359","17377","17383","17387","17389","17393","17401","17417","17419","17431","17443","17449","17467","17471","17477","17483","17489","17491","17497","17509","17519","17539","17551","17569","17573","17579","17581","17597","17599","17609","17623","17627","17657","17659","17669","17681","17683","17707","17713","17729","17737","17747","17749","17761","17783","17789","17791","17807","17827","17837","17839","17851","17863","17881","17891","17903","17909","17911","17921","17923","17929","17939","17957","17959","17971","17977","17981","17987","17989","18013","18041","18043","18047","18049","18059","18061","18077","18089","18097","18119","18121","18127","18131","18133","18143","18149","18169","18181","18191","18199","18211","18217","18223","18229","18233","18251","18253","18257","18269","18287","18289","18301","18307","18311","18313","18329","18341","18353","18367","18371","18379","18397","18401","18413","18427","18433","18439","18443","18451","18457","18461","18481","18493","18503","18517","18521","18523","18539","18541","18553","18583","18587","18593","18617","18637","18661","18671","18679","18691","18701","18713","18719","18731","18743","18749","18757","18773","18787","18793","18797","18803","18839","18859","18869","18899","18911","18913","18917","18919","18947","18959","18973","18979","19001","19009","19013","19031","19037","19051","19069","19073","19079","19081","19087","19121","19139","19141","19157","19163","19181","19183","19207","19211","19213","19219","19231","19237","19249","19259","19267","19273","19289","19301","19309","19319","19333","19373","19379","19381","19387","19391","19403","19417","19421","19423","19427","19429","19433","19441","19447","19457","19463","19469","19471","19477","19483","19489","19501","19507","19531","19541","19543","19553","19559","19571","19577","19583","19597","19603","19609","19661","19681","19687","19697","19699","19709","19717","19727","19739","19751","19753","19759","19763","19777","19793","19801","19813","19819","19841","19843","19853","19861","19867","19889","19891","19913","19919","19927","19937","19949","19961","19963","19973","19979","19991","19993","19997","20011","20021","20023","20029","20047","20051","20063","20071","20089","20101","20107","20113","20117","20123","20129","20143","20147","20149","20161","20173","20177","20183","20201","20219","20231","20233","20249","20261","20269","20287","20297","20323","20327","20333","20341","20347","20353","20357","20359","20369","20389","20393","20399","20407","20411","20431","20441","20443","20477","20479","20483","20507","20509","20521","20533","20543","20549","20551","20563","20593","20599","20611","20627","20639","20641","20663","20681","20693","20707","20717","20719","20731","20743","20747","20749","20753","20759","20771","20773","20789","20807","20809","20849","20857","20873","20879","20887","20897","20899","20903","20921","20929","20939","20947","20959","20963","20981","20983","21001","21011","21013","21017","21019","21023","21031","21059","21061","21067","21089","21101","21107","21121","21139","21143","21149","21157","21163","21169","21179","21187","21191","21193","21211","21221","21227","21247","21269","21277","21283","21313","21317","21319","21323","21341","21347","21377","21379","21383","21391","21397","21401","21407","21419","21433","21467","21481","21487","21491","21493","21499","21503","21517","21521","21523","21529","21557","21559","21563","21569","21577","21587","21589","21599","21601","21611","21613","21617","21647","21649","21661","21673","21683","21701","21713","21727","21737","21739","21751","21757","21767","21773","21787","21799","21803","21817","21821","21839","21841","21851","21859","21863","21871","21881","21893","21911","21929","21937","21943","21961","21977","21991","21997","22003","22013","22027","22031","22037","22039","22051","22063","22067","22073","22079","22091","22093","22109","22111","22123","22129","22133","22147","22153","22157","22159","22171","22189","22193","22229","22247","22259","22271","22273","22277","22279","22283","22291","22303","22307","22343","22349","22367","22369","22381","22391","22397","22409","22433","22441","22447","22453","22469","22481","22483","22501","22511","22531","22541","22543","22549","22567","22571","22573","22613","22619","22621","22637","22639","22643","22651","22669","22679","22691","22697","22699","22709","22717","22721","22727","22739","22741","22751","22769","22777","22783","22787","22807","22811","22817","22853","22859","22861","22871","22877","22901","22907","22921","22937","22943","22961","22963","22973","22993","23003","23011","23017","23021","23027","23029","23039","23041","23053","23057","23059","23063","23071","23081","23087","23099","23117","23131","23143","23159","23167","23173","23189","23197","23201","23203","23209","23227","23251","23269","23279","23291","23293","23297","23311","23321","23327","23333","23339","23357","23369","23371","23399","23417","23431","23447","23459","23473","23497","23509","23531","23537","23539","23549","23557","23561","23563","23567","23581","23593","23599","23603","23609","23623","23627","23629","23633","23663","23669","23671","23677","23687","23689","23719","23741","23743","23747","23753","23761","23767","23773","23789","23801","23813","23819","23827","23831","23833","23857","23869","23873","23879","23887","23893","23899","23909","23911","23917","23929","23957","23971","23977","23981","23993","24001","24007","24019","24023","24029","24043","24049","24061","24071","24077","24083","24091","24097","24103","24107","24109","24113","24121","24133","24137","24151","24169","24179","24181","24197","24203","24223","24229","24239","24247","24251","24281","24317","24329","24337","24359","24371","24373","24379","24391","24407","24413","24419","24421","24439","24443","24469","24473","24481","24499","24509","24517","24527","24533","24547","24551","24571","24593","24611","24623","24631","24659","24671","24677","24683","24691","24697","24709","24733","24749","24763","24767","24781","24793","24799","24809","24821","24841","24847","24851","24859","24877","24889","24907","24917","24919","24923","24943","24953","24967","24971","24977","24979","24989","25013","25031","25033","25037","25057","25073","25087","25097","25111","25117","25121","25127","25147","25153","25163","25169","25171","25183","25189","25219","25229","25237","25243","25247","25253","25261","25301","25303","25307","25309","25321","25339","25343","25349","25357","25367","25373","25391","25409","25411","25423","25439","25447","25453","25457","25463","25469","25471","25523","25537","25541","25561","25577","25579","25583","25589","25601","25603","25609","25621","25633","25639","25643","25657","25667","25673","25679","25693","25703","25717","25733","25741","25747","25759","25763","25771","25793","25799","25801","25819","25841","25847","25849","25867","25873","25889","25903","25913","25919","25931","25933","25939","25943","25951","25969","25981","25997","25999","26003","26017","26021","26029","26041","26053","26083","26099","26107","26111","26113","26119","26141","26153","26161","26171","26177","26183","26189","26203","26209","26227","26237","26249","26251","26261","26263","26267","26293","26297","26309","26317","26321","26339","26347","26357","26371","26387","26393","26399","26407","26417","26423","26431","26437","26449","26459","26479","26489","26497","26501","26513","26539","26557","26561","26573","26591","26597","26627","26633","26641","26647","26669","26681","26683","26687","26693","26699","26701","26711","26713","26717","26723","26729","26731","26737","26759","26777","26783","26801","26813","26821","26833","26839","26849","26861","26863","26879","26881","26891","26893","26903","26921","26927","26947","26951","26953","26959","26981","26987","26993","27011","27017","27031","27043","27059","27061","27067","27073","27077","27091","27103","27107","27109","27127","27143","27179","27191","27197","27211","27239","27241","27253","27259","27271","27277","27281","27283","27299","27329","27337","27361","27367","27397","27407","27409","27427","27431","27437","27449","27457","27479","27481","27487","27509","27527","27529","27539","27541","27551","27581","27583","27611","27617","27631","27647","27653","27673","27689","27691","27697","27701","27733","27737","27739","27743","27749","27751","27763","27767","27773","27779","27791","27793","27799","27803","27809","27817","27823","27827","27847","27851","27883","27893","27901","27917","27919","27941","27943","27947","27953","27961","27967","27983","27997","28001","28019","28027","28031","28051","28057","28069","28081","28087","28097","28099","28109","28111","28123","28151","28163","28181","28183","28201","28211","28219","28229","28277","28279","28283","28289","28297","28307","28309","28319","28349","28351","28387","28393","28403","28409","28411","28429","28433","28439","28447","28463","28477","28493","28499","28513","28517","28537","28541","28547","28549","28559","28571","28573","28579","28591","28597","28603","28607","28619","28621","28627","28631","28643","28649","28657","28661","28663","28669","28687","28697","28703","28711","28723","28729","28751","28753","28759","28771","28789","28793","28807","28813","28817","28837","28843","28859","28867","28871","28879","28901","28909","28921","28927","28933","28949","28961","28979","29009","29017","29021","29023","29027","29033","29059","29063","29077","29101","29123","29129","29131","29137","29147","29153","29167","29173","29179","29191","29201","29207","29209","29221","29231","29243","29251","29269","29287","29297","29303","29311","29327","29333","29339","29347","29363","29383","29387","29389","29399","29401","29411","29423","29429","29437","29443","29453","29473","29483","29501","29527","29531","29537","29567","29569","29573","29581","29587","29599","29611","29629","29633","29641","29663","29669","29671","29683","29717","29723","29741","29753","29759","29761","29789","29803","29819","29833","29837","29851","29863","29867","29873","29879","29881","29917","29921","29927","29947","29959","29983","29989","30011","30013","30029","30047","30059","30071","30089","30091","30097","30103","30109","30113","30119","30133","30137","30139","30161","30169","30181","30187","30197","30203","30211","30223","30241","30253","30259","30269","30271","30293","30307","30313","30319","30323","30341","30347","30367","30389","30391","30403","30427","30431","30449","30467","30469","30491","30493","30497","30509","30517","30529","30539","30553","30557","30559","30577","30593","30631","30637","30643","30649","30661","30671","30677","30689","30697","30703","30707","30713","30727","30757","30763","30773","30781","30803","30809","30817","30829","30839","30841","30851","30853","30859","30869","30871","30881","30893","30911","30931","30937","30941","30949","30971","30977","30983","31013","31019","31033","31039","31051","31063","31069","31079","31081","31091","31121","31123","31139","31147","31151","31153","31159","31177","31181","31183","31189","31193","31219","31223","31231","31237","31247","31249","31253","31259","31267","31271","31277","31307","31319","31321","31327","31333","31337","31357","31379","31387","31391","31393","31397","31469","31477","31481","31489","31511","31513","31517","31531","31541","31543","31547","31567","31573","31583","31601","31607","31627","31643","31649","31657","31663","31667","31687","31699","31721","31723","31727","31729","31741","31751","31769","31771","31793","31799","31817","31847","31849","31859","31873","31883","31891","31907","31957","31963","31973","31981","31991","32003","32009","32027","32029","32051","32057","32059","32063","32069","32077","32083","32089","32099","32117","32119","32141","32143","32159","32173","32183","32189","32191","32203","32213","32233","32237","32251","32257","32261","32297","32299","32303","32309","32321","32323","32327","32341","32353","32359","32363","32369","32371","32377","32381","32401","32411","32413","32423","32429","32441","32443","32467","32479","32491","32497","32503","32507","32531","32533","32537","32561","32563","32569","32573","32579","32587","32603","32609","32611","32621","32633","32647","32653","32687","32693","32707","32713","32717","32719","32749","32771","32779","32783","32789","32797","32801","32803","32831","32833","32839","32843","32869","32887","32909","32911","32917","32933","32939","32941","32957","32969","32971","32983","32987","32993","32999","33013","33023","33029","33037","33049","33053","33071","33073","33083","33091","33107","33113","33119","33149","33151","33161","33179","33181","33191","33199","33203","33211","33223","33247","33287","33289","33301","33311","33317","33329","33331","33343","33347","33349","33353","33359","33377","33391","33403","33409","33413","33427","33457","33461","33469","33479","33487","33493","33503","33521","33529","33533","33547","33563","33569","33577","33581","33587","33589","33599","33601","33613","33617","33619","33623","33629","33637","33641","33647","33679","33703","33713","33721","33739","33749","33751","33757","33767","33769","33773","33791","33797","33809","33811","33827","33829","33851","33857","33863","33871","33889","33893","33911","33923","33931","33937","33941","33961","33967","33997","34019","34031","34033","34039","34057","34061","34123","34127","34129","34141","34147","34157","34159","34171","34183","34211","34213","34217","34231","34253","34259","34261","34267","34273","34283","34297","34301","34303","34313","34319","34327","34337","34351","34361","34367","34369","34381","34403","34421","34429","34439","34457","34469","34471","34483","34487","34499","34501","34511","34513","34519","34537","34543","34549","34583","34589","34591","34603","34607","34613","34631","34649","34651","34667","34673","34679","34687","34693","34703","34721","34729","34739","34747","34757","34759","34763","34781","34807","34819","34841","34843","34847","34849","34871","34877","34883","34897","34913","34919","34939","34949","34961","34963","34981","35023","35027","35051","35053","35059","35069","35081","35083","35089","35099","35107","35111","35117","35129","35141","35149","35153","35159","35171","35201","35221","35227","35251","35257","35267","35279","35281","35291","35311","35317","35323","35327","35339","35353","35363","35381","35393","35401","35407","35419","35423","35437","35447","35449","35461","35491","35507","35509","35521","35527","35531","35533","35537","35543","35569","35573","35591","35593","35597","35603","35617","35671","35677","35729","35731","35747","35753","35759","35771","35797","35801","35803","35809","35831","35837","35839","35851","35863","35869","35879","35897","35899","35911","35923","35933","35951","35963","35969","35977","35983","35993","35999","36007","36011","36013","36017","36037","36061","36067","36073","36083","36097","36107","36109","36131","36137","36151","36161","36187","36191","36209","36217","36229","36241","36251","36263","36269","36277","36293","36299","36307","36313","36319","36341","36343","36353","36373","36383","36389","36433","36451","36457","36467","36469","36473","36479","36493","36497","36523","36527","36529","36541","36551","36559","36563","36571","36583","36587","36599","36607","36629","36637","36643","36653","36671","36677","36683","36691","36697","36709","36713","36721","36739","36749","36761","36767","36779","36781","36787","36791","36793","36809","36821","36833","36847","36857","36871","36877","36887","36899","36901","36913","36919","36923","36929","36931","36943","36947","36973","36979","36997","37003","37013","37019","37021","37039","37049","37057","37061","37087","37097","37117","37123","37139","37159","37171","37181","37189","37199","37201","37217","37223","37243","37253","37273","37277","37307","37309","37313","37321","37337","37339","37357","37361","37363","37369","37379","37397","37409","37423","37441","37447","37463","37483","37489","37493","37501","37507","37511","37517","37529","37537","37547","37549","37561","37567","37571","37573","37579","37589","37591","37607","37619","37633","37643","37649","37657","37663","37691","37693","37699","37717","37747","37781","37783","37799","37811","37813","37831","37847","37853","37861","37871","37879","37889","37897","37907","37951","37957","37963","37967","37987","37991","37993","37997","38011","38039","38047","38053","38069","38083","38113","38119","38149","38153","38167","38177","38183","38189","38197","38201","38219","38231","38237","38239","38261","38273","38281","38287","38299","38303","38317","38321","38327","38329","38333","38351","38371","38377","38393","38431","38447","38449","38453","38459","38461","38501","38543","38557","38561","38567","38569","38593","38603","38609","38611","38629","38639","38651","38653","38669","38671","38677","38693","38699","38707","38711","38713","38723","38729","38737","38747","38749","38767","38783","38791","38803","38821","38833","38839","38851","38861","38867","38873","38891","38903","38917","38921","38923","38933","38953","38959","38971","38977","38993","39019","39023","39041","39043","39047","39079","39089","39097","39103","39107","39113","39119","39133","39139","39157","39161","39163","39181","39191","39199","39209","39217","39227","39229","39233","39239","39241","39251","39293","39301","39313","39317","39323","39341","39343","39359","39367","39371","39373","39383","39397","39409","39419","39439","39443","39451","39461","39499","39503","39509","39511","39521","39541","39551","39563","39569","39581","39607","39619","39623","39631","39659","39667","39671","39679","39703","39709","39719","39727","39733","39749","39761","39769","39779","39791","39799","39821","39827","39829","39839","39841","39847","39857","39863","39869","39877","39883","39887","39901","39929","39937","39953","39971","39979","39983","39989","40009","40013","40031","40037","40039","40063","40087","40093","40099","40111","40123","40127","40129","40151","40153","40163","40169","40177","40189","40193","40213","40231","40237","40241","40253","40277","40283","40289","40343","40351","40357","40361","40387","40423","40427","40429","40433","40459","40471","40483","40487","40493","40499","40507","40519","40529","40531","40543","40559","40577","40583","40591","40597","40609","40627","40637","40639","40693","40697","40699","40709","40739","40751","40759","40763","40771","40787","40801","40813","40819","40823","40829","40841","40847","40849","40853","40867","40879","40883","40897","40903","40927","40933","40939","40949","40961","40973","40993","41011","41017","41023","41039","41047","41051","41057","41077","41081","41113","41117","41131","41141","41143","41149","41161","41177","41179","41183","41189","41201","41203","41213","41221","41227","41231","41233","41243","41257","41263","41269","41281","41299","41333","41341","41351","41357","41381","41387","41389","41399","41411","41413","41443","41453","41467","41479","41491","41507","41513","41519","41521","41539","41543","41549","41579","41593","41597","41603","41609","41611","41617","41621","41627","41641","41647","41651","41659","41669","41681","41687","41719","41729","41737","41759","41761","41771","41777","41801","41809","41813","41843","41849","41851","41863","41879","41887","41893","41897","41903","41911","41927","41941","41947","41953","41957","41959","41969","41981","41983","41999","42013","42017","42019","42023","42043","42061","42071","42073","42083","42089","42101","42131","42139","42157","42169","42179","42181","42187","42193","42197","42209","42221","42223","42227","42239","42257","42281","42283","42293","42299","42307","42323","42331","42337","42349","42359","42373","42379","42391","42397","42403","42407","42409","42433","42437","42443","42451","42457","42461","42463","42467","42473","42487","42491","42499","42509","42533","42557","42569","42571","42577","42589","42611","42641","42643","42649","42667","42677","42683","42689","42697","42701","42703","42709","42719","42727","42737","42743","42751","42767","42773","42787","42793","42797","42821","42829","42839","42841","42853","42859","42863","42899","42901","42923","42929","42937","42943","42953","42961","42967","42979","42989","43003","43013","43019","43037","43049","43051","43063","43067","43093","43103","43117","43133","43151","43159","43177","43189","43201","43207","43223","43237","43261","43271","43283","43291","43313","43319","43321","43331","43391","43397","43399","43403","43411","43427","43441","43451","43457","43481","43487","43499","43517","43541","43543","43573","43577","43579","43591","43597","43607","43609","43613","43627","43633","43649","43651","43661","43669","43691","43711","43717","43721","43753","43759","43777","43781","43783","43787","43789","43793","43801","43853","43867","43889","43891","43913","43933","43943","43951","43961","43963","43969","43973","43987","43991","43997","44017","44021","44027","44029","44041","44053","44059","44071","44087","44089","44101","44111","44119","44123","44129","44131","44159","44171","44179","44189","44201","44203","44207","44221","44249","44257","44263","44267","44269","44273","44279","44281","44293","44351","44357","44371","44381","44383","44389","44417","44449","44453","44483","44491","44497","44501","44507","44519","44531","44533","44537","44543","44549","44563","44579","44587","44617","44621","44623","44633","44641","44647","44651","44657","44683","44687","44699","44701","44711","44729","44741","44753","44771","44773","44777","44789","44797","44809","44819","44839","44843","44851","44867","44879","44887","44893","44909","44917","44927","44939","44953","44959","44963","44971","44983","44987","45007","45013","45053","45061","45077","45083","45119","45121","45127","45131","45137","45139","45161","45179","45181","45191","45197","45233","45247","45259","45263","45281","45289","45293","45307","45317","45319","45329","45337","45341","45343","45361","45377","45389","45403","45413","45427","45433","45439","45481","45491","45497","45503","45523","45533","45541","45553","45557","45569","45587","45589","45599","45613","45631","45641","45659","45667","45673","45677","45691","45697","45707","45737","45751","45757","45763","45767","45779","45817","45821","45823","45827","45833","45841","45853","45863","45869","45887","45893","45943","45949","45953","45959","45971","45979","45989","46021","46027","46049","46051","46061","46073","46091","46093","46099","46103","46133","46141","46147","46153","46171","46181","46183","46187","46199","46219","46229","46237","46261","46271","46273","46279","46301","46307","46309","46327","46337","46349","46351","46381","46399","46411","46439","46441","46447","46451","46457","46471","46477","46489","46499","46507","46511","46523","46549","46559","46567","46573","46589","46591","46601","46619","46633","46639","46643","46649","46663","46679","46681","46687","46691","46703","46723","46727","46747","46751","46757","46769","46771","46807","46811","46817","46819","46829","46831","46853","46861","46867","46877","46889","46901","46919","46933","46957","46993","46997","47017","47041","47051","47057","47059","47087","47093","47111","47119","47123","47129","47137","47143","47147","47149","47161","47189","47207","47221","47237","47251","47269","47279","47287","47293","47297","47303","47309","47317","47339","47351","47353","47363","47381","47387","47389","47407","47417","47419","47431","47441","47459","47491","47497","47501","47507","47513","47521","47527","47533","47543","47563","47569","47581","47591","47599","47609","47623","47629","47639","47653","47657","47659","47681","47699","47701","47711","47713","47717","47737","47741","47743","47777","47779","47791","47797","47807","47809","47819","47837","47843","47857","47869","47881","47903","47911","47917","47933","47939","47947","47951","47963","47969","47977","47981","48017","48023","48029","48049","48073","48079","48091","48109","48119","48121","48131","48157","48163","48179","48187","48193","48197","48221","48239","48247","48259","48271","48281","48299","48311","48313","48337","48341","48353","48371","48383","48397","48407","48409","48413","48437","48449","48463","48473","48479","48481","48487","48491","48497","48523","48527","48533","48539","48541","48563","48571","48589","48593","48611","48619","48623","48647","48649","48661","48673","48677","48679","48731","48733","48751","48757","48761","48767","48779","48781","48787","48799","48809","48817","48821","48823","48847","48857","48859","48869","48871","48883","48889","48907","48947","48953","48973","48989","48991","49003","49009","49019","49031","49033","49037","49043","49057","49069","49081","49103","49109","49117","49121","49123","49139","49157","49169","49171","49177","49193","49199","49201","49207","49211","49223","49253","49261","49277","49279","49297","49307","49331","49333","49339","49363","49367","49369","49391","49393","49409","49411","49417","49429","49433","49451","49459","49463","49477","49481","49499","49523","49529","49531","49537","49547","49549","49559","49597","49603","49613","49627","49633","49639","49663","49667","49669","49681","49697","49711","49727","49739","49741","49747","49757","49783","49787","49789","49801","49807","49811","49823","49831","49843","49853","49871","49877","49891","49919","49921","49927","49937","49939","49943","49957","49991","49993","49999","50021","50023","50033","50047","50051","50053","50069","50077","50087","50093","50101","50111","50119","50123","50129","50131","50147","50153","50159","50177","50207","50221","50227","50231","50261","50263","50273","50287","50291","50311","50321","50329","50333","50341","50359","50363","50377","50383","50387","50411","50417","50423","50441","50459","50461","50497","50503","50513","50527","50539","50543","50549","50551","50581","50587","50591","50593","50599","50627","50647","50651","50671","50683","50707","50723","50741","50753","50767","50773","50777","50789","50821","50833","50839","50849","50857","50867","50873","50891","50893","50909","50923","50929","50951","50957","50969","50971","50989","50993","51001","51031","51043","51047","51059","51061","51071","51109","51131","51133","51137","51151","51157","51169","51193","51197","51199","51203","51217","51229","51239","51241","51257","51263","51283","51287","51307","51329","51341","51343","51347","51349","51361","51383","51407","51413","51419","51421","51427","51431","51437","51439","51449","51461","51473","51479","51481","51487","51503","51511","51517","51521","51539","51551","51563","51577","51581","51593","51599","51607","51613","51631","51637","51647","51659","51673","51679","51683","51691","51713","51719","51721","51749","51767","51769","51787","51797","51803","51817","51827","51829","51839","51853","51859","51869","51871","51893","51899","51907","51913","51929","51941","51949","51971","51973","51977","51991","52009","52021","52027","52051","52057","52067","52069","52081","52103","52121","52127","52147","52153","52163","52177","52181","52183","52189","52201","52223","52237","52249","52253","52259","52267","52289","52291","52301","52313","52321","52361","52363","52369","52379","52387","52391","52433","52453","52457","52489","52501","52511","52517","52529","52541","52543","52553","52561","52567","52571","52579","52583","52609","52627","52631","52639","52667","52673","52691","52697","52709","52711","52721","52727","52733","52747","52757","52769","52783","52807","52813","52817","52837","52859","52861","52879","52883","52889","52901","52903","52919","52937","52951","52957","52963","52967","52973","52981","52999","53003","53017","53047","53051","53069","53077","53087","53089","53093","53101","53113","53117","53129","53147","53149","53161","53171","53173","53189","53197","53201","53231","53233","53239","53267","53269","53279","53281","53299","53309","53323","53327","53353","53359","53377","53381","53401","53407","53411","53419","53437","53441","53453","53479","53503","53507","53527","53549","53551","53569","53591","53593","53597","53609","53611","53617","53623","53629","53633","53639","53653","53657","53681","53693","53699","53717","53719","53731","53759","53773","53777","53783","53791","53813","53819","53831","53849","53857","53861","53881","53887","53891","53897","53899","53917","53923","53927","53939","53951","53959","53987","53993","54001","54011","54013","54037","54049","54059","54083","54091","54101","54121","54133","54139","54151","54163","54167","54181","54193","54217","54251","54269","54277","54287","54293","54311","54319","54323","54331","54347","54361","54367","54371","54377","54401","54403","54409","54413","54419","54421","54437","54443","54449","54469","54493","54497","54499","54503","54517","54521","54539","54541","54547","54559","54563","54577","54581","54583","54601","54617","54623","54629","54631","54647","54667","54673","54679","54709","54713","54721","54727","54751","54767","54773","54779","54787","54799","54829","54833","54851","54869","54877","54881","54907","54917","54919","54941","54949","54959","54973","54979","54983","55001","55009","55021","55049","55051","55057","55061","55073","55079","55103","55109","55117","55127","55147","55163","55171","55201","55207","55213","55217","55219","55229","55243","55249","55259","55291","55313","55331","55333","55337","55339","55343","55351","55373","55381","55399","55411","55439","55441","55457","55469","55487","55501","55511","55529","55541","55547","55579","55589","55603","55609","55619","55621","55631","55633","55639","55661","55663","55667","55673","55681","55691","55697","55711","55717","55721","55733","55763","55787","55793","55799","55807","55813","55817","55819","55823","55829","55837","55843","55849","55871","55889","55897","55901","55903","55921","55927","55931","55933","55949","55967","55987","55997","56003","56009","56039","56041","56053","56081","56087","56093","56099","56101","56113","56123","56131","56149","56167","56171","56179","56197","56207","56209","56237","56239","56249","56263","56267","56269","56299","56311","56333","56359","56369","56377","56383","56393","56401","56417","56431","56437","56443","56453","56467","56473","56477","56479","56489","56501","56503","56509","56519","56527","56531","56533","56543","56569","56591","56597","56599","56611","56629","56633","56659","56663","56671","56681","56687","56701","56711","56713","56731","56737","56747","56767","56773","56779","56783","56807","56809","56813","56821","56827","56843","56857","56873","56891","56893","56897","56909","56911","56921","56923","56929","56941","56951","56957","56963","56983","56989","56993","56999","57037","57041","57047","57059","57073","57077","57089","57097","57107","57119","57131","57139","57143","57149","57163","57173","57179","57191","57193","57203","57221","57223","57241","57251","57259","57269","57271","57283","57287","57301","57329","57331","57347","57349","57367","57373","57383","57389","57397","57413","57427","57457","57467","57487","57493","57503","57527","57529","57557","57559","57571","57587","57593","57601","57637","57641","57649","57653","57667","57679","57689","57697","57709","57713","57719","57727","57731","57737","57751","57773","57781","57787","57791","57793","57803","57809","57829","57839","57847","57853","57859","57881","57899","57901","57917","57923","57943","57947","57973","57977","57991","58013","58027","58031","58043","58049","58057","58061","58067","58073","58099","58109","58111","58129","58147","58151","58153","58169","58171","58189","58193","58199","58207","58211","58217","58229","58231","58237","58243","58271","58309","58313","58321","58337","58363","58367","58369","58379","58391","58393","58403","58411","58417","58427","58439","58441","58451","58453","58477","58481","58511","58537","58543","58549","58567","58573","58579","58601","58603","58613","58631","58657","58661","58679","58687","58693","58699","58711","58727","58733","58741","58757","58763","58771","58787","58789","58831","58889","58897","58901","58907","58909","58913","58921","58937","58943","58963","58967","58979","58991","58997","59009","59011","59021","59023","59029","59051","59053","59063","59069","59077","59083","59093","59107","59113","59119","59123","59141","59149","59159","59167","59183","59197","59207","59209","59219","59221","59233","59239","59243","59263","59273","59281","59333","59341","59351","59357","59359","59369","59377","59387","59393","59399","59407","59417","59419","59441","59443","59447","59453","59467","59471","59473","59497","59509","59513","59539","59557","59561","59567","59581","59611","59617","59621","59627","59629","59651","59659","59663","59669","59671","59693","59699","59707","59723","59729","59743","59747","59753","59771","59779","59791","59797","59809","59833","59863","59879","59887","59921","59929","59951","59957","59971","59981","59999","60013","60017","60029","60037","60041","60077","60083","60089","60091","60101","60103","60107","60127","60133","60139","60149","60161","60167","60169","60209","60217","60223","60251","60257","60259","60271","60289","60293","60317","60331","60337","60343","60353","60373","60383","60397","60413","60427","60443","60449","60457","60493","60497","60509","60521","60527","60539","60589","60601","60607","60611","60617","60623","60631","60637","60647","60649","60659","60661","60679","60689","60703","60719","60727","60733","60737","60757","60761","60763","60773","60779","60793","60811","60821","60859","60869","60887","60889","60899","60901","60913","60917","60919","60923","60937","60943","60953","60961","61001","61007","61027","61031","61043","61051","61057","61091","61099","61121","61129","61141","61151","61153","61169","61211","61223","61231","61253","61261","61283","61291","61297","61331","61333","61339","61343","61357","61363","61379","61381","61403","61409","61417","61441","61463","61469","61471","61483","61487","61493","61507","61511","61519","61543","61547","61553","61559","61561","61583","61603","61609","61613","61627","61631","61637","61643","61651","61657","61667","61673","61681","61687","61703","61717","61723","61729","61751","61757","61781","61813","61819","61837","61843","61861","61871","61879","61909","61927","61933","61949","61961","61967","61979","61981","61987","61991","62003","62011","62017","62039","62047","62053","62057","62071","62081","62099","62119","62129","62131","62137","62141","62143","62171","62189","62191","62201","62207","62213","62219","62233","62273","62297","62299","62303","62311","62323","62327","62347","62351","62383","62401","62417","62423","62459","62467","62473","62477","62483","62497","62501","62507","62533","62539","62549","62563","62581","62591","62597","62603","62617","62627","62633","62639","62653","62659","62683","62687","62701","62723","62731","62743","62753","62761","62773","62791","62801","62819","62827","62851","62861","62869","62873","62897","62903","62921","62927","62929","62939","62969","62971","62981","62983","62987","62989","63029","63031","63059","63067","63073","63079","63097","63103","63113","63127","63131","63149","63179","63197","63199","63211","63241","63247","63277","63281","63299","63311","63313","63317","63331","63337","63347","63353","63361","63367","63377","63389","63391","63397","63409","63419","63421","63439","63443","63463","63467","63473","63487","63493","63499","63521","63527","63533","63541","63559","63577","63587","63589","63599","63601","63607","63611","63617","63629","63647","63649","63659","63667","63671","63689","63691","63697","63703","63709","63719","63727","63737","63743","63761","63773","63781","63793","63799","63803","63809","63823","63839","63841","63853","63857","63863","63901","63907","63913","63929","63949","63977","63997","64007","64013","64019","64033","64037","64063","64067","64081","64091","64109","64123","64151","64153","64157","64171","64187","64189","64217","64223","64231","64237","64271","64279","64283","64301","64303","64319","64327","64333","64373","64381","64399","64403","64433","64439","64451","64453","64483","64489","64499","64513","64553","64567","64577","64579","64591","64601","64609","64613","64621","64627","64633","64661","64663","64667","64679","64693","64709","64717","64747","64763","64781","64783","64793","64811","64817","64849","64853","64871","64877","64879","64891","64901","64919","64921","64927","64937","64951","64969","64997","65003","65011","65027","65029","65033","65053","65063","65071","65089","65099","65101","65111","65119","65123","65129","65141","65147","65167","65171","65173","65179","65183","65203","65213","65239","65257","65267","65269","65287","65293","65309","65323","65327","65353","65357","65371","65381","65393","65407","65413","65419","65423","65437","65447","65449","65479","65497","65519","65521","65537","65539","65543","65551","65557","65563","65579","65581","65587","65599","65609","65617","65629","65633","65647","65651","65657","65677","65687","65699","65701","65707","65713","65717","65719","65729","65731","65761","65777","65789","65809","65827","65831","65837","65839","65843","65851","65867","65881","65899","65921","65927","65929","65951","65957","65963","65981","65983","65993","66029","66037","66041","66047","66067","66071","66083","66089","66103","66107","66109","66137","66161","66169","66173","66179","66191","66221","66239","66271","66293","66301","66337","66343","66347","66359","66361","66373","66377","66383","66403","66413","66431","66449","66457","66463","66467","66491","66499","66509","66523","66529","66533","66541","66553","66569","66571","66587","66593","66601","66617","66629","66643","66653","66683","66697","66701","66713","66721","66733","66739","66749","66751","66763","66791","66797","66809","66821","66841","66851","66853","66863","66877","66883","66889","66919","66923","66931","66943","66947","66949","66959","66973","66977","67003","67021","67033","67043","67049","67057","67061","67073","67079","67103","67121","67129","67139","67141","67153","67157","67169","67181","67187","67189","67211","67213","67217","67219","67231","67247","67261","67271","67273","67289","67307","67339","67343","67349","67369","67391","67399","67409","67411","67421","67427","67429","67433","67447","67453","67477","67481","67489","67493","67499","67511","67523","67531","67537","67547","67559","67567","67577","67579","67589","67601","67607","67619","67631","67651","67679","67699","67709","67723","67733","67741","67751","67757","67759","67763","67777","67783","67789","67801","67807","67819","67829","67843","67853","67867","67883","67891","67901","67927","67931","67933","67939","67943","67957","67961","67967","67979","67987","67993","68023","68041","68053","68059","68071","68087","68099","68111","68113","68141","68147","68161","68171","68207","68209","68213","68219","68227","68239","68261","68279","68281","68311","68329","68351","68371","68389","68399","68437","68443","68447","68449","68473","68477","68483","68489","68491","68501","68507","68521","68531","68539","68543","68567","68581","68597","68611","68633","68639","68659","68669","68683","68687","68699","68711","68713","68729","68737","68743","68749","68767","68771","68777","68791","68813","68819","68821","68863","68879","68881","68891","68897","68899","68903","68909","68917","68927","68947","68963","68993","69001","69011","69019","69029","69031","69061","69067","69073","69109","69119","69127","69143","69149","69151","69163","69191","69193","69197","69203","69221","69233","69239","69247","69257","69259","69263","69313","69317","69337","69341","69371","69379","69383","69389","69401","69403","69427","69431","69439","69457","69463","69467","69473","69481","69491","69493","69497","69499","69539","69557","69593","69623","69653","69661","69677","69691","69697","69709","69737","69739","69761","69763","69767","69779","69809","69821","69827","69829","69833","69847","69857","69859","69877","69899","69911","69929","69931","69941","69959","69991","69997","70001","70003","70009","70019","70039","70051","70061","70067","70079","70099","70111","70117","70121","70123","70139","70141","70157","70163","70177","70181","70183","70199","70201","70207","70223","70229","70237","70241","70249","70271","70289","70297","70309","70313","70321","70327","70351","70373","70379","70381","70393","70423","70429","70439","70451","70457","70459","70481","70487","70489","70501","70507","70529","70537","70549","70571","70573","70583","70589","70607","70619","70621","70627","70639","70657","70663","70667","70687","70709","70717","70729","70753","70769","70783","70793","70823","70841","70843","70849","70853","70867","70877","70879","70891","70901","70913","70919","70921","70937","70949","70951","70957","70969","70979","70981","70991","70997","70999","71011","71023","71039","71059","71069","71081","71089","71119","71129","71143","71147","71153","71161","71167","71171","71191","71209","71233","71237","71249","71257","71261","71263","71287","71293","71317","71327","71329","71333","71339","71341","71347","71353","71359","71363","71387","71389","71399","71411","71413","71419","71429","71437","71443","71453","71471","71473","71479","71483","71503","71527","71537","71549","71551","71563","71569","71593","71597","71633","71647","71663","71671","71693","71699","71707","71711","71713","71719","71741","71761","71777","71789","71807","71809","71821","71837","71843","71849","71861","71867","71879","71881","71887","71899","71909","71917","71933","71941","71947","71963","71971","71983","71987","71993","71999","72019","72031","72043","72047","72053","72073","72077","72089","72091","72101","72103","72109","72139","72161","72167","72169","72173","72211","72221","72223","72227","72229","72251","72253","72269","72271","72277","72287","72307","72313","72337","72341","72353","72367","72379","72383","72421","72431","72461","72467","72469","72481","72493","72497","72503","72533","72547","72551","72559","72577","72613","72617","72623","72643","72647","72649","72661","72671","72673","72679","72689","72701","72707","72719","72727","72733","72739","72763","72767","72797","72817","72823","72859","72869","72871","72883","72889","72893","72901","72907","72911","72923","72931","72937","72949","72953","72959","72973","72977","72997","73009","73013","73019","73037","73039","73043","73061","73063","73079","73091","73121","73127","73133","73141","73181","73189","73237","73243","73259","73277","73291","73303","73309","73327","73331","73351","73361","73363","73369","73379","73387","73417","73421","73433","73453","73459","73471","73477","73483","73517","73523","73529","73547","73553","73561","73571","73583","73589","73597","73607","73609","73613","73637","73643","73651","73673","73679","73681","73693","73699","73709","73721","73727","73751","73757","73771","73783","73819","73823","73847","73849","73859","73867","73877","73883","73897","73907","73939","73943","73951","73961","73973","73999","74017","74021","74027","74047","74051","74071","74077","74093","74099","74101","74131","74143","74149","74159","74161","74167","74177","74189","74197","74201","74203","74209","74219","74231","74257","74279","74287","74293","74297","74311","74317","74323","74353","74357","74363","74377","74381","74383","74411","74413","74419","74441","74449","74453","74471","74489","74507","74509","74521","74527","74531","74551","74561","74567","74573","74587","74597","74609","74611","74623","74653","74687","74699","74707","74713","74717","74719","74729","74731","74747","74759","74761","74771","74779","74797","74821","74827","74831","74843","74857","74861","74869","74873","74887","74891","74897","74903","74923","74929","74933","74941","74959","75011","75013","75017","75029","75037","75041","75079","75083","75109","75133","75149","75161","75167","75169","75181","75193","75209","75211","75217","75223","75227","75239","75253","75269","75277","75289","75307","75323","75329","75337","75347","75353","75367","75377","75389","75391","75401","75403","75407","75431","75437","75479","75503","75511","75521","75527","75533","75539","75541","75553","75557","75571","75577","75583","75611","75617","75619","75629","75641","75653","75659","75679","75683","75689","75703","75707","75709","75721","75731","75743","75767","75773","75781","75787","75793","75797","75821","75833","75853","75869","75883","75913","75931","75937","75941","75967","75979","75983","75989","75991","75997","76001","76003","76031","76039","76079","76081","76091","76099","76103","76123","76129","76147","76157","76159","76163","76207","76213","76231","76243","76249","76253","76259","76261","76283","76289","76303","76333","76343","76367","76369","76379","76387","76403","76421","76423","76441","76463","76471","76481","76487","76493","76507","76511","76519","76537","76541","76543","76561","76579","76597","76603","76607","76631","76649","76651","76667","76673","76679","76697","76717","76733","76753","76757","76771","76777","76781","76801","76819","76829","76831","76837","76847","76871","76873","76883","76907","76913","76919","76943","76949","76961","76963","76991","77003","77017","77023","77029","77041","77047","77069","77081","77093","77101","77137","77141","77153","77167","77171","77191","77201","77213","77237","77239","77243","77249","77261","77263","77267","77269","77279","77291","77317","77323","77339","77347","77351","77359","77369","77377","77383","77417","77419","77431","77447","77471","77477","77479","77489","77491","77509","77513","77521","77527","77543","77549","77551","77557","77563","77569","77573","77587","77591","77611","77617","77621","77641","77647","77659","77681","77687","77689","77699","77711","77713","77719","77723","77731","77743","77747","77761","77773","77783","77797","77801","77813","77839","77849","77863","77867","77893","77899","77929","77933","77951","77969","77977","77983","77999","78007","78017","78031","78041","78049","78059","78079","78101","78121","78137","78139","78157","78163","78167","78173","78179","78191","78193","78203","78229","78233","78241","78259","78277","78283","78301","78307","78311","78317","78341","78347","78367","78401","78427","78437","78439","78467","78479","78487","78497","78509","78511","78517","78539","78541","78553","78569","78571","78577","78583","78593","78607","78623","78643","78649","78653","78691","78697","78707","78713","78721","78737","78779","78781","78787","78791","78797","78803","78809","78823","78839","78853","78857","78877","78887","78889","78893","78901","78919","78929","78941","78977","78979","78989","79031","79039","79043","79063","79087","79103","79111","79133","79139","79147","79151","79153","79159","79181","79187","79193","79201","79229","79231","79241","79259","79273","79279","79283","79301","79309","79319","79333","79337","79349","79357","79367","79379","79393","79397","79399","79411","79423","79427","79433","79451","79481","79493","79531","79537","79549","79559","79561","79579","79589","79601","79609","79613","79621","79627","79631","79633","79657","79669","79687","79691","79693","79697","79699","79757","79769","79777","79801","79811","79813","79817","79823","79829","79841","79843","79847","79861","79867","79873","79889","79901","79903","79907","79939","79943","79967","79973","79979","79987","79997","79999","80021","80039","80051","80071","80077","80107","80111","80141","80147","80149","80153","80167","80173","80177","80191","80207","80209","80221","80231","80233","80239","80251","80263","80273","80279","80287","80309","80317","80329","80341","80347","80363","80369","80387","80407","80429","80447","80449","80471","80473","80489","80491","80513","80527","80537","80557","80567","80599","80603","80611","80621","80627","80629","80651","80657","80669","80671","80677","80681","80683","80687","80701","80713","80737","80747","80749","80761","80777","80779","80783","80789","80803","80809","80819","80831","80833","80849","80863","80897","80909","80911","80917","80923","80929","80933","80953","80963","80989","81001","81013","81017","81019","81023","81031","81041","81043","81047","81049","81071","81077","81083","81097","81101","81119","81131","81157","81163","81173","81181","81197","81199","81203","81223","81233","81239","81281","81283","81293","81299","81307","81331","81343","81349","81353","81359","81371","81373","81401","81409","81421","81439","81457","81463","81509","81517","81527","81533","81547","81551","81553","81559","81563","81569","81611","81619","81629","81637","81647","81649","81667","81671","81677","81689","81701","81703","81707","81727","81737","81749","81761","81769","81773","81799","81817","81839","81847","81853","81869","81883","81899","81901","81919","81929","81931","81937","81943","81953","81967","81971","81973","82003","82007","82009","82013","82021","82031","82037","82039","82051","82067","82073","82129","82139","82141","82153","82163","82171","82183","82189","82193","82207","82217","82219","82223","82231","82237","82241","82261","82267","82279","82301","82307","82339","82349","82351","82361","82373","82387","82393","82421","82457","82463","82469","82471","82483","82487","82493","82499","82507","82529","82531","82549","82559","82561","82567","82571","82591","82601","82609","82613","82619","82633","82651","82657","82699","82721","82723","82727","82729","82757","82759","82763","82781","82787","82793","82799","82811","82813","82837","82847","82883","82889","82891","82903","82913","82939","82963","82981","82997","83003","83009","83023","83047","83059","83063","83071","83077","83089","83093","83101","83117","83137","83177","83203","83207","83219","83221","83227","83231","83233","83243","83257","83267","83269","83273","83299","83311","83339","83341","83357","83383","83389","83399","83401","83407","83417","83423","83431","83437","83443","83449","83459","83471","83477","83497","83537","83557","83561","83563","83579","83591","83597","83609","83617","83621","83639","83641","83653","83663","83689","83701","83717","83719","83737","83761","83773","83777","83791","83813","83833","83843","83857","83869","83873","83891","83903","83911","83921","83933","83939","83969","83983","83987","84011","84017","84047","84053","84059","84061","84067","84089","84121","84127","84131","84137","84143","84163","84179","84181","84191","84199","84211","84221","84223","84229","84239","84247","84263","84299","84307","84313","84317","84319","84347","84349","84377","84389","84391","84401","84407","84421","84431","84437","84443","84449","84457","84463","84467","84481","84499","84503","84509","84521","84523","84533","84551","84559","84589","84629","84631","84649","84653","84659","84673","84691","84697","84701","84713","84719","84731","84737","84751","84761","84787","84793","84809","84811","84827","84857","84859","84869","84871","84913","84919","84947","84961","84967","84977","84979","84991","85009","85021","85027","85037","85049","85061","85081","85087","85091","85093","85103","85109","85121","85133","85147","85159","85193","85199","85201","85213","85223","85229","85237","85243","85247","85259","85297","85303","85313","85331","85333","85361","85363","85369","85381","85411","85427","85429","85439","85447","85451","85453","85469","85487","85513","85517","85523","85531","85549","85571","85577","85597","85601","85607","85619","85621","85627","85639","85643","85661","85667","85669","85691","85703","85711","85717","85733","85751","85781","85793","85817","85819","85829","85831","85837","85843","85847","85853","85889","85903","85909","85931","85933","85991","85999","86011","86017","86027","86029","86069","86077","86083","86111","86113","86117","86131","86137","86143","86161","86171","86179","86183","86197","86201","86209","86239","86243","86249","86257","86263","86269","86287","86291","86293","86297","86311","86323","86341","86351","86353","86357","86369","86371","86381","86389","86399","86413","86423","86441","86453","86461","86467","86477","86491","86501","86509","86531","86533","86539","86561","86573","86579","86587","86599","86627","86629","86677","86689","86693","86711","86719","86729","86743","86753","86767","86771","86783","86813","86837","86843","86851","86857","86861","86869","86923","86927","86929","86939","86951","86959","86969","86981","86993","87011","87013","87037","87041","87049","87071","87083","87103","87107","87119","87121","87133","87149","87151","87179","87181","87187","87211","87221","87223","87251","87253","87257","87277","87281","87293","87299","87313","87317","87323","87337","87359","87383","87403","87407","87421","87427","87433","87443","87473","87481","87491","87509","87511","87517","87523","87539","87541","87547","87553","87557","87559","87583","87587","87589","87613","87623","87629","87631","87641","87643","87649","87671","87679","87683","87691","87697","87701","87719","87721","87739","87743","87751","87767","87793","87797","87803","87811","87833","87853","87869","87877","87881","87887","87911","87917","87931","87943","87959","87961","87973","87977","87991","88001","88003","88007","88019","88037","88069","88079","88093","88117","88129","88169","88177","88211","88223","88237","88241","88259","88261","88289","88301","88321","88327","88337","88339","88379","88397","88411","88423","88427","88463","88469","88471","88493","88499","88513","88523","88547","88589","88591","88607","88609","88643","88651","88657","88661","88663","88667","88681","88721","88729","88741","88747","88771","88789","88793","88799","88801","88807","88811","88813","88817","88819","88843","88853","88861","88867","88873","88883","88897","88903","88919","88937","88951","88969","88993","88997","89003","89009","89017","89021","89041","89051","89057","89069","89071","89083","89087","89101","89107","89113","89119","89123","89137","89153","89189","89203","89209","89213","89227","89231","89237","89261","89269","89273","89293","89303","89317","89329","89363","89371","89381","89387","89393","89399","89413","89417","89431","89443","89449","89459","89477","89491","89501","89513","89519","89521","89527","89533","89561","89563","89567","89591","89597","89599","89603","89611","89627","89633","89653","89657","89659","89669","89671","89681","89689","89753","89759","89767","89779","89783","89797","89809","89819","89821","89833","89839","89849","89867","89891","89897","89899","89909","89917","89923","89939","89959","89963","89977","89983","89989","90001","90007","90011","90017","90019","90023","90031","90053","90059","90067","90071","90073","90089","90107","90121","90127","90149","90163","90173","90187","90191","90197","90199","90203","90217","90227","90239","90247","90263","90271","90281","90289","90313","90353","90359","90371","90373","90379","90397","90401","90403","90407","90437","90439","90469","90473","90481","90499","90511","90523","90527","90529","90533","90547","90583","90599","90617","90619","90631","90641","90647","90659","90677","90679","90697","90703","90709","90731","90749","90787","90793","90803","90821","90823","90833","90841","90847","90863","90887","90901","90907","90911","90917","90931","90947","90971","90977","90989","90997","91009","91019","91033","91079","91081","91097","91099","91121","91127","91129","91139","91141","91151","91153","91159","91163","91183","91193","91199","91229","91237","91243","91249","91253","91283","91291","91297","91303","91309","91331","91367","91369","91373","91381","91387","91393","91397","91411","91423","91433","91453","91457","91459","91463","91493","91499","91513","91529","91541","91571","91573","91577","91583","91591","91621","91631","91639","91673","91691","91703","91711","91733","91753","91757","91771","91781","91801","91807","91811","91813","91823","91837","91841","91867","91873","91909","91921","91939","91943","91951","91957","91961","91967","91969","91997","92003","92009","92033","92041","92051","92077","92083","92107","92111","92119","92143","92153","92173","92177","92179","92189","92203","92219","92221","92227","92233","92237","92243","92251","92269","92297","92311","92317","92333","92347","92353","92357","92363","92369","92377","92381","92383","92387","92399","92401","92413","92419","92431","92459","92461","92467","92479","92489","92503","92507","92551","92557","92567","92569","92581","92593","92623","92627","92639","92641","92647","92657","92669","92671","92681","92683","92693","92699","92707","92717","92723","92737","92753","92761","92767","92779","92789","92791","92801","92809","92821","92831","92849","92857","92861","92863","92867","92893","92899","92921","92927","92941","92951","92957","92959","92987","92993","93001","93047","93053","93059","93077","93083","93089","93097","93103","93113","93131","93133","93139","93151","93169","93179","93187","93199","93229","93239","93241","93251","93253","93257","93263","93281","93283","93287","93307","93319","93323","93329","93337","93371","93377","93383","93407","93419","93427","93463","93479","93481","93487","93491","93493","93497","93503","93523","93529","93553","93557","93559","93563","93581","93601","93607","93629","93637","93683","93701","93703","93719","93739","93761","93763","93787","93809","93811","93827","93851","93871","93887","93889","93893","93901","93911","93913","93923","93937","93941","93949","93967","93971","93979","93983","93997","94007","94009","94033","94049","94057","94063","94079","94099","94109","94111","94117","94121","94151","94153","94169","94201","94207","94219","94229","94253","94261","94273","94291","94307","94309","94321","94327","94331","94343","94349","94351","94379","94397","94399","94421","94427","94433","94439","94441","94447","94463","94477","94483","94513","94529","94531","94541","94543","94547","94559","94561","94573","94583","94597","94603","94613","94621","94649","94651","94687","94693","94709","94723","94727","94747","94771","94777","94781","94789","94793","94811","94819","94823","94837","94841","94847","94849","94873","94889","94903","94907","94933","94949","94951","94961","94993","94999","95003","95009","95021","95027","95063","95071","95083","95087","95089","95093","95101","95107","95111","95131","95143","95153","95177","95189","95191","95203","95213","95219","95231","95233","95239","95257","95261","95267","95273","95279","95287","95311","95317","95327","95339","95369","95383","95393","95401","95413","95419","95429","95441","95443","95461","95467","95471","95479","95483","95507","95527","95531","95539","95549","95561","95569","95581","95597","95603","95617","95621","95629","95633","95651","95701","95707","95713","95717","95723","95731","95737","95747","95773","95783","95789","95791","95801","95803","95813","95819","95857","95869","95873","95881","95891","95911","95917","95923","95929","95947","95957","95959","95971","95987","95989","96001","96013","96017","96043","96053","96059","96079","96097","96137","96149","96157","96167","96179","96181","96199","96211","96221","96223","96233","96259","96263","96269","96281","96289","96293","96323","96329","96331","96337","96353","96377","96401","96419","96431","96443","96451","96457","96461","96469","96479","96487","96493","96497","96517","96527","96553","96557","96581","96587","96589","96601","96643","96661","96667","96671","96697","96703","96731","96737","96739","96749","96757","96763","96769","96779","96787","96797","96799","96821","96823","96827","96847","96851","96857","96893","96907","96911","96931","96953","96959","96973","96979","96989","96997","97001","97003","97007","97021","97039","97073","97081","97103","97117","97127","97151","97157","97159","97169","97171","97177","97187","97213","97231","97241","97259","97283","97301","97303","97327","97367","97369","97373","97379","97381","97387","97397","97423","97429","97441","97453","97459","97463","97499","97501","97511","97523","97547","97549","97553","97561","97571","97577","97579","97583","97607","97609","97613","97649","97651","97673","97687","97711","97729","97771","97777","97787","97789","97813","97829","97841","97843","97847","97849","97859","97861","97871","97879","97883","97919","97927","97931","97943","97961","97967","97973","97987","98009","98011","98017","98041","98047","98057","98081","98101","98123","98129","98143","98179","98207","98213","98221","98227","98251","98257","98269","98297","98299","98317","98321","98323","98327","98347","98369","98377","98387","98389","98407","98411","98419","98429","98443","98453","98459","98467","98473","98479","98491","98507","98519","98533","98543","98561","98563","98573","98597","98621","98627","98639","98641","98663","98669","98689","98711","98713","98717","98729","98731","98737","98773","98779","98801","98807","98809","98837","98849","98867","98869","98873","98887","98893","98897","98899","98909","98911","98927","98929","98939","98947","98953","98963","98981","98993","98999","99013","99017","99023","99041","99053","99079","99083","99089","99103","99109","99119","99131","99133","99137","99139","99149","99173","99181","99191","99223","99233","99241","99251","99257","99259","99277","99289","99317","99347","99349","99367","99371","99377","99391","99397","99401","99409","99431","99439","99469","99487","99497","99523","99527","99529","99551","99559","99563","99571","99577","99581","99607","99611","99623","99643","99661","99667","99679","99689","99707","99709","99713","99719","99721","99733","99761","99767","99787","99793","99809","99817","99823","99829","99833","99839","99859","99871","99877","99881","99901","99907","99923","99929","99961","99971","99989","99991","100003","100019","100043","100049","100057","100069","100103","100109","100129","100151","100153","100169","100183","100189","100193","100207","100213","100237","100267","100271","100279","100291","100297","100313","100333","100343","100357","100361","100363","100379","100391","100393","100403","100411","100417","100447","100459","100469","100483","100493","100501","100511","100517","100519","100523","100537","100547","100549","100559","100591","100609","100613","100621","100649","100669","100673","100693","100699","100703","100733","100741","100747","100769","100787","100799","100801","100811","100823","100829","100847","100853","100907","100913","100927","100931","100937","100943","100957","100981","100987","100999","101009","101021","101027","101051","101063","101081","101089","101107","101111","101113","101117","101119","101141","101149","101159","101161","101173","101183","101197","101203","101207","101209","101221","101267","101273","101279","101281","101287","101293","101323","101333","101341","101347","101359","101363","101377","101383","101399","101411","101419","101429","101449","101467","101477","101483","101489","101501","101503","101513","101527","101531","101533","101537","101561","101573","101581","101599","101603","101611","101627","101641","101653","101663","101681","101693","101701","101719","101723","101737","101741","101747","101749","101771","101789","101797","101807","101833","101837","101839","101863","101869","101873","101879","101891","101917","101921","101929","101939","101957","101963","101977","101987","101999","102001","102013","102019","102023","102031","102043","102059","102061","102071","102077","102079","102101","102103","102107","102121","102139","102149","102161","102181","102191","102197","102199","102203","102217","102229","102233","102241","102251","102253","102259","102293","102299","102301","102317","102329","102337","102359","102367","102397","102407","102409","102433","102437","102451","102461","102481","102497","102499","102503","102523","102533","102539","102547","102551","102559","102563","102587","102593","102607","102611","102643","102647","102653","102667","","102673","102677","102679","102701","102761","102763","102769","102793","102797","102811","102829","102841","102859","102871","102877","102881","102911","102913","102929","102931","102953","102967","102983","103001","103007","103043","103049","103067","103069","103079","103087","103091","103093","103099","103123","103141","103171","103177","103183","103217","103231","103237","103289","103291","103307","103319","103333","103349","103357","103387","103391","103393","103399","103409","103421","103423","103451","103457","103471","103483","103511","103529","103549","103553","103561","103567","103573","103577","103583","103591","103613","103619","103643","103651","103657","103669","103681","103687","103699","103703","103723","103769","103787","103801","103811","103813","103837","103841","103843","103867","103889","103903","103913","103919","103951","103963","103967","103969","103979","103981","103991","103993","103997","104003","104009","104021","104033","104047","104053","104059","104087","104089","104107","104113","104119","104123","104147","104149","104161","104173","104179","104183","104207","104231","104233","104239","104243","104281","104287","104297","104309","104311","104323","104327","104347","104369","104381","104383","104393","104399","104417","104459","104471","104473","104479","104491","104513","104527","104537","104543","104549","104551","104561","104579","104593","104597","104623","104639","104651","104659","104677","104681","104683","104693","104701","104707","104711","104717","104723","104729"];

        // Error Checking
          if ((Argument.charAt(0) == "-") || ZeroTrim(Argument).search(/\./) != (-1) || Argument == "0" || Argument == "1")
            {
              Answer = "";
              alert(Warning);
            }
          else
            {
              // Check for easy divisions
                 if (((parseInt(Argument.charAt(Argument.length-1))) % 2 == 0) && (Argument != "2")) // is divisible by 2
                   { Answer = "FALSE"; }
                 if ((Argument.charAt(Argument.length-1) == "5") && (Argument != "5")) // is divisible by 5
                   { Answer = "FALSE"; }
                 DigitSum = 0;
                 for (Counter = 0; Counter < Argument.length; Counter++)
                   {
                     DigitSum = DigitSum + parseInt(Argument.charAt(Counter));
                   }
                 if ((DigitSum % 3 == 0) && (Argument != "3")) // is divisible by 3
                   { Answer = "FALSE"; }
                 if (Answer == "TRUE")
                    {
                      // Now we check a big array of primes
                         for(var PrimeCounter=0; PrimeCounter < (PrimeArray.length + 1); PrimeCounter++) // Is a divisor of the Argument in the array?
                           {
                             if (PrimeArray[PrimeCounter] == Argument) // if it's one of the primes in the list...
                               { return "TRUE"; }
                           }
                         for(var PrimeCounter=0; PrimeCounter < (PrimeArray.length + 1); PrimeCounter++) // Is a divisor of the Argument in the array?
                           {
                             if (DIV_MOD(PrimeArray[PrimeCounter],Argument,"MOD") == "0") // then a divisor has been found in the list
                               { return "FALSE"; }
                           }
                    }
              // If no easy shortcuts, then do it the hard way...
                 if (Answer == "TRUE")
                    // then the number is not divisible by any prime from the list, meaning
                    // it must be greater than the square of the highest prime on the list. 
                    // (a number is either a prime or divisible by primes and we just 
                    // finished checking a crapload of primes...)
                   {
                     // RollingNumber is the square of the highest prime on the list.
                     RollingNumber = Multiply(PrimeArray[PrimeArray.length-1],PrimeArray[PrimeArray.length-1]);
                     while ((IsLessThan(Multiply(RollingNumber,RollingNumber),Argument) == "TRUE") && (Answer == "TRUE"))
                       {
                         RollingNumber = CalculatorAdd(RollingNumber,"2"); // only odd numbers
                         if ((DIV_MOD(RollingNumber,Argument,"MOD") == "0") && (IsEqualTo(RollingNumber,Argument) == "FALSE"))
                           {
                             Answer = "FALSE";
                             // alert(Argument + " is evenly divided by " + RollingNumber); // uncomment this if you want to know the first divisor of Argument.
                           }
                       }
                   }
            }
        // Return Answer
           return Answer;
      }

    function SqrtFloor(Argument) // Returns the FLOOR of the Square Root of Argument
      {
        // Declare variables
           var Estimate = "";
           var ContinueLoop = "TRUE";
           var Warning = "NOTE:"
                         + "\n"
                         + "The Square Root function is designed"
                         + "\n"
                         + "only for non-negative numbers."
                         + "\n\n"
                         + "Negative arguments are not valid.";
        // If it's a non-negative number...
           if (Argument.charAt(0) == "-")
             {
               alert(Warning);
             }
           else
             {
               Estimate = "2";
               while (ContinueLoop == "TRUE")
                 {
                   Estimate = DIV_MOD("2",(CalculatorAdd(Estimate,DIV_MOD(Estimate,Argument,"DIV"))),"DIV");
                   if (IsEqualTo(Argument,Multiply(Estimate,Estimate)) == "TRUE")
                     { ContinueLoop = "FALSE"; }
                   if ((IsLessThan(Multiply(Estimate,Estimate),Argument) == "TRUE") && (IsGreaterThan(Multiply(CalculatorAdd(Estimate,"1"),CalculatorAdd(Estimate,"1")),Argument) == "TRUE"))
                     { ContinueLoop = "FALSE"; }
                 }
             }

        // Return Answer
           return Estimate;
      }

    function PerfectSquare(Argument) // Returns TRUE if the argument is a perfect square, otherwise FALSE
      {
        // Declare variables
           var Answer = "";
           var Warning = "NOTE:"
                         + "\n"
                         + "The IsPerfectSquare function is designed"
                         + "\n"
                         + "only for non-negative numbers."
                         + "\n\n"
                         + "Negative arguments are not valid.";
        // If it's a non-negative number...
           if (Argument.charAt(0) == "-")
             {
               alert(Warning);
             }
           else
             {
               Answer = IsEqualTo(Multiply(SqrtFloor(Argument),SqrtFloor(Argument)),Argument);
             }

        // Return Answer
           return Answer;
      }

