MBS Xojo Plugins, version 19.3pr4

New in this prerelease of the 19.3 plugins:
  • Changed C++ to 2017 dialect for Xcode 11.
  • Fixed memory leak with TagLibFileRefMBS class.
  • Updated WinSparkle to version 0.6.
  • Added currentFactory property and NewPictureMBS method for PictureFactoryMBS class.
  • Updated DynaPDF to version 4.0.29.84.
  • Fixed MKMapViewMBS.showAddress method to correctly center on the found placemark instead of the region for that placemark.
Download: monkeybreadsoftware.com/xojo/download/plugin/Prerelease/.
Or ask us to be added to our shared Dropbox folder.

MBS Xojo Plugins Mailinglist

We just fixed our sign up form for the MBS Xojo Plugin Mailing list. See the mailing list page here.

If you like to be informed about new plugin pre-releases and join discussions about our plugins for Xojo, you can sign up here:

Email:

Please do not spam the lists and be polite. If we catch you with an auto responder, we may put you on moderation.
You are welcome to ask questions about our plugins there and get responses from other users.

The list is archived here: Mail Archive

Four months till European MBS Xojo Conference 2019 in Cologne

Monkeybread Software is pleased to announce the European MBS Xojo Conference in metropolitan Cologne, Germany. We meet in the lovely Dorint Hotel in the center of Cologne. The hotel is in the city center and in walking distance to the main station. Beside our two conference days we have accompanying social programme with our dinner event and optional two training days. For the evenings we have casual get-together in the hotel bar or beer garden.

To give you an update, we have already over 50 attendees signed up from 15 countries:
🇩🇪, 🇬🇧, 🇳🇱, 🇫🇷, 🇨🇭, 🇺🇸, 🇬🇷, 🇸🇮, 🇦🇹, 🇮🇹, 🇺🇦, 🇪🇸, 🇯🇴, 🇧🇪, & 🇨🇦.

We extended our last offer: Save 100 € till 24th July and pay 599 instead of 699 Euro for the ticket (+VAT if needed).



The schedule:

Oct 23rd: Xojo Training in English
Oct 24th: Conference, first day with dinner event
Oct 25th: Conference, second day
Oct 26th: Xojo Training in German

Registration is open. The early bird offer available till 24th July is just 599 Euro plus VAT. Attending the conference costs regularly 699 Euro plus VAT, including food and beverage in the Dorint Hotel as well as an accompanying social program.

Sessions are to be held in English. Our conference is conceived as a networking event for the Xojo community. The conference is an ideal opportunity for sharing your thoughts and your own development experience with fellow users and developers.

See also conference website, Things to do in Cologne beside our conference and European Xojo Conference FAQ.

DynaPDF 4 for PHP

Today DynaForms GmbH released a new PHP version of the DynaPDF library. You use this PHP modules with your PHP installation to use DynaPDF commands in PHP code. While PHP 5.x is still supported, you may prefer to migrate to the PHP 7.2 version. The DynaPDF library has the same commands for all PHP versions to make sure your existing PHP scripts can easily be upgraded.

You can download on the DynaForms website:

DynaPDF für PHP 5.3 for 32 Bit Windows and 32/64 Bit Linux.
DynaPDF für PHP 5.4 for 32 Bit Windows and 32/64 Bit Linux
DynaPDF für PHP 7.2 for 32/64 Bit Windows and 32/64 Bit Linux

Source code for the PHP modules. With an Enterprise DynaPDF license you can also download the source code of the DynaPDF library itself.

For the license, your license key for DynaPDF in Xojo and FileMaker will also work for the PHP version!
Try it and enjoy the same commands in your PHP scripts.

JSON Sort

In last prerelease we added JSON sort function to our FileMaker and Xojo plugins.

For FileMaker:

MBS( "JSON.Sort"; json )

For Xojo:

Sort method in JSONMBS class

Both use in-place sorting of the elements for arrays and object keys.
Here two examples:

[9,4,3.2,3.1,123]
returns
[3.1, 3.2, 4, 9, 123]

and

{ "last": 1, "First": 2, "Test": 3, "abc": 4}
returns
{ "abc": 4, "First": 2, "last": 1, "Test": 3 }

As you see it sorts text case insensitive. If you sort a single number, text or boolean value, we just return it as is.

We hope you enjoy the new functions. Please do not hesitate to contact us with questions.

Xojo Stammtisch in Wien

Wer hat Interesse an einem Xojo Entwicklertreffen im Juni in Wien?

Einfach in gemütlicher Runde treffen in einem netten Restaurant und beim Abendessen was über Xojo reden. Vielleicht habt ihr ja auch Fragen und Probleme, wo ich helfen kann?

Zeit wäre ca. 18 bis 22 Uhr, so dass man auch später kommen oder früher gehen kann.

Termin: 25. Juni 2019.

Bei Interesse bitte bei uns melden.

Falls sonst noch Bedarf an Schulung, vor Ort Entwicklung oder FileMaker/Xojo Hilfe besteht, bitte wegen Terminfindung bald melden.

MBS Xojo Plugins, version 19.3pr3

New in this prerelease of the 19.3 plugins: Download: monkeybreadsoftware.com/xojo/download/plugin/Prerelease/.
Or ask us to be added to our shared Dropbox folder.

MBS SQLite Extension in version 1.5

NICKENICH, Germany (June 19th, 2019) -- Monkeybread Software releases version 1.5 of the MBS SQLite Extension.

The MBS SQLite Extension is a multifunctional extension to any SQLite powered application.

Our SQLite Extension supports Mac OS, Windows and Linux. You can use it
  • in MBS SQL Plugin with SQLite,
  • in Cube SQL 4.0 and newer,
  • in Studio Stable Database Server 2.0 and newer,
  • in Xojo with the SQLiteDatabase class (needs LoadExtensions property set to true),
  • in Real Studio with the REALSQLDatabase class,
  • with SQLiteManager
  • or any other SQLite application using load_extension.

New in Version 1.5:

Our SQLite Extension gives you over 50 new functions for SQLite:
  • Additional mathematical functions like Round or Pow.
  • Functions to save blob values in files outside the database.
  • Functions to calculate checksums on blob values on the server.
  • String functions like SoundEx or accents removing for your text searches.
  • Regular Expressions in queries.
  • UUID generation
Our SQLite Extension supports macOS, Windows and Linux.
Example projects for Xojo and Real Studio are included for SQLiteDatabase, REALSQLDatabase, REALSQLServerDatabase and CubeSQLDatabase classes.

You can test the extension for free up to 10 minutes per launch in a demo mode. Licenses are available for $149 USD per developer with one year of free updates. If you have feature requests for additional functions, please send us an email.

MBS Plugins @ XDC 2019

We got a video from my presentation from Xojo Developer Conference 2019 in Miami.



Enjoy the video and see you at the coming European Xojo conference in Germany!

Additional XDC videos can be purchased here: https://xojo.com/store/#conference

Tip of the day: Folderitem items sorted

Here are some code snippets for methods, you may want to put in a module and use in your project. They return you the items or true items in a folder sorted by name and optionally with hidden items skipped:

Function Items(extends f as FolderItem, IncludeInvisible as Boolean = true) As FolderItem() // return all items in a folder // resoloves aliases or links // optionally filters hidden files Dim items() As FolderItem Dim c As Integer = f.Count For i As Integer = 1 To c Dim item As FolderItem = f.Item(i) If item <> Nil Then If IncludeInvisible Or item.Visible Then items.Append item end if End If Next Return items End Function
Function ItemsSorted(extends f as FolderItem, IncludeInvisible as Boolean = true) As FolderItem() // return all items in a folder ordered by display name // resoloves aliases or links // optionally filters hidden files Dim items() As FolderItem dim names() As string Dim c As Integer = f.Count For i As Integer = 1 To c Dim item As FolderItem = f.Item(i) If item <> Nil Then If IncludeInvisible Or item.Visible Then items.Append item names.Append item.DisplayName end if End If Next names.SortWith items Return items End Function
Function TrueItems(extends f as FolderItem, IncludeInvisible as Boolean = true) As FolderItem() // return all true items in a folder // does not resolove aliases or links // optionally filters hidden files Dim items() As FolderItem Dim c As Integer = f.Count For i As Integer = 1 To c Dim item As FolderItem = f.TrueItem(i) if item <> nil then If IncludeInvisible Or item.Visible Then items.Append item end if end if Next Return items End Function
Function TrueItemsSorted(extends f as FolderItem, IncludeInvisible as Boolean = true) As FolderItem() // return all true items in a folder ordered by display name // does not resolove aliases or links // optionally filters hidden files Dim items() As FolderItem dim names() As string Dim c As Integer = f.Count For i As Integer = 1 To c Dim item As FolderItem = f.TrueItem(i) If item <> Nil Then If IncludeInvisible Or item.Visible Then items.Append item names.Append item.DisplayName end if End If Next names.SortWith items Return items End Function

