Solving 3 problems with the ShellTileSchedule

Are the problems with the Shell Tile Schedule? Yes there are, at least I’m in the impression that there are some problems. Although we have those problems I really like the ShellTileSchedule because it enables an app to have an updated tile without the requirement to write server-side code to notify the client for a new tile. The smallest schedule that’s supported is 1-hour. In that situation every hour the tile will be updated with a tile located on the web (static url, which can return a dynamic image of course).

There are three problems I identified so far.

1. You can’t get the status of the ShellTileSchedule. Worse, although you started the schedule it might be stopped because for whatever reason (ex. phone is on Airplane mode) the downloading of the tile failed.

2. You have to wait at least 1 hour before the tile is updated for the first time.

3. After you stopped the ShellTileSchedule, the tile will be the last downloaded tile forever. It would be better if automatically the original tile (from the .xap package) is put back.

Combined a diagram to show the problems.

image

Solution 1 for problem 1

Alright, we can’t get the status. So what do we do? We store it locally, in the Isolated Storage. I really like the approach that’s explained by Joost van Schaik who created some extension methods for storing the settings in the Isolated Storage. He’s storing and retrieving to the Phone State on the Tomb Stoning events: Activated and Deactivated. I did store and retrieve from Isolated on all events: Activated, Deactivated, Launching and Closing.

That’s all about making sure we have a status. But still this status won’t be updated when the schedule stopped. The Windows Phone team suggests to start the schedule on every application start. The code of the Application_Launching event in the App.xaml.cs could look like this.

private void Application_Launching(object sender, LaunchingEventArgs e)
{
    Settings = this.RetrieveFromIsolatedStorage<SettingsViewModel>() ?? new SettingsViewModel();
    if(Settings.TileUpdatesEnabled)
    {
        new ShellTileSchedule
        {
            Interval = UpdateInterval.EveryHour,
            MaxUpdateCount = 0,
            Recurrence = UpdateRecurrence.Interval,
            RemoteImageUri = new Uri(@"http://mark.mymonster.nl/Uploads/2010/12/servertile.png"),
            StartTime = DateTime.Now
        }.Start();
    }
}

Joost mentions that the ViewModelBase of MVVM Light isn’t serializable. So I created a basic ViewModelBase that has the functionality that I’m always using in ViewModelBase (RaisePropertyChanged) and decorated it with the DataContract attribute.

[DataContract]
public class ViewModelBase : INotifyPropertyChanged
{
    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    #endregion

