private void CreateAdvertisement(VmapAdBreak adBreak)
        {
            Advertisement ad = null;

            switch (adBreak.TimeOffset)
            {
            case "start":
                ad = new PrerollAdvertisement();
                break;

            case "end":
                ad = new PostrollAdvertisement();
                break;

            default:
                var offset = FlexibleOffset.Parse(adBreak.TimeOffset);
                if (offset != null)
                {
                    var midroll = new MidrollAdvertisement();
                    if (!offset.IsAbsolute)
                    {
                        midroll.TimePercentage = offset.RelativeOffset;
                    }
                    else
                    {
                        midroll.Time = offset.AbsoluteOffset;
                    }
                    ad = midroll;
                }
                break;
            }

            if (ad != null)
            {
                ad.Source = GetAdSource(adBreak.AdSource);
                if (ad.Source != null)
                {
                    Advertisements.Add(ad);
                    adBreaks.Add(ad, adBreak);
                }
            }
        }
        /// <inheritdoc />
        protected override async Task PlayAdAsync(Advertisement ad, CancellationToken cancellationToken)
        {
            if (adBreaks.ContainsKey(ad)) // app could have manually added ads besides those in vmap
            {
                VmapAdBreak adBreak = adBreaks[ad];
                try
                {
                    TrackEvent(adBreak.TrackingEvents.Where(te => te.EventType == VmapTrackingEventType.BreakStart));
                    await base.PlayAdAsync(ad, cancellationToken);

                    TrackEvent(adBreak.TrackingEvents.Where(te => te.EventType == VmapTrackingEventType.BreakEnd));
                }
                catch
                {
                    TrackEvent(adBreak.TrackingEvents.Where(te => te.EventType == VmapTrackingEventType.Error));
                }
            }
            else
            {
                await base.PlayAdAsync(ad, cancellationToken);
            }
        }