Search Unity

Google Universal Analytics for Unity - Support Thread

Discussion in 'Assets and Asset Store' started by tonic, Sep 25, 2013.

  1. Ghopper21

    Ghopper21

    Joined:
    Aug 24, 2012
    Posts:
    170
    @tonic -- thanks for the quick reply!

    Another question: does GUA allow me to explicitly queue up hits for sending later, e.g. queue them during the FPS-critical part of a level, then send them all at the end of the level?

    Related question: is there an FPS hit from sending a hit via GUA?
     
  2. tonic

    tonic

    Joined:
    Oct 31, 2012
    Posts:
    439
    @Ghopper21, GUA does not have such support for explicit queueing up hits until a bit later. It always tries to send the hit immediately.

    But the GA itself has limitation of 500 hits per session (more about limits in this web page). So, it becomes quite obvious that you need to think about what kind of analytics hits are actually relevant. So, sending lot of hits directly during gameplay (during "fps critical parts") is almost surely somehow "the wrong way", since you might end up filling that 500 hit limit quota too easily. More likely you want to increment some stats counters during gameplay, and then only at e.g. level ending send a hit or two with the collected data.

    I haven't got reports about GUA showing up as a problem with fps. Each hit is a simple WWW call. Building the hit uses a StringBuilder, reducing the amount of temporary strings for GC to collect later. But, as we can see from the above comments, you're supposed to be sending analytics hits only "rarely".
     
  3. Ghopper21

    Ghopper21

    Joined:
    Aug 24, 2012
    Posts:
    170
    Thanks for the good advice @tonic. Yes, I'm surprised to see a 500 hits per session limit for GA. I thought fewer hit limits was a big advantage for GA over Unity Analytics, but actually Unity's 100 events per minute limit seems high compared to GA's per-session limit (obviously depending on session length).

    In your view, what are the advantages of GA over Unity Analytics?
     
  4. tonic

    tonic

    Joined:
    Oct 31, 2012
    Posts:
    439
    @Ghopper21, I haven't done an in-depth look at Unity Analytics, so I cannot really give any insightful comments on that. If would expect UA to be bit more suitable for certain types of games with its more advanced features like heatmaps.
     
  5. Goooooooogle

    Goooooooogle

    Joined:
    Sep 30, 2016
    Posts:
    11
    Hi @tonic This looks great! I would love to use it for our app. Does it work with Unity 2017.3 and PlayStation ?
     
  6. tonic

    tonic

    Joined:
    Oct 31, 2012
    Posts:
    439
    Hi @wwangbaobab, unfortunately I don't know for sure. I don't have access to a devkit and don't know about the restrictions on the platform.

    My guess is that if normal network connections are allowed, then it works (or perhaps if the GA is somehow whitelisted).

    I also guess that the hits might not show up with correctly identified platform. That would be both because of GUA asset not having bit of PS-specific user-agent code, but also because GA itself also probably doesn't detect PS as a platform. But, if you only send hits to a specific tracking profile (with nothing else sending hits there), maybe that's not a problem.
     
  7. kwikdev

    kwikdev

    Joined:
    Jun 13, 2013
    Posts:
    31
    Looks like a great and simple package. However in the setup, Google Analytics has a new Firebase mandatory requirement, when setting up. In your directions it is this step:

    8. Select “Mobile app” and provide a Reporting View Name, for example “MobileAppData”. Click “Create view”.

    This option doesn't exist; now it forces me to use a Firebase project? I just REMOVED the Firebase plugin because it does not apparently support WebGL (Google does not disclose this up front and the WebGL build breaks without workarounds). My take is that Google is making a complicated mess out of what used to be a simple procedure.

    What do you recommend if I do not want to use a Firebase SDK in the Unity project. That's why I bought this plugin. Will it still work?
     

    Attached Files:

    Last edited: Apr 13, 2018
  8. tonic

    tonic

    Joined:
    Oct 31, 2012
    Posts:
    439
    @kwikdev,

    Hi, if you have purchased some time earlier and only now started to actually use this plugin, please make sure first that you have the latest version!

    The Tracking Profile setup instructions in the documentation have been revised a few months ago exactly because of the reason you're asking, since Google is forcing to use Firebase for exclusively "mobile" analytics (and there's no any support for that in this GUA asset!).

    In short, you now have to select that you are tracking a "Website", and be able to provide some kind of URL for it -- even if it is even somewhat of an dummy url (it can be company website, or a marketing website for the game, for example). After that it is possible to to create a "Mobile app" view in the tracking profile.

    The included PDF instructions contain a more detailed checklist.
     
  9. kwikdev

    kwikdev

    Joined:
    Jun 13, 2013
    Posts:
    31
    The version is current, from yesterday. When you say, "create a Mobile app view in the tracking profile" that is where the instructions were unclear.

    If I don't somehow associate the ID with a Mobile app, will the base tracking still work? Just want basic Google Analytics and Events across WebGL, iOS and Android.
     
  10. tonic

    tonic

    Joined:
    Oct 31, 2012
    Posts:
    439
    Yes, unfortunately it is now a bit confusing that you have to first create a Website tracking property (since trying to create a "Mobile app" property will just force to firebase nowadays). And then only afterwards create separately a new view to your new tracking property, which is specified to be for viewing mobile app data.

    I think that the data sent to the profile will be saved, even if you haven't (yet) created a "Mobile app view". But, for actually seeing the data, I guess you still need to have a view.

    The checklist in the instructions pdf should work if you follow it closely step by step (well, apart from some tiny UI changes happening in the GA website, which seem to be happening somewhat often). Currently latest version of the doc states on first page: "This document has been revised in November 2017."

    Apparently the step 7 could be more clear. Now when you create a new property, GA opens automatically the tracking code page for that new property. So, when the PDF says "Return to Admin Home", it means you first click the little back-arrow (left of the list of options under property column). After that you get back to the three-column layout, where rightmost column allows you to Create a new view.
     
  11. kwikdev

    kwikdev

    Joined:
    Jun 13, 2013
    Posts:
    31
    Thanks - tested it out today and works perfectly.

    Excellent and lightweight asset, only 2 classes, great job!
     
  12. tonic

    tonic

    Joined:
    Oct 31, 2012
    Posts:
    439
    Thank you! :D
     
  13. ZzappSizzler

    ZzappSizzler

    Joined:
    Jan 15, 2017
    Posts:
    33
    Hi Tonic. I've purchased and am implementing GUA. Right now I am setting it up for Custom Metrics. I've configured the Google Analytics Custom Definitions - Custom Metrics, to match my in game scripts. On the Google instructions page it tells me I now have to now have to modify my tracking code (see below). How do I do that? (Or have I already done it?)

    Here's a sample of my script:
    Strobotnik.GUA.Analytics.gua.addCustomMetric(1, gameController.extraHerosBought);
    Strobotnik.GUA.Analytics.gua.addCustomMetric(2, gameController.extraSleepysBought);
    etc....

    and here's the relevant part of the Google instructions:

    https://support.google.com/analytics/answer/2709829?hl=en
    ******************************
    Modify your tracking code

    After you create custom dimensions or metrics in your property, you must also modify your tracking code. This should be completed by a qualified developer. Follow the instructions in the Developer Guide for your specific environment:

     
    Last edited: Jun 1, 2018
  14. tonic

    tonic

    Joined:
    Oct 31, 2012
    Posts:
    439
    Hi @ZzappSizzler,

    The Google page is right that the custom dimension/metric usage tends to need some customized code.

    In case of this GUA asset, also this is covered in the API (addCustomDimension, addCustomMetric). But it's left up to you to do some custom code in the cases where you want to have the custom dimension/metric stuff. It's pretty easy as you can, for example, take the code of sendEventHit(...) as reference and do small additions.

    The earlier posting in this thread has one such example where additional addCustomMetric call has been added, please check out code of sendCustomMetricEvent(...) in this message:
    https://forum.unity.com/threads/goo...ity-support-thread.202335/page-5#post-2848981
     
  15. ZzappSizzler

    ZzappSizzler

    Joined:
    Jan 15, 2017
    Posts:
    33
    Tonic, I have a plugin clash. I was using EasyMobilePro for IAP. Now I have installed GA, and finally got around to building for Android again, I get a Unity message: 'Unable To Build DEX' and it looks like I have 2 versions of support-v4 in the plugins/Android folder- "com.android.suppoert.support-v4-26.1.0" and "support-v4-2.0". If I disable one or the other then the build will be successful but so far, purchasing for Android will not work. Which of the two versions are put there by GA, and, what will happen if it's deleted?

    Any help you can give would be great!

    Thanks
     
  16. tonic

    tonic

    Joined:
    Oct 31, 2012
    Posts:
    439
    @ZzappSizzler, sorry but I can not give you assistance. You should visit Google's own support forums instead, or EasyMobilePro support forums, perhaps send them a bug report and wait for answer.

    The "Google Universal Analytics" asset doesn't have anything to do with GA android plugins. Instead it has Unity-C# code which sends analytics hits using http(s), as defined in measurement protocol spec, so there are no native plugins and no plugin-related problems.
     
  17. TheGering

    TheGering

    Joined:
    Nov 26, 2012
    Posts:
    29
    Hi, I had a
    MissingReferenceException
    in your Plugin. I resolved it by making following changes:

    Code (CSharp):
    1.        
    2.  
    3. if (useOfflineCache)
    4.             StartCoroutine(netActivity());
    5. ...
    6.  
    7. if (useOfflineCache && !needReturnWWW)
    8.         {
    9.             StartCoroutine(doWWWRequestAndCheckResult(postDataString));
    10.             return null;
    11.         }
    12.         else // caller needs the returned WWW object:
    13.         {
    14.             return beginWWWRequest(postDataString);
    15.         }
    16.  
    17. ...
    18.  
    19.     public Coroutine StartCoroutine(IEnumerator routine)
    20.     {
    21.         return (helperBehaviour && helperBehaviour.gameObject) ? helperBehaviour.StartCoroutine(routine) : null;
    22.     }
    23.  
    I basically wrapped the call to start a Coroutine and check if the GameObject is still there. Most users shouldn't have a problem there, but I had. This fixes it just in case. Please add this change in you next update.

    Also I made another change:

    I changed
    Code (CSharp):
    1. sendUserTimingHit
    to take an
    long
    instead of an
    int
    for the time.
     
  18. tonic

    tonic

    Joined:
    Oct 31, 2012
    Posts:
    439
    Hi @TheGering, thanks for the info. Good catch with the timing variable type. Can you tell me any details in what kind of situation did that exception happen - was it connected to loading new additional scenes, or switching to totally different level, or something?
     
  19. tonic

    tonic

    Joined:
    Oct 31, 2012
    Posts:
    439
    NEW in v1.8.0:
    • Use HTTPS by default.
    • Use UnityWebRequest for sending analytics hits on Unity 2018.3+.
     
  20. FADGCarneiro

    FADGCarneiro

    Joined:
    Mar 28, 2019
    Posts:
    1
    Hi @tonic

    Regarding the Sunsetting of the Google Analytics SDKs (https://support.google.com/firebase/answer/9167112?hl=en), on the 31st of October, do you have any idea if the apps using your plugin will be affected?

    In the e-mail I received from Google several other apps from the company I work for were mentioned, however all the apps I've developed using your plugin for Analytics, were not. Google does mention that apps using the Measurement Protocol will not be affected, however I need to be sure.

    Thank you in advance!
     
  21. tonic

    tonic

    Joined:
    Oct 31, 2012
    Posts:
    439
    Hi @FADGCarneiro, thanks for asking about this.

    I can confirm that my "Google Universal Analytics for Unity" ("GUA") asset uses the Measurement Protocol when sending analytics data. The asset doesn't use the mentioned native GA Android/iOS SDKs at all.

    So, sunsetting of the mentioned SDKs should not affect. It's of course still a good idea to keep a close eye on list of affected analytics properties, like you did.
     
  22. fonb

    fonb

    Joined:
    Apr 4, 2018
    Posts:
    2
    Some time ago I integrated Google Universal Analytics in a Unity project. I can't remember exactly what I did , but the tracking ID I got then is still working.
    However , when I try to create a new tracking ID , and change to it in Unity, analytics is not working. I'm following the description in the .pdf in section "Setting Up a Profile in Google Analytics"
    Using version 1.7.2 of Google Analytics, 2018.3.8f1 Unity and testing in the Unity Editor under Windows 10.
     
  23. tonic

    tonic

    Joined:
    Oct 31, 2012
    Posts:
    439
    Hi @fonb,

    I just tried to make a new property using the instructions, and verified it is working. I used Unity 2018.3.10f1, testing in editor under Windows 10.

    Make sure to update to latest version of GUA asset (1.8.0). Also, check that you go through the whole instructions, i.e. you must also make a new "Mobile app" view for the tracking property. And when you are looking at the data in the analytics website, make sure you have selected the mobile app view as well.
     
  24. fonb

    fonb

    Joined:
    Apr 4, 2018
    Posts:
    2
    No idea what was the cause , but it was a problem with the project itself. Had to delete all temp files to get it working.
     
  25. tonic

    tonic

    Joined:
    Oct 31, 2012
    Posts:
    439
    Google Universal Analytics for Unity, version 1.8.1 has been released:

    • Fixed minor warnings with Unity 2019+.
    • Always use debug tracking when running in Unity Editor, if debug tracking id is given.
     
  26. alexchesser

    alexchesser

    Joined:
    Sep 15, 2017
    Posts:
    147
    Hi @tonic up until now I have been using the GAv4 plugin which works with older GA properties but does not work when used on properties that have been created recently.

    Is this a fork of the (now unsupported) google analytics project? https://github.com/googleanalytics/google-analytics-plugin-for-unity

    Does this work for NEW GA properties? Does this function as a drop in replacement for the official github project?

    Sorry if you've answered these already but it is a 6 page thread and I'm reading through from the start to find these answers.

    ALSO I see in the INTRO post for this thread you say that "As long as UnityEngine.WWW works" - has this been updated as WWW appears to be marked as obsolete in the current version of unity https://docs.unity3d.com/ScriptReference/WWW.html ?

    Will your plugin work with the WEB+APP(beta) Data Streams or is it required that they be WEB only?

    I'm happy to buy the plugin if it will work with a GA property created today - but - I would like to know if this is going to work before I dive in.

    Thanks!
    - Alex


    edits:

    OK
    - looks liek you're updated to "UnityWebRequest" from WWW
    - looks like you have tested with a NEW property since the forced-FIREBASE changes have been put in place.

    I'm going to assume this is going to work if I go ahead and follow the "create mobile view" setup and follow the instructions PDF you supply with the package.

    questions I still have:
    • is this a fork of the official google unity analytics plugin as seen on github?
    • does this use the same API as the official plugin?
     
    Last edited: Nov 19, 2019
  27. tonic

    tonic

    Joined:
    Oct 31, 2012
    Posts:
    439
    Hi @alexchesser,

    Great questions, and thanks for the effort of sifting through the thread to find some of the answers. Also, I updated the initial post in this thread a bit!

    Some comments for the answers you found & remaining questions:

    Yes, the instructions for setting up a new property had to be changed around that time, but seem to be functional. Like you noticed with the Firebase-related changes, we're of course dependant on what Google decides. My "GUA" asset uses the Measurement Protocol spec, which has somewhat stabilized, so as long as they keep supporting it, I guess this asset should work as well.

    No, there's no relation between these projects. My asset was released back in 2013 so it precedes that Google's project (first commit in 2014), and seems like this asset has also outlived the official google unity analytics plugin, since it never came out of beta and looks like it has been abandoned.

    Since there's no relation between the projects, the API is quite different. For the part which implements measurement protocol I think my implementation is superior. That's because my implementation is carefully made to minimize amount of temporary objects, and that doesn't seem to have been a design goal at all in the google lib. (But I think the measurement protocol impl. was only a fallback in the google library, or only for certain platforms?)
     
    alexchesser likes this.
  28. tonic

    tonic

    Joined:
    Oct 31, 2012
    Posts:
    439
    Google Universal Analytics for Unity, version 1.8.2 has been released:

    • Added custom user agent construction for Android, after default UA change in recent Unity versions.

    I found out about needing to add this change thanks to @alexchesser :)
     
    alexchesser likes this.
  29. tonic

    tonic

    Joined:
    Oct 31, 2012
    Posts:
    439
    alexchesser likes this.
  30. zlremillard

    zlremillard

    Joined:
    Nov 19, 2014
    Posts:
    11
    Hello @tonic ,

    I was just wondering if it's possible to send analytics information to two separate Google Tracking-ID ?
     
  31. tonic

    tonic

    Joined:
    Oct 31, 2012
    Posts:
    439
    Out of the box that is not supported. There is code which makes sure there's only single Analytics instance being used.

    That being said, the code is included, so one could make a customized version which supports several Analytics instances. That'd require replacing all code dealing with some "instance" stuff with something slightly different (or partly just removing that stuff). Also the internal "static GoogleUniversalAnalytics gua" object should be made specific to the front-facing Analytics MonoBehaviour, i.e. remove it from being static.

    But, customizations are "unsupported", meaning that I'm not providing assistance for such stuff. Not more than this message which has some hints, that is. ;)
     
  32. Asseks

    Asseks

    Joined:
    Nov 22, 2019
    Posts:
    13
    I've got an exception and crash when I tried to load Unity container into mobile app the second time:

    [B]ArgumentException: An item with the same key has already been added. Key: User-Agent[/B]

    [B] at System.Collections.Generic.Dictionary`2[TKey,TValue].TryInsert (TKey key, TValue value, System.Collections.Generic.InsertionBehavior behavior) [0x00000] in <00000000000000000000000000000000>:0 [/B]

    [B] at System.Collections.Generic.Dictionary`2[TKey,TValue].Add (TKey key, TValue value) [0x00000] in <00000000000000000000000000000000>:0 [/B]

    [B] at Strobotnik.GUA.GoogleUniversalAnalytics.addCustomHeader (System.String key, System.String value) [0x00000] in <00000000000000000000000000000000>:0 [/B]

    [B] at Strobotnik.GUA.GoogleUniversalAnalytics.initialize (UnityEngine.MonoBehaviour analyticsHelperBehaviour, System.String trackingID, System.String anonymousClientID, System.String appName, System.String appVersion, System.Boolean useHTTPS, System.String offlineCacheFilePath) [0x00000] in <00000000000000000000000000000000>:0 [/B]

    [B] at Strobotnik.GUA.AnalyticsIqeon.Awake () [0x00000] in <00000000000000000000000000000000>:0 [/B]


    [B](Filename: currently not available on il2cpp Line: -1)[/B]
     
  33. tonic

    tonic

    Joined:
    Oct 31, 2012
    Posts:
    439
    Thank you for the report @Asseks, I will have a look at this.
    I'm assuming it's not specific to a certain mobile platform, but happens in a mobile build made with il2cpp?

    I'm not sure what you meant with "loading Unity container for a second time", but the quoted crash report is helpful so I can try to see what I can do.
     
  34. Asseks

    Asseks

    Joined:
    Nov 22, 2019
    Posts:
    13
    @tonic Yup. It happens when I created a Unity game like a part of iOS native client with il2cpp.
    What I meant. Let me try to explain. I have a mobile client with more then one unity game. I launched a one of them, then I tapped Unity button which called
    Application.Unload();
    and I returned to the native application. I got that crash when I tried launch the same game the second time.
     
  35. tonic

    tonic

    Joined:
    Oct 31, 2012
    Posts:
    439
    @Asseks, okay ... so, I think there may be some overall issue with embedding more than one Unity thing into same app, like that, since it seems like it doesn't fully de-initialize or neutralize the first one, so that launch of the second one could be considered fully "independent".

    However, that report of yours still exposed slight sloppiness from my part, in the addCustomHeader method.

    Could you try to do this small change and see if it helps:

    Find addCustomHeader method in GoogleUniversalAnalytics.cs, and this line:
            customHeaders.Add(key, value);


    Replace that line with this block of code:

    if (customHeaders.ContainsKey(key))
    customHeaders[key] = value;
    else
    customHeaders.Add(key, value);
     
  36. Balours

    Balours

    Joined:
    Nov 27, 2013
    Posts:
    59
    Hi @tonic !

    Quick question about Enhanced E-Commerce analytics integration.
    I tried to setup a product but I'm not seeing anything in GA.

    GA says : "
    Missing Ecommerce Data
    error
    View xxx is configured for Ecommerce, but no data is flowing."

    My code for sending a product hit :

    Code (CSharp):
    1.         Analytics.gua.beginHit(GoogleUniversalAnalytics.HitType.Item);
    2.         Analytics.gua.addProductAction(GoogleUniversalAnalytics.ProductAction.Click);
    3.         Analytics.gua.addProductName(1, "title");
    4.         Analytics.gua.addProductSKU(1, "id");
    5.         Analytics.gua.addProductCategory(1, "category");
    6.         Analytics.gua.addProductBrand(1, "brand");
    7.         Analytics.gua.addProductCustomDimension(1, 1, "buy");
    8.         Analytics.gua.sendHit();
    Am I missing something? I'm also sending regular events and I can see them in GA.

    Thanks a lot,
     
    Last edited: Apr 12, 2020
  37. tonic

    tonic

    Joined:
    Oct 31, 2012
    Posts:
    439
    Hi @Balours,

    in-depth support for the actual GA usage (and Measurement Protocol) intricacies is not in the scope of this asset, as this is basically an easy wrapper for the API but not an actual analytics service.

    But, that being said, I think the issue you're having is that you're trying to use an unsupported combination of parameters and hit types.

    Below is a quote from this page: https://developers.google.com/analytics/devguides/collection/protocol/v1/devguide#enhancedecom
     
  38. Balours

    Balours

    Joined:
    Nov 27, 2013
    Posts:
    59
    Thank you @tonic it was indeed the issue. It now shows the data in GA :)
     
  39. tonic

    tonic

    Joined:
    Oct 31, 2012
    Posts:
    439
  40. tonic

    tonic

    Joined:
    Oct 31, 2012
    Posts:
    439
    v1.8.4 released:
    • Added addDisableAdvertisingPersonalization, deprecated content experiments methods.
    • Fixes for Unity 2020.2.
    • This is the last version to support legacy Unity versions from 3.x to Unity 5.6.6.
      (Support for Unity 5.6.7 will likely continue.)
     
  41. tonic

    tonic

    Joined:
    Oct 31, 2012
    Posts:
    439
    v1.8.5 released:
    • Updated instructions for setting up a profile in Google Analytics.
    Asset is uploaded using Unity 2017.4, since Asset Store Tools stopped working with older Unity versions.
    However, the version 1.8.5 supports Unity versions down to 5.6.7.
     
  42. Blarp

    Blarp

    Joined:
    May 13, 2014
    Posts:
    270
    Thank you for maintaining this all these years. Purchased and immediately got hits in GA.

    This is the best GA implementation for Unity that exists on the internet, hands down.
     
  43. tonic

    tonic

    Joined:
    Oct 31, 2012
    Posts:
    439
    Thank you so much for the kind words! :D
     
    Blarp likes this.
  44. Blarp

    Blarp

    Joined:
    May 13, 2014
    Posts:
    270
    @tonic In 2021.1.12f1 PC-build (editor) getting an error on load or any hit.

    A Native Collection has not been disposed, resulting in a memory leak. Enable Full StackTraces to get more details.
     
  45. tonic

    tonic

    Joined:
    Oct 31, 2012
    Posts:
    439
    Hi @Blarp, thanks for this bug report.

    I think I found the issue, and will push a new release soon.
     
    Blarp likes this.
  46. tonic

    tonic

    Joined:
    Oct 31, 2012
    Posts:
    439
    v1.8.6 released:
    • Made sure UnityWebRequests will be properly disposed to fix Unity 2021+ warnings.
    • Removed deprecated code.
    Again, thanks to @Blarp for the bug report!
     
    Blarp likes this.
  47. Blarp

    Blarp

    Joined:
    May 13, 2014
    Posts:
    270
    I just noticed, I stopped getting hits around this change. Are you seeing hits in GA on 2021.1.12f1? (most recent latest)
     
  48. tonic

    tonic

    Joined:
    Oct 31, 2012
    Posts:
    439
    Hi @Blarp, well, I just re-checked, even with two different tracking properties, and it seemed to work just as usual. I already upgraded to 2021.1.13 though after the last time I tested (around the release), but I don't think that should matter.
     
  49. Blarp

    Blarp

    Joined:
    May 13, 2014
    Posts:
    270
    K, thanks for checking, was a rando problem.

    This is THE best and only GA implementation for Unity that matters. Works perfectly and is exactly what I needed
     
    Last edited: Jul 20, 2021
  50. amynox

    amynox

    Joined:
    Oct 23, 2016
    Posts:
    178
    Hi,
    I'm planning to buy this asset and i have some question:
    1/ I'm using Unity 2020.3 LTS, Does this asset work with Unity 2020?
    2/ Can we have real-time report (players playing the game in realtime) with Geo infos for a desktop game ? (We are not shipping to any mobile platforme)

    Thanks