    protected void RaisePropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

Solution 2 for problem 2

Not many people know it’s possible, but Matthijs Hoekstra from Microsoft helped me in the direction to solve this problem.

Solution: Send a Push Notification from the phone itself. And afterwards close the channel and start the ShellTileSchedule.

It’s important that you send the Push Notification before the actual call to the start the ShellTileSchedule because the ShellTileSchedule is a kind of NotificationChannel of which only one can exist.

A lot of articles have been written already about how to do Push Notifications. After opening a NotificationChannel you will get a url. After that you send some xml to that url. The xml that has to be send looks like this.

?<?xml version="1.0" encoding="utf-8"?>
<wp:Notification xmlns:wp="WPNotification">
  <wp:Tile>
    <wp:BackgroundImage>http://someserver/servertile.png</wp:BackgroundImage>
    <wp:Count>0</wp:Count>
  </wp:Tile>
</wp:Notification>

The setup of the xml in code:

public void SendTile(Uri notificationUrl, string tileUri, int? count, string title, Action onComplete)
{
    var stream = new MemoryStream();
    var settings = new XmlWriterSettings {Indent = true, Encoding = Encoding.UTF8};
    XmlWriter writer = XmlWriter.Create(stream, settings);
    writer.WriteStartDocument();
    writer.WriteStartElement("wp", "Notification", "WPNotification");
    writer.WriteStartElement("wp", "Tile", "WPNotification");
    if (!string.IsNullOrEmpty(tileUri))
    {
        writer.WriteStartElement("wp", "BackgroundImage", "WPNotification");
        writer.WriteValue(tileUri);
        writer.WriteEndElement();
    }
    if (count.HasValue)
    {
        writer.WriteStartElement("wp", "Count", "WPNotification");
        writer.WriteValue(count.ToString());
        writer.WriteEndElement();
    }
    if (!string.IsNullOrEmpty(title))
    {
        writer.WriteStartElement("wp", "Title", "WPNotification");
        writer.WriteValue(title);
        writer.WriteEndElement();
    }
    writer.WriteEndElement();
    writer.Close();
    byte[] payload = stream.ToArray();

	...
}

If you take a look at the Windows Phone 7 Training Kit you will see an example on how to do a Push Notification. It can be used almost one on one in the Windows Phone application itself. I removed some of the code (for the Raw and Toast Notifications) and refactored it to fit my needs.

So after the setup of the xml, the sending of the xml and setting of the HTTP headers looks like this:

public void SendTile(Uri notificationUrl, string tileUri, int? count, string title, Action onComplete)
{
	...
	
	byte[] payload = stream.ToArray();

    //Check the length of the payload and reject it if too long
    if (payload.Length > MaxPayloadLength)
        throw new ArgumentOutOfRangeException(
            string.Format("Payload is too long. Maximum payload size shouldn't exceed {0} bytes",
                            MaxPayloadLength));

    //Create and initialize the request object
    var request = (HttpWebRequest) WebRequest.Create(notificationUrl);
    request.Method = "POST";
    request.ContentType = "text/xml; charset=utf-8";
    //request.ContentLength = payload.Length;
    request.Headers["X-MessageID"] = Guid.NewGuid().ToString();
    request.Headers["X-NotificationClass"] = 1.ToString();
    request.Headers["X-WindowsPhone-Target"] = "token";

    request.BeginGetRequestStream(
        ar =>
            {
                //Once async call returns get the Stream object
                Stream requestStream = request.EndGetRequestStream(ar);

                //and start to write the payload to the stream asynchronously
                requestStream.BeginWrite(
                    payload, 0, payload.Length,
                    iar =>
                        {
                            //When the writing is done, close the stream
                            requestStream.EndWrite(iar);
                            requestStream.Close();

                            //and switch to receiving the response from MPNS
                            request.BeginGetResponse(
                                iarr =>
                                    {
                                        if (onComplete != null)
                                            onComplete();
                                    },
                                null);
                        },
                    null);
            },
        null);
}

Of course we shouldn’t forget the important part: Subscribing to the Notification channel. Take special notice to the Thread.Sleep in line 21. This is to make sure that the Tile update is completed before the unbinding, and more starting the ShellTileSchedule.

private void UpdateTileBeforeOperation(Uri imageUri, Action onComplete)
{
    HttpNotificationChannel channel = HttpNotificationChannel.Find("OneTime");
    if (channel != null)
        channel.Close();
    else
    {
        channel = new HttpNotificationChannel("OneTime");
        channel.ChannelUriUpdated +=
            (s, e) =>
                {
                    if (imageUri.IsAbsoluteUri)
                        channel.BindToShellTile(new Collection<Uri> {imageUri});
                    else
                        channel.BindToShellTile();

                    SendTile(e.ChannelUri, imageUri.ToString(), 0, "",
                                () =>
                                    {
                                        //Give it some time to let the update propagate
                                        Thread.Sleep(
                                            TimeSpan.FromSeconds(1));

                                        channel.UnbindToShellTile();
                                        channel.Close();
                                        //Do the operation
                                        if (onComplete != null)
                                            onComplete();
                                    }
                        );
                };
        channel.Open();
    }
}

Solution 3 for problem 3

The solution for problem 3 is similar to solution 2. But instead of a remote url the url is an relative url, local to the .xap file.

public void Stop(Action onComplete)
{
    UpdateTileBeforeOperation(new Uri("/Background.png", UriKind.Relative),
                                () => { if (onComplete != null) onComplete(); });
}

Again it allows you to include an action that will be called upon completion of the Stop method.

 

Full solution diagram

Alright, all problems solved. The diagram now looks like this.

image

Of course you want to have the full code for the SmartShellTileSchedule.

public class SmartShellTileSchedule
{
    private const int MaxPayloadLength = 1024;

    public UpdateRecurrence Recurrence { get; set; }

    public int MaxUpdateCount { get; set; }

    public DateTime StartTime { get; set; }

    public UpdateInterval Interval { get; set; }

    public Uri RemoteImageUri { get; set; }

    /// <summary>
    /// If the schedule is enabled (store this in application settings) this operation should be 
    /// called upon each application start.
    /// </summary>
    public void CheckForStart()
    {
        DelegateSchedule().Start();
    }