ZUGFeRD 2.0 and Factur-X for Xojo

With the last DynaPDF update we got new support for ZUGFeRD 2.0 and Factur-X, two standards to deliver invoices as PDF files with embedded XML data. We supported ZUGFeRD 1.0 before and now upgraded code to support version 2 in addition.

 

So here is a little Xojo code snippet to convert an existing PDF into a ZUGFeRD 2.0 document. Before you start, please assemble the XML for the invoice and know whether it's Minimum, Basic, Comfort or Extended level. So the code here starts with a new DynaPDFMBS object and creates a new PDF environment. We set import flags to import all content and prepare for PDF/A. If needed, you could skip some content like annotations directly here.

 

dim pdf as new MyDynapdfMBS

dim f as FolderItem = SpecialFolder.Desktop.Child("Create PDF.pdf")

pdf.SetLicenseKey "Pro" // For this example you can use a Pro or Enterprise License

// now create PDF

call pdf.CreateNewPDF f

Dim flags As Integer

flags = Bitwise.BitOr(flags, pdf.kifImportAll)

flags = Bitwise.BitOr(flags, pdf.kifImportAsPage)

flags = Bitwise.BitOr(flags, pdf.kifPrepareForPDFA)

call pdf.SetImportFlags(flags)

 

Next we load an existing PDF from a container field. Of course you can also use functions to create new pages here or open an import PDF from a file on disk. The next line imports the whole PDF file we opened into our work PDF. If you repeat the open and import step, you can merge several documents here. If you need only one page, you can use DynaPDF.ImportPDFPage function.

 

// import PDF file

dim ImportFile as FolderItem = FindFile("invoice template.pdf")

call pdf.OpenImportFile(ImportFile)

call pdf.ImportPDFFile(1) 

 

Per PDF/A requirement, we add here the language setting and a structure tree:

 

// PDF/A requires a language set

Call pdf.SetLanguage("en-US")

// PDF/A requires a structure tree

Call pdf.CreateStructureTree

 

If the PDF contains colorspaces which are not backed by an ICC Profile, we get an OnReplaceICCProfile event call to provide a replacement profile to the PDF engine. So if there is a colorspace missing the profile, it will be using one of our replacement profiles for RGB, Gray or CMYK. Here is an example implementation of the event, which looks for some generic profiles to replace an existing one:

 

EventHandler Function OnReplaceICCProfile(Type as integer, ColorSpace as integer) As integer

// provide missing ICC Profiles to DynaPDF

// The ICC profiles which should normally be configured by the user.

Dim filename As String

Select Case type

Case Me.kictGray

filename = "Generic Gray Profile.icc"

Case Me.kictRGB

filename = "Generic RGB Profile.icc"

Case Me.kictCMYK

filename = "Generic CMYK Profile.icc"

Case Me.kictLab

// not yet needed, but maybe in future

filename = "Generic Lab Profile.icc"

Else

Break

Return -1 // new type we don't know?

End Select

Dim f As FolderItem = FindFile(filename)

If f = Nil Or Not f.Exists Then

// file missing?

Return -1

End If

Dim e As Integer = ReplaceICCProfile(ColorSpace, f)

If e < 0 Then

// failed

Break

End If

// pass along success or failure

Return e

End EventHandler

 

There is another event for missing fonts, where you can provide a replacement font. We simply replace missing fonts with Arial

 

