Example #1
0
        protected virtual FlashTag ReadTag(FlashReader reader, TagRecord header)
        {
            FlashTag tag = null;

            switch (header.TagType)
            {
            default:
                tag = new UnknownTag(Reader, header);
                break;

            case FlashTagType.DoABC:
                tag = new DoABCTag(Reader, header);
                _abcFiles.Add(((DoABCTag)tag).ABC);
                break;

            case FlashTagType.DefineBitsLossless2:
                tag = new DefineBitsLossless2Tag(Reader, header);
                break;

            case FlashTagType.DefineBinaryData:
                tag = new DefineBinaryDataTag(Reader, header);
                break;
            }

            var character = (tag as ICharacter);

            if (character != null)
            {
                // Add ICharacter tag to the global dictionary.
                Dictionary.Characters[
                    character.CharacterId] = character;
            }
            return(tag);
        }
Example #2
0
        private void ModifyBin(DefineBinaryDataTag binaryTag)
        {
            string binaryDataBody = Encoding.UTF8
                                    .GetString(binaryTag.BinaryData);

            if (binaryDataBody.Contains("habbo_login_dialog"))
            {
                string realRsaKeys = binaryDataBody
                                     .GetChild("name=\"dummy_field\" caption=\"", '"');

                if (string.IsNullOrWhiteSpace(realRsaKeys))
                {
                    return;
                }
                ExtractRsaKeys(realRsaKeys);

                string fakeRsaKeys = EncodeRsaKeys(
                    HandshakeManager.FAKE_EXPONENT, HandshakeManager.FAKE_MODULUS);

                binaryTag.BinaryData = Encoding.UTF8.GetBytes(
                    binaryDataBody.Replace(realRsaKeys, fakeRsaKeys));
            }
        }
Example #3
0
 SwfTagData ISwfTagVisitor <ISwfStreamWriter, SwfTagData> .Visit(DefineBinaryDataTag tag, ISwfStreamWriter writer)
 {
     return(null);
 }
Example #4
0
        public void ReplaceLocalizationDefaults(RetroLocalizationConfig[] localizationConfigs)
        {
            var abc               = _flash.AbcGame;
            var symbols           = (SymbolClassTag)_flash.Tags.Last(x => x.Kind == TagKind.SymbolClass);
            var localizationClass = abc.GetClass("HabboLocalizationCom");

            // Save all old localizations.
            var localizations = localizationConfigs
                                .Select(x => x.HotelCodeBase).Distinct()
                                .ToDictionary(x => x, y =>
            {
                var binaryDataId = symbols.Entries.First(x => x.Item2.Contains(y));
                var binaryData   = (DefineBinaryDataTag)_flash.Tags.First(x => x.Kind == TagKind.DefineBinaryData && ((DefineBinaryDataTag)x).Id == binaryDataId.Item1);

                return(binaryData.Data);
            });

            // Find all old localizations.
            var localizationSymbols = symbols.Entries.Where(x => x.Item2.Contains("default_localizations_")).ToArray();
            var localizationTraits  = localizationClass.Traits.Where(x => x.IsStatic && x.QName.Name.StartsWith("default_localizations_")).ToArray();
            var localizationClasses = abc.Classes.Where(x => x.QName.Name.StartsWith("default_localizations_")).ToArray();

            if (localizationSymbols.Length != localizationTraits.Length ||
                localizationTraits.Length != localizationClasses.Length)
            {
                throw new ApplicationException("Localization result amount mismatch.");
            }

            // Remove all old localization references.

            // - Remove symbols
            foreach (var symbol in localizationSymbols)
            {
                _flash.Tags.RemoveAll(x => x.Kind == TagKind.DefineBinaryData && ((DefineBinaryDataTag)x).Id == symbol.Item1);
                symbols.Entries.RemoveAll(x => x.Item1 == symbol.Item1);
            }

            // - Remove "public static var default_localizations_*"
            localizationClass.Traits.RemoveAll(trait => trait.QName.Name.StartsWith("default_localizations_"));

            var body = localizationClass.Constructor.Body.ParseCode();

            var getLex      = body.First(x => x.OP == OPCode.GetLex && ((GetLexIns)x).TypeName.Name.StartsWith("default_localizations_"));
            var getLexIndex = body.IndexOf(getLex);
            var setProp     = body.LastIndexOf(body.Count - 1, OPCode.SetProperty);

            body.RemoveRange(getLexIndex, setProp - getLexIndex + 1);

            localizationClass.Constructor.Body.Code = body.ToArray();

            // - Remove "default_localizations_" classes / instances / scripts
            // TODO: Figure out how to fix all index based stuff, because this messes it up. DO NOT USE YET.
            // _flash.AbcGame.Classes.RemoveAll(x => x.QName.Name.StartsWith("default_localizations_"));
            // _flash.AbcGame.Instances.RemoveAll(x => x.QName.Name.StartsWith("default_localizations_"));
            // _flash.AbcGame.Scripts.RemoveAll(x => x.QName.Name.Contains("default_localizations_"));

            // Add localizations.
            foreach (var config in localizationConfigs)
            {
                var localizationName    = $"custom_localizations_{config.HotelCode}";
                var defLocalizationName = $"own_default_localizations_{config.HotelCode}";

                var localizationMultiNameIndex = abc.Pool.AddConstant(new ASMultiname(abc.Pool)
                {
                    NameIndex      = abc.Pool.AddConstant(localizationName),
                    Kind           = MultinameKind.QName,
                    NamespaceIndex = 1
                });

                #region Create localization class

                // Create instance.
                var instanceConstructor = new ASMethod(abc)
                {
                    ReturnTypeIndex = 0
                };

                var instanceConstructorIndex = abc.AddMethod(instanceConstructor);

                var instanceConstructorBody = new ASMethodBody(abc)
                {
                    MethodIndex       = instanceConstructorIndex,
                    MaxStack          = 1,
                    LocalCount        = 1,
                    InitialScopeDepth = 0,
                    MaxScopeDepth     = 1,
                    Code = new byte[] { 0xD0, 0x30, 0xD0, 0x49, 0x00, 0x47 }
                };

                abc.AddMethodBody(instanceConstructorBody);

                // Create class.
                var classConstructor = new ASMethod(abc)
                {
                    ReturnTypeIndex = 0
                };

                var classConstructorIndex = abc.AddMethod(classConstructor);

                var classConstructorBody = new ASMethodBody(abc)
                {
                    MethodIndex       = classConstructorIndex,
                    MaxStack          = 0,
                    LocalCount        = 1,
                    InitialScopeDepth = 0,
                    MaxScopeDepth     = 0,
                    Code = new byte[] { 0x47 }
                };

                abc.AddMethodBody(classConstructorBody);

                // Add class to SWF.
                var classIndex = abc.AddClass(
                    new ASClass(abc)
                {
                    ConstructorIndex = classConstructorIndex
                },
                    new ASInstance(abc)
                {
                    ConstructorIndex = instanceConstructorIndex,
                    QNameIndex       = localizationMultiNameIndex,
                    SuperIndex       = abc.Pool.GetMultinameIndex("ByteArray"),
                    Flags            = ClassFlags.Sealed
                }
                    );

                // Create script.
                var initializerMethod = new ASMethod(abc)
                {
                    ReturnTypeIndex = 0
                };

                var initializerMethodIndex = abc.AddMethod(initializerMethod);

                var initializerMethodBody = new ASMethodBody(abc)
                {
                    MethodIndex       = initializerMethodIndex,
                    MaxStack          = 3,
                    LocalCount        = 1,
                    InitialScopeDepth = 0,
                    MaxScopeDepth     = 3,
                    Code = new byte[0]
                };

                abc.AddMethodBody(initializerMethodBody);

                var initializerMethodBodyCode = new ASCode(abc, initializerMethodBody);

                initializerMethodBodyCode.AddRange(new ASInstruction[]
                {
                    new GetLocal0Ins(),
                    new PushScopeIns(),
                    new GetScopeObjectIns(0),
                    new GetLexIns(abc, abc.Pool.GetMultinameIndex("Object")),
                    new PushScopeIns(),
                    new GetLexIns(abc, abc.Pool.GetMultinameIndex("ByteArray")),
                    new DupIns(),
                    new PushScopeIns(),
                    new NewClassIns(abc, classIndex),
                    new PopScopeIns(),
                    new PopScopeIns(),
                    new InitPropertyIns(abc, localizationMultiNameIndex),
                    new ReturnVoidIns()
                });

                initializerMethodBody.Code = initializerMethodBodyCode.ToArray();

                var initScript = new ASScript(abc)
                {
                    InitializerIndex = initializerMethodIndex
                };

                initScript.Traits.Add(new ASTrait(abc)
                {
                    ClassIndex = classIndex,
                    QNameIndex = localizationMultiNameIndex,
                    Kind       = TraitKind.Class
                });

                _flash.AbcGame.AddScript(initScript);

                #endregion

                #region Create binary data symbol

                var symbolId = symbols.AddSymbol(localizationName);
                var data     = localizations[config.HotelCodeBase];

                _flash.Tags.Insert(_flash.Tags.IndexOf(symbols), new DefineBinaryDataTag(symbolId, data));

                #endregion

                #region Add to HabboLocalizationCom

                var defLocalizationMultiNameIndex = abc.Pool.AddConstant(new ASMultiname(abc.Pool)
                {
                    NameIndex      = abc.Pool.AddConstant(defLocalizationName),
                    Kind           = MultinameKind.QName,
                    NamespaceIndex = 1
                });

                localizationClass.Traits.Add(new ASTrait(abc)
                {
                    QNameIndex = defLocalizationMultiNameIndex,
                    TypeIndex  = abc.Pool.GetMultinameIndex("Class")
                });

                var constructorBody = localizationClass.Constructor.Body.ParseCode();

                constructorBody.InsertRange(constructorBody.Count - 1, new ASInstruction[]
                {
                    new GetLexIns(abc, localizationMultiNameIndex),
                    new FindPropertyIns(abc, defLocalizationMultiNameIndex),
                    new SwapIns(),
                    new SetPropertyIns(abc, defLocalizationMultiNameIndex)
                });

                localizationClass.Constructor.Body.Code = constructorBody.ToArray();

                #endregion
            }

            // Swap localization to load.
            var stringId = abc.Pool.Strings.IndexOf("default_localizations_");
            abc.Pool.Strings[stringId] = "own_default_localizations_";

            // Replace localization_configuration_txt.
            var locConfigBuilder = new StringBuilder();

            for (var i = 0; i < localizationConfigs.Length; i++)
            {
                var config    = localizationConfigs[i];
                var currentId = i + 1;

                locConfigBuilder.AppendLine($"localization.{currentId}={config.HotelCode}");
                locConfigBuilder.AppendLine($"localization.{currentId}.code={config.Code}");
                locConfigBuilder.AppendLine($"localization.{currentId}.name={config.Name}");
                locConfigBuilder.AppendLine($"localization.{currentId}.url={config.Url}");
            }

            var locConfigId = symbols.Entries.First(x => x.Item2.Contains("localization_configuration_txt"));
            var locConfig   = (DefineBinaryDataTag)_flash.Tags.First(x => x.Kind == TagKind.DefineBinaryData && ((DefineBinaryDataTag)x).Id == locConfigId.Item1);

            locConfig.Data = Encoding.UTF8.GetBytes(locConfigBuilder.ToString());

            // Replace localizations manifest.
            string localizationManifestStr           = null;
            DefineBinaryDataTag localizationManifest = null;

            foreach (var(entryId, _) in symbols.Entries)
            {
                var binaryData = (DefineBinaryDataTag)_flash.Tags.FirstOrDefault(x => x.Kind == TagKind.DefineBinaryData && ((DefineBinaryDataTag)x).Id == entryId);
                if (binaryData != null)
                {
                    var dataString = Encoding.UTF8.GetString(binaryData.Data);
                    if (dataString.Contains("<asset mimeType=\"text/plain\" name=\"default_localizations_en\" />"))
                    {
                        localizationManifestStr = dataString;
                        localizationManifest    = binaryData;
                        break;
                    }
                }
            }

            if (localizationManifest == null || localizationManifestStr == null)
            {
                throw new ApplicationException("Could not find localizationManifest or localizationManifestStr.");
            }

            var xmlDocument = new XmlDocument();
            xmlDocument.LoadXml(localizationManifestStr);

            var defaultLoc     = new string[] { "development_localizations" };
            var manifestAssets = xmlDocument.GetElementsByTagName("assets")[0];
            manifestAssets.RemoveAll();

            foreach (var name in defaultLoc.Union(localizationConfigs.Select(x => "own_default_localizations_" + x.HotelCode)))
            {
                var child = xmlDocument.CreateElement("asset");

                child.SetAttribute("mimeType", "text/plain");
                child.SetAttribute("name", name);

                manifestAssets.AppendChild(child);
            }

            using (var stringWriter = new StringWriter())
                using (var xmlTextWriter = XmlWriter.Create(stringWriter, new XmlWriterSettings
                {
                    Indent = true
                }))
                {
                    xmlDocument.WriteTo(xmlTextWriter);
                    xmlTextWriter.Flush();

                    localizationManifest.Data = Encoding.UTF8.GetBytes(stringWriter.GetStringBuilder().ToString());
                }
        }