    /// <summary>
    /// This will enable the schedule and make sure the tile is updated immediately. Don't call 
    /// this operation on each application start.
    /// </summary>
    public void Start()
    {
        Start(null);
    }

    /// <summary>
    /// This will enable the schedule and make sure the tile is updated immediately. Don't call 
    /// this operation on each application start.
    /// </summary>
    /// <param name="onComplete">will be called upon completion</param>
    public void Start(Action onComplete)
    {
        UpdateTileBeforeOperation(RemoteImageUri, () =>
                                                        {
                                                            CheckForStart();
                                                            if (onComplete != null) onComplete();
                                                        });
    }

    /// <summary>
    /// This will stop the schedule and make sure the tile is replaced with the original logo-tile.
    /// Assumption is that the logo-tile is called "Background.png"
    /// </summary>
    public void Stop()
    {
        Stop(null);
    }

    /// <summary>
    /// This will stop the schedule and make sure the tile is replaced with the original logo-tile.
    /// Assumption is that the logo-tile is called "Background.png"
    /// </summary>
    /// <param name="onComplete">will be called upon completion</param>
    public void Stop(Action onComplete)
    {
        UpdateTileBeforeOperation(new Uri("/Background.png", UriKind.Relative),
                                    () => { if (onComplete != null) onComplete(); });
    }

    private void UpdateTileBeforeOperation(Uri imageUri, Action onComplete)
    {
        HttpNotificationChannel channel = HttpNotificationChannel.Find("OneTime");
        if (channel != null)
            channel.Close();
        else
        {
            channel = new HttpNotificationChannel("OneTime");
            channel.ChannelUriUpdated +=
                (s, e) =>
                    {
                        if (imageUri.IsAbsoluteUri)
                            channel.BindToShellTile(new Collection<Uri> {imageUri});
                        else
                            channel.BindToShellTile();

                        SendTile(e.ChannelUri, imageUri.ToString(), 0, "",
                                    () =>
                                        {
                                            //Give it some time to let the update propagate
                                            Thread.Sleep(
                                                TimeSpan.FromSeconds(1));

                                            channel.UnbindToShellTile();
                                            channel.Close();
                                            //Do the operation
                                            if (onComplete != null)
                                                onComplete();
                                        }
                            );
                    };
            channel.Open();
        }
    }

    private ShellTileSchedule DelegateSchedule()
    {
        return new ShellTileSchedule
                    {
                        Interval = Interval,
                        MaxUpdateCount = MaxUpdateCount,
                        Recurrence = Recurrence,
                        RemoteImageUri = RemoteImageUri,
                        StartTime = StartTime
                    };
    }

    public void SendTile(Uri notificationUrl, string tileUri, int? count, string title, Action onComplete)
    {
        var stream = new MemoryStream();
        var settings = new XmlWriterSettings {Indent = true, Encoding = Encoding.UTF8};
        XmlWriter writer = XmlWriter.Create(stream, settings);
        writer.WriteStartDocument();
        writer.WriteStartElement("wp", "Notification", "WPNotification");
        writer.WriteStartElement("wp", "Tile", "WPNotification");
        if (!string.IsNullOrEmpty(tileUri))
        {
            writer.WriteStartElement("wp", "BackgroundImage", "WPNotification");
            writer.WriteValue(tileUri);
            writer.WriteEndElement();
        }
        if (count.HasValue)
        {
            writer.WriteStartElement("wp", "Count", "WPNotification");
            writer.WriteValue(count.ToString());
            writer.WriteEndElement();
        }
        if (!string.IsNullOrEmpty(title))
        {
            writer.WriteStartElement("wp", "Title", "WPNotification");
            writer.WriteValue(title);
            writer.WriteEndElement();
        }
        writer.WriteEndElement();
        writer.Close();
        byte[] payload = stream.ToArray();

        //Check the length of the payload and reject it if too long
        if (payload.Length > MaxPayloadLength)
            throw new ArgumentOutOfRangeException(
                string.Format("Payload is too long. Maximum payload size shouldn't exceed {0} bytes",
                                MaxPayloadLength));

        //Create and initialize the request object
        var request = (HttpWebRequest) WebRequest.Create(notificationUrl);
        request.Method = "POST";
        request.ContentType = "text/xml; charset=utf-8";
        //request.ContentLength = payload.Length;
        request.Headers["X-MessageID"] = Guid.NewGuid().ToString();
        request.Headers["X-NotificationClass"] = 1.ToString();
        request.Headers["X-WindowsPhone-Target"] = "token";

        request.BeginGetRequestStream(
            ar =>
                {
                    //Once async call returns get the Stream object
                    Stream requestStream = request.EndGetRequestStream(ar);

                    //and start to write the payload to the stream asynchronously
                    requestStream.BeginWrite(
                        payload, 0, payload.Length,
                        iar =>
                            {
                                //When the writing is done, close the stream
                                requestStream.EndWrite(iar);
                                requestStream.Close();

                                //and switch to receiving the response from MPNS
                                request.BeginGetResponse(
                                    iarr =>
                                        {
                                            if (onComplete != null)
                                                onComplete();
                                        },
                                    null);
                            },
                        null);
                },
            null);
    }
}

Additional I also included my SettingsViewModel which is fully bindable.

[DataContract]
public class SettingsViewModel : ViewModelBase
{
    private ICommand _enforceTileUpdatesState;
    private bool _executing;
    private ICommand _setScheduleIfEnabled;
    private bool _tileUpdatesEnabled;