EventHandler Function OnFontNotFound(PDFFontRef as integer, FontName as string, Style as integer, StdFontIndex as integer, IsSymbolFont as boolean) As integer

// Here you could use your own mapping table.

// In this example we replace the font simply with Arial

if (WeightFromStyle(Style) < 500) then

// Only the weights 500 and 700 of Arial are installed

// by default. If you have also light variants then it is

// not required to change the style.

Style = BitwiseAnd(Style, &h0F)

Style = BitwiseOr(Style, kfsRegular)

end if

return ReplaceFont(PDFFontRef, "Arial", Style, true)

End EventHandler

 

Next we attach the XML invoice to the PDF. You can pass attachments as container, file or text, but please use the corresponding function. Here we pass it as text from a field, specify UTF-8 encoding and the ZUGFeRD specific file name. The attachment is associated with the main catalog as an alternative version.

 

// now add xml

Dim file As FolderItem = FindFile("ZUGFeRD-invoice.xml")

dim n as integer = pdf.AttachFile(file, "ZUGFeRD Rechnung", false)

if not pdf.AssociateEmbFile(pdf.kadCatalog, -1, pdf.karAlternative, n) then

Break // error

end if

 

Now we do the conformance check. If you licensed the PDF/A converter from us (Add-on for DynaPDF Pro), you get the PDF fixed if needed. If the PDF was already PDF/A, this should return okay and tel you which output indent is recommended. We than add the ICC Profile for RGB or CMYK to indicate how the PDF likes to be viewed.

 

// make sure we conform

// for perfect usage, you need PDF/A extension for DynaPDF (extra purchase)

// here we pass Basic level. Please make sure XML and level here match!

Dim retval As Integer = pdf.CheckConformance(pdf.kctZUGFeRD2_Basic, pdf.kcoDefault)

Select case retval

case 1

call pdf.AddOutputIntent(RGBProfileFile) // RGB

case 2

call pdf.AddOutputIntent(CMYKProfileFile) // CMYK

case 3

call pdf.AddOutputIntent(GrayProfileFile) // Gray

end Select

 

Finally we close the PDF file and let the destructor free the PDF environment.

 

call pdf.CloseFile 

 

We hope you enjoy this blog post. Please check the example databases included with MBS Xojo Plugins 19.3.


Ideas from WWDC

After a few days passed some of the details in various WWDC sessions show up.

I got a few points of interest to look into till the new releases appear in the wild and this includes:
  • Text recognition in Vision framework
  • Speech functions
  • Encryption functions
  • Asking for permissions to access user folders
  • CoreML functions
  • Enhancements for AppKit
  • Color picker
  • Sign-in with Apple button
Anything else? What are you interested in using in your solution with help of our plugins?

The release for MacOS 10.15 and iOS 13 are expected for September/October. The APIs are still in flux and the betas not yet polished. So let's wait for the public betas in July before we change applications. So maybe in August, we could show you some plugins for some new features.

Xcode 11 is working well and our projects build already with a few little changes.

MBS Xojo Plugins, version 19.3pr2

New in this prerelease of the 19.3 plugins:
  • Updated DynaPDF to version 4.0.29.82.
  • Changed Create3DView in DynaPDFMBS class to now use unicode version of the function. Also keep old function as Create3DViewAnsi.
  • Added BindedValues and BindedTypes property for SQLPreparedStatements to inspect bindings.
  • Added isCatalina function for SystemInformationMBS class.
  • Added OpenDirectory classes for Xojo: ODQueryMBS, ODRecordMBS, ODNodeMBS and ODSessionMBS.
  • Added LibVersion, BarcodeMailMark, BarcodeUPNQR, BarcodeVin, FontSize and InputModeEscape to BarcodeGeneratorMBS class.
  • Added ZintRenderHexagonMBS.Height property.
  • Updated libzint to version 2.6.3.
  • Updated libiconv to version 1.16.
  • Updated libPNG to version 1.6.37.
  • Updated PCRE to version 8.43.
  • Updated libxlst to version 1.1.33.
  • Updated libxml2 to version 2.9.9.
  • Updated libcpuid to version 0.4.1.
  • Updated OpenSSL to version 1.1.1c.
  • Updated curl to version 7.65.1.
  • Added examples for ZUGFeRD 2.0 and Factur-X for DynaPDF.
  • Changed iTunesLibraryMediaEntityMBS.persistentID to Int64.
  • Added WindowsADSystemInfoMBS class to query Active Directory details for current user.
  • Deprecated ImageCaptureMBS and ImageCaptureObjectMBS classes.
  • Removed helpWindow, eventWindow and shadowWindow from NSHelpManagerMBS class.
  • Added SQLDatabaseMBS.kOptionLibraryCubeSQL and SQLConnectionMBS.kOptionLibraryCubeSQL constants.
Download: monkeybreadsoftware.com/xojo/download/plugin/Prerelease/.
Or ask us to be added to our shared Dropbox folder.

CubeSQL Library for Mac

We just built a CubeSQL client library for Mac, the cubesql.dylib. You can download it in our download area in Libs folder.

As you may know you can use SQL functions in both MBS Xojo SQL Plugin and MBS FileMaker Plugin to connect to a CubeSQL server and perform queries. Since SQLabs does not yet provide prebuilt libraries for Mac & Linux, we just made one for Mac 32 and 64 bit with OpenSSL embedded.

For Xojo, you can of course use InternalCubeSQLLibraryMBS module which has library embedded for all platforms right into our MBS Xojo SQL Plugin.

For FileMaker, please use library files. For example in your script set the library path as a connection option.

For Windows:
MBS( "SQL.SetConnectionOption"; $Connection; "CUBESQL.LIBS"; "c:\CubeSQL\cubesql.dll" )

For MacOS:
MBS( "SQL.SetConnectionOption"; $Connection; "CUBESQL.LIBS"; "/Users/cs/Desktop/cubesql.dylib" )

Of course you need different paths depending on your installation. e.g. you can put the CubeSQL library in the same folder as the plugins.

WWDC Tipps and Notes

WWDC is the yearly Apple developer conference. With over 5000 attendees and 1000 Apple engineers on site (plus security and host people from Apple), there are people everywhere. It is a great experience and after several years of trying the lottery, I had the honor to join the conference this year. Here a few notes to make live easier:
  • The keynote room is big enough to sit everyone. No need to hurry to get a seat.
  • Whether it is worth waiting 4 hours to get a spot in a front row? Next time I'd better come at 9:30, sit in the back and not so close near the screen that I need to move my head to see the other side.
  • Watching the keynote on a screen at home has a big advantage: You can press the pause button. And you can open a website in parallel with a newsfeed so you have a transcript to look back. This year the keynote was very fast and there was not enough time to read slides with a lot of text.
  • Bring a jacket. It's cold early morning outside and often the temperature in the rooms is chilly.
  • Bring a bag folded in your pocket. Over the day, you may need to stuff things there like your jacket, some purchases at the Apple store or simply food for having it later.
  • Rucksacks are not optimal as you may run into bag checks on the entry. Laptop bags are more likely to be inspected.
  • Skip the waiting lines for sessions. The sessions are in general not very full, so you can just walk into 5 minutes before the session starts and find a good spot. As you can watch all session later at home, the only benefit of going there is to get the information earlier and then ask questions at the labs. There are no questions taken in the session room.
  • Go to the labs. Before WWDC make detailed list with things to ask, sample projects to show your issues, radar numbers for the bugs, so they can follow up. And check if the bug is fixed in new beta already before (!) you ask.
  • If you need the restroom, best go there when sessions start or leave one a minute before it ends. You may even use restrooms in the session room (on the back wall) before the session starts.
  • Grab some food and drinks early when it's delivered, put it in the bag and walk to find an area where you can eat without a thousand people watching you. If you come late to the food tables, the best stuff is taken...
  • Bring extra devices to install the beta software. Don't put it on your regular machine unless it's a VM for MacOS. First betas are said to be buggy and may not even boot or cause data loss.
  • For hotel booking: Either you pick an expensive one in downtown San Jose or you stay outside. As car park is $25 in the conference center and nearby parking space, the best choice seems to pick a hotel near a train station and use those local trains here in the city. I stayed at the Courtyard hotel in Campbell which is just a few stops away and right next to a train station. The train is $5 per day for two trips.
  • A wish to Belkin and Apple: Please make USB-C Ethernet adapters which can charge the MacBook Pro via Power over Ethernet. That would be even better for sitting in the Café area.
