“Zipper” A Zipping Component In .NET 3.5 Using C# 3.0

Recently I have posted a zipping plugin – “On the Fly Zip and Attach” – for Windows Live Writer. I actually developed this component that was consumed in the writer’s zipping plugin. I thought to share with you the approach of design/development of this component, from use cases to its implementation along with unit tests using Visual Studio-2008 Unit Test infrastructure.

The functionalities that we are looking for are pretty straight forward :-

  • The component shall Zip files and Directories
  • The component shall provides functionality to Unzip the files in some user specified directory.

These functionalities can be broken down into use cases, that leads/binds to the interface “IZipper”, shown in the diagram below:-

ZipperPrimaryUseCases

The outcome of the use cases is the interface for our Zipper component, here is the code for it in C# :-

    public interface IZipper
    {
        // Zipping use cases
        bool Zip();
        bool ZipAs(string zipFilePath);
        bool ZipAs(string zipFilePath, bool useRelativePath);
        void AddFile(string absoluteFilePath);
        void AddFiles(string[] files);
        void AddFolder(string absoluteFolderPath);
        bool Clear();

        // Unzipping use cases
        bool Unzip(string destFilesPath);
        string[] UnzipVirtual();
    }

In order to realize the interface/use cases, I planned to use .NET 3.5 frameworks “{System.IO.Packaging.ZipPackage}”. This is part of the larger framework “System.IO.Packaging” that was primarily developed by Microsoft for its document system, XPS (the basis for Open XML documents), you can read about its specification from Microsoft, here is the link “XML Paper Specification”. The assembly you need to reference for it is “ReachFramework.dll”.

Here is the static design or class diagram for it. “Zipper” class is the realization of “IZipper” interface. Zipper class uses a static “inner” class “ZipperHelper” that eventually uses the .NET Packaging System.

Zipper

Since the central role is of the class ZipperHelper, here is how it looks like -

/// <summary>
        /// Zipper helper, a generic zipping api/utility class
        /// </summary>
        public static class ZipperHelper
        {
            /// <summary>
            /// uses the external container to zip the file...
            /// </summary>
            /// <param name="zipFilePath"></param>
            /// <param name="filesPathList"></param>
            /// <param name="useRelativePath"></param>
            /// <returns></returns>
            public static bool ZipAs(string zipFilePath, List<string> filesPathList, bool useRelativePath)
            {
                bool isZippedOk = false;
                if (filesPathList.Count > 0)
                {
                    FileInfo fileInfo = new FileInfo(zipFilePath);

                    // <bad file check>, delete it, if it contains zero bytes...
                    if (fileInfo.Exists && (fileInfo.Length == 0))
                    {
                        fileInfo.Delete();
                    }

                    using (Package package = Package.Open(zipFilePath, FileMode.OpenOrCreate))
                    {
                        foreach (string filePath in filesPathList)
                        {
                            string fileCurrentPath = ZipperHelper.MakePathRelative(filePath, useRelativePath);

                            Uri uri = new Uri(fileCurrentPath, UriKind.Relative);
                            uri = PackUriHelper.CreatePartUri(uri);
                            if (package.PartExists(uri))
                            {
                                package.DeletePart(uri);
                            }

                            PackagePart part = package.CreatePart(uri, string.Empty, CompressionOption.Maximum);
                            using (Stream streamIn = new FileStream(filePath, FileMode.Open, FileAccess.Read))
                            using (Stream streamOut = part.GetStream())
                            {
                                Core.CopyStream(streamIn, streamOut);
                            }
                        }
                        isZippedOk = true;
                    }
                }
                return isZippedOk;
            }

            /// <summary>
            /// uses external zip file path and extracts files to the provided destination files path 
            /// </summary>
            /// <param name="zipFilePath"></param>
            /// <param name="destFilesPath"></param>
            /// <returns></returns>
            public static bool UnzipAs(string zipFilePath, string destFilesPath)
            {
                bool isUnZipOk = false;

                FileInfo fileInfo = new FileInfo(zipFilePath);
                if (fileInfo.Exists && (fileInfo.Length > 0))
                {
                    using (Package package = Package.Open(zipFilePath, FileMode.Open))
                    {
                        if (package.GetParts().Count() > 0)
                        {
                            foreach (PackagePart part in package.GetParts())
                            {
                                // combine the paths...
                                string filePath = Path.Combine(destFilesPath, ZipperHelper.GetNormalizedPath(part.Uri.OriginalString));

                                // if directory doesnt exist create it...
                                if (!Directory.Exists(Path.GetDirectoryName(filePath)))
                                {
                                    Directory.CreateDirectory(Path.GetDirectoryName(filePath));
                                }

                                using (Stream streamOut = new FileStream(filePath, FileMode.Create))
                                using (Stream streamIn = part.GetStream())
                                {
                                    Core.CopyStream(streamIn, streamOut);
                                }
                            }
                            isUnZipOk = true;
                        }
                    }
                }
                return isUnZipOk;
            }

            /// <summary>
            /// Get the internal list of a zip file.
            /// </summary>
            /// <param name="zipFilePath"></param>
            /// <returns>string[]</returns>
            public static string[] UnzipVirtual(string zipFilePath)
            {
                List<string> filesList = new List<string>();
                FileInfo fileInfo = new FileInfo(zipFilePath);
                if (fileInfo.Exists && (fileInfo.Length > 0))
                {
                    using (Package package = Package.Open(zipFilePath, FileMode.Open))
                    {
                        if (package.GetParts().Count() > 0)
                        {
                            foreach (PackagePart part in package.GetParts())
                            {
                                filesList.Add(ZipperHelper.GetProperPath(ZipperHelper.GetNormalizedPath(part.Uri.OriginalString)));
                            }
                        }
                    }
                }
                return filesList.ToArray();
            }

            private static string MakePathRelative(string filePath)
            {
                return MakePathRelative(filePath, true);
            }

            private static string MakePathRelative(string filePath, bool useRelativePath)
            {
                string fileCurrentPath = filePath;
                if (filePath.Contains(":"))
                {
                    if (useRelativePath)
                    {
                        // simple approach, the absolute path has a colon ":", so split it and get the next one... 
                        fileCurrentPath = filePath.Split(new char[] { ':' })[1];
                    }
                    else
                    {
                        fileCurrentPath = filePath.Replace(":", "_");
                    }
                }
                return fileCurrentPath;
            }

            // c_\windows\explorer.exe --> c:\windows\explorer.exe
            private static string GetProperPath(string filePath)
            {
                // work on a copy
                string fileCurrentPath = filePath;
                // tokenize the paths
                string[] filePaths = filePath.Split(new char[] { '\\' });
                // replace the first one that contains "_" with ":"
                filePaths[0] = filePaths[0].Replace("_", ":");
                // remove the first path from the original
                fileCurrentPath = fileCurrentPath.Remove(0, filePaths[0].Length);
                // now add the replaced token
                fileCurrentPath = filePaths[0] + fileCurrentPath;

                return fileCurrentPath.Replace("%20", " ").Replace("%5B", "[").Replace("%5D", "]");
            }

            private static string GetNormalizedPath(string filePath)
            {
                string path = filePath.Replace(@"/", @"\");
                if (path.StartsWith(@"\"))
                {
                    path = path.Remove(0, 1);
                }
                return path;
            }           
        }

There are three public methods, ZipAs(…), UnzipAs(…) and UnzipVirtual(…). If you look into the code, you have  noticed that we don't see any where the “System.IO.Packaging.ZipPackage”. Its actually created when you call the static method Open of the abstract Package class, i.e “Package.Open(zipFilePath, FileMode.Open))” Rest of the functionality is straight forward, Here is the sequence

  • Create the Package.
  • Package will be composed of Parts and those Parts represents the corresponding files.
  • While Zipping you Serialize them to File using the Core Utility Class’s CopyStream method.
  • In Case of Unzipping things will become reversed and You get the Parts using the package.GetParts(), method and then Serialize those files to output streams.

For its usage, I have included the Unit Tests, and here is the  class model for it.

ZipperTestProject

The Unit tests conforms to the IZipper interface/Use cases and the concrete implementation i.e Zipper object is created in the Factory method CreateIZipper(). Here is the usage code for the Unit Tests:-

/// <summary>
    ///This is a test class for IZipperTest and is intended
    ///to contain all IZipperTest Unit Tests
    ///</summary>
    [TestClass()]
    public class IZipperTest
    {
        private const string ZipFilePath = @"c:\shams\zipper\test.zip";
        private TestContext testContextInstance;

        /// <summary>
        ///Gets or sets the test context which provides
        ///information about and functionality for the current test run.
        ///</summary>
        public TestContext TestContext
        {
            get
            {
                return testContextInstance;
            }
            set
            {
                testContextInstance = value;
            }
        }

        #region Additional test attributes
        #endregion

        /// <summary>
        /// Factory method.
        /// </summary>
        /// <returns></returns>
        internal virtual IZipper CreateIZipper()
        {
            // TODO: Instantiate an appropriate concrete class.
            IZipper target = new Shams.IO.ZippingPackage.Utils.Zipper(IZipperTest.ZipFilePath);
            return target;
        }

        /// <summary>
        ///A test for Zip
        ///</summary>
        [TestMethod()]
        public void ZipTest()
        {
            IZipper zipper = CreateIZipper();       // Initialize to an appropriate value
            zipper.AddFile(@"c:\windows\notepad.exe");
            zipper.AddFile(@"c:\windows\regedit.exe");
            zipper.AddFile(@"c:\windows\explorer.exe");
            zipper.AddFile(@"c:\windows\system32\winlogon.exe");

            bool expected = true;       // Initialize to an appropriate value
            bool actual = zipper.Zip();

            Assert.AreEqual(expected, actual);
            //Assert.Inconclusive("Verify the correctness of this test method.");
        }

        /// <summary>
        ///A test for ZipAs
        ///</summary>
        [TestMethod()]
        public void ZipAsTest()
        {
            IZipper zipper = CreateIZipper(); // TODO: Initialize to an appropriate value
            zipper.AddFile(@"c:\windows\notepad.exe");
            zipper.AddFile(@"c:\windows\regedit.exe");
            zipper.AddFile(@"c:\windows\explorer.exe");
            zipper.AddFile(@"c:\windows\system32\winlogon.exe");

            string zipFilePath = @"c:\shams\zipper\temp.zip";

            bool expected = true;
            bool actual = zipper.ZipAs(zipFilePath);

            Assert.AreEqual(expected, actual);
        }

        /// <summary>
        ///A test for ZipAs
        ///</summary>
        [TestMethod()]
        public void ZipAsTest1()
        {
            IZipper zipper = CreateIZipper(); // TODO: Initialize to an appropriate value
            zipper.AddFile(@"c:\windows\notepad.exe");
            zipper.AddFile(@"c:\windows\regedit.exe");
            zipper.AddFile(@"c:\windows\explorer.exe");
            zipper.AddFile(@"c:\windows\system32\winlogon.exe");

            string zipFilePath = @"c:\shams\zipper\temp.zip";

            // by default it is false, lets make it relative here.
            bool useRelativePath = true;

            bool expected = true;
            bool actual = zipper.ZipAs(zipFilePath, useRelativePath);
            Assert.AreEqual(expected, actual);
        }

        /// <summary>
        ///A test for UnZipVirtual
        ///</summary>
        [TestMethod()]
        public void UnzipVirtualTest()
        {
            IZipper zipper = CreateIZipper(); // TODO: Initialize to an appropriate value
            string[] expected = new string[] {@"c:\windows\explorer.exe",
                @"c:\windows\notepad.exe", 
                @"c:\windows\regedit.exe", 
                @"c:\windows\system32\winlogon.exe"};

            zipper.AddFiles(expected);
           
            string[] actual = zipper.UnzipVirtual();
            Assert.AreEqual(expected, actual);
            
            //Assert.Inconclusive("Verify the correctness of this test method.");
        }

         /// <summary>
        ///A test for UnZip
        ///</summary>
        [TestMethod()]
        public void UnzipTest()
        {
            IZipper zipper = CreateIZipper();
            string destFilesPath = @"c:\shams\zipper\temp1";
            bool expected = true;
            bool actual = zipper.Unzip(destFilesPath);
            Assert.AreEqual(expected, actual);
            //Assert.Inconclusive("Verify the correctness of this test method.");
        }

        /// <summary>
        ///A test for Clear
        ///</summary>
        [TestMethod()]
        public void ClearTest()
        {
            IZipper zipper = CreateIZipper(); // TODO: Initialize to an appropriate value
            string[] files = new string[] {@"c:\windows\notepad.exe", 
                @"c:\windows\regedit.exe", 
                @"c:\windows\explorer.exe", 
                @"c:\windows\system32\winlogon.exe"};

            zipper.AddFiles(files);
            bool expected = true; 
            bool actual = zipper.Clear();
            Assert.AreEqual(expected, actual);
            //Assert.Inconclusive("Verify the correctness of this test method.");
        }

        /// <summary>
        ///A test for AddFolder
        ///</summary>
        [TestMethod()]
        public void AddFolderTest()
        {
            IZipper zipper = CreateIZipper();
            string absoluteFolderPath = @"c:\shams\zipper";
            zipper.AddFolder(absoluteFolderPath);

            Assert.Inconclusive("A method that does not return a value cannot be verified.");
        }

        /// <summary>
        ///A test for AddFiles
        ///</summary>
        [TestMethod()]
        public void AddFilesTest()
        {
            IZipper zipper = CreateIZipper(); // TODO: Initialize to an appropriate value
            string[] files = new string[] {@"c:\windows\notepad.exe", 
                @"c:\windows\regedit.exe", 
                @"c:\windows\explorer.exe", 
                @"c:\windows\system32\winlogon.exe"};

            zipper.AddFiles(files);
            Assert.Inconclusive("A method that does not return a value cannot be verified.");
        }

        /// <summary>
        ///A test for AddFile
        ///</summary>
        [TestMethod()]
        public void AddFileTest()
        {
            IZipper zipper = CreateIZipper();
            string absoluteFilePath = @"c:\windows\explorer.exe";
            zipper.AddFile(absoluteFilePath);

            Assert.Inconclusive("A method that does not return a value cannot be verified.");
        }
    }

That's all for now, the source code and unit tests are all included in the attached project. Enjoy :)

 

Download File - Zipping-Package

 

If you enjoyed reading this blog, leave your valuable feedback and consider subscribing to the RSS feed. You can also subscribe to it by email. Also, you can follow me on Twitter. Thank you!
Technorati Tags: ,,,

Comments (3) -

annonce de rencontre gratuite
10/11/2017 10:29:58 AM #

site de rencontre gratuit 49 pour ado  site pour faire des rencontres ado - www.arnaud.space/...-faire-des-rencontres-ado.html  rencontre region de hannut  site rencontres adultere - www.arnaud.space/site-rencontres-adultere.html  numero salon de rencontre gratuit  lp la lande de la rencontre - www.arnaud.space/lp-la-lande-de-la-rencontre.html  rendez vous avec x sankara  rencontre amicale activite lyon - www.arnaud.space/...tre-amicale-activite-lyon.html  site d rencontre badoo  rencontre avec les femmes celibataires - www.arnaud.space/...c-les-femmes-celibataires.html  rencontre homme la baule  secret affaire site de rencontre - www.arnaud.space/...affaire-site-de-rencontre.html  coup de foudre a notting hill bande annonce  rencontre 39 - https://www.arnaud.space/rencontre-39.html  site de rencontre gratuit pour femme celibataire  phrase pour nouvelle rencontre - www.arnaud.space/...e-pour-nouvelle-rencontre.html  site de rencontre ado telephone  rencontre gay pau - https://www.arnaud.space/rencontre-gay-pau.html  site de rencontre pour ado de 15 a 17 ans  rencontres sans engagement - www.arnaud.space/rencontres-sans-engagement.html  cite de rencontre gratuit au cameroun  site de rencontre amitie fille - www.arnaud.space/...de-rencontre-amitie-fille.html  pietragalla je vous ai rencontre par hasard  cms site de rencontre open source - www.arnaud.space/...-de-rencontre-open-source.html  rencontrer amis nouvelle ville  rencontre femme dunkerque - www.arnaud.space/rencontre-femme-dunkerque.html  faire une bonne rencontre  cms site de rencontre open source - www.arnaud.space/...-de-rencontre-open-source.html  badoo rencontre du monde gratuit  bon message pour site de rencontre - www.arnaud.space/...ge-pour-site-de-rencontre.html  site de rencontre pour ado de 12 ans gratuit sans inscription  rencontre par telephone 06 - www.arnaud.space/rencontre-par-telephone-06.html  femmes mures rencontre  wannonces rencontres adultes - www.arnaud.space/wannonces-rencontres-adultes.html  poeme rencontre hasard  brest rencontres amicales - www.arnaud.space/brest-rencontres-amicales.html  site de rencontre agen  pof site de rencontre avis - www.arnaud.space/pof-site-de-rencontre-avis.html  rencontre ado 11 ans  site de rencontre attractive world - www.arnaud.space/...encontre-attractive-world.html  site de rencontre cupidon montreal  site de rencontres lesbien - www.arnaud.space/site-de-rencontres-lesbien.html  site d  annonce de rencontre gratuite - www.arnaud.space/...nce-de-rencontre-gratuite.html  rencontre gratuite  rencontre de femmes mures - www.arnaud.space/rencontre-de-femmes-mures.html  rencontre nuit  pourquoi je ne rencontre pas l'amour - www.arnaud.space/...e-ne-rencontre-pas-lamour.html  creer site de rencontre  rencontre oyonnax - https://www.arnaud.space/rencontre-oyonnax.html  application de rencontre windows phone  sites de rencontre camerounaise - www.arnaud.space/...de-rencontre-camerounaise.html

site de rencontre cul
10/11/2017 11:16:33 AM #

elit rencontre  a la rencontre de divers aspects du monde contemporain - www.dorian.club/...ects-du-monde-contemporain.html  site rencontre elite single  site de rencontre lgbt - www.dorian.club/site-de-rencontre-lgbt.html  rencontre menton 06  premiere rencontre romeo et juliette - www.dorian.club/...encontre-romeo-et-juliette.html  forum discussion site rencontre  voyages rencontres celibataires - www.dorian.club/...es-rencontres-celibataires.html  twitter rencontre gratuit  rencontre karmique c'est quoi - www.dorian.club/rencontre-karmique-cest-quoi.html  rencontre adultes nord pas de calais  site de rencontre nature - www.dorian.club/site-de-rencontre-nature.html  site rencontre bdsm  rencontre en ligne ado - www.dorian.club/rencontre-en-ligne-ado.html  site de rencontre select  rencontre pour adulte - https://www.dorian.club/rencontre-pour-adulte.html  site de rencontre seniors 100 gratuit  la rencontre des volontes dissertation - www.dorian.club/...-des-volontes-dissertation.html  rencontre une fille sur facebook  rencontres landes - https://www.dorian.club/rencontres-landes.html  rencontre amicale en corse  rencontre amicale dax - https://www.dorian.club/rencontre-amicale-dax.html  rencontre gay 28  rencontre trans savoie - www.dorian.club/rencontre-trans-savoie.html  rencontre parent divorce  site pour faire des rencontres entre ado - www.dorian.club/...e-des-rencontres-entre-ado.html  sites rencontres herault  rencontre 100 gratuit pour les hommes - www.dorian.club/...00-gratuit-pour-les-hommes.html  rencontre harley morzine  site pour rencontrer des gens en voyage - www.dorian.club/...contrer-des-gens-en-voyage.html  site de rencontre celibataire gratuit  rencontre 40 a 50 ans - https://www.dorian.club/rencontre-40-a-50-ans.html  50 nuances de grey scene rencontre  rencontre cameroun yaounde - www.dorian.club/rencontre-cameroun-yaounde.html  site de rencontre ado toulouse  rencontre lyon 3 - https://www.dorian.club/rencontre-lyon-3.html  rencontre speed dating montpellier  rencontres yvelines - https://www.dorian.club/rencontres-yvelines.html  rencontre couple senior  site de rencontre pour ado gratuits - www.dorian.club/...encontre-pour-ado-gratuits.html  site de rencontre avec portable  rencontre seduction - https://www.dorian.club/rencontre-seduction.html  rencontres ado  rencontre d'amis ado - https://www.dorian.club/rencontre-damis-ado.html  elite rencontre forums  rencontre femmes noires montreal - www.dorian.club/...tre-femmes-noires-montreal.html   site de rencontre cul - https://www.dorian.club/site-de-rencontre-cul.html  rencontre avec photo sans inscription  site de rencontre gratuit 74 - www.dorian.club/site-de-rencontre-gratuit-74.html  forum de rencontre pour ado sans inscription  une rencontre musique - https://www.dorian.club/une-rencontre-musique.html

rencontre le bon coin
10/11/2017 2:38:14 PM #

applications de rencontre gratuite  rencontre seniors gers - www.dorian.club/rencontre-seniors-gers.html  site de rencontre top  site de rencontre gratuit 54 pour ado - www.dorian.club/...contre-gratuit-54-pour-ado.html  cms site de rencontre open source  rencontre femme fontaine - www.dorian.club/rencontre-femme-fontaine.html  rencontrer quelqu'un  video rencontre tinder - www.dorian.club/video-rencontre-tinder.html  rencontres adultes toulouse  il y a des rencontres qu'on oublie pas - www.dorian.club/...rencontres-quon-oublie-pas.html  site de rencontre pour adolescent  notre dame des rencontres - www.dorian.club/notre-dame-des-rencontres.html  rencontre mondiale du logiciel libre  rencontre royan - https://www.dorian.club/rencontre-royan.html  site de rencontres gratuits pour les hommes  rencontre etrangere - https://www.dorian.club/rencontre-etrangere.html  avis site de  rencontre le bon coin - https://www.dorian.club/rencontre-le-bon-coin.html  gratuit pour les hommes  site de rencontre metisses gratuit - www.dorian.club/...rencontre-metisses-gratuit.html  rencontre fontenay aux roses  rencontre d'amis ado - https://www.dorian.club/rencontre-damis-ado.html  rencontre entre fille au pair  sit de rencontre gratuit sans inscription - www.dorian.club/...e-gratuit-sans-inscription.html  rencontre cougars gratuit  rencontre 40 - https://www.dorian.club/rencontre-40.html  site de rencontre travestie  rencontre foret fontainebleau - www.dorian.club/rencontre-foret-fontainebleau.html  rencontre amicale lille nord  rencontrer amis tours - https://www.dorian.club/rencontrer-amis-tours.html  site de rencontre 100 gratuite non payant  ou rencontrer du monde - www.dorian.club/ou-rencontrer-du-monde.html  rencontre femme rondes  application rencontre sexe - www.dorian.club/application-rencontre-sexe.html  rencontre 28170  rencontres 1962 - https://www.dorian.club/rencontres-1962.html  la vie parisienne rencontres  site de rencontre cameroun yaounde - www.dorian.club/...rencontre-cameroun-yaounde.html  rencontre fortuite ekladata  site de rencontre pour temoins de jehovah - www.dorian.club/...re-pour-temoins-de-jehovah.html  top application rencontre gratuite  rencontre bi bordeaux - https://www.dorian.club/rencontre-bi-bordeaux.html  vrai site de rencontre 100 gratuit  rencontre ephemere lyon - www.dorian.club/rencontre-ephemere-lyon.html  quel saint prier pour retrouver amour perdu  on rencontre des gens - https://www.dorian.club/on-rencontre-des-gens.html  site de rencontre d un soir gratuit  site rencontre sex gratuit - www.dorian.club/site-rencontre-sex-gratuit.html  rencontrer des gens pour partir en voyage  rencontre 100 gratuit pour les hommes - www.dorian.club/...00-gratuit-pour-les-hommes.html  113 rencontre  site rencontre tiilt tarif - www.dorian.club/site-rencontre-tiilt-tarif.html

rencontre herouville saint clair
10/12/2017 1:34:27 PM #

site de  rencontre herouville saint clair - www.elodie.space/...re-herouville-saint-clair.html  special antillais  premiere rencontre quoi faire - www.elodie.space/...iere-rencontre-quoi-faire.html  faire des rencontres par telephone  site de rencontre love you - www.elodie.space/site-de-rencontre-love-you.html  site de rencontre gratuit sans inscription forum  tango site rencontre - https://www.elodie.space/tango-site-rencontre.html  rencontre 22 loudeac  site de rencontre world - www.elodie.space/site-de-rencontre-world.html  rencontre gennevilliers  rencontre musicale figeac - www.elodie.space/rencontre-musicale-figeac.html  rencontre gratuit sexe  rencontre femme albi - https://www.elodie.space/rencontre-femme-albi.html  je l'ai rencontre sur tinder  rencontre femme forte - www.elodie.space/rencontre-femme-forte.html  premiere rencontre quoi faire  amour rencontre et conseil - www.elodie.space/amour-rencontre-et-conseil.html  sex rencontre gratuit  site de rencontre gratuit pour les hommes sans inscription - www.elodie.space/...s-hommes-sans-inscription.html  rencontre badou  ligne de rencontre gratuite - www.elodie.space/ligne-de-rencontre-gratuite.html  maitresse sm rencontre  site rencontre personnes agees - www.elodie.space/...rencontre-personnes-agees.html  site rencontre bi gratuit  rencontre gay meaux - https://www.elodie.space/rencontre-gay-meaux.html  site rencontre adultes  je contacte site de rencontre gratuit - www.elodie.space/...site-de-rencontre-gratuit.html  rencontrer quelqu'un de bien  inscription badoo site de rencontre - www.elodie.space/...n-badoo-site-de-rencontre.html  rencontres amicales seniors montpellier  trans rencontre - https://www.elodie.space/trans-rencontre.html  rencontres geneve agence  rencontre metro lyon - https://www.elodie.space/rencontre-metro-lyon.html  les site de rencontre 100 gratuit  rencontre femme mures - www.elodie.space/rencontre-femme-mures.html  ou rencontrer des amish  sites rencontres gratuits pour femmes - www.elodie.space/...tres-gratuits-pour-femmes.html  plan rencontre  rencontre love live - https://www.elodie.space/rencontre-love-live.html  rencontre la louviere  rencontre sex nancy - https://www.elodie.space/rencontre-sex-nancy.html  rencontre var gratuit  rencontrer des gens paris - www.elodie.space/rencontrer-des-gens-paris.html  site de rencontre coquin gratuit  rencontrer des filles montreal - www.elodie.space/...ntrer-des-filles-montreal.html  nouveau site de rencontre iphone  site de rencontre tinder pour pc - www.elodie.space/...-rencontre-tinder-pour-pc.html  rencontre candauliste  rencontre sans capote - www.elodie.space/rencontre-sans-capote.html  rencontre avec routiers  inscription badoo site de rencontre - www.elodie.space/...n-badoo-site-de-rencontre.html

site rencontre paiement sms
10/12/2017 1:45:36 PM #

le bon coin rhone alpes rencontre  rencontre amicale a caen - www.anne-sophie.space/...ontre-amicale-a-caen.html  hotel rencontre bruxelles  le bon coin rencontre 16 - www.anne-sophie.space/...on-coin-rencontre-16.html  rencontres femmes 66  site pour faire de nouvelle rencontre - www.anne-sophie.space/...e-nouvelle-rencontre.html  rencontre olivet  rencontres femmes montpellier - www.anne-sophie.space/...s-femmes-montpellier.html  site de rencontres gratuit pour les femmes  badoo rencontre gratuite - www.anne-sophie.space/...o-rencontre-gratuite.html  homme rencontre femme particulier  site je contacte rencontre homme de courcouronnes - www.anne-sophie.space/...mme-de-courcouronnes.html   site rencontre paiement sms - www.anne-sophie.space/...ncontre-paiement-sms.html  de rencontre ado par cam  site de rencontre homme femme - www.anne-sophie.space/...encontre-homme-femme.html  avis sur elite rencontre  rencontre pour ronde - www.anne-sophie.space/rencontre-pour-ronde.html  site rencontre gratuit homme et femme  comment rencontrer sa star prefere - www.anne-sophie.space/...trer-sa-star-prefere.html  rencontre sex vosges  rencontre gay cannes - www.anne-sophie.space/rencontre-gay-cannes.html  swing rencontres  contact rencontre celibataire - www.anne-sophie.space/...encontre-celibataire.html  les site de rencontre canadien  rencontre pour sportifs - www.anne-sophie.space/rencontre-pour-sportifs.html  rencontre start up bordeaux  site de rencontre x pour ado gratuit - www.anne-sophie.space/...e-x-pour-ado-gratuit.html  faire des rencontres en corse  rencontre fitness - www.anne-sophie.space/rencontre-fitness.html  rencontre 100 gratuit  site de rencontre jura gratuit - www.anne-sophie.space/...ncontre-jura-gratuit.html  je n'ai rencontre personne  rencontrer l amour gratuit - www.anne-sophie.space/...trer-l-amour-gratuit.html  rencontre femme brest  site rencontre adultere gleeden - www.anne-sophie.space/...tre-adultere-gleeden.html  rencontre femme dominante  site rencontre gratuit non payant badoo - www.anne-sophie.space/...uit-non-payant-badoo.html  site de rencontre gratuite badoo  site rencontre canada gratuit - www.anne-sophie.space/...ontre-canada-gratuit.html  voyage rencontre ukraine  rencontrer des personnes hypersensibles - www.anne-sophie.space/...onnes-hypersensibles.html  rencontre femme sourde muette  sites de rencontre gratuit - www.anne-sophie.space/...de-rencontre-gratuit.html  application pour rencontre gratuite  rencontre aude - https://www.anne-sophie.space/rencontre-aude.html  rencontre centre  site de rencontre non payant canada - www.anne-sophie.space/...re-non-payant-canada.html  site de rencontre gratuit 85 ado  rencontre celibataire protestant - www.anne-sophie.space/...libataire-protestant.html  rencontre start up bordeaux  twitter rencontre gratuit - www.anne-sophie.space/...er-rencontre-gratuit.html

site je rencontre
10/12/2017 4:11:36 PM #

cafe rencontre pour celibataire  rencontres cul - https://www.elodie.space/rencontres-cul.html  site rencontre femme sportive  rencontrer des amis - https://www.elodie.space/rencontrer-des-amis.html  comment s'habiller pour rencontrer les amis de son copain  maxi rencontre - https://www.elodie.space/maxi-rencontre.html  rencontre plan cul gay  site de rencontre 100u gratuit - www.elodie.space/...de-rencontre-100u-gratuit.html  blog rencontre tinder  site de rencontre rousse - www.elodie.space/site-de-rencontre-rousse.html  rencontre des amis sur skype  rencontres meetic affinity - www.elodie.space/rencontres-meetic-affinity.html   site je rencontre - https://www.elodie.space/site-je-rencontre.html  de rencontre gratuit amiez  bar de rencontre bordeaux - www.elodie.space/bar-de-rencontre-bordeaux.html  site rencontre infidelite  simple rencontre amicale - www.elodie.space/simple-rencontre-amicale.html  tango pour rencontre  rencontre fille au pair londres - www.elodie.space/...tre-fille-au-pair-londres.html  site rencontre homme celibataire gratuit  rencontre sexuelle - https://www.elodie.space/rencontre-sexuelle.html  site de rencontre pour tromper sa femme  amitie rencontres appartages - www.elodie.space/amitie-rencontres-appartages.html  revue rencontres intimes  rencontre immediate sans inscription - www.elodie.space/...mmediate-sans-inscription.html  site de rencontre des hommes celibataires  rencontre pop - https://www.elodie.space/rencontre-pop.html  rencontrer l'homme de sa vie a 40 ans  rencontre femme 77 - https://www.elodie.space/rencontre-femme-77.html  site rencontre amical  site de rencontre sans inscription pour ado - www.elodie.space/...sans-inscription-pour-ado.html  site de rencontre elite single  vais je rencontrer l amour - www.elodie.space/vais-je-rencontrer-l-amour.html  site rencontre amicale gratuite  site de rencontre parents separes - www.elodie.space/...rencontre-parents-separes.html  rencontre sexe 49  rencontre sur meetic avis - www.elodie.space/rencontre-sur-meetic-avis.html  rencontrer un homme apres 40 ans  vrai site de rencontre 100 gratuit - www.elodie.space/...-de-rencontre-100-gratuit.html  faire des rencontres par telephone  rencontrer de nouveaux amis - www.elodie.space/rencontrer-de-nouveaux-amis.html  comment rencontrer des amis sur paris  rencontre adulte vivastreet - www.elodie.space/rencontre-adulte-vivastreet.html  trip-avenue rencontre  site rencontre gratuit femme - www.elodie.space/site-rencontre-gratuit-femme.html  une bonne rencontre  site de rencontre a montpellier - www.elodie.space/...e-rencontre-a-montpellier.html  bon site rencontre gratuit  agence de rencontre bordeaux - www.elodie.space/agence-de-rencontre-bordeaux.html  site de rencontre homme celibataire  rencontre cougars gratuit - www.elodie.space/rencontre-cougars-gratuit.html

prix demoussage toiture fibro ciment
10/12/2017 6:20:44 PM #

tarif cloison amovible leroy merlin  escalier 2 quart tournant bois prix - www.florent.space/...quart-tournant-bois-prix.html  prix abri de piscine gonflable  prix ascenseur prive - www.florent.space/prix-ascenseur-prive.html  devis pour carrelage interieur  devis plaquiste maison 100m2 - www.florent.space/...s-plaquiste-maison-100m2.html  renover son appartement  marbre salle de bain prix - www.florent.space/marbre-salle-de-bain-prix.html  prix d'un escalier en bois standard  prix ouverture porte mur porteur - www.florent.space/...erture-porte-mur-porteur.html  renover un escalier en bois exotique  prix cloture electrique pour sanglier - www.florent.space/...electrique-pour-sanglier.html  isolation par l'exterieur prix moyen  prix installation salle de bain m2 - www.florent.space/...llation-salle-de-bain-m2.html  prix escalier bois double quart tournant  prix pose porte pvc - https://www.florent.space/prix-pose-porte-pvc.html  isolation toiture renovation  peinture renovation escalier - www.florent.space/...ture-renovation-escalier.html  cheminee bio ethanol prix discount  devis pour volet pvc - www.florent.space/devis-pour-volet-pvc.html  prix grillage simple torsion 1m20  prix pose pave exterieur - www.florent.space/prix-pose-pave-exterieur.html  deratisation bordeaux prix  quel prix pour casser mur porteur - www.florent.space/...-pour-casser-mur-porteur.html  traitement de l'eau par uv  prix demoussage toiture fibro ciment - www.florent.space/...age-toiture-fibro-ciment.html   prix renovation toiture veranda - www.florent.space/...novation-toiture-veranda.html  cout pour abattage d'un arbre  prix insert invicta 700 double face - www.florent.space/...-invicta-700-double-face.html  moteur somfy volet roulant prix  devis pour entretien immeuble - www.florent.space/...-pour-entretien-immeuble.html  prix moyen pose porte blindee  motorisation volet roulant leroy merlin prix - www.florent.space/...oulant-leroy-merlin-prix.html  tarif demolition maison m2  tarif demolition mur en pierre - www.florent.space/...demolition-mur-en-pierre.html  poele a granule cout a l annee  prix mur en fausse pierre interieur - www.florent.space/...-fausse-pierre-interieur.html  piscine interieure grange prix  installation vmc prix - www.florent.space/installation-vmc-prix.html  tarif pose porte coulissante galandage  parquet massif clipsable prix - www.florent.space/...et-massif-clipsable-prix.html  prix portail coulissant autoportant 5m  veranda prix forum - https://www.florent.space/veranda-prix-forum.html  prix decorateur interieur nantes  prix maison plain pied - www.florent.space/prix-maison-plain-pied.html  idee renovation cuisine rustique  adoucisseur d'eau permo centurion 20 prix - www.florent.space/...-permo-centurion-20-prix.html  prix controle d'acces par badge  devis travaux renovation gratuit - www.florent.space/...avaux-renovation-gratuit.html  tarifs forage puits en gironde  devis abris de jardin parpaing - www.florent.space/...abris-de-jardin-parpaing.html

operation myopie astigmatie prix
10/12/2017 10:08:41 PM #

schema myopie hypermetropie  operation des yeux pour la myopie prix - www.benoit.space/...-yeux-pour-la-myopie-prix.html  myopie astigmate hypermetropie  correction hypermetropie faible - www.benoit.space/...tion-hypermetropie-faible.html  myopie cause  myopie evolutive causes - www.benoit.space/myopie-evolutive-causes.html  hypermetrope myope  operation laser myopie chu bordeaux - www.benoit.space/...laser-myopie-chu-bordeaux.html  oeil presbyte dioptrie  operation myopie vue baisse - www.benoit.space/operation-myopie-vue-baisse.html  operation laser myopie prix  verre astigmate prix - https://www.benoit.space/verre-astigmate-prix.html  myopie cause psychologique  chirurgie laser yeux remboursement cmu - www.benoit.space/...er-yeux-remboursement-cmu.html  quelle lentille pour presbyte  comment soigne t on la myopie - www.benoit.space/...ent-soigne-t-on-la-myopie.html  hypermetropie vision double  faire une operation pour la myopie - www.benoit.space/...-operation-pour-la-myopie.html  correspondance myopie dioptrie  oeil astigmate schema - www.benoit.space/oeil-astigmate-schema.html  comment savoir si je suis astigmate  prix verre presbytie - https://www.benoit.space/prix-verre-presbytie.html  remboursement securite sociale  operation myopie astigmatie prix - www.benoit.space/...on-myopie-astigmatie-prix.html  de la myopie  application israelienne correction presbytie - www.benoit.space/...enne-correction-presbytie.html  oeil hypermetrope punctum remotum  cataracte myopie - https://www.benoit.space/cataracte-myopie.html  corriger la presbytie au laser  operation laser hypermetrope-astigmate - www.benoit.space/...er-hypermetrope-astigmate.html  myope et hypermetrope  myope astigmate operation possible - www.benoit.space/...igmate-operation-possible.html  operation myopie chu grenoble  laser presbytie prix - https://www.benoit.space/laser-presbytie-prix.html  hypermetropie presbytie myopie  lentilles pour presbyte et myope - www.benoit.space/...es-pour-presbyte-et-myope.html  un myope peut-il devenir aveugle  operation laser hypermetropie strabisme - www.benoit.space/...r-hypermetropie-strabisme.html  myopie astigmatie hypermetropie  personne myope et astigmate - www.benoit.space/personne-myope-et-astigmate.html  myopie et hypermetropie  presbytie et hypermetropie - www.benoit.space/presbytie-et-hypermetropie.html  exercice contre myopie  operation astigmatie hypermetropie - www.benoit.space/...-astigmatie-hypermetropie.html  meilleures lentilles pour astigmates  operation laser myopie chu bordeaux - www.benoit.space/...laser-myopie-chu-bordeaux.html  chirurgie hypermetropie  etre myope definition - www.benoit.space/etre-myope-definition.html  operation myopie vue de pres  operation laser myopie nantes - www.benoit.space/...ation-laser-myopie-nantes.html  lentilles de contact mensuelles pour myope  prix operation myopie presbytie - www.benoit.space/...peration-myopie-presbytie.html

ASK ME ANYTHING
10/14/2017 10:37:48 PM #

I was wondering if you ever considered changing the layout of your website? Its very well written; I love what youve got to say. But maybe you could a little more in the way of content so people could connect with it better. Youve got an awful lot of text for only having 1 or 2 pictures. Maybe you could space it out better?

téléphone taser pas cher
10/15/2017 9:59:01 PM #

Découvrez le téléphone Taser Shocker smartphone de 5 millions de volts sur la boutique Sécurité Défense : www.securite-defense.fr/.../...lions-de-volts.html ce shocker électrique d'une puissance de 5 000 000 volts à l'apparence d'un smartphone.

earth angel tarot card meaning
10/16/2017 10:35:40 PM #

tarot of the vampyres ian daniels  london tarot study group - www.aurelie.space/london-tarot-study-group.html  tarot card quiz  the wheel of fortune tarot future - www.aurelie.space/...-of-fortune-tarot-future.html   earth angel tarot card meaning - www.aurelie.space/...angel-tarot-card-meaning.html  two of cups love  7 of swords tarot card meaning - www.aurelie.space/...words-tarot-card-meaning.html  old tarot cards meanings  osho zen tarot interpretation - www.aurelie.space/...zen-tarot-interpretation.html  latin tarot global  cancer horoscope tarot - www.aurelie.space/cancer-horoscope-tarot.html  judgement tarot card meaning relationship  pick cards tarot reading - www.aurelie.space/pick-cards-tarot-reading.html  tarot josnell del universo  tarot questions about money - www.aurelie.space/tarot-questions-about-money.html  the lovers tarot card as a person  famous tarot card reader singapore - www.aurelie.space/...ot-card-reader-singapore.html  major arcana tarot cards meaning  do your own tarot card reading online - www.aurelie.space/...arot-card-reading-online.html  the hermit love dove tarot  keen tarot 8 cups - https://www.aurelie.space/keen-tarot-8-cups.html  tarot 450 dfc  bad omen tarot cards - www.aurelie.space/bad-omen-tarot-cards.html  virgo love tarot june  biddy tarot ace of swords reversed - www.aurelie.space/...t-ace-of-swords-reversed.html  accurate love tarot spread  4 wands tarot love - https://www.aurelie.space/4-wands-tarot-love.html  tarot ace of swords  weekly tarot reading for pisces - www.aurelie.space/...tarot-reading-for-pisces.html  isis tarot reading  free tarot card reading games - www.aurelie.space/...tarot-card-reading-games.html  free monthly tarot reading online  tarot reading dublin 15 - www.aurelie.space/tarot-reading-dublin-15.html  ace of wands reversed tarot forum  biddy tarot the lovers reversed - www.aurelie.space/...arot-the-lovers-reversed.html  tarot labs tower  ace pentacles tarot keen - www.aurelie.space/ace-pentacles-tarot-keen.html  4 of cups tarot meaning love  univision tarot geminis - www.aurelie.space/univision-tarot-geminis.html  rainbow tarot woman lyrics espanol  love tarot readings - https://www.aurelie.space/love-tarot-readings.html  love horoscope tarot capricorn  art of life tarot - https://www.aurelie.space/art-of-life-tarot.html  how accurate tarot card readings  fortuna tarot - https://www.aurelie.space/fortuna-tarot.html  el loco tarot egipcio  animal tarot - https://www.aurelie.space/animal-tarot.html  oldest type of tarot cards  tarot one moment after - www.aurelie.space/tarot-one-moment-after.html  tarot artwork  free online single tarot reading - www.aurelie.space/...ine-single-tarot-reading.html

masque cheveux bio
10/18/2017 2:02:07 AM #

bio secure toilette intime sans savon  deodorant marilou bio avis - www.agathe.club/deodorant-marilou-bio-avis.html  gel douche bio maison  apres shampoing bio cheveux fins - www.agathe.club/...shampoing-bio-cheveux-fins.html  quel shampoing bio pour cheveux boucles  insecticide bio pour potager - www.agathe.club/insecticide-bio-pour-potager.html  eau micellaire bio bebe  deodorant bio efficace - www.agathe.club/deodorant-bio-efficace.html  toilette intime femme bio  cranberry bio - https://www.agathe.club/cranberry-bio.html  cosmetiques biologiques et ecologiques  huile essentielle pas cher - www.agathe.club/huile-essentielle-pas-cher.html  lessive ecologique sent bon  biovital multivitamine - www.agathe.club/biovital-multivitamine.html  biologique recherche creme contour des yeux reviews  huiles essentielles pas cher avis - www.agathe.club/...essentielles-pas-cher-avis.html  savon liquide bio 5l  cosmetique bio pas cher en ligne - www.agathe.club/...ique-bio-pas-cher-en-ligne.html  savon au lait d'anesse bio  creme legere aloe vera so'bio etic - www.agathe.club/...egere-aloe-vera-sobio-etic.html  marque cosmetique bio avril  vente produit biolane - https://www.agathe.club/vente-produit-biolane.html  baume a levres bio  deo bio lavera - https://www.agathe.club/deo-bio-lavera.html  keratine bio pour cheveux en tunisie  shampoing solide bio ma provence - www.agathe.club/...ing-solide-bio-ma-provence.html  apres shampooing bio cheveux gras  cranberry bio jus - https://www.agathe.club/cranberry-bio-jus.html  savon lait d'anesse bio 40  huile essentielle de lavande aspic proprietes - www.agathe.club/...e-lavande-aspic-proprietes.html  bave d'escargot bio royer  savon d'alep bio bienfaits - www.agathe.club/savon-dalep-bio-bienfaits.html   masque cheveux bio - https://www.agathe.club/masque-cheveux-bio.html  biologique carita  ginseng gelee royale bio avis - www.agathe.club/ginseng-gelee-royale-bio-avis.html  gelee royale biologique francaise  cadum bio gel toilette intime surgras hydratant - www.agathe.club/...e-intime-surgras-hydratant.html  faire dentifrice maison bio  alimentation bio chien et chat - www.agathe.club/...entation-bio-chien-et-chat.html  produit lessive maison bio  masque cheveux bio maison - www.agathe.club/masque-cheveux-bio-maison.html  masque bio cellulose hydratant  parapharmacie bio - https://www.agathe.club/parapharmacie-bio.html  logo produit d'entretien bio professionnel  shampooing biologique naturel - www.agathe.club/shampooing-biologique-naturel.html  tisane biorigine sommeil  huile vegetale bio pas cher - www.agathe.club/huile-vegetale-bio-pas-cher.html  creme visage bio a faire soi-meme  creme contour des yeux bio - www.agathe.club/creme-contour-des-yeux-bio.html  shampoing bio sans sulfate  phytosun aroms verrerie pour diffuseur d'huiles essentielles - www.agathe.club/...useur-dhuiles-essentielles.html

Dorie
10/20/2017 9:35:35 AM #

For newest information you have to pay a quick visit the web and on internet I found this web site as a most excellent web page for hottest updates.  Also visit my homepage -  Dorie - http://www.bonpourtonpoil.ch/wiki/Utilisateur:CraigSalazar57

Add comment