Example #5
0
 SwfTagBase ISwfTagVisitor <ISwfStreamReader, SwfTagBase> .Visit(DefineBinaryDataTag tag, ISwfStreamReader reader)
 {
     return(tag);
 }
Example #6
0
        static SwfTagBase Create(SwfTagData tag_data)
        {
            var reader = new SwfStreamReader(tag_data.TagData);

            switch (tag_data.TagId)
            {
            // Display list
            case (int)SwfTagType.PlaceObject:                  return(PlaceObjectTag.Create(reader));

            case (int)SwfTagType.PlaceObject2:                 return(PlaceObject2Tag.Create(reader));

            case (int)SwfTagType.PlaceObject3:                 return(PlaceObject3Tag.Create(reader));

            case (int)SwfTagType.RemoveObject:                 return(RemoveObjectTag.Create(reader));

            case (int)SwfTagType.RemoveObject2:                return(RemoveObject2Tag.Create(reader));

            case (int)SwfTagType.ShowFrame:                    return(ShowFrameTag.Create(reader));

            // Control
            case (int)SwfTagType.SetBackgroundColor:           return(SetBackgroundColorTag.Create(reader));

            case (int)SwfTagType.FrameLabel:                   return(FrameLabelTag.Create(reader));

            case (int)SwfTagType.Protect:                      return(ProtectTag.Create(reader));

            case (int)SwfTagType.End:                          return(EndTag.Create(reader));

            case (int)SwfTagType.ExportAssets:                 return(ExportAssetsTag.Create(reader));

            case (int)SwfTagType.ImportAssets:                 return(UnsupportedTag.Create(SwfTagType.ImportAssets));

            case (int)SwfTagType.EnableDebugger:               return(EnableDebuggerTag.Create(reader));

            case (int)SwfTagType.EnableDebugger2:              return(EnableDebugger2Tag.Create(reader));

            case (int)SwfTagType.ScriptLimits:                 return(ScriptLimitsTag.Create(reader));

            case (int)SwfTagType.SetTabIndex:                  return(UnsupportedTag.Create(SwfTagType.SetTabIndex));

            case (int)SwfTagType.ImportAssets2:                return(UnsupportedTag.Create(SwfTagType.ImportAssets2));

            case (int)SwfTagType.SymbolClass:                  return(SymbolClassTag.Create(reader));

            case (int)SwfTagType.Metadata:                     return(MetadataTag.Create(reader));

            case (int)SwfTagType.DefineScalingGrid:            return(UnsupportedTag.Create(SwfTagType.DefineScalingGrid));

            case (int)SwfTagType.DefineSceneAndFrameLabelData: return(DefineSceneAndFrameLabelDataTag.Create(reader));

            // Actions
            case (int)SwfTagType.DoAction:                     return(UnsupportedTag.Create(SwfTagType.DoAction));

            case (int)SwfTagType.DoInitAction:                 return(UnsupportedTag.Create(SwfTagType.DoInitAction));

            case (int)SwfTagType.DoABC:                        return(DoABCTag.Create(reader));

            // Shape
            case (int)SwfTagType.DefineShape:                  return(DefineShapeTag.Create(reader));

            case (int)SwfTagType.DefineShape2:                 return(DefineShape2Tag.Create(reader));

            case (int)SwfTagType.DefineShape3:                 return(DefineShape3Tag.Create(reader));

            case (int)SwfTagType.DefineShape4:                 return(DefineShape4Tag.Create(reader));

            // Bitmaps
            case (int)SwfTagType.DefineBits:                   return(UnsupportedTag.Create(SwfTagType.DefineBits));

            case (int)SwfTagType.JPEGTables:                   return(UnsupportedTag.Create(SwfTagType.JPEGTables));

            case (int)SwfTagType.DefineBitsJPEG2:              return(UnsupportedTag.Create(SwfTagType.DefineBitsJPEG2));

            case (int)SwfTagType.DefineBitsJPEG3:              return(UnsupportedTag.Create(SwfTagType.DefineBitsJPEG3));

            case (int)SwfTagType.DefineBitsLossless:           return(DefineBitsLosslessTag.Create(reader));

            case (int)SwfTagType.DefineBitsLossless2:          return(DefineBitsLossless2Tag.Create(reader));

            case (int)SwfTagType.DefineBitsJPEG4:              return(UnsupportedTag.Create(SwfTagType.DefineBitsJPEG4));

            // Shape Morphing
            case (int)SwfTagType.DefineMorphShape:             return(UnsupportedTag.Create(SwfTagType.DefineMorphShape));

            case (int)SwfTagType.DefineMorphShape2:            return(UnsupportedTag.Create(SwfTagType.DefineMorphShape2));

            // Fonts and Text
            case (int)SwfTagType.DefineFont:                   return(UnsupportedTag.Create(SwfTagType.DefineFont));

            case (int)SwfTagType.DefineFontInfo:               return(UnsupportedTag.Create(SwfTagType.DefineFontInfo));

            case (int)SwfTagType.DefineFontInfo2:              return(UnsupportedTag.Create(SwfTagType.DefineFontInfo2));

            case (int)SwfTagType.DefineFont2:                  return(UnsupportedTag.Create(SwfTagType.DefineFont2));

            case (int)SwfTagType.DefineFont3:                  return(UnsupportedTag.Create(SwfTagType.DefineFont3));

            case (int)SwfTagType.DefineFontAlignZones:         return(UnsupportedTag.Create(SwfTagType.DefineFontAlignZones));

            case (int)SwfTagType.DefineFontName:               return(UnsupportedTag.Create(SwfTagType.DefineFontName));

            case (int)SwfTagType.DefineText:                   return(UnsupportedTag.Create(SwfTagType.DefineText));

            case (int)SwfTagType.DefineText2:                  return(UnsupportedTag.Create(SwfTagType.DefineText2));

            case (int)SwfTagType.DefineEditText:               return(UnsupportedTag.Create(SwfTagType.DefineEditText));

            case (int)SwfTagType.CSMTextSettings:              return(UnsupportedTag.Create(SwfTagType.CSMTextSettings));

            case (int)SwfTagType.DefineFont4:                  return(UnsupportedTag.Create(SwfTagType.DefineFont4));

            // Sounds
            case (int)SwfTagType.DefineSound:                  return(UnsupportedTag.Create(SwfTagType.DefineSound));

            case (int)SwfTagType.StartSound:                   return(UnsupportedTag.Create(SwfTagType.StartSound));

            case (int)SwfTagType.StartSound2:                  return(UnsupportedTag.Create(SwfTagType.StartSound2));

            case (int)SwfTagType.SoundStreamHead:              return(UnsupportedTag.Create(SwfTagType.SoundStreamHead));

            case (int)SwfTagType.SoundStreamHead2:             return(UnsupportedTag.Create(SwfTagType.SoundStreamHead2));

            case (int)SwfTagType.SoundStreamBlock:             return(UnsupportedTag.Create(SwfTagType.SoundStreamBlock));

            // Buttons
            case (int)SwfTagType.DefineButton:                 return(UnsupportedTag.Create(SwfTagType.DefineButton));

            case (int)SwfTagType.DefineButton2:                return(UnsupportedTag.Create(SwfTagType.DefineButton2));

            case (int)SwfTagType.DefineButtonCxform:           return(UnsupportedTag.Create(SwfTagType.DefineButtonCxform));

            case (int)SwfTagType.DefineButtonSound:            return(UnsupportedTag.Create(SwfTagType.DefineButtonSound));

            // Sprites and Movie Clips
            case (int)SwfTagType.DefineSprite:                 return(DefineSpriteTag.Create(reader));

            // Video
            case (int)SwfTagType.DefineVideoStream:            return(UnsupportedTag.Create(SwfTagType.DefineVideoStream));

            case (int)SwfTagType.VideoFrame:                   return(UnsupportedTag.Create(SwfTagType.VideoFrame));

            // Metadata
            case (int)SwfTagType.FileAttributes:               return(FileAttributesTag.Create(reader));

            case (int)SwfTagType.EnableTelemetry:              return(EnableTelemetryTag.Create(reader));

            case (int)SwfTagType.DefineBinaryData:             return(DefineBinaryDataTag.Create(reader));

            default:                                           return(UnknownTag.Create(tag_data.TagId));
            }
        }