The conference can be a great experience with thousands of developers from all over the world. I learnt a ton of things and got a few ideas for new plugins, but more in a future blog post. You can make friends, find a lot of other developers from your country (lots of German) and ask your questions directly to Apple employer. They may not answer everything, but sometimes you can read between the lines. Next year, I'll not enter the lottery to give others a chance to go there!

OpenDirectory Framework for Xojo

For next plugin version, we add OpenDirectory classes for MacOS. They allow you to query local, active directory and LDAP information for users.

We have ODSessionMBS class for a session, ODQueryMBS for synchronous or asynchronous queries. You may query for records (ODRecordMBS) on a given node (ODNodeMBS).

The existing classes allow you already to query details on the current user when logged into a Mac with Active Directory or LDAP server.

We also have LDAPMBS class for cross-platform queries to LDAP and Active Directory servers. But Apple deprecated the OpenLDAP library For MacOS, so it is not sure whether it will work in future OS versions. So far it looks like it is still included for MacOS 10.15.

You can try that soon with next prerelease. If you miss additional features, please let us know.

Plugin wishes for macOS 10.15 and iOS 13?

You may all be watching videos from WWDC and learn what's coming soon for macOS and iOS.

Now the are a lot of new APIs, but I'd like to know from you what you'd like to see in our plugins for Xojo and FileMaker.

Usually we provide lower level wrapper for Xojo to Apple's APIs for macOS with hiding all the threading issues from you and translating values from native Xojo types to the matching Foundation types. As there is currently no iOS plugin SDK for Xojo, we can't make all features available via declares.

For FileMaker we usually provide a much more higher level API to do selected things and provide plugin functions for both macOS and iOS.

If you have ideas and wishes, please email me. I'll keep a list and if we have a lot of wishes for a given API, I may give it some priority.

MBS Xojo Plugins, version 19.3pr1

New in this prerelease of the 19.3 plugins:
  • Updated DynaPDF to version 4.0.28.81.
  • Added constants for DynaPDF to create ZUGFerd 2.0 and Factur-X files.
  • Fixed CSTransformMBS to better pick right alpha info for Xojo pictures.
  • Fixed QLPreviewPanel.Show to work if used with cards.
  • Fixed MKPinAnnotationViewMBS constructor.
  • Added multi line support for DynaPDFMBS graphics support with StringShape object.
  • Added trace support for graphics calls in DynaPDFMBS.
  • Fixed a problem with DynaPDFMBS ReplacePattern function and fonts missing the CID Ordering table.
  • Fixed issue with DynaPDFMBS graphics and center aligned text in reports.
  • Added OptionMaxAgeConn property for CURLSMBS class.
  • Added ZoneID property for CURLSURLMBS class.
  • Updated curl to version 7.65.0.
  • Improved automatic CURL library loading on Linux to better find the library.
  • Improved destructor for FSEventsMBS class to avoid a possible crash.
  • Improved SplitCommaSeparatedValuesMBS to better handle new lines.
Download: monkeybreadsoftware.com/xojo/download/plugin/Prerelease/.
Or ask us to be added to our shared Dropbox folder.

LLVM Bitcode

Did you know that Bitcode feature in Xcode and LLVM made it possible for Apple to recompile all 32-bit apps for the Apple Watch as 64-bit versions?

Bitcode is the representation of the app as the LLVM compiler internally uses it. The platform independent part parses code, optimizes and then passes this intermediate representation to the platform specific code generator, which then builds machine instructions for the target processor. Instead of outputting 32-bit code, Apple took the intermediate representation (the Bitcode) and let LLVM make a 64-bit version. A few tweaks may be needed like stubs to take 32-bit arguments and than call system functions with 64-bit values, but it looks like Apple figured that out.

Now if Apple goes someday with ARM processor for MacOS, the Bitcode in Mac apps (on the App Store) could allow the system to recompile the app for ARM 64-bit automatically. The developer uploaded his applications to Mac App Store and if bitcode is included, Apple could deliver them as ARM 64-bit for newer Macs automatically. Or if the bitcode is delivered with the final application, this could be done on the Mac on first-run.

I think that is a great way to make transition easier and not require an emulation at runtime like Rosetta for PPC code.

And to play with the bitcode option, I build a couple of libraries with bitcode and got a the MBS FileMaker Plugin for iOS built with Bitcode included. For a test with our MBS Xojo Plugins, I built a few of them with bitcode enabled. Maybe I can do the same for MacOS and make sure our plugin would benefit from an on device recompilation if such transition happens. But for now, we keep this as an experiment and disable bitcode again.
The biggest plugin in space...

Archives

Mar 2024
Feb 2024
Jan 2024
Dec 2023
Nov 2023
Oct 2023
Sep 2023
Aug 2023
Jul 2023
Jun 2023
May 2023
Apr 2023
Mar 2023
Feb 2023
Jan 2023
Dec 2022
Nov 2022
Oct 2022
Sep 2022
Aug 2022
Jul 2022
Jun 2022
May 2022
Apr 2022
Mar 2022
Feb 2022
Jan 2022
Dec 2021
Nov 2021
Oct 2021
Sep 2021
Aug 2021
Jul 2021
Jun 2021
May 2021
Apr 2021
Mar 2021
Feb 2021
Jan 2021
Dec 2020
Nov 2020
Oct 2020
Sep 2020
Aug 2020
Jul 2020
Jun 2020
May 2020
Apr 2020
Mar 2020
Feb 2020
Jan 2020
Dec 2019
Nov 2019
Oct 2019
Sep 2019
Aug 2019
Jul 2019
Jun 2019
May 2019
Apr 2019
Mar 2019
Feb 2019
Jan 2019
Dec 2018
Nov 2018
Oct 2018
Sep 2018
Aug 2018
Jul 2018
Jun 2018
May 2018
Apr 2018
Mar 2018
Feb 2018
Jan 2018
Dec 2017
Nov 2017
Oct 2017
Sep 2017
Aug 2017
Jul 2017
Jun 2017
May 2017
Apr 2017
Mar 2017
Feb 2017
Jan 2017
Dec 2016
Nov 2016
Oct 2016
Sep 2016
Aug 2016
Jul 2016
Jun 2016
May 2016
Apr 2016
Mar 2016
Feb 2016
Jan 2016
Dec 2015
Nov 2015
Oct 2015
Sep 2015
Aug 2015
Jul 2015
Jun 2015
May 2015
Apr 2015
Mar 2015
Feb 2015
Jan 2015
Dec 2014
Nov 2014
Oct 2014
Sep 2014
Aug 2014
Jul 2014
Jun 2014
May 2014
Apr 2014
Mar 2014
Feb 2014
Jan 2014
Dec 2013
Nov 2013
Oct 2013
Sep 2013
Aug 2013
Jul 2013
Jun 2013
May 2013
Apr 2013
Mar 2013
Feb 2013
Jan 2013
Dec 2012
Nov 2012
Oct 2012
Sep 2012
Aug 2012
Jul 2012
Jun 2012
May 2012
Apr 2012
Mar 2012
Feb 2012
Jan 2012
Dec 2011
Nov 2011
Oct 2011
Sep 2011
Aug 2011
Jul 2011
Jun 2011
May 2011
Apr 2011
Mar 2011
Feb 2011
Jan 2011
Dec 2010
Nov 2010
Oct 2010
Sep 2010
Aug 2010
Jul 2010
Jun 2010
May 2010
Apr 2010
Mar 2010
Feb 2010
Jan 2010
Dec 2009
Nov 2009
Oct 2009
Sep 2009
Aug 2009
Jul 2009
Apr 2009
Mar 2009
Feb 2009
Dec 2008
Nov 2008
Oct 2008
Aug 2008
May 2008
Apr 2008
Mar 2008
Feb 2008