    [DataMember]
    public bool TileUpdatesEnabled
    {
        get { return _tileUpdatesEnabled; }
        set
        {
            if (value != _tileUpdatesEnabled)
            {
                _tileUpdatesEnabled = value;
                RaisePropertyChanged("TileUpdatesEnabled");
            }
        }
    }

    public bool Executing
    {
        get { return _executing; }
        set
        {
            if (value != _executing)
            {
                _executing = value;
                RaisePropertyChanged("Executing");
            }
        }
    }

    public ICommand SetScheduleIfEnabled
    {
        get
        {
            if (_setScheduleIfEnabled == null)
            {
                _setScheduleIfEnabled = new RelayCommand(
                    () =>
                        {
                            if (TileUpdatesEnabled)
                            {
                                Executing = true;
                                GetSchedule().CheckForStart();
                                Executing = false;
                            }
                        });
            }
            return _setScheduleIfEnabled;
        }
    }

    public ICommand EnforceTileUpdatesState
    {
        get
        {
            if (_enforceTileUpdatesState == null)
            {
                _enforceTileUpdatesState = new RelayCommand(
                    () =>
                        {
                            if (TileUpdatesEnabled)
                            {
                                Executing = true;
                                GetSchedule().Start(
                                    () =>
                                    Deployment.Current.Dispatcher.
                                        BeginInvoke(() => Executing = false));
                            }
                            else
                            {
                                Executing = true;
                                GetSchedule().Stop(
                                    () =>
                                    Deployment.Current.Dispatcher.
                                        BeginInvoke(() => Executing = false));
                            }
                        });
            }
            return _enforceTileUpdatesState;
        }
    }


    private SmartShellTileSchedule GetSchedule()
    {
        return new SmartShellTileSchedule
                    {
                        Interval = UpdateInterval.EveryHour,
                        RemoteImageUri =
                            new Uri(@"http://someserver/servertile.png"),
                        StartTime = DateTime.Now,
                        Recurrence = UpdateRecurrence.Interval
                    };
    }
}
  • Gravatar Axel December 19th, 2010 at 23:39
    Just curious: what makes you think 1 second is enough for the push server to process your request and send the notification back? In my experience (I've been running a live service using tile notifications for the last couple of weeks) the notification takes anywhere from 1 second to several HOURS to actually reach the phone. For some reason things tends to work much better in the emulator but your mileage may vary widely on an actual device. Be also prepared for ChannelUriUpdated never firing, or for the push server telling you that you are "temporarily disconnected" even if it's clearly not the case :-) Just my $0.002
  • Gravatar Arktronic January 4th, 2011 at 20:26
    FYI, this code seems to cause some odd issues in live Marketplace apps - http://forums.create.msdn.com/forums/t/71361.aspx
  • Gravatar Chris Hardy January 6th, 2011 at 21:56
    Hey Mark,

    For the first solution, having the tile schedule start like that means that if someone opens the app up every 50 minute or so, they will never get a live tile. Though this is not realistic, this coupled with the fact that when the phone is idle, it won't be checking for updates and if you're on WiFi only then it might not even have a connection when the phone comes out of idle then you're going to run into some very intermittent "live tiles".

    For the second solution, if a user wanted to turn off live tiles, you could always do a one time shell tile update to get the original live tile from the server, this seems to work pretty, it just won't be as instant as doing a push notification to get it.

    Hope this helps,

    ChrisNTR
  • Gravatar Joost van Schaik January 11th, 2011 at 15:16
    Hi Mark,

    Thanks for noticing my solution for tombstoning. Be aware that I more or less abandoned the approach using an XMLSerializer - I know use SilverligthSerializer by Mike Talbot which - binary - serializes about everything. Very cool. I'd recommend using it.
  • Gravatar Edo February 3rd, 2011 at 13:26
    Thanks Mark, really neat solution!

    I had only one problem (really hard to find out): when calling
    channel.BindToShellTile(new Collection { imageUri });
    it threw InvalidOperationException(Notification server temporary unavailable)
    and subsequent calls to
    HttpNotificationChannel channel = HttpNotificationChannel.Find("ChannelName");
    always threw InvalidOperationException(Notification server temporary unavailable)

    After a lot of debug, I found out that the problem was the length of Uri (including http://... ).
    If it's shorter than 130 chars all is ok, if longer it keeps on throwing exceptions.

    For what I've seen, it's enough to use the host in the Uri, so replacing
    channel.BindToShellTile(new Collection { imageUri });
    with
    channel.BindToShellTile(new Collection { (new UriBuilder(imageUri.Scheme, imageUri.Host, imageUri.Port)).Uri });
    solved the problem.

    Thanks again!
  • Gravatar Doug Rathbone March 4th, 2011 at 08:34
    I am having the same problem as Edo,

    except mine is actually failing all the way through as my Uri is too long for the tile. i don't have a way around this as i'm actually passing token values in the Uri and they are around 200 chars long - unless i store these for my users (bad security model) it won't work

    anyone else run into this?

    cheers
    Doug
  • Gravatar Manfred Dalmeijer June 13th, 2011 at 16:18
    This solution works very well in my Windows Phone 7 apps.
    There is one issue though: HttpNotificationChannel methods and the ShellTileSchedule methods can raise an InvalidOperationException (see http://msdn.microsoft.com/en-us/library/microsoft.phone.shell.shelltileschedule.start (VS.92).aspx).
    Since these exceptions occur very infrequently and my apps set the schedule every time they run, I chose a lazy solution: catch them with an empty (apart from logging) handler.
  • Gravatar abc June 27th, 2011 at 07:41
    can i get the code sample please
  • The Nike VRS Covert 2.0 fairway woods come in 3 wood (15 degrees) and 5 wood (19 degrees) models, with the Kuro Kage Black HBP graphite shaft standard. The street price is $199 at retail introduction, which was Jan. 31, 2014.
    http://danhostel-roenne.dk/kontakt/default2.asp http://danhostel-roenne.dk/kontakt/default2.asp
  • Gravatar Danielapet May 19th, 2014 at 01:58
    <a href=http:/www.sedatec.ru/products/863939/863946/>цена phantom v641</a>

    СЕДАТЭК является быстро развивающейся отечественной компанией, которая занимается реализацией камер, осуществляемых скоростную съемку. Сегодня наше предприятие осуществляет поставки и технически сопровождает видеооборудование скоростной съемки, а также предлагает разнообразные аксессуары к оборудованию.

    <a href=http:/www.sedatec.ru/ru/products/>тест колёсных дисков на прочность</a>

    Наша компания – это действующий партнер и дистрибьютор известного мирового производителя скоростных видеокамер Vision Research. Наша компания дает своим заказчикам возможность пользоваться инновационными технологиями, быть среди всех конкурентов на ступень выше.

    <a href=http:/www.sedatec.ru/>камера заднего вида фантом са 0829 москва</a>

    СЕДАТЭК является серьёзной компанией. Мы берём на себя ответственность за все решения, предлагаемые своим клиентам. Поэтому мы предлагаем продолжительную гарантию, хороший уровень поддержки, постгарантийное сервисное обслуживание. Это дает возможность строить с клиентами долгие и продуктивные отношения, которые основаны на ответственности и надежности.

    <a href=http:/www.sedatec.ru/>скоростная видеокамера цены</a>

    Наше предприятие продаёт высокоскоростные камеры Phantom, а также оборудование, необходимое для скоростной съемки. С их помощью можно регистрировать и визуализировать быстропротекающие процессы, испытывать вооружения, самолётные двигатели, проводить тесты автомобилей.
  • Gravatar karen millen voucher code July 10th, 2014 at 03:13
    A clean lined beehive for the modern bee
  • Gravatar hermes garden bag replica kelly picnic July 19th, 2014 at 17:34
    hermes garden bag replica kelly picnic replica hermes handbags articles kelly befzetjh
  • Gravatar http://boobie.finanskarriere.com July 21st, 2014 at 17:21
    <a href=" http://bonnes.getsunpath.com/sunhat-10013152.html">☆☆☆ サングラス UVカット ニューヨーク コレクション クリアサングラス NYC-25003 (全3色) メンズ/レディース</a>||| http://bonnes.getsunpath.com/sunhat-10013152.html
  • Gravatar hermes dinnerware replica online July 23rd, 2014 at 12:47
    hermes dinnerware replica online hermes kelly fake vs real wallet rndycbdtt
  • Gravatar hermes belt replica price manila July 27th, 2014 at 18:55
    hermes belt replica price manila hermes belt how to tell if fake u have a real wnohaosc
  • Gravatar good hermes replica handbags kong July 27th, 2014 at 19:08
    good hermes replica handbags kong replica hermes belt usa black mafuujam
  • Gravatar Nfl Jerseys Wholesale July 30th, 2014 at 11:56
    American footbal Tops Nike Inexpensive came with regards to a few minutes after donning darker match
  • Gravatar hollister sweat August 7th, 2014 at 07:58
    The case has drawn comparisons to the self defense trial of George Zimmerman, the former central Florida neighborhood watch volunteer who was acquitted last year of murder in the shooting of an unarmed, black 17 year old, Trayvon Martin.
  • Gravatar MatthewMus August 16th, 2014 at 02:00
    <a href= http://sale-flowers.org/>купить дешовые хорошие розы</a>

    Праздники и события, которые мы отмечаем, чаще всего не обходятся без цветов. Цветы оставляют красочные воспоминания о любой дате. У каждого человека имеется цветок, ему он отдаёт предпочтение из общего разнообразия. В нашем богатом цветочном ассортименте можно найти цветы на любой вкус.

    <a href= http://sale-flowers.org/rozy-70-sm/>длинные розы спб</a>

    Если вы не уверены в точных предпочтениях того, кому приобретаете цветы, можете остановить выбор на красивейших букетах. Наши букеты собраны опытными флористами. Букет из алых роз, красивых орхидей, прекрасных хризантем и других, удивляющих особой красотой цветов, будет отличным презентом, как даме, так и джентльмену. Если вы хотите доставить радость девушке, то купите к букетук примеру мягкую игрушку. Данный сюрприз станет по душе любой представительнице слабого пола.

    <a href= http://sale-flowers.org/>купить саженцы розы в спб</a>

    Розы являются самыми покупаемыми цветами. Даря розы, вы наверняка угодите каждому человеку. Эти красивые цветы излучают неповторимый аромат, который может радовать продолжительное время. На нашем складе в наличии огромный выбор сортов роз разнообразной высоты и цветовой гаммы.

    <a href= http://sale-flowers.org/rozy-70-sm/>где можно купить лепестки роз в спб</a>

    На вопросы относительно выбора букета или создания его по индивидуальному заказу ответят наши флористы.
  • Gravatar prada galleria vittorio emanuele September 22nd, 2014 at 13:01
    Marine FavaudManager Coach Terrain , Laboratoire BROTHIERVersailles FranceForte d solide exp en tant que d hospitali dans un domaine de haute technologie, et reconnue par mes interlocuteurs comme une personne int et professionnelle je souhaite acc un poste au travers duquel mes collaborateurs pourront appr ma t et mon go du.
  • Gravatar air jordan 6 baby blue September 22nd, 2014 at 19:03
    The Old Gringo Patsy Boot or any of these other high style fashions could help you strut your stuff this season. Purchase online and possibly pay less than full retail price for some of these styles. Normally, you will also find shipping is free.
  • Gravatar hotel hermes di policoro September 23rd, 2014 at 12:24
    Pour nous, la diff茅rence est 脿 l'int茅rieur. L'ext茅rieur du v锚tement est cens茅 锚tre 脿 la mode et beau, mais vous devriez 锚tre en mesure de regarder et de dire, qui pourrait 锚tre la veste ou blouson de soufflage de n'importe qui, mais la diff茅rence est quand vous verrez toutes les poches et la construction 脿 l'int茅rieur de cacher tout de ces caract茅ristiques.
  • Gravatar JoshuaTed September 24th, 2014 at 06:46
    http://www.hvidesandesupply.com/slides/Chanel144.html yeozya http://www.visit-hvidesande.dk/files/hamilton-watchs-153.html 06z0 http://www.3xj.dk/en/Chanel163.html ロエベ バッグ 通販 http://www.rcyc.dk/debatforum/hamilton-watchs-155.html 8sq http://www.3xj.dk/en/Chanel41.html 腕時計 ハミルトン メンズ http://dpmarine.dk/news/Chanel384.html 4b7a http://www.perhk.dk/cms/hamilton-watchs-28.html シャネル新作時計 http://www.3xj.dk/en/Chanel250.html ngb http://www.rgs-fenders.com/html/Chanel10.html ハミルトン 時計 女性 http://www.perhk.dk/cms/hamilton-watchs-18.html mph http://www.vestfisk.com/dk/loewe-sale-55.html Gショック ベーシック http://www.sea-master.dk/media/casio-outlet-23.html 129 http://www.hvidesandesupply.com/slides/Chanel181.html ハミルトン長崎
  • Gravatar coach September 25th, 2014 at 06:38
    Si rempli était toujours pareillement a la existence serait davantage simple, tout orient impeccable, coach original
  • Gravatar alviero martini scarpe outlet online September 25th, 2014 at 07:31
    Lesage, propri茅taire du Sea Horse Ranch sur Hollister Street, d茅clar茅 que les inondations n'est pas aussi d茅vastatrice cette ann茅e comme il l'a 茅t茅 dans le pass茅, en partie parce que des projets de dragage de la ville et de grandes digues construites par le gouvernement f茅d茅ral.
  • Gravatar chanel handbags australia September 26th, 2014 at 04:06
    fast shipping! A+++ seller
  • Gravatar gucci saldi October 19th, 2014 at 13:01
    A new May reading earlier mentioned 60 shows expansion, while a looking at beneath 60 shows shrinkage. [url= http://www.cddor.com/specials2.php?id=saldi-gucci]saldi gucci[/url]
    Garcia got few details on what could possibly have transpired from the minute officers arrived on arena to the lethal shooting. [url= http://www.cddor.com/specials2.php?id=sito-gucci]gucci occhiali da sole[/url]
    The media described which the Islamist fighters had been seeking reprisal after era of airstrikes by fresh air causes loyal to Haftar. [url= http://www.cddor.com/specials2.php?id=outlet-online-gucci]gucci uomo[/url]
    But tension in excess of border troubles wasn't distant. With Weekend morning hours, just before Mr Wang arrived regarding his / her initial appointed get togethers, safety makes within Delhi required placements close to a new Tibetan area with northern Delhi. Several hundred activists from your Tibetan Childhood Our elected representatives, who'd collected to point the object outside of the Chinese language embassy, ended up stuck in as well as can not depart, Tenzing Jigme, from the Tibetan Youth The legislature, said. [url= http://www.cddor.com/specials2.php?id=saldi-gucci]saldi gucci[/url]
    R1 (Of sixteen) – RHP Touki Toussaint, Coral Rises Roscoe Academy HS (Fla)
  • Gravatar nissan de montclair October 21st, 2014 at 03:46
    A j U u Y n L b R 0 <a href=" http://www.101rings.com/foots.asp?id=moncler-manteaux-vente">moncler manteaux vente</a> U j D kl <a href=" http://www.accountingnetworks.net/foots.asp?id=moncler-vestes-points">moncler vestes points</a> J f <a href=" http://www.accountlogix.com/foots.asp?id=moncler-acorus-navy">moncler acorus navy</a>
    nissan de montclair http://www.panopticslighting.com/foots.asp
  • Q a <a href=" http://www.bobtail.org/advise/indexs.asp?id=nike-air-max-tailwind-2009">nike air max tailwind 2009</a> P j X p <a href=" http://www.boursierassistance.com/advise/indexs.asp?id=313170-543-nike-sb-dunk-low-beijing-teal-pourpre-rouge-k03079">313170 543 nike sb dunk low beijing teal pourpre rouge k03079</a> F b W r
    chaussure nike flight 13 mid university rouge 579961 600 http://www.savjcae.com/advise/indexs.asp
  • Gravatar ugg ascot porcelaine the vente October 21st, 2014 at 03:46
    N f <a href=" http://www.minceur-homeo.com/advise/indexs.asp?id=chaussure-nike-femme-match-supreme-ltr-bright-magenta-631461-500">chaussure nike femme match supreme ltr bright magenta 631461 500</a> V z R 1 S 2 <a href=" http://www.natives.fr/advise/indexs.asp?id=414574-002-air-jordan-13-retro-femme-blanc-true-rouge-noir-a24024">414574 002 air jordan 13 retro femme blanc true rouge noir a24024</a> T b <a href=" http://www.netatelier.ch/advise/indexs.asp?id=nike-free-run-3-0-plus">nike free run 3 0 plus</a>
    ugg ascot porcelaine the vente http://www.minipac.com/foots.asp
  • Gravatar men's mbt shuguli gtx brown online October 21st, 2014 at 04:10
    Nella relazione inviata nei giorni scorsi al magistrato, i carabinieri del Ris definiscono altamente probabile che quelle impronte appartengano proprio all'accusato. L'affermazione è suffragata da un approfondimento tecnico particolarmente sofisticato i cui risultati sono stati addirittura interfacciati con una sorta di analisi probabilistica che tiene conto del tipo di scarpe e delle microlesioni sulla particolare suola che "fotografano" la camminata del proprietario delle scarpe stesse. In sintesi secondo i militari è di 9000 volte rispetto a 1 la probabilità che quelle impronte siano il negativo delle suole delle Clark calzate da Tepeku. Quello che non è stato chiarito al momento è cosa stesse cercando l'uomo al momento dell'incursione effettuata un mese dopo l'omicidio.
  • Gravatar グッチ バッグ リペア October 21st, 2014 at 13:21
    我々は袋に行くことができる店です 内部の人の中規模の番号に小さなを持っている人
    グッチ バッグ リペア http://www.hitm.edu.in/gucci/Gucci-wallet-discount28302.html
  • Gravatar http://acua.hotelvmiami.com October 25th, 2014 at 17:36
    http://viat.idahoinn.nethttp://viat.idahoinn.net
  • Gravatar best relief wash October 27th, 2014 at 18:58
    Admiring the time and effort you put into your site and in depth information you provide.

    It's awesome to come across a blog every once in a while that isn't the same out of date rehashed material.
    Excellent read! I've saved your site and I'm including your RSS feeds to my Google account.
  • Gravatar bailey button chestnut October 27th, 2014 at 20:41
    Q 4 <a href=" http://scottandscottinc.com/confirm.asp?id=beats-by-dre-hd-solo">beats by dre hd solo</a> I 1 C a <a href=" http://svfilms.org/confirm.asp?id=free-studio-beats">free studio beats</a> K s <a href=" http://thepaperplate.com/confirm.asp?id=limited-edition-dre-beats">limited edition dre beats</a> P x <a href=" http://theprintingpressofjoliet.com/confirm.asp?id=cord-for-beats-by-dre">cord for beats by dre</a>
    bailey button chestnut http://www.lovecourtreporting.com/service.asp
  • Gravatar montre gucci prix October 30th, 2014 at 05:23
    The 2011 fall season showed that almost any outfit can be improved with faux fur, peplums or feathers.
  • Gravatar フェリージ ゴルフバック October 30th, 2014 at 09:35
    私と 今日はに行ってきました。私は貝殻を見つけて、私の4歳の娘にそれを与えたと言った"あなたはあなたの耳にこれを置けばあなたが海を聞くことができます。"彼女の耳にシェルをして叫んだ|彼女は置か置く。あり内側ヤドカリだった、それは彼女の耳に挟ま。彼女が戻って行きたがっていることはありません!大爆笑私は、これは知っているオフトピック完全に完全に完全にが、私は誰かを教えていた!
    フェリージ ゴルフバック http://maxilim.com.br/css/felisi/jf20141028201729-&.-40yt.asp
Gravatar