LaTeX interprété par Java

LaTeX interprété par Java - Java - Programmation

Marsh Posté le 26-03-2004 à 21:30:52    

Aurrait-il un moyen de traiter des formules LaTeX dans du Java. Le but est de pouvoir afficher des formules dans une page XHTML.

Reply

Marsh Posté le 26-03-2004 à 21:30:52   

Reply

Marsh Posté le 26-03-2004 à 21:34:22    

J'ai entendu parlé y'a qq temps d'un système qui s'appelle NTS... mais je n'ai jamais essayé... donc à tes risques et périls ...
 

Citation :


Sur CTAN, dans systems/nts, on trouve un
ntsbase-1.0-beta.zip et son readme, qui datent de 2001.

Reply

Marsh Posté le 17-08-2008 à 22:13:20    

Bonjour,
 
Ce fil date un peu, mais au cas où cela puisse aider quelqu'un dans le futur...
 
Mimetex (http://www.forkosh.com/mimetex.html) permet :
(i) d'être utilisé directement à partir de code HTML sous forme de CGI-BIN,
(ii) d'être appelé depuis une application Java pour générer des images à la volée, affichables par exemple dans des JLabel.
 
Un exemple de (i) figure au bout du lien ci-dessus. Je tiens un exemple de (ii) à disposition de toute personne intéressée.
 
Cordialement,
 
Nicolas
 

Reply

Marsh Posté le 16-01-2010 à 14:59:48    

Bonjour,
 
Suite à une demande par mél privé, ci-dessous le code correspondant à (ii).
Le fichier doit être appelé Exemple106_MimetexInterface.java
Dans le code, remplacer  

Code :
  1. final private static String MIMETEX_EXE = "c:\\Program Files\\mimetex\\mimetex.exe";


par le bon chemin.
Le fichier est alors normalement compilable et exécutable. Il contient un "main" de démonstration.
 
Cordialement,
 
Nicolas
 

Code :
  1. import java.awt.*;
  2. import java.io.*;
  3. import java.util.ArrayList;
  4. import javax.swing.*;
  5. // appeler le fichier Exemple106_MimetexInterface.java
  6. // dimanche 17 août 2008
  7. // Nicolas_75
  8. // http://forum.hardware.fr/hfr/Progr [...] 8593_1.htm
  9. /**
  10. * Classe permettant d'utiliser Mimetex pour transformer du code LaTeX en image GIF
  11. */
  12. public class Exemple106_MimetexInterface {
  13.    
  14.     final private static String MIMETEX_EXE = "c:\\Program Files\\mimetex\\mimetex.exe";
  15.    
  16.     final private static int BUFFER_SIZE = 1024;
  17.    
  18.     /**
  19.      * Transforme un code LaTeX en image GIF
  20.      * @param latexString code LaTeX
  21.      * @return image GIF sous forme de byte[]
  22.      */
  23.     public static byte[] getLaTeXImage(String latexString) {
  24.         byte[] imageData = null;
  25.         try {
  26.             // on demande à mimetex (en ligne de commande) de convertir
  27.             // l'expression LaTeX en .gif sur la sortie standard :
  28.             Process proc = Runtime.getRuntime().exec(MIMETEX_EXE+" -d \""+latexString+"\"" );
  29.             // on récupère le flux de sortie du processus :
  30.             BufferedInputStream bis = (BufferedInputStream) proc.getInputStream();
  31.             // on lit le flux de sortie par bloc de bytes d'une longueur de BUFFER_SIZE
  32.             // et on stocke tout cela dans une ArrayList de byte|] :
  33.             byte[] buffer = new byte[BUFFER_SIZE];
  34.             int bytesRead = 0;
  35.             ArrayList<byte[]> al = new ArrayList<byte[]>();
  36.             while ((bytesRead = bis.read(buffer)) != -1) {
  37.                 al.add(buffer.clone());
  38.             }
  39.             // on convertir l'ArrayList en tableau unique :
  40.             int nbOfArrays = al.size();
  41.             if (nbOfArrays==1) {
  42.                 imageData = buffer;
  43.             } else {
  44.                 imageData = new byte[BUFFER_SIZE*nbOfArrays];
  45.                 byte[] temp;
  46.                 for (int k=0; k<nbOfArrays; k++) {
  47.                     temp = al.get(k);
  48.                     for (int i=0; i<BUFFER_SIZE; i++) {
  49.                         imageData[BUFFER_SIZE*k+i] = temp[i];
  50.                     }
  51.                 }
  52.             }
  53.             bis.close();
  54.             proc.destroy();
  55.         } catch (IOException e) {
  56.             e.printStackTrace();
  57.         }
  58.         return imageData;
  59.     }
  60.    
  61.     /**
  62.      * main() de démonstration
  63.      * @param args arguments de la ligne de commande
  64.      */
  65.     public static void main(String[] args) {
  66.         JFrame jframe = new JFrame();
  67.         jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  68.         jframe.setLayout(new BorderLayout());
  69.        
  70.         String LATEX_EXPRESSION_1 = "4$A=\\(\\array{3,c.cccBCCC$&1&2&3\\\\\\hdash~1&a_{11}&a_{12}&a_{13}\\\\2&a_{21}&a_{22}&a_{23}\\\\3&a_{31}&a_{32}&a_{33}}\\) ";
  71.         byte[] imageData1 = getLaTeXImage(LATEX_EXPRESSION_1);
  72.         JLabel button1 = new JLabel(new ImageIcon(imageData1));
  73.         jframe.add(button1, BorderLayout.NORTH);
  74.        
  75.         String LATEX_EXPRESSION_2 = "4$\\array{rccclBCB$&f&\\longr[75]^{\\alpha:{-1$f\\rightar~g}}&g\\\\3$\\gamma&\\longd[50]&&\\longd[50]&3$\\gamma\\\\&u&\\longr[75]_\\beta&v}";
  76.         byte[] imageData2 = getLaTeXImage(LATEX_EXPRESSION_2);
  77.         JLabel button2 = new JLabel(new ImageIcon(imageData2));
  78.         jframe.add(button2, BorderLayout.CENTER);
  79.        
  80.         String LATEX_EXPRESSION_3 = "4$\\hspace{5}\\unitlength{1}\\picture(175,100){~(50,50){\\circle(100)}(1,50){\\overbrace{\\line(46)}^{4$\\;\\;a}}(52,50) {\\line(125)}~(50,52;115;2){\\mid}~(52,55){\\longleftar[60]}(130,56){\\longrightar[35]}~(116,58){r}~(c85,50;80;2){\\bullet} (c85,36){3$-q}~(c165,36){3$q}(42,30){\\underbrace{\\line(32)}_{1$a^2/r\\;\\;\\;}}~}";
  81.         byte[] imageData3 = getLaTeXImage(LATEX_EXPRESSION_3);
  82.         JLabel button3 = new JLabel(new ImageIcon(imageData3));
  83.         jframe.add(button3, BorderLayout.SOUTH);
  84.        
  85.         jframe.pack();
  86.         jframe.setLocationRelativeTo(null);
  87.         jframe.setVisible(true);
  88.     }
  89. }

Reply

Marsh Posté le 17-01-2010 à 10:24:22    

Le résultat est vraiment impressionnant ! C'est exactement ce dont j'avais besoin.

Reply

Marsh Posté le 18-03-2013 à 22:25:30    

Résultat du code précédent :  
http://content.screencast.com/users/Nicolas98/folders/Jing/media/a985ac1d-c4dc-4bf4-9243-56aad71b1bbc/mimetex.png


Message édité par Nicolas_75 le 18-03-2013 à 22:26:29
Reply

Marsh Posté le 18-03-2013 à 22:44:08    

Une autre solution : JLateXMath
( http://forge.scilab.org/index.php/p/jlatexmath/ )
 

Code :
  1. import java.awt.FlowLayout;
  2. import java.awt.image.BufferedImage;
  3. import javax.swing.ImageIcon;
  4. import javax.swing.JFrame;
  5. import javax.swing.JLabel;
  6. import org.scilab.forge.jlatexmath.TeXConstants;
  7. import org.scilab.forge.jlatexmath.TeXFormula;
  8. import org.scilab.forge.jlatexmath.TeXIcon;
  9. public class Exemple128_JLatexMath {
  10.     public static void main(String[] args) {
  11.         String math = "\\begin{array}{l}";
  12. math += "\\forall\\varepsilon\\in\\mathbb{R}_+^*\\ \\exists\\eta>0\\ |x-x_0|\\leq\\eta\\Longrightarrow|f(x)-f(x_0)|\\leq\\varepsilon\\\\";
  13. math += "\\det\\begin{bmatrix}a_{11}&a_{12}&\\cdots&a_{1n}\\\\a_{21}&\\ddots&&\\vdots\\\\\\vdots&&\\ddots&\\vdots\\\\a_{n1}&\\cdots&\\cdots&a_{nn}\\end{bmatrix}\\overset{\\mathrm{def}}{=}\\sum_{\\sigma\\in\\mathfrak{S}_n}\\varepsilon(\\sigma)\\prod_{k=1}^n a_{k\\sigma(k)}\\\\";
  14. math += "\\sideset{_\\alpha^\\beta}{_\\gamma^\\delta}{\\begin{pmatrix}a&b\\\\c&d\\end{pmatrix}}\\\\";
  15. math += "\\int_0^\\infty{x^{2n} e^{-a x^2}\\,dx} = \\frac{2n-1}{2a} \\int_0^\\infty{x^{2(n-1)} e^{-a x^2}\\,dx} = \\frac{(2n-1)!!}{2^{n+1}} \\sqrt{\\frac{\\pi}{a^{2n+1}}}\\\\";
  16. math += "\\int_a^b{f(x)\\,dx} = (b - a) \\sum\\limits_{n = 1}^\\infty  {\\sum\\limits_{m = 1}^{2^n  - 1} {\\left( { - 1} \\right)^{m + 1} } } 2^{ - n} f(a + m\\left( {b - a} \\right)2^{-n} )\\\\";
  17. math += "\\int_{-\\pi}^{\\pi} \\sin(\\alpha x) \\sin^n(\\beta x) dx = \\textstyle{\\left \\{ \\begin{array}{cc} (-1)^{(n+1)/2} (-1)^m \\frac{2 \\pi}{2^n} \\binom{n}{m} & n \\mbox{ odd},\\ \\alpha = \\beta (2m-n) \\\\ 0 & \\mbox{otherwise} \\\\ \\end{array} \\right .}\\\\";
  18. math += "L = \\int_a^b \\sqrt{ \\left|\\sum_{i,j=1}^ng_{ij}(\\gamma(t))\\left(\\frac{d}{dt}x^i\\circ\\gamma(t)\\right)\\left(\\frac{d}{dt}x^j\\circ\\gamma(t)\\right)\\right|}\\,dt\\\\";
  19. math += "\\begin{array}{rl} s &= \\int_a^b\\left\\|\\frac{d}{dt}\\vec{r}\\,(u(t),v(t))\\right\\|\\,dt \\\\ &= \\int_a^b \\sqrt{u'(t)^2\\,\\vec{r}_u\\cdot\\vec{r}_u + 2u'(t)v'(t)\\, \\vec{r}_u\\cdot\\vec{r}_v+ v'(t)^2\\,\\vec{r}_v\\cdot\\vec{r}_v}\\,\\,\\, dt. \\end{array}\\\\";
  20. math += "\\end{array}";
  21.         TeXFormula fomule = new TeXFormula(math);
  22.         TeXIcon ti = fomule.createTeXIcon(TeXConstants.STYLE_DISPLAY, 30);
  23.         BufferedImage b = new BufferedImage(ti.getIconWidth(), ti.getIconHeight(), BufferedImage.TYPE_4BYTE_ABGR);
  24.         ti.paintIcon(new JLabel(), b.getGraphics(), 0, 0);
  25.         //
  26.         JFrame maFrame = new JFrame();
  27.         maFrame.setResizable(false);
  28.         maFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  29.         maFrame.setSize(400, 400);
  30.         maFrame.getContentPane().setLayout(new FlowLayout());
  31.         maFrame.getContentPane().add(new JLabel(new ImageIcon(b)));
  32.         maFrame.pack();
  33.         maFrame.setVisible(true);
  34.     }
  35. }


 
Résultat :
http://content.screencast.com/users/Nicolas98/folders/Jing/media/1b7a100f-1205-403f-895e-5f40a82089d5/JLatexMath.png
 
Nicolas

Reply

Marsh Posté le 22-03-2014 à 22:17:54    

Une autre solution pour produire une image PNG depuis LaTeX si LaTeX (par exemple MiKTeX) est installé sur votre ordinateur...
 
Le package standalone de LaTeX permet de produire un fichier output .png collant à la taille des formules ou du texte.
Il suffit alors d'exécuter LaTeX depuis Java, en récupérant le fichier ainsi produit.
 
1. Prérequis
 
LaTeX est installé sur l'ordinateur
... avec tous les packages nécessaires pour les formules (dans l'exemple ci-dessous : amsfonts et amsmath)
... avec le package standalone
 
GhostScript est installé (nécessaire pour standalone)
Ajouter au PATH le répertoire contenant gswin32c.exe.
Chez moi : C:\Program Files (x86)\gs\gs9.10\bin
 
ImageMagick est installé (nécessaire pour standalone)
convert.exe a été renommé en imgconvert.exe
Ajouter au PATH le répertoire contenant imgconvert.exe
Chez moi : C:\Program Files (x86)\ImageMagick-6.8.8-9
 
2. S'assurer que LaTeX avec le package standalone (sans Java) parvient à générer le fichier PNG
 
Référence : http://tex.stackexchange.com/quest [...] s-possible  
 
Document LaTeX, appelé, par exemple New21.tex

Code :
  1. \documentclass[border=0.50001bp,convert={convertexe={imgconvert},outext=.png}]{standalone}
  2. \usepackage{amsfonts}
  3. \usepackage{amsmath}
  4. \begin{document}
  5. $\begin{array}{l}
  6. \forall\varepsilon\in\mathbb{R}_+^*\ \exists\eta>0\ |x-x_0|\leq\eta\Longrightarrow|f(x)-f(x_0)|\leq\varepsilon\\
  7. \det\begin{bmatrix}a_{11}&a_{12}&\cdots&a_{1n}\\a_{21}&\ddots&&\vdots\\\vdots&&\ddots&\vdots\\a_{n1}&\cdots&\cdots&a_{nn}\end{bmatrix}\overset{\mathrm{def}}{=}\sum_{\sigma\in\mathfrak{S}_n}\varepsilon(\sigma)\prod_{k=1}^n a_{k\sigma(k)}\\
  8. {\sideset{_\alpha^\beta}{_\gamma^\delta}{\mathop{\begin{pmatrix}a&b\\c&d\end{pmatrix}}}}\\
  9. \int_0^\infty{x^{2n} e^{-a x^2}\,dx} = \frac{2n-1}{2a} \int_0^\infty{x^{2(n-1)} e^{-a x^2}\,dx} = \frac{(2n-1)!!}{2^{n+1}} \sqrt{\frac{\pi}{a^{2n+1}}}\\
  10. \int_a^b{f(x)\,dx} = (b - a) \sum\limits_{n = 1}^\infty  {\sum\limits_{m = 1}^{2^n  - 1} {\left( { - 1} \right)^{m + 1} } } 2^{ - n} f(a + m\left( {b - a} \right)2^{-n} )\\
  11. \int_{-\pi}^{\pi} \sin(\alpha x) \sin^n(\beta x) dx = \textstyle{\left \{ \begin{array}{cc} (-1)^{(n+1)/2} (-1)^m \frac{2 \pi}{2^n} \binom{n}{m} & n \mbox{ odd},\ \alpha = \beta (2m-n) \\ 0 & \mbox{otherwise} \\ \end{array} \right .}\\
  12. L = \int_a^b \sqrt{ \left|\sum_{i,j=1}^ng_{ij}(\gamma(t))\left(\frac{d}{dt}x^i\circ\gamma(t)\right)\left(\frac{d}{dt}x^j\circ\gamma(t)\right)\right|}\,dt\\
  13. \begin{array}{rl} s &= \int_a^b\left\|\frac{d}{dt}\vec{r}\,(u(t),v(t))\right\|\,dt \\ &= \int_a^b \sqrt{u'(t)^2\,\vec{r}_u\cdot\vec{r}_u + 2u'(t)v'(t)\, \vec{r}_u\cdot\vec{r}_v+ v'(t)^2\,\vec{r}_v\cdot\vec{r}_v}\,\,\, dt. \end{array}\\
  14. \end{array}$
  15. \end{document}


 
Ligne de commande :

Code :
  1. pdflatex -shell-escape New21.tex


 
Ceci doit générer un fichier New21.png contenant l'image ci-dessous :
http://content.screencast.com/users/Nicolas98/folders/Jing/media/b4f9dcab-ec67-44b5-9577-3608d0209d3f/a.png
 
3. Production de l'image PNG depuis Java en appelant LaTeX
 
Le code suivant :

Code :
  1. import java.awt.FlowLayout;
  2. import java.io.BufferedReader;
  3. import java.io.File;
  4. import java.io.FileWriter;
  5. import java.io.IOException;
  6. import java.io.InputStream;
  7. import java.io.InputStreamReader;
  8. import javax.swing.ImageIcon;
  9. import javax.swing.JFrame;
  10. import javax.swing.JLabel;
  11. class StreamPrinter implements Runnable {
  12.     // Source: http://labs.excilys.com/2012/06/26 [...] ssbuilder/
  13.     private final InputStream inputStream;
  14.     private boolean print;
  15.     StreamPrinter(InputStream inputStream, boolean print) {
  16.         this.inputStream = inputStream;
  17.         this.print = print;
  18.     }
  19.     private BufferedReader getBufferedReader(InputStream is) {
  20.         return new BufferedReader(new InputStreamReader(is));
  21.     }
  22.     @Override
  23.     public void run() {
  24.         BufferedReader br = getBufferedReader(inputStream);
  25.         String ligne = "";
  26.         try {
  27.             while ((ligne = br.readLine()) != null) {
  28.                 if (print) {
  29.                     System.out.println(ligne);
  30.                 }
  31.             }
  32.         } catch (IOException e) {
  33.             e.printStackTrace();
  34.         }
  35.     }
  36. }
  37. public class Exemple141_LaTeX_to_PNG_using_installed_LaTeX_distribution {
  38.     public static void main(String[] args) {
  39.         String TEMP_DIRECTORY = "D:\\_tmp";
  40.         String TEMP_TEX_FILE_NAME = "New22"; // for New22.tex
  41.         // 1. Prepare the .tex file
  42.         String newLineWithSeparation = System.getProperty("line.separator" )+System.getProperty("line.separator" );
  43.         String math = "";
  44.         math += "\\documentclass[border=0.50001bp,convert={convertexe={imgconvert},outext=.png}]{standalone}" + newLineWithSeparation;
  45.         math += "\\usepackage{amsfonts}" + newLineWithSeparation;
  46.         math += "\\usepackage{amsmath}" + newLineWithSeparation;
  47.         math += "\\begin{document}" + newLineWithSeparation;
  48.         math += "$\\begin{array}{l}" + newLineWithSeparation;
  49.         math += "\\forall\\varepsilon\\in\\mathbb{R}_+^*\\ \\exists\\eta>0\\ |x-x_0|\\leq\\eta\\Longrightarrow|f(x)-f(x_0)|\\leq\\varepsilon\\\\" + newLineWithSeparation;
  50.         math += "\\det\\begin{bmatrix}a_{11}&a_{12}&\\cdots&a_{1n}\\\\a_{21}&\\ddots&&\\vdots\\\\\\vdots&&\\ddots&\\vdots\\\\a_{n1}&\\cdots&\\cdots&a_{nn}\\end{bmatrix}\\overset{\\mathrm{def}}{=}\\sum_{\\sigma\\in\\mathfrak{S}_n}\\varepsilon(\\sigma)\\prod_{k=1}^n a_{k\\sigma(k)}\\\\" + newLineWithSeparation;
  51.         math += "{\\sideset{_\\alpha^\\beta}{_\\gamma^\\delta}{\\mathop{\\begin{pmatrix}a&b\\\\c&d\\end{pmatrix}}}}\\\\" + newLineWithSeparation;
  52.         math += "\\int_0^\\infty{x^{2n} e^{-a x^2}\\,dx} = \\frac{2n-1}{2a} \\int_0^\\infty{x^{2(n-1)} e^{-a x^2}\\,dx} = \\frac{(2n-1)!!}{2^{n+1}} \\sqrt{\\frac{\\pi}{a^{2n+1}}}\\\\" + newLineWithSeparation;
  53.         math += "\\int_a^b{f(x)\\,dx} = (b - a) \\sum\\limits_{n = 1}^\\infty  {\\sum\\limits_{m = 1}^{2^n  - 1} {\\left( { - 1} \\right)^{m + 1} } } 2^{ - n} f(a + m\\left( {b - a} \\right)2^{-n} )\\\\" + newLineWithSeparation;
  54.         math += "\\int_{-\\pi}^{\\pi} \\sin(\\alpha x) \\sin^n(\\beta x) dx = \\textstyle{\\left \\{ \\begin{array}{cc} (-1)^{(n+1)/2} (-1)^m \\frac{2 \\pi}{2^n} \\binom{n}{m} & n \\mbox{ odd},\\ \\alpha = \\beta (2m-n) \\\\ 0 & \\mbox{otherwise} \\\\ \\end{array} \\right .}\\\\" + newLineWithSeparation;
  55.         math += "L = \\int_a^b \\sqrt{ \\left|\\sum_{i,j=1}^ng_{ij}(\\gamma(t))\\left(\\frac{d}{dt}x^i\\circ\\gamma(t)\\right)\\left(\\frac{d}{dt}x^j\\circ\\gamma(t)\\right)\\right|}\\,dt\\\\" + newLineWithSeparation;
  56.         math += "\\begin{array}{rl} s &= \\int_a^b\\left\\|\\frac{d}{dt}\\vec{r}\\,(u(t),v(t))\\right\\|\\,dt \\\\ &= \\int_a^b \\sqrt{u'(t)^2\\,\\vec{r}_u\\cdot\\vec{r}_u + 2u'(t)v'(t)\\, \\vec{r}_u\\cdot\\vec{r}_v+ v'(t)^2\\,\\vec{r}_v\\cdot\\vec{r}_v}\\,\\,\\, dt. \\end{array}\\\\" + newLineWithSeparation;
  57.         math += "\\end{array}$" + newLineWithSeparation;
  58.         math += "\\end{document}";
  59.         // 2. Create the .tex file
  60.         FileWriter writer = null;
  61.         try {
  62.             writer = new FileWriter(TEMP_DIRECTORY + "\\" + TEMP_TEX_FILE_NAME + ".tex", false);
  63.             writer.write(math, 0, math.length());
  64.             writer.close();
  65.         } catch (IOException ex) {
  66.             ex.printStackTrace();
  67.         }
  68.         // 3. Execute LaTeX from command line  to generate picture
  69.         ProcessBuilder pb = new ProcessBuilder("pdflatex", "-shell-escape", TEMP_TEX_FILE_NAME + ".tex" );
  70.         pb.directory(new File(TEMP_DIRECTORY));
  71.         try {
  72.             Process p = pb.start();
  73.             StreamPrinter fluxSortie = new StreamPrinter(p.getInputStream(), false);
  74.             StreamPrinter fluxErreur = new StreamPrinter(p.getErrorStream(), false);
  75.             new Thread(fluxSortie).start();
  76.             new Thread(fluxErreur).start();
  77.             p.waitFor();
  78.         } catch (IOException | InterruptedException ex) {
  79.             ex.printStackTrace();
  80.         }
  81.         // 4. Display picture
  82.         JFrame maFrame = new JFrame();
  83.         maFrame.setResizable(false);
  84.         maFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  85.         maFrame.setSize(400, 400);
  86.         maFrame.getContentPane().setLayout(new FlowLayout());
  87.         maFrame.getContentPane().add(new JLabel(new ImageIcon(TEMP_DIRECTORY + "\\" + TEMP_TEX_FILE_NAME + ".png" )));
  88.         maFrame.pack();
  89.         maFrame.setVisible(true);
  90.         // 5. Delete files
  91.         for (File file : (new File(TEMP_DIRECTORY).listFiles())) {
  92.             if (file.getName().startsWith(TEMP_TEX_FILE_NAME + "." )) {
  93.                 file.delete();
  94.             }
  95.         }
  96.     }
  97. }


 
... produit cette fenêtre :
http://content.screencast.com/users/Nicolas98/folders/Jing/media/8da233aa-d9d1-4c0d-99e4-386ae3b28530/b.png
 
Nicolas


Message édité par Nicolas_75 le 22-03-2014 à 22:20:41
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed