elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a la Factorización De Semiprimos (RSA)


  Mostrar Mensajes
Páginas: 1 ... 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 [66] 67 68 69 70 71 72 73 74 75 76 77 78 79 80
651  Programación / .NET (C#, VB.NET, ASP) / Re: Subir imagen con WebBrowser en: 19 Junio 2015, 23:02 pm
Hola compañero

Mira no te complique más. Como no me rindo facilmente, finalmente encontré la solución  :P. Por lo menos para conseguir pulsar el botón. En cuanto a tu pregunta por lo del servidor, sinceramente no lo se.


Código
  1. Public Class Form1
  2.  
  3.  
  4.  
  5.    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
  6.        WebBrowser1.ScriptErrorsSuppressed = True
  7.        WebBrowser1.Navigate("http://www2.yapo.cl/ai/form/7?ca=15_s")
  8.    End Sub
  9.  
  10.    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  11.  
  12.        Dim clElement As HtmlElementCollection = WebBrowser1.Document.GetElementsByTagName("Input")
  13.        For Each Element As HtmlElement In clElement
  14.            Dim controlName As String = Element.GetAttribute("input").ToString
  15.            If Element.GetAttribute("name").Equals("file") Then
  16.                Element.InvokeMember("click")
  17.            End If
  18.        Next
  19.    End Sub
  20. End Class



Explico como lo he averiguado.

Se me ocurrió que era mejor guardar la página web y luego analizarla. Tras guardarla la he abierto con el vb.net como web y justo donde está el botón hay controles uno encima de otro. Los separé, y conseguí determinar realmente cual es el control a llamar. Para ello guardé los cambios y luego lo abrí con el Google Chrome sin conexión  para determinar cual era realmente el que abre el cuadro. No es visible pero se detecta al pasar el ratón porque se pone el dedo. Después le doy con el botón derecho del ratón y hago clic en Inspeccionar y Chrome me muestra el código exácto que hace referencia al mismo.

Código
  1. <input multiple="multiple" type="file" name="file" style="height: 46px; position: absolute; right: 18px; top: 50px; font-family: Arial; font-size: 118px; margin: 0px; padding: 0px; cursor: pointer; opacity: 0; width: 1925px;">


No encontraba el control porque no es visible desde el webbrowser al obtener el código de la página al conectarse online. Si no ubiera guardado la página para analizarla no lo hubiera encontrado.

El control se crea desde un archivo de jscript que se descarga en el caché que se llama ai.js:

Código
  1. e=document.createElement("input");this._options.multiple&&e.setAttribute("multiple","multiple"),this._options.acceptFiles&&e.setAttribute







652  Programación / .NET (C#, VB.NET, ASP) / Re: Subir imagen con WebBrowser en: 19 Junio 2015, 19:35 pm
A ver si lo consigues



He encontrado esto, creo que es lo que buscas. Ahora no lo no puedo mirar yo. A ver si te sirve


https://support.microsoft.com/en-us/kb/315832
653  Programación / .NET (C#, VB.NET, ASP) / Obtener subida y bajada de Internet en Megabytes en: 19 Junio 2015, 17:39 pm
Hola

Me gustaría saber como puedo, con VB.NET, obtener los megabytes de datos de bajada y subida a través de mi conexión de Internet.

Gracias



He encontrado este código en la ayuda de vb.net. Si se mete en un timer al entrar en una nueva web los valores aumentan, porque me da unos números que representan paquetes recibidos creo. Pero no se es esto lo que busco, ni qué representan estos valores.

Código
  1.    Dim properties As IPGlobalProperties = IPGlobalProperties.GetIPGlobalProperties()
  2.        Dim ipstat As IPGlobalStatistics = properties.GetIPv4GlobalStatistics()
  3.        Label1.text= "Inbound Packet Data: "  & ipstat.ReceivedPackets
  4.        Label2.text= "Forwarded: " & ipstat.ReceivedPacketsForwarded
  5.        Label3.text= "Delivered: " &  ipstat.ReceivedPacketsDelivered
  6.        Label4.text= "Discarded: " &  ipstat.ReceivedPacketsDiscarded
  7.  
  8.  

https://msdn.microsoft.com/en-us/library/system.net.networkinformation.ipglobalstatistics.receivedpackets%28v=vs.110%29.aspx



Finalmente parece que encontré la respueta:

Código
  1.     Dim ipv4Stats As System.Net.NetworkInformation.IPv4InterfaceStatistics
  2.        ipv4Stats = System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces(0).GetIPv4Statistics
  3.        Label6.Text = ipv4Stats.BytesReceived.ToString
  4.        Label7.Text = ipv4Stats.BytesSent.ToString
  5.  

fuente:
http://www.sevenforums.com/network-sharing/193986-question-about-packets-bytes-sent-received-n-work-connection.html

Se obtiene la misma información que aquí:



Sl2
654  Programación / .NET (C#, VB.NET, ASP) / Navegar con WebBrowser sin alojar archivos en caché en: 19 Junio 2015, 17:17 pm
buenas
Me gustaría poder usar WebBrowser sin alojar nada en el caché. Sólo para obtener información de una página como links o código, pero sin alojar, cookies,  imágenes, scripts, etc en el disco. Es decir, que no se descargue nada en disco.

Es posible usar Webbrowser sin crear el control Webbrowser:

Código
  1. Dim WB as new WebBrowser

No se si al utilizar este sistema ser alojan archivos en el disco o no.

Sl2
655  Programación / .NET (C#, VB.NET, ASP) / Re: Leer datos de una tabla html en: 19 Junio 2015, 03:33 am
Bien Elektro, seguiré tu consejo.

Al final he encontrado una manera más elegante de obtener el listado de la tabla. Curiosamente al intentar ayudar a otro usuario que trata de loguear y accionar un botón de una web. Antes intentaba encontrar conseguir el atributo "class" y no funcionaba, pues resulta que se llama usando el término "classname".


Código
  1.  
  2. Dim doc As HtmlDocument = WebBrowser1.Document
  3.        Dim divs As HtmlElementCollection = doc.GetElementsByTagName("td")
  4.        For Each div As HtmlElement In divs
  5.            If div.GetAttribute("classname") = "Pais" Then
  6.                ListBox1.Items.Add(div.InnerText)
  7.            End If
  8.        Next


y otra forma, esta. Pero solo obtiene el primero, porque no repasa cada elemento

Código
  1.     Dim ele = webbrowser1.Document.GetElementsByTagName("td").Cast(Of HtmlElement).First(Function(el) el.GetAttribute("classname") = "Pais")
  2.        ListBox1.Items.Add(ele.InnerText)

y aunque en el ejemplo uso el control Webbrowser1 se puede crear una variable objeto como un webbrowser



656  Programación / .NET (C#, VB.NET, ASP) / Re: Subir imagen con WebBrowser en: 19 Junio 2015, 00:55 am
Genial, esto andaba buscando, ya tenía más o menos una idea pero con esto me queda más claro.

Ahora lo que me está rompiendo la cabeza es el tema del botón para subir imágenes, no puedo hacerlo funcionar de ninguna manera.

Hay alguna forma de hacerlo funcionar?.

Saludos y muchas gracias por tu tiempo

Pues ahora mismo estaba yo intentándolo  :xD

El código html que hacer referencia a ese botón es este:

Código
  1. <div class="rightcol">
  2. <div class="images_container">
  3. <div class="line single-image">
  4. <ul id="uploaded_images" class="list_ai-images"></ul>
  5. <div id="wrapper_image_upload_button" class="wrapper_image_upload_button">
  6. <div class="title">
  7. <label class="ipt_label img-txt">Imagen principal</label>
  8. </div>
  9. <div class="image">
  10. <span id="image_upload_button" class="image_upload_button">Agregar imágenes</span>
  11. </div>
  12. </div>
  13. </div>
  14. <span id="err_extra_image" class="validation_msg success" style="display:none;">
  15.  
  16. </span>

Estoy rompiéndome la cabeza intentando accionarlo pero no lo consigo. Hay que encontrar la forma de hacer referencia al mismo y accionarlo.

Más abajo hay un Script que como te decía (que era lo que creía que querías hacer), es lo que genera el cuadro

Código
  1. <script type="text/javascript">
  2. var ai_images = [];
  3. var ai_images_on_init = true;
  4. var ai_images_button = null;
  5. var max_allowed_images=5;
  6. var state = null;
  7. var submitted = 0;
  8. var completed = 0;
  9.  
  10. $(document).ready(function () {
  11. state = $('#image_upload_status');
  12.  
  13. $('.ipt_radio.main_image').on('change', function(){
  14. $('.ipt_radio.main_image').parent().parent().removeClass('checked');
  15. $(this).parent().parent().addClass('checked');
  16. });
  17.  
  18. ....
  19.  





Pues no he conseguido clicar el botón pero he descubierto algo muy curioso. Se me ocurrió que debería de haber algunar manera de invocar el Script para que se ejecutara y se mostrara el cuadro. En dicho Scritp hay unas funciones y es posible reproducirlas.

En el Script hay la siguiente función:

Código
  1. function ai_image_add(filename, thumbnail_digest, digest_present) {
  2. var index = ai_images.length;
  3. if (filename == "") return;
  4. ai_images[index] = {
  5. 'file': filename,
  6. 'thumbnail_digest': (thumbnail_digest == '' ? 'EMPTYDIGEST' : thumbnail_digest),
  7. 'digest_present': digest_present
  8. };
  9. ai_image_insert_before(index);
  10. ai_image_insert(index);
  11. completed++;
  12. submitted++;
  13.  
  14. }


y para ejecutarla desde el Webbrowser se hace lo siguiente:


Código
  1.    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
  2.        If (Not (WebBrowser1.Document Is Nothing)) Then
  3.            Dim ObjArr(2) As Object
  4.            ObjArr(0) = CObj(New String("file:///c:\...")) '<---Se supones que aquí va el directorio de la imagen
  5.            ObjArr(1) = CObj(New String(""))
  6.            ObjArr(2) = CObj(New String(""))
  7.            WebBrowser1.Document.InvokeScript("ai_image_add", ObjArr)
  8.        End If
  9.  
  10.    End Sub


La función es: function ai_image_add(filename, thumbnail_digest, digest_present)

  ObjArr(0) representa al valor filename
  ObjArr(1) representa al valor thumbnail_digest
  ObjArr(2) representa al valor  digest_present

Al hacer clic en el botón se crea en la página un cuadrito en la que se supone que debería estar la imagen pero no se carga. Si siges haciendo clic siguen creandose cuadritos.


Pero es mera curiosidad.
657  Programación / .NET (C#, VB.NET, ASP) / Re: Subir imagen con WebBrowser en: 19 Junio 2015, 00:18 am
Perdona, entendí mal, pensaba que querías hacer el cuadro tu mismo  :-\

Lo que tu quieres lo suelen llamar 'loguear una web'. Consiste en automatizar una serie de acciones como rellenar cuadros de contraseñas  y hacer clics en botones y checkboxs.

Debes obtener el código de la página para obtener el ID del control de la páginas que quieres "atacar". Puedes hacerlo mediante código, en plan complicado o simplemente entras con tu navegador habitual y pulsas con le botón derecho del ratón en cualquier lugar y cuando salga el menú emergente selecciona "Ver código fuente". Luego buscas el ID o el Valor del control con el que quieras interactuar con el.

Del link que has facilitado he sacado esto que hace referencia a los botones de aquí se saca la información para poder hacer referencia a los botones y otros controles desde nuestro programa.

   
Código
  1. <!-- BEGIN SUBMIT FORM -->
  2. <div class="footer-ai">
  3. <input id="submit_preview" class="btn btn-primary visualize" name="validate" type="submit" value="Vista previa">
  4. <input id="submit_create_now" class="btn btn-primary publish_now" name="create" type="submit" value="Publicar ahora">
  5. </div>
  6. <!-- END SUBMIT FORM -->


Ahora, una vez encontrada la información en VB.NET mete el siguiente código (el de arriba no, el de abajo), que como verás para hacer referencia al botón 'Publicar ahora' he usado el valor '"Publicar ahora':


Crea dos botones y un control Webbrowser

Código
  1. Public Class Form1
  2.  
  3.  
  4.    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
  5.        WebBrowser1.Navigate("http://www2.yapo.cl/ai/form/7?ca=15_s")
  6.    End Sub
  7.  
  8.    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  9.  
  10.        'Marca el checkbox "[x]Estoy de acuerdo con los Términos y Condiciones"
  11.        Dim theElementCollection As HtmlElementCollection = WebBrowser1.Document.GetElementsByTagName("Input")
  12.  
  13.        '<input class="ipt_checkbox" id="accept_conditions" name="ai_accept_conditions"  type="checkbox">  
  14.        theElementCollection = WebBrowser1.Document.GetElementsByTagName("Input")
  15.        For Each curElement As HtmlElement In theElementCollection
  16.            Dim controlName As String = curElement.GetAttribute("id").ToString
  17.            If controlName = "accept_conditions" Then
  18.                curElement.SetAttribute("checked", "1")
  19.            End If
  20.        Next
  21.    End Sub
  22.  
  23.    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
  24.        Dim theElementCollection As HtmlElementCollection = WebBrowser1.Document.GetElementsByTagName("Input")
  25.  
  26.        ' Simula el clic en el botón
  27.        '<input id="submit_create_now" class="btn btn-primary publish_now" name="create" type="submit" value="Publicar ahora">
  28.        theElementCollection = WebBrowser1.Document.GetElementsByTagName("Input")
  29.        For Each curElement As HtmlElement In theElementCollection
  30.            If curElement.GetAttribute("value").Equals("Publicar ahora") Then
  31.                curElement.InvokeMember("click")
  32.                'javascript has a click method for we need to invoke on the current submit button element.  
  33.            End If
  34.        Next
  35.    End Sub
  36. End Class


- La línea  de código html de la página que hace referencia al checkbox de aceptar las condiciones es:

Código
  1. <input class="ipt_checkbox" id="accept_conditions" name="ai_accept_conditions"  type="checkbox">  

Para activarlo he necesitado el ID = accept_conditions

Y se activa al pulsar el button1.

La línea de código html de la página que hace referencia al botón "Publicar Ahora" es:

Código
  1.        '<input id="submit_create_now" class="btn btn-primary publish_now" name="create" type="submit" value="Publicar ahora">


He necesitado   el valor  "Publicar ahora" para accionarlo como puedes comprobar en el código para el Button2. Al pulsar Button2 se accionará el botón de la página.


Si quieres que de forma automática al entrar se active el checkbox y se pulse el botón, metes el código en el evento WebBrowser1_DocumentCompleted

Código
  1. Public Class Form1
  2.  
  3.  
  4.    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
  5.        WebBrowser1.Navigate("http://www2.yapo.cl/ai/form/7?ca=15_s")
  6.    End Sub
  7.  
  8.  
  9.    Private Sub WebBrowser1_DocumentCompleted(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
  10.  
  11.  
  12.        Dim theElementCollection As HtmlElementCollection = WebBrowser1.Document.GetElementsByTagName("Input")
  13.  
  14.        'Marca el checkbox "[x]Estoy de acuerdo con los Términos y Condiciones"
  15.        '<input class="ipt_checkbox" id="accept_conditions" name="ai_accept_conditions"  type="checkbox">  
  16.        theElementCollection = WebBrowser1.Document.GetElementsByTagName("Input")
  17.        For Each curElement As HtmlElement In theElementCollection
  18.            Dim controlName As String = curElement.GetAttribute("id").ToString
  19.            If controlName = "accept_conditions" Then
  20.                curElement.SetAttribute("checked", "1")
  21.            End If
  22.        Next
  23.  
  24.        ' Simula el clic en el botón
  25.        '<input id="submit_create_now" class="btn btn-primary publish_now" name="create" type="submit" value="Publicar ahora">
  26.        theElementCollection = WebBrowser1.Document.GetElementsByTagName("Input")
  27.        For Each curElement As HtmlElement In theElementCollection
  28.            If curElement.GetAttribute("value").Equals("Publicar ahora") Then
  29.                curElement.InvokeMember("click")
  30.                'javascript has a click method for we need to invoke on the current submit button element.  
  31.            End If
  32.        Next
  33.    End Sub
  34. End Class


Con los demás  controles de la página pues lo mismo.  Para cuadros de texto:


Código
  1.  
  2.  
  3.        theElementCollection = WebBrowser1.Document.GetElementsByTagName("Input")
  4.        For Each curElement As HtmlElement In theElementCollection
  5.            Dim controlName As String = curElement.GetAttribute("id").ToString
  6.            If controlName = [ID_OBJETO] Then
  7.                curElement.SetAttribute("Value", [TEXTO])
  8.            End If
  9.        Next


Sl2
658  Programación / .NET (C#, VB.NET, ASP) / Re: Subir imagen con WebBrowser en: 18 Junio 2015, 21:14 pm
Yo creo que este cuadro debe ser alguna aplicación html, un script o algo así que se crea con la página y  no cosa del navegador. Es decir que se debe de hacer en creación de páginas web y no con un control como el webbrowser, ya que el webbrowser es sólo una herramienta para visualizar páginas web e interactuar con ellas, como obtener el código de la misma y datos, valores o logear


Abre el Notepad (en windows) y mete este código. Luego lo guardas con extensión HTML:


Código
  1. <html>
  2. <head>
  3. <title>intento de msg box</title>
  4. <STYLE type="text/css">
  5. #mantonegro{
  6. display:none;
  7. position:absolute;
  8. top:0;
  9. left:0;
  10. background-color: #000000;
  11. width:2000;
  12. height:3000;
  13. filter:alpha(opacity=72);
  14. z-index:0;
  15. }
  16. #dthing{
  17. display:none;
  18. position:absolute;
  19. top:70;
  20. left:120;
  21. background-color: #CAE0F0;
  22. z-index:0;
  23. }
  24. </STYLE>
  25.  
  26. </head>
  27. <body onload='alert("bienvenidos a Mi Web, dejen su comentario");'>
  28. <h1>TITULO</h1>
  29. <br>
  30. </div>
  31.  
  32.  
  33. </body>
  34. </html>  

Al poner esto :
<body onload='alert("bienvenidos a Mi Web, dejen su comentario");'>

se muestra un cuadro de mensaje

Pues el cuadro que tu nombras debe de conseguirse  con código html o complementos del mismo. Dicho cuadro envía la imagen a algún disco duro en alguna parte para ser usado por el servidor.


No se, pregunta en Desarrollo web, a ver
http://foro.elhacker.net/desarrollo_web-b7.0/

659  Programación / Programación Visual Basic / Re: Salvar JPG con mucho menos peso sin perder calidad en: 18 Junio 2015, 19:41 pm
Hola de nuevo
Perdonad que me meta en vuestro intercambio de pareceres  :P

Repito lo que te dije Fran1946 tiempo atrás, si no quieres depender de mspaint, puedes usar las funciones GDI que se encuentran el gdi32.dll de windows, que no hace falta instalar porque va con el SO. Creo que en todas las versiones, en w98 o Me, no tengo ni idea, pero quien uso eso ya.

Como te dije no conozco mucho el tema del GDI, lo tengo pendiente. Por ahora solo tengo esto que si que he podido mirar. Como muestra que este es el camino si no me equivoco, o por lo menos uno más. A no ser que diseñes tu propio sistema de compresión.

https://mega.co.nz/#!zd8lkJZb!7tjONqVuRwIrBsp7SfbfzNDUTZIazreQXEoLP1XLvXI

Para cualquier duda sobre este código, puedes preguntarme



Ejemplo sencillo del uso de GDI para cambiar la intensidad de color.  


ca.caColorfulness = -100  'Convierte la imagen a blanco y negro


Código
  1. Private Type COLORADJUSTMENT
  2.        caSize As Integer
  3.        caFlags As Integer
  4.        caIlluminantIndex As Integer
  5.        caRedGamma As Integer
  6.        caGreenGamma As Integer
  7.        caBlueGamma As Integer
  8.        caReferenceBlack As Integer
  9.        caReferenceWhite As Integer
  10.        caContrast As Integer
  11.        caBrightness As Integer
  12.        caColorfulness As Integer
  13.        caRedGreenTint As Integer
  14. End Type
  15.  
  16. Private Declare Function SetColorAdjustment Lib "gdi32" _
  17. (ByVal hdc As Long, _
  18. lpca As COLORADJUSTMENT) As Long
  19. Private Declare Function SetStretchBltMode Lib "gdi32" _
  20. (ByVal hdc As Long, _
  21. ByVal nStretchMode As Long) As Long
  22. Private Declare Function GetColorAdjustment Lib "gdi32" _
  23. (ByVal hdc As Long, _
  24. lpca As COLORADJUSTMENT) As Long
  25. Private Declare Function StretchBlt Lib "gdi32" _
  26. (ByVal hdc As Long, _
  27. ByVal x As Long, _
  28. ByVal y As Long, ByVal nWidth As Long, _
  29. ByVal nHeight As Long, _
  30. ByVal hSrcDC As Long, _
  31. ByVal xSrc As Long, _
  32. ByVal ySrc As Long, _
  33. ByVal nSrcWidth As Long, _
  34. ByVal nSrcHeight As Long, _
  35. ByVal dwRop As Long) As Long
  36.  
  37. Const HALFTONE = 4
  38. Dim Imagen As StdPicture
  39. Private Sub Form_Load()
  40. 'Valores para el HScroll
  41. HScroll1.Max = 100
  42. HScroll1.Min = -100
  43. HScroll1.Value = 0
  44.  
  45. CommonDialog1.ShowOpen
  46. CommonDialog1.Filter = "*.jpg file|*.jpg"
  47.  
  48. 'Abre el cuadro de diálogo abrir y mete la imagen en la variable 'Imagen'
  49. If Len(CommonDialog1.FileName) > 0 Then
  50. Set Imagen = LoadPicture(CommonDialog1.FileName)
  51. End If
  52.  
  53. 'Valores para el Picture
  54. Picture1.AutoRedraw = True
  55. Picture1.ScaleMode = vbPixels
  56. Picture1.Picture = Imagen
  57.  
  58. End Sub
  59.  
  60. Private Sub HScroll1_Scroll()
  61. Dim ca As COLORADJUSTMENT
  62.    With Picture1
  63.       .Picture = Imagen 'Linea necesaria para actualizar la imagen
  64.        SetStretchBltMode .hdc, HALFTONE 'No borrar
  65.        GetColorAdjustment .hdc, ca 'No borrar
  66.        ca.caColorfulness = HScroll1.Value 'Cambia el  valor de color de la imagen
  67.        SetColorAdjustment .hdc, ca  'No borrar
  68.        StretchBlt .hdc, 0, 0, .ScaleWidth, .ScaleHeight, .hdc, 0, 0, .ScaleWidth, .ScaleHeight, vbSrcCopy
  69.        .Refresh
  70.    End With
  71. End Sub
660  Programación / .NET (C#, VB.NET, ASP) / Re: Leer datos de una tabla html en: 18 Junio 2015, 19:13 pm
El código que has mostrado está bastante vb6-estilizado.

En lugar de la función InStr, puedes utilizar la función String.IndexOf()

En lugar de la constante vbCrLf, puedes usar la constante ControlChars.CrLf

Saludos!

Gracias elektro, por la información. No sabía lo de ControlChars.Crlf, pero si uso vbCrlf ¿tampoco pasa nada no?. Quiero decir, que no afecta en nada al programa, supongo. Es más, se me ocurre que también se podría usar ChrW(13).

En cuanto a lo de String.IndexOf, eso si que lo sabía. Ahora me doy cuenta que también sirve  :P
Páginas: 1 ... 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 [66] 67 68 69 70 71 72 73 74 75 76 77 78 79 80
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines