public void ProcessContent(EPiServer.Core.IContent content, System.IO.Stream writableStream)
        {
            var streamWriter = new StreamWriter(writableStream);

            if (content is VariationContent)
            {
                streamWriter.Write(",\"__prices\":{");
                WritePrices(streamWriter, GetDefaultPrices(content as VariationContent));
                streamWriter.Write("}");
            }
            else if (content is ProductContent)
            {
                var pricesLow  = new Dictionary <string, Dictionary <string, decimal> >();
                var pricesHigh = new Dictionary <string, Dictionary <string, decimal> >();
                var variants   = ServiceLocator.Current.GetInstance <IContentLoader>()
                                 .GetItems((content as ProductContent).GetVariants(), (content as ProductContent).Language);

                if (variants != null)
                {
                    foreach (VariationContent variant in variants)
                    {
                        var markets = GetDefaultPrices(variant);

                        if (markets != null)
                        {
                            foreach (var market in markets)
                            {
                                if (!pricesLow.ContainsKey(market.Key))
                                {
                                    pricesLow.Add(market.Key, new Dictionary <string, decimal>());
                                }

                                if (!pricesHigh.ContainsKey(market.Key))
                                {
                                    pricesHigh.Add(market.Key, new Dictionary <string, decimal>());
                                }

                                if (market.Value.Any())
                                {
                                    foreach (var price in market.Value)
                                    {
                                        if (!pricesLow[market.Key].ContainsKey(price.Key))
                                        {
                                            pricesLow[market.Key].Add(price.Key, price.Value);
                                        }
                                        else
                                        {
                                            if (price.Value < pricesLow[market.Key][price.Key])
                                            {
                                                pricesLow[market.Key][price.Key] = price.Value;
                                            }
                                        }

                                        if (!pricesHigh[market.Key].ContainsKey(price.Key))
                                        {
                                            pricesHigh[market.Key].Add(price.Key, price.Value);
                                        }
                                        else
                                        {
                                            if (price.Value > pricesHigh[market.Key][price.Key])
                                            {
                                                pricesHigh[market.Key][price.Key] = price.Value;
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }

                streamWriter.Write(",\"__pricesLow\":{");
                WritePrices(streamWriter, pricesLow);
                streamWriter.Write("}");
                streamWriter.Write(",\"__pricesHigh\":{");
                WritePrices(streamWriter, pricesHigh);
                streamWriter.Write("}");
            }

            // read permission compatibility for commerce content, since markets handle access
            var commercePermissionEntries = new AccessControlEntry[]
            {
                new AccessControlEntry(EveryoneRole.RoleName, AccessLevel.Read),
                new AccessControlEntry(AnonymousRole.RoleName, AccessLevel.Read)
            };

            streamWriter.Write(",\"" + VulcanFieldConstants.ReadPermission + "\":[");
            streamWriter.Write(string.Join(",", commercePermissionEntries.Select(x => "\"" + x.Name + "\"")));
            streamWriter.Write("]");

            streamWriter.Flush();
        }
        /// <summary>
        /// Process record.
        /// </summary>
        protected override void ProcessRecord()
        {
            IEnumerable <Sid> sids;

            switch (ParameterSetName)
            {
            case "sddl":
                sids = Sddl.Select(s => new Sid(s));
                break;

            case "name":
                sids = Name.Select(s => NtSecurity.LookupAccountName(s));
                break;

            case "service":
                sids = ServiceName.Select(s => NtSecurity.GetServiceSid(s));
                break;

            case "il":
                sids = IntegrityLevel.Select(s => NtSecurity.GetIntegritySid(s));
                break;

            case "il_raw":
                sids = IntegrityLevelRaw.Select(s => NtSecurity.GetIntegritySidRaw(s));
                break;

            case "package":
                sids = PackageName.Select(s => TokenUtils.DerivePackageSidFromName(s));
                if (RestrictedPackageName != null)
                {
                    sids = sids.Select(s => TokenUtils.DeriveRestrictedPackageSidFromSid(s, RestrictedPackageName));
                }
                if (AsCapability)
                {
                    sids = sids.Select(s => NtSecurity.PackageSidToCapability(s));
                }
                break;

            case "known":
                sids = KnownSid.Select(s => KnownSids.GetKnownSid(s));
                break;

            case "token":
                using (NtToken token = NtToken.OpenProcessToken())
                {
                    Sid temp = null;
                    if (PrimaryGroup)
                    {
                        temp = token.PrimaryGroup;
                    }
                    else if (Owner)
                    {
                        temp = token.Owner;
                    }
                    else if (LogonGroup)
                    {
                        temp = token.LogonSid.Sid;
                    }
                    else if (AppContainer)
                    {
                        temp = token.AppContainerSid;
                    }
                    else if (Label)
                    {
                        temp = token.IntegrityLevelSid.Sid;
                    }
                    else
                    {
                        temp = token.User.Sid;
                    }
                    sids = new[] { temp };
                }
                break;

            case "cap":
                sids = CapabilityName.Select(s => CapabilityGroup ? NtSecurity.GetCapabilityGroupSid(s)
                        : NtSecurity.GetCapabilitySid(s));
                break;

            case "sid":
                sids = new[] { new Sid(SecurityAuthority, RelativeIdentifier ?? new uint[0]) };
                break;

            case "rawsa":
                sids = new[] { new Sid(new SidIdentifierAuthority(SecurityAuthorityByte), RelativeIdentifier) };
                break;

            case "logon":
                sids = new[] { NtSecurity.GetLogonSessionSid() };
                break;

            case "trust":
                sids = new[] { NtSecurity.GetTrustLevelSid(TrustType, TrustLevel) };
                break;

            case "ace":
                sids = AccessControlEntry.Select(a => a.Sid);
                break;

            case "relsid":
                sids = new[] { Sibling?BaseSid.CreateSibling(RelativeIdentifier) : BaseSid.CreateRelative(RelativeIdentifier) };
                break;

            case "bytes":
                sids = new[] { new Sid(Byte) };
                break;

            default:
                throw new ArgumentException("No SID type specified");
            }

            if (AsSddl)
            {
                WriteObject(sids.Select(s => s.ToString()), true);
            }
            else if (AsName)
            {
                WriteObject(sids.Select(s => s.Name), true);
            }
            else
            {
                WriteObject(sids, true);
            }
        }