Example #7
0
        public void Decompile(Byte[] data)
        {
            SwfStream stream = data;

            Signature = stream.ReadStringBytes(3);
            Version   = stream.ReadByte();
            Length    = stream.ReadInt();

            int startTime = Environment.TickCount;

            if (Signature == "CWS")
            {
                stream    = ZlibStream.UncompressBuffer(stream.ReadToEnd());
                Signature = "FWS";
            }

            if (Signature == "ZWS")
            {
                Signature = "FWS";
                int          length     = stream.ReadInt();
                byte[]       properties = stream.ReadBytes(5);
                byte[]       compressed = stream.ReadBytes(length);
                Decoder      coder      = new Decoder();
                MemoryStream output     = new MemoryStream(Length - 8);

                coder.SetDecoderProperties(properties);
                coder.Code(new MemoryStream(compressed), output, length, Length - 8, null);
                byte[] d = new byte[Length - 8];
                output.Position = 0;
                output.Read(d, 0, Length - 8);
                stream = d;
            }

            int time = Environment.TickCount - startTime;

            if (Signature != "FWS")
            {
                throw new Exception("Unsupported signature: " + Signature);
            }

            FrameSize  = stream.ReadRect();
            FrameRate  = stream.ReadFixed8();
            FrameCount = stream.ReadShort();

            TagList                 = new List <BaseTag>();
            DoAbcTagList            = new List <DoAbcTag>();
            SymbolClassTagList      = new List <SymbolClassTag>();
            DefineBinaryDataTagList = new List <DefineBinaryDataTag>();



            while (stream.Position < stream.Length)
            {
                short tagHeader = stream.ReadShort();
                short code      = (short)(tagHeader >> 6);
                int   length    = tagHeader & 63;
                if (length == 63)
                {
                    length = stream.ReadInt();
                }
                byte[] tagBody = stream.ReadBytes(length);

                BaseTag tag = null;
                switch (code)
                {
                case 82:
                    tag = new DoAbcTag(tagBody);
                    DoAbcTagList.Add(tag as DoAbcTag);
                    break;

                case 76:
                    tag = new SymbolClassTag(tagBody);
                    SymbolClassTagList.Add(tag as SymbolClassTag);
                    break;

                case 87:
                    tag = new DefineBinaryDataTag(tagBody);
                    DefineBinaryDataTagList.Add(tag as DefineBinaryDataTag);
                    break;

                default:
                    tag = new BaseTag(code, tagBody);
                    break;
                }
                TagList.Add(tag);
            }
        }
Example #8
0
 ITagFormatter ISwfTagVisitor <object, ITagFormatter> .Visit(DefineBinaryDataTag tag, object arg)
 {
     return(new DefineBinaryDataTagFormatter());
 }
 public SwfDisplayList Visit(DefineBinaryDataTag tag, SwfDisplayList dl)
 {
     return(dl);
 }
Example #10
0
        protected virtual TagItem ReadTag(HeaderRecord header, FlashReader input)
        {
            TagItem tag = null;

            switch (header.Kind)
            {
            case TagKind.DefineBinaryData:
                tag = new DefineBinaryDataTag(header, input);
                break;

            case TagKind.DefineBitsLossless2:
                tag = new DefineBitsLossless2Tag(header, input);
                break;

            case TagKind.DefineFontName:
                tag = new DefineFontNameTag(header, input);
                break;

            case TagKind.DefineSound:
                tag = new DefineSoundTag(header, input);
                break;

            case TagKind.DoABC:
                tag = new DoABCTag(header, input);
                break;

            case TagKind.End:
                tag = new EndTag(header);
                break;

            case TagKind.ExportAssets:
                tag = new ExportAssetsTag(header, input);
                break;

            case TagKind.FileAttributes:
                tag = new FileAttributesTag(header, input);
                break;

            case TagKind.FrameLabel:
                tag = new FrameLabelTag(header, input);
                break;

            case TagKind.ProductInfo:
                tag = new ProductInfoTag(header, input);
                break;

            case TagKind.ScriptLimits:
                tag = new ScriptLimitsTag(header, input);
                break;

            case TagKind.SetBackgroundColor:
                tag = new SetBackgroundColorTag(header, input);
                break;

            case TagKind.ShowFrame:
                tag = new ShowFrameTag(header);
                break;

            case TagKind.SymbolClass:
                tag = new SymbolClassTag(header, input);
                break;

            default:
            case TagKind.Unknown:
                tag = new UnknownTag(header, input);
                break;
            }
            return(tag